config_skeleton 1.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0b419f026421b513b20f2950609f9b45339d86433b88e8372bd94746f6a72091
4
- data.tar.gz: 7e0a5ac1b0dfe9ad7ee989aeb9d0051b06d179190328460ba09c273312b36b7d
3
+ metadata.gz: f85f27d60f4dcaf253af5ecff4d6fcc6d851e5b54ad85d3f8cdf2bae4ac4a541
4
+ data.tar.gz: fa4ca080415307e4d44e19f12fc5799fc3b8b8f750eda72c7d543491cd37e7fb
5
5
  SHA512:
6
- metadata.gz: c36398b332b1bfa53a66d11a2c083af4a0f794e53fba518278fcef7ef41dfc63d51b4b010f508eeb898bf99c10ff55a2f813251bdfefe122a70e3254b87da46a
7
- data.tar.gz: 53acc41e5da3aea61cda288cfe90f122e8d8871eea594d5e4b0857d127c01ba20a542df7087884c34e0e75589e968820d53b41db62c3f85f91d49eea9dbf88a2
6
+ metadata.gz: bc6ad4e7c89e473d0902c44b160040da924943d3437310a2edb202a3bab246259f238691bbb81696cc7cf0f0bbe635444dab8add65d0d56790907014aa973293
7
+ data.tar.gz: 9659f0fd04bf6d2e89bc2d58ecc82dd741dd6b1f266d7ff36e621fcb0e5c3774e524c7b02187d90c699d7d2163412505bf55501e35c679d25f1f1f2dd590e755
@@ -0,0 +1,50 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ push:
6
+ branches:
7
+ - master
8
+ - main
9
+
10
+ jobs:
11
+ build:
12
+ runs-on: ubuntu-latest
13
+
14
+ strategy:
15
+ matrix:
16
+ ruby:
17
+ - 2.5
18
+ - 2.6
19
+ - 2.7
20
+ - 3.0
21
+
22
+ steps:
23
+ - uses: actions/checkout@v2
24
+
25
+ - name: Setup ruby
26
+ uses: ruby/setup-ruby@v1
27
+ with:
28
+ ruby-version: ${{ matrix.ruby }}
29
+ bundler-cache: true
30
+
31
+ - name: Lint
32
+ run: bundle exec rubocop
33
+
34
+ - name: Tests
35
+ run: bundle exec rake test
36
+
37
+ publish:
38
+ if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master')
39
+ needs: build
40
+ runs-on: ubuntu-latest
41
+
42
+ steps:
43
+ - uses: actions/checkout@v2
44
+
45
+ - name: Release Gem
46
+ uses: discourse/publish-rubygems-action@v2-beta
47
+ env:
48
+ RUBYGEMS_API_KEY: ${{ secrets.RUBYGEMS_API_KEY }}
49
+ GIT_EMAIL: team@discourse.org
50
+ GIT_NAME: discoursebot
data/.gitignore CHANGED
@@ -1,9 +1,2 @@
1
1
  /Gemfile.lock
2
- /pkg
3
- /doc
4
- /.yardoc
5
- /coverage
6
- /.bundle
7
2
  /cfg.txt
8
-
9
- .rubocop-https---raw-githubusercontent-com-discourse-discourse-master--rubocop-yml
data/.rubocop.yml CHANGED
@@ -1 +1,2 @@
1
- inherit_from: https://raw.githubusercontent.com/discourse/discourse/master/.rubocop.yml
1
+ inherit_gem:
2
+ rubocop-discourse: default.yml
@@ -1,29 +1,28 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Gem::Specification.new do |s|
2
4
  s.name = "config_skeleton"
3
-
4
- s.version = "1.1.0"
5
+ s.version = "2.2.0"
5
6
 
6
7
  s.platform = Gem::Platform::RUBY
7
-
8
8
  s.summary = "Dynamically generate configs and reload servers"
9
-
10
9
  s.authors = ["Matt Palmer", "Discourse Team"]
11
10
  s.email = ["matt.palmer@discourse.org", "team@discourse.org"]
12
11
  s.homepage = "https://github.com/discourse/config_skeleton"
13
12
 
14
13
  s.files = `git ls-files -z`.split("\0").reject { |f| f =~ /^(G|spec|Rakefile)/ }
15
14
 
16
- s.required_ruby_version = ">= 2.3.0"
15
+ s.required_ruby_version = ">= 2.5.0"
17
16
 
18
17
  s.add_runtime_dependency 'diffy', '~> 3.0'
19
18
  s.add_runtime_dependency 'rb-inotify', '~> 0.9'
