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 +4 -4
- data/.github/workflows/ci.yml +50 -0
- data/.gitignore +0 -7
- data/.rubocop.yml +2 -1
- data/config_skeleton.gemspec +8 -9
- data/lib/config_skeleton.rb +21 -3
- metadata +17 -17
- data/.github/workflows/ruby.yml +0 -48
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f85f27d60f4dcaf253af5ecff4d6fcc6d851e5b54ad85d3f8cdf2bae4ac4a541
|
4
|
+
data.tar.gz: fa4ca080415307e4d44e19f12fc5799fc3b8b8f750eda72c7d543491cd37e7fb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
data/.rubocop.yml
CHANGED
@@ -1 +1,2 @@
|
|
1
|
-
|
1
|
+
inherit_gem:
|
2
|
+
rubocop-discourse: default.yml
|
data/config_skeleton.gemspec
CHANGED
@@ -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.
|
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', "~>
|
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 '
|
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'
|
data/lib/config_skeleton.rb
CHANGED
@@ -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
|
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:
|
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:
|
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: '
|
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: '
|
55
|
+
version: '2.0'
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
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: :
|
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:
|
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: '
|
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: '
|
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:
|
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:
|
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/
|
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.
|
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.
|
219
|
+
rubygems_version: 3.1.6
|
220
220
|
signing_key:
|
221
221
|
specification_version: 4
|
222
222
|
summary: Dynamically generate configs and reload servers
|
data/.github/workflows/ruby.yml
DELETED
@@ -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}}
|