shipit-engine 0.41.1 → 0.42.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/README.md +33 -1
- data/app/controllers/shipit/api/rollbacks_controller.rb +2 -2
- data/app/controllers/shipit/rollbacks_controller.rb +1 -1
- data/app/models/shipit/deploy_spec/file_system.rb +2 -1
- data/app/models/shipit/deploy_spec.rb +13 -0
- data/app/models/shipit/rollback.rb +4 -0
- data/app/models/shipit/stack.rb +3 -2
- data/lib/shipit/version.rb +1 -1
- data/test/models/deploy_spec_test.rb +27 -1
- data/test/models/shipit/deploy_spec/file_system_test.rb +41 -0
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 92deb69f7e1cf311777e4de1f80c95055d85b13bf28bba0cfa867d998a469620
|
|
4
|
+
data.tar.gz: d201434b2619d1d1cd5b089656b5acbeeadc842cab75da2d4051f51a2013d497
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 701903483ad7438eb46f1624c75bdcc893d9be84cf2f3926c0987cc257bd55b95e4c4e0703c85bf2db8c0ae7429c4e03ae1fe28e294a24cdca26f4d321e82d11
|
|
7
|
+
data.tar.gz: 80a26fdee216be7713a1aa6389e3ec9b304f494514eed6d14d24bf7dd6b4466821ce8b54c12d4a3e291f49bfc20585a178d2eef581e74f846ac1c532e00d9b35
|
data/README.md
CHANGED
|
@@ -352,6 +352,38 @@ rollback:
|
|
|
352
352
|
```
|
|
353
353
|
<br>
|
|
354
354
|
|
|
355
|
+
You can also accept custom environment variables defined by the user that triggers the rollback:
|
|
356
|
+
|
|
357
|
+
**<code>rollback.variables</code>** contains an array of variable definitions.
|
|
358
|
+
|
|
359
|
+
For example:
|
|
360
|
+
|
|
361
|
+
```yaml
|
|
362
|
+
rollback:
|
|
363
|
+
variables:
|
|
364
|
+
-
|
|
365
|
+
name: RUN_MIGRATIONS
|
|
366
|
+
title: Run database migrations on rollback
|
|
367
|
+
default: 1
|
|
368
|
+
```
|
|
369
|
+
<br>
|
|
370
|
+
|
|
371
|
+
**<code>rollback.variables.select</code>** will turn the input into a `<select>` of values.
|
|
372
|
+
|
|
373
|
+
For example:
|
|
374
|
+
|
|
375
|
+
```yaml
|
|
376
|
+
rollback:
|
|
377
|
+
variables:
|
|
378
|
+
-
|
|
379
|
+
name: REGION
|
|
380
|
+
title: Run a rollback in a given region
|
|
381
|
+
select:
|
|
382
|
+
- east
|
|
383
|
+
- west
|
|
384
|
+
- north
|
|
385
|
+
```
|
|
386
|
+
<br>
|
|
355
387
|
|
|
356
388
|
**<code>fetch</code>** contains an array of the shell commands that Shipit executes to check the revision of the currently-deployed version. This key defaults to `disabled`.
|
|
357
389
|
|
|
@@ -362,7 +394,7 @@ fetch:
|
|
|
362
394
|
```
|
|
363
395
|
|
|
364
396
|
**Note:** Currently, deployments in emergency mode are configured to occur concurrently via [the `build_deploy` method](https://github.com/Shopify/shipit-engine/blob/main/app/models/shipit/stack.rb),
|
|
365
|
-
whose `allow_concurrency` keyword argument defaults to `force`, where `force` is true when emergency mode is enabled.
|
|
397
|
+
whose `allow_concurrency` keyword argument defaults to `force`, where `force` is true when emergency mode is enabled.
|
|
366
398
|
If you'd like to separate these two from one another, override this method as desired in your service.
|
|
367
399
|
|
|
368
400
|
<h3 id="kubernetes">Kubernetes</h3>
|
|
@@ -15,7 +15,7 @@ module Shipit
|
|
|
15
15
|
commit = stack.commits.by_sha(params.sha) || param_error!(:sha, 'Unknown revision')
|
|
16
16
|
param_error!(:force, "Can't rollback a locked stack") if !params.force && stack.locked?
|
|
17
17
|
deploy = stack.deploys.find_by(until_commit: commit) || param_error!(:sha, 'Cant find associated deploy')
|
|
18
|
-
|
|
18
|
+
rollback_env = stack.filter_rollback_envs(params.env)
|
|
19
19
|
|
|
20
20
|
response = nil
|
|
21
21
|
if !params.force && stack.active_task?
|
|
@@ -25,7 +25,7 @@ module Shipit
|
|
|
25
25
|
active_task.abort!(aborted_by: current_user, rollback_once_aborted_to: deploy, rollback_once_aborted: true)
|
|
26
26
|
response = active_task
|
|
27
27
|
else
|
|
28
|
-
response = deploy.trigger_rollback(current_user, env:
|
|
28
|
+
response = deploy.trigger_rollback(current_user, env: rollback_env, force: params.force, lock: params.lock)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
render_resource(response, status: :accepted)
|
|
@@ -78,7 +78,8 @@ module Shipit
|
|
|
78
78
|
},
|
|
79
79
|
'rollback' => {
|
|
80
80
|
'override' => rollback_steps,
|
|
81
|
-
'retries' => retries_on_rollback
|
|
81
|
+
'retries' => retries_on_rollback,
|
|
82
|
+
'variables' => rollback_variables.map(&:to_h)
|
|
82
83
|
},
|
|
83
84
|
'fetch' => fetch_deployed_revision_steps,
|
|
84
85
|
'tasks' => cacheable_tasks
|
|
@@ -139,6 +139,15 @@ module Shipit
|
|
|
139
139
|
rollback_steps || cant_detect!(:rollback)
|
|
140
140
|
end
|
|
141
141
|
|
|
142
|
+
def rollback_variables
|
|
143
|
+
if config('rollback', 'variables').nil?
|
|
144
|
+
# For backwards compatibility, fallback to using deploy_variables if no explicit rollback variables are set
|
|
145
|
+
deploy_variables
|
|
146
|
+
else
|
|
147
|
+
Array.wrap(config('rollback', 'variables')).map(&VariableDefinition.method(:new))
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
142
151
|
def retries_on_rollback
|
|
143
152
|
config('rollback', 'retries') { nil }
|
|
144
153
|
end
|
|
@@ -166,6 +175,10 @@ module Shipit
|
|
|
166
175
|
EnvironmentVariables.with(env).permit(deploy_variables)
|
|
167
176
|
end
|
|
168
177
|
|
|
178
|
+
def filter_rollback_envs(env)
|
|
179
|
+
EnvironmentVariables.with(env).permit(rollback_variables)
|
|
180
|
+
end
|
|
181
|
+
|
|
169
182
|
def review_checklist
|
|
170
183
|
(config('review', 'checklist') || discover_review_checklist || []).map(&:strip).select(&:present?)
|
|
171
184
|
end
|
data/app/models/shipit/stack.rb
CHANGED
|
@@ -519,8 +519,9 @@ module Shipit
|
|
|
519
519
|
end
|
|
520
520
|
|
|
521
521
|
delegate :plugins, :task_definitions, :hidden_statuses, :required_statuses, :soft_failing_statuses,
|
|
522
|
-
:blocking_statuses, :deploy_variables, :filter_task_envs, :filter_deploy_envs,
|
|
523
|
-
:maximum_commits_per_deploy, :pause_between_deploys, :retries_on_deploy,
|
|
522
|
+
:blocking_statuses, :deploy_variables, :rollback_variables, :filter_task_envs, :filter_deploy_envs,
|
|
523
|
+
:filter_rollback_envs, :maximum_commits_per_deploy, :pause_between_deploys, :retries_on_deploy,
|
|
524
|
+
:retries_on_rollback,
|
|
524
525
|
to: :cached_deploy_spec
|
|
525
526
|
|
|
526
527
|
def monitoring?
|
data/lib/shipit/version.rb
CHANGED
|
@@ -243,6 +243,31 @@ module Shipit
|
|
|
243
243
|
assert_equal ["kubernetes-deploy --max-watch-seconds 900 foo bar"], @spec.rollback_steps
|
|
244
244
|
end
|
|
245
245
|
|
|
246
|
+
test "#rollback_variables returns an empty array by default" do
|
|
247
|
+
assert_equal [], @spec.rollback_variables
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
test "#rollback_variables returns an array of VariableDefinition instances" do
|
|
251
|
+
@spec.stubs(:load_config).returns('rollback' => { 'variables' => [{
|
|
252
|
+
'name' => 'SAFETY_DISABLED',
|
|
253
|
+
'title' => 'Set to 1 to do dangerous things',
|
|
254
|
+
'default' => 0
|
|
255
|
+
}] })
|
|
256
|
+
|
|
257
|
+
assert_equal 1, @spec.rollback_variables.size
|
|
258
|
+
variable_definition = @spec.rollback_variables.first
|
|
259
|
+
assert_equal 'SAFETY_DISABLED', variable_definition.name
|
|
260
|
+
end
|
|
261
|
+
|
|
262
|
+
test "#rollback_variables falls back to deploy_variables if rollback_variables itself is empty" do
|
|
263
|
+
@spec.stubs(:load_config).returns('deploy' => { 'variables' => [{
|
|
264
|
+
'name' => 'SAFETY_DISABLED',
|
|
265
|
+
'title' => 'Set to 1 to do dangerous things',
|
|
266
|
+
'default' => 0
|
|
267
|
+
}] })
|
|
268
|
+
assert_equal @spec.rollback_variables.map(&:to_h), @spec.deploy_variables.map(&:to_h)
|
|
269
|
+
end
|
|
270
|
+
|
|
246
271
|
test "#discover_task_definitions include a kubernetes restart command if `kubernetes` is present" do
|
|
247
272
|
@spec.stubs(:load_config).returns(
|
|
248
273
|
'kubernetes' => {
|
|
@@ -381,7 +406,8 @@ module Shipit
|
|
|
381
406
|
},
|
|
382
407
|
'rollback' => {
|
|
383
408
|
'override' => nil,
|
|
384
|
-
'retries' => nil
|
|
409
|
+
'retries' => nil,
|
|
410
|
+
'variables' => []
|
|
385
411
|
},
|
|
386
412
|
'fetch' => nil,
|
|
387
413
|
'tasks' => {}
|
|
@@ -93,6 +93,34 @@ module Shipit
|
|
|
93
93
|
assert_not loaded_config.include?(Shipit::DeploySpec::FileSystem::SHIPIT_CONFIG_INHERIT_FROM_KEY)
|
|
94
94
|
end
|
|
95
95
|
|
|
96
|
+
test '#load_config accurately deserializes deploy variables' do
|
|
97
|
+
Shipit.expects(:respect_bare_shipit_file?).returns(true).at_least_once
|
|
98
|
+
stack = shipit_stacks(:shipit)
|
|
99
|
+
deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, stack)
|
|
100
|
+
deploy_spec.expects(:config_file_path).returns("#{Pathname.new(Dir.tmpdir)}/shipit.yml").at_least_once
|
|
101
|
+
deploy_spec.expects(:read_config).returns(SafeYAML.load(deploy_spec_with_variables_yaml))
|
|
102
|
+
|
|
103
|
+
deploy_vars = deploy_spec.deploy_variables
|
|
104
|
+
assert_equal 1, deploy_vars.length
|
|
105
|
+
|
|
106
|
+
assert_equal 'TEST_VAR', deploy_vars[0].name
|
|
107
|
+
assert_equal 'deploy_default', deploy_vars[0].default
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
test '#load_config accurately deserializes rollback variables' do
|
|
111
|
+
Shipit.expects(:respect_bare_shipit_file?).returns(true).at_least_once
|
|
112
|
+
stack = shipit_stacks(:shipit)
|
|
113
|
+
deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, stack)
|
|
114
|
+
deploy_spec.expects(:config_file_path).returns("#{Pathname.new(Dir.tmpdir)}/shipit.yml").at_least_once
|
|
115
|
+
deploy_spec.expects(:read_config).returns(SafeYAML.load(deploy_spec_with_variables_yaml))
|
|
116
|
+
|
|
117
|
+
rollback_vars = deploy_spec.rollback_variables
|
|
118
|
+
assert_equal 1, rollback_vars.length
|
|
119
|
+
|
|
120
|
+
assert_equal 'TEST_VAR', rollback_vars[0].name
|
|
121
|
+
assert_equal 'rollback_default', rollback_vars[0].default
|
|
122
|
+
end
|
|
123
|
+
|
|
96
124
|
def deploy_spec_yaml
|
|
97
125
|
<<~EOYAML
|
|
98
126
|
deploy:
|
|
@@ -120,6 +148,19 @@ module Shipit
|
|
|
120
148
|
- production-unrestricted-1234
|
|
121
149
|
EOYAML
|
|
122
150
|
end
|
|
151
|
+
|
|
152
|
+
def deploy_spec_with_variables_yaml
|
|
153
|
+
<<~EOYAML
|
|
154
|
+
deploy:
|
|
155
|
+
variables:
|
|
156
|
+
- name: TEST_VAR
|
|
157
|
+
default: "deploy_default"
|
|
158
|
+
rollback:
|
|
159
|
+
variables:
|
|
160
|
+
- name: TEST_VAR
|
|
161
|
+
default: "rollback_default"
|
|
162
|
+
EOYAML
|
|
163
|
+
end
|
|
123
164
|
end
|
|
124
165
|
end
|
|
125
166
|
end
|