20
- s.add_runtime_dependency 'service_skeleton', "~> 1.0"
19
+ s.add_runtime_dependency 'service_skeleton', "~> 2.0"
20
+ s.add_runtime_dependency 'webrick'
21
21
 
22
22
  s.add_development_dependency 'bundler'
23
- s.add_development_dependency 'github-release'
24
- s.add_development_dependency 'rake', "~> 12.0"
23
+ s.add_development_dependency 'rake', "~> 13.0"
25
24
  s.add_development_dependency 'redcarpet'
26
- s.add_development_dependency 'rubocop'
25
+ s.add_development_dependency 'rubocop-discourse', '~> 2.4.1'
27
26
  s.add_development_dependency 'yard'
28
27
  s.add_development_dependency 'rspec'
29
28
  s.add_development_dependency 'pry'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'diffy'
2
4
  require 'fileutils'
3
5
  require 'frankenstein'
@@ -162,11 +164,12 @@ class ConfigSkeleton
162
164
  end
163
165
 
164
166
  def self.inherited(klass)
167
+ klass.gauge :"#{klass.service_name}_config_ok", docstring: "Whether the last config change was accepted by the server"
168
+ klass.gauge :"#{klass.service_name}_generation_ok", docstring: "Whether the last config generation completed without error"
165
169
  klass.gauge :"#{klass.service_name}_last_generation_timestamp", docstring: "When the last config generation run was made"
166
170
  klass.gauge :"#{klass.service_name}_last_change_timestamp", docstring: "When the config file was last written to"
167
171
  klass.counter :"#{klass.service_name}_reload_total", docstring: "How many times we've asked the server to reload", labels: [:status]
168
172
  klass.counter :"#{klass.service_name}_signals_total", docstring: "How many signals have been received (and handled)"
169
- klass.gauge :"#{klass.service_name}_config_ok", docstring: "Whether the last config change was accepted by the server"
170
173
 
171
174
  klass.hook_signal("HUP") do
172
175
  logger.info("SIGHUP") { "received SIGHUP, triggering config regeneration" }
@@ -205,11 +208,15 @@ class ConfigSkeleton
205
208
  @watches || []
206
209
  end
207
210
 
208
- def initialize(*_)
211
+ def initialize(*_, metrics:, config:)
209
212
  super
210
213
  initialize_config_skeleton_metrics
211
214
  @trigger_regen_r, @trigger_regen_w = IO.pipe
212
215
  @terminate_r, @terminate_w = IO.pipe
216
+
217
+ raise "cooldown_duration invalid" if cooldown_duration < 0
218
+ raise "sleep_duration invalid" if sleep_duration < 0
219
+ raise "sleep_duration must not be less than cooldown_duration" if sleep_duration < cooldown_duration
213
220
  end
214
221
 
215
222
  # Expose the write pipe which can be written to to trigger a config
@@ -323,6 +330,7 @@ class ConfigSkeleton
323
330
  metrics.last_generation_timestamp.set(0)
324
331
  metrics.last_change_timestamp.set(0)
325
332
  metrics.config_ok.set(0)
333
+ metrics.generation_ok.set(0)
326
334
  end
327
335
 
328
336
  # Write out a config file if one doesn't exist, or do an initial regen run
@@ -425,9 +433,15 @@ class ConfigSkeleton
425
433
  #
426
434
  def instrumented_config_data
427
435
  begin
428
- @config_generation.measure { config_data.tap { metrics.last_generation_timestamp.set(Time.now.to_f) } }
436
+ @config_generation.measure do
437
+ config_data.tap do
438
+ metrics.last_generation_timestamp.set(Time.now.to_f)
439
+ metrics.generation_ok.set(1)
440
+ end
441
+ end
429
442
  rescue => ex
430
443
  log_exception(ex, logloc) { "Call to config_data raised exception" }
444
+ metrics.generation_ok.set(0)
431
445
  nil
432
446
  end
433
447
  end
@@ -457,6 +471,10 @@ class ConfigSkeleton
457
471
  # duration, regardless of any CONT signals or inotify events. Those events
458
472
  # will be queued up, and processed at the end of the cooldown.
459
473
  #
474
+ # The cooldown_duration is counted as part of the sleep_duration. So for
475
+ # the default values of 60 and 5, the service will cooldown for 5s, then wait
476
+ # for 55s.
477
+ #
460
478
  # @return [Integer] the number of seconds to 'cooldown' for. This *must* be
461
479
  # greater than zero, and less than sleep_duration
