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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bafbe17c7fb151098a26f705e72fa102d72a160525954fabfddb40cfaf5e102c
4
- data.tar.gz: 65971811403084320352425fea9a55a6ab013e9ab45d6ee2db2b1db2d2be589e
3
+ metadata.gz: 92deb69f7e1cf311777e4de1f80c95055d85b13bf28bba0cfa867d998a469620
4
+ data.tar.gz: d201434b2619d1d1cd5b089656b5acbeeadc842cab75da2d4051f51a2013d497
5
5
  SHA512:
6
- metadata.gz: 72af323c05c61f27f55e7f7ec5f4cdadd3cd53b0399dd163e7ebbc2700f0eca8965d44ab502bb922e808e3b409fc6375fb96c9dc695b35f23aed82d0c9bee27d
7
- data.tar.gz: c2d9c9fe1f7782cef895d38085611323ec29462022f02327124839245789b100a139b38def2e0def37645dae2eeddb369e81d45453b188660685369d1a8b611f
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
- deploy_env = stack.filter_deploy_envs(params.env)
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: deploy_env, force: params.force, lock: params.lock)
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)
@@ -27,7 +27,7 @@ module Shipit
27
27
  end
28
28
 
29
29
  def rollback_params
30
- params.require(:rollback).permit(:parent_id, env: @stack.deploy_variables.map(&:name))
30
+ params.require(:rollback).permit(:parent_id, env: @stack.rollback_variables.map(&:name))
31
31
  end
32
32
  end
33
33
  end
@@ -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
@@ -38,6 +38,10 @@ module Shipit
38
38
  complete!
39
39
  end
40
40
 
41
+ def variables
42
+ stack.rollback_variables
43
+ end
44
+
41
45
  private
42
46
 
43
47
  def update_release_status
@@ -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, :retries_on_rollback,
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?
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Shipit
4
- VERSION = '0.41.1'
4
+ VERSION = '0.42.0'
5
5
  end
@@ -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
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shipit-engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.41.1
4
+ version: 0.42.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier