config_skeleton 1.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
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}}