462
480
  #
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: config_skeleton
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Palmer
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2021-03-11 00:00:00.000000000 Z
12
+ date: 2022-06-20 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: diffy
@@ -45,22 +45,22 @@ dependencies:
45
45
  requirements:
46
46
  - - "~>"
47
47
  - !ruby/object:Gem::Version
48
- version: '1.0'
48
+ version: '2.0'
49
49
  type: :runtime
50
50
  prerelease: false
51
51
  version_requirements: !ruby/object:Gem::Requirement
52
52
  requirements:
53
53
  - - "~>"
54
54
  - !ruby/object:Gem::Version
55
- version: '1.0'
55
+ version: '2.0'
56
56
  - !ruby/object:Gem::Dependency
57
- name: bundler
57
+ name: webrick
58
58
  requirement: !ruby/object:Gem::Requirement
59
59
  requirements:
60
60
  - - ">="
61
61
  - !ruby/object:Gem::Version
62
62
  version: '0'
63
- type: :development
63
+ type: :runtime
64
64
  prerelease: false
65
65
  version_requirements: !ruby/object:Gem::Requirement
66
66
  requirements:
@@ -68,7 +68,7 @@ dependencies:
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
70
  - !ruby/object:Gem::Dependency
71
- name: github-release
71
+ name: bundler
72
72
  requirement: !ruby/object:Gem::Requirement
73
73
  requirements:
74
74
  - - ">="
@@ -87,14 +87,14 @@ dependencies:
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '12.0'
90
+ version: '13.0'
91
91
  type: :development
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '12.0'
97
+ version: '13.0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: redcarpet
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -110,19 +110,19 @@ dependencies:
110
110
  - !ruby/object:Gem::Version
111
111
  version: '0'
112
112
  - !ruby/object:Gem::Dependency
113
- name: rubocop
113
+ name: rubocop-discourse
114
114
  requirement: !ruby/object:Gem::Requirement
115
115
  requirements:
116
- - - ">="
116
+ - - "~>"
117
117
  - !ruby/object:Gem::Version
118
- version: '0'
118
+ version: 2.4.1
119
119
  type: :development
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  requirements:
123
- - - ">="
123
+ - - "~>"
124
124
  - !ruby/object:Gem::Version
125
- version: '0'
125
+ version: 2.4.1
126
126
  - !ruby/object:Gem::Dependency
127
127
  name: yard
128
128
  requirement: !ruby/object:Gem::Requirement
@@ -187,7 +187,7 @@ executables: []
187
187
  extensions: []
188
188
  extra_rdoc_files: []
189
189
  files:
190
- - ".github/workflows/ruby.yml"
190
+ - ".github/workflows/ci.yml"
191
191
  - ".gitignore"
192
192
  - ".rspec"
193
193
  - ".rubocop.yml"
@@ -209,14 +209,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
209
209
  requirements:
210
210
  - - ">="
211
211
  - !ruby/object:Gem::Version
212
- version: 2.3.0
212
+ version: 2.5.0
213
213
  required_rubygems_version: !ruby/object:Gem::Requirement
214
214
  requirements:
215
215
  - - ">="
216
216
  - !ruby/object:Gem::Version
217
217
  version: '0'
218
218
  requirements: []
219
- rubygems_version: 3.0.3
219
+ rubygems_version: 3.1.6
220
220
  signing_key:
221
221
  specification_version: 4
222
222
  summary: Dynamically generate configs and reload servers
@@ -1,48 +0,0 @@
1
- # This workflow uses actions that are not certified by GitHub.
2
- # They are provided by a third-party and are governed by
3
- # separate terms of service, privacy policy, and support
4
- # documentation.
5
- # This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
6
- # For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
7
-
8
- name: Ruby
9
-
10
- on:
11
- push:
12
- branches:
13
- - master
14
- tags:
15
- - v*
16
- pull_request:
17
- branches:
18
- - master
19
- workflow_dispatch:
20
-
21
- jobs:
22
- build:
23
- runs-on: ubuntu-latest
24
-
25
- steps:
26
- - uses: actions/checkout@v2
27
-
28
- - name: Set up Ruby
29
- uses: ruby/setup-ruby@v1
30
- with:
31
- ruby-version: 2.6
32
- - name: Install dependencies
33
- run: bundle install
34
- - name: Run specs
35
- run: bundle exec rspec
36
-
37
- publish:
38
- if: contains(github.ref, 'refs/tags/v')
39
- needs: build
40
- runs-on: ubuntu-latest
41
-
42
- steps:
43
- - uses: actions/checkout@v2
44
-
45
- - name: Release Gem
46
- uses: discourse/publish-rubygems-action@main
47
- env:
48
- RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}