shipit-engine 0.36.0 → 0.36.1

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: 3336765264c2c554f5dd879ac8ed409b08e4f5b281bbd9127132b688d23184ee
4
- data.tar.gz: ac55d9a82c007326c9a231b784d887be1a826ba11cc71c581888a0018ffaed7b
3
+ metadata.gz: 17cf66ed4359907e35e37a0ac00bcb05884c24148386bf8712d8b73c3cc33708
4
+ data.tar.gz: b21d35454c554c7faccad5236333cefc3270434617e4bd192372c0a8baa66ac1
5
5
  SHA512:
6
- metadata.gz: a770a63ffadea62d25d8244265d5ea9552930fee64951d6c4b1e5be4a518271d54d34161b83a8760c9331c6f2758995e61114000bfcf5675b0353a955cc41bad
7
- data.tar.gz: 7e7d3629476bab8aa1ab7655e099e6218b511fe728ef9161a2591835ae2c369cd22724e7c193243fd29779574ea1148b2adb97119ce8a04def1a46df0168d62c
6
+ metadata.gz: 1f8e6ba6aaaa5eaa4630cfb52a1445e416e4cb6566550c4a5e2ec447065b2d342c52a728b370552a8b7a2a7df8061c30b0d4987d637729d533fd1bfd907a074a
7
+ data.tar.gz: 94abc1c12513349c85d4d54c4668865f21a42bf055d630fca667fd636dd7119b42f31c11f5c2182f2412ed76601adecce38b096a1add9e978dd83279b600d7fb
data/README.md CHANGED
@@ -134,6 +134,19 @@ Lastly, if you override the `app_name` configuration in your Shipit deployment,
134
134
 
135
135
  * * *
136
136
 
137
+ <h3 id="respecting-bare-files">Respecting bare <code>shipit.yml</code> files</h3>
138
+
139
+ Shipit will, by default, respect the "bare" <code>shipit.yml</code> file as a fallback option if no more specifically-named file exists (such as <code>shipit.staging.yml</code>).
140
+
141
+ You can configure this behavior via the attribute <code>Shipit.respect_bare_shipit_file</code>.
142
+
143
+ - The value <code>false</code> will disable this behavior and instead cause Shipit to emit an error upon deploy if Shipit cannot find a more specifically-named file.
144
+ - Setting this attribute to any other value (**including <code>nil</code>**), or not setting this attribute, will cause Shipit to use the default behavior of respecting bare <code>shipit.yml</code> files.
145
+
146
+ You can determine if Shipit is configured to respect bare files using <code>Shipit.respect_bare_shipit_file?</code>.
147
+
148
+ * * *
149
+
137
150
  <h3 id="installing-dependencies">Installing dependencies</h3>
138
151
 
139
152
  The **<code>dependencies</code>** step allows you to install all the packages your deploy script needs.
@@ -62,7 +62,7 @@ module Shipit
62
62
  end
63
63
 
64
64
  def refresh
65
- GithubSyncJob.perform_later(id: stack.id)
65
+ GithubSyncJob.perform_later(stack_id: stack.id)
66
66
  render_resource(stack, status: :accepted)
67
67
  end
68
68
 
@@ -5,7 +5,11 @@ module Shipit
5
5
  before_action :load_deploy
6
6
 
7
7
  def create
8
- @rollback = @deploy.trigger_rollback(current_user, env: rollback_params[:env], force: params[:force].present?)
8
+ @rollback = @deploy.trigger_rollback(
9
+ current_user,
10
+ env: rollback_params[:env]&.to_unsafe_hash,
11
+ force: params[:force].present?,
12
+ )
9
13
  redirect_to(stack_deploy_path(@stack, @rollback))
10
14
  rescue Task::ConcurrentTaskRunning
11
15
  redirect_to(rollback_stack_deploy_path(@stack, @deploy))
@@ -8,7 +8,7 @@ module Shipit
8
8
 
9
9
  validates :creator, :name, presence: true
10
10
 
11
- serialize :permissions, Array
11
+ serialize :permissions, Shipit.serialized_column(:permissions, type: Array)
12
12
  PERMISSIONS = %w(
13
13
  read:stack
14
14
  write:stack
@@ -9,7 +9,7 @@ module Shipit
9
9
  validates :url, presence: true, url: { no_local: true, allow_blank: true }
10
10
  validates :content_type, presence: true
11
11
 
12
- serialize :response_headers, JSON
12
+ serialize :response_headers, SafeJSON
13
13
 
14
14
  after_commit :purge_old_deliveries, on: :create
15
15
 
@@ -128,6 +128,7 @@ module Shipit
128
128
  lock_reason = "A rollback for #{until_commit.sha} has been triggered. " \
129
129
  "Please make sure the reason for the rollback has been addressed before deploying again."
130
130
  stack.update!(lock_reason: lock_reason, lock_author_id: user_id)
131
+ stack.emit_lock_hooks
131
132
  rollback
132
133
  end
133
134
 
@@ -91,10 +91,30 @@ module Shipit
91
91
  end
92
92
 
93
93
  def load_config
94
- read_config(file("#{app_name}.#{@env}.yml", root: true)) ||
95
- read_config(file("#{app_name}.yml", root: true)) ||
96
- read_config(file("shipit.#{@env}.yml", root: true)) ||
97
- read_config(file('shipit.yml', root: true))
94
+ return if config_file_path.nil?
95
+
96
+ if !Shipit.respect_bare_shipit_file? && config_file_path.to_s.end_with?(*bare_shipit_filenames)
97
+ return { 'deploy' => { 'pre' => [shipit_not_obeying_bare_file_echo_command, 'exit 1'] } }
98
+ end
99
+
100
+ read_config(config_file_path)
101
+ end
102
+
103
+ def shipit_file_names_in_priority_order
104
+ ["#{app_name}.#{@env}.yml", "#{app_name}.yml", "shipit.#{@env}.yml", "shipit.yml"].uniq
105
+ end
106
+
107
+ def bare_shipit_filenames
108
+ ["#{app_name}.yml", "shipit.yml"].uniq
109
+ end
110
+
111
+ def config_file_path
112
+ shipit_file_names_in_priority_order.each do |filename|
113
+ path = file(filename, root: true)
114
+ return path if path.exist?
115
+ end
116
+
117
+ nil
98
118
  end
99
119
 
100
120
  def app_name
@@ -104,6 +124,14 @@ module Shipit
104
124
  def read_config(path)
105
125
  SafeYAML.load(path.read) if path.exist?
106
126
  end
127
+
128
+ def shipit_not_obeying_bare_file_echo_command
129
+ <<~EOM
130
+ echo \"\e[1;31mShipit is configured to ignore the bare '#{app_name}.yml' file.
131
+ Please rename this file to more specifically include the environment name.
132
+ Deployments will fail until a valid '#{app_name}.#{@env}.yml' file is found.\e[0m\"
133
+ EOM
134
+ end
107
135
  end
108
136
  end
109
137
  end
@@ -11,7 +11,7 @@ module Shipit
11
11
  has_many :pull_request_assignments
12
12
  has_many :assignees, class_name: :User, through: :pull_request_assignments, source: :user
13
13
 
14
- serialize :labels, Array
14
+ serialize :labels, Shipit.serialized_column(:labels, type: Array)
15
15
 
16
16
  after_create_commit :emit_create_hooks
17
17
  after_update_commit :emit_update_hooks
@@ -608,6 +608,16 @@ module Shipit
608
608
  Shipit.deployment_checks.call(self)
609
609
  end
610
610
 
611
+ def emit_lock_hooks
612
+ return unless previous_changes.include?('lock_reason')
613
+
614
+ lock_details = if previous_changes['lock_reason'].last.blank?
615
+ { from: previous_changes['locked_since'].first, until: Time.zone.now }
616
+ end
617
+
618
+ Hook.emit(:lock, self, locked: locked?, lock_details: lock_details, stack: self)
619
+ end
620
+
611
621
  private
612
622
 
613
623
  def clear_cache
@@ -641,16 +651,6 @@ module Shipit
641
651
  end
642
652
  end
643
653
 
644
- def emit_lock_hooks
645
- return unless previous_changes.include?('lock_reason')
646
-
647
- lock_details = if previous_changes['lock_reason'].last.blank?
648
- { from: previous_changes['locked_since'].first, until: Time.zone.now }
649
- end
650
-
651
- Hook.emit(:lock, self, locked: locked?, lock_details: lock_details, stack: self)
652
- end
653
-
654
654
  def emit_added_hooks
655
655
  Hook.emit(:stack, self, action: :added, stack: self)
656
656
  end
@@ -27,8 +27,35 @@ module Shipit
27
27
 
28
28
  deferred_touch stack: :updated_at
29
29
 
30
+ module EnvHash
31
+ class << self
32
+ def dump(hash)
33
+ raise TypeError, "Task#env should be a Hash[String => String]" unless hash.is_a?(Hash)
34
+ hash = hash.to_h.stringify_keys
35
+ hash.transform_values! do |value|
36
+ case value
37
+ when String, Symbol, Numeric
38
+ value.to_s
39
+ else
40
+ raise TypeError, "Task#env should be a Hash[String => String]" unless hash.is_a?(Hash)
41
+ end
42
+ end
43
+
44
+ hash unless hash.empty?
45
+ end
46
+
47
+ def load(hash)
48
+ hash&.to_h || {} # cast back to a real hash
49
+ end
50
+
51
+ def new
52
+ nil
53
+ end
54
+ end
55
+ end
56
+
30
57
  serialize :definition, TaskDefinition
31
- serialize :env, Hash
58
+ serialize :env, Shipit.serialized_column(:env, coder: EnvHash)
32
59
 
33
60
  scope :success, -> { where(status: 'success') }
34
61
  scope :completed, -> { where(status: COMPLETED_STATUSES) }
data/lib/shipit/engine.rb CHANGED
@@ -5,7 +5,18 @@ module Shipit
5
5
 
6
6
  paths['app/models'] << 'app/serializers' << 'app/serializers/concerns'
7
7
 
8
- initializer 'shipit.config', before: 'active_record_encryption.configuration' do |app|
8
+ initializer 'shipit.encryption_config', before: 'active_record_encryption.configuration' do |app|
9
+ if app.credentials.active_record_encryption.blank? && Shipit.user_access_tokens_key.present?
10
+ # For ease of upgrade, we derive an Active Record encryption config automatically.
11
+ # But if AR Encryption is already configured, we just use that
12
+ app.credentials[:active_record_encryption] = {
13
+ primary_key: Shipit.user_access_tokens_key,
14
+ key_derivation_salt: Digest::SHA256.digest("salt:".b + Shipit.user_access_tokens_key),
15
+ }
16
+ end
17
+ end
18
+
19
+ initializer 'shipit.config' do |app|
9
20
  Rails.application.routes.default_url_options[:host] = Shipit.host
10
21
  Shipit::Engine.routes.default_url_options[:host] = Shipit.host
11
22
  Pubsubstub.redis_url = Shipit.redis_url.to_s
@@ -42,15 +53,6 @@ module Shipit
42
53
  if Shipit.enable_samesite_middleware?
43
54
  app.config.middleware.insert_after(::Rack::Runtime, Shipit::SameSiteCookieMiddleware)
44
55
  end
45
-
46
- if app.credentials.active_record_encryption.blank? && Shipit.user_access_tokens_key.present?
47
- # For ease of upgrade, we derive an Active Record encryption config automatically.
48
- # But if AR Encryption is already configured, we just use that
49
- app.credentials[:active_record_encryption] = {
50
- primary_key: Shipit.user_access_tokens_key,
51
- key_derivation_salt: Digest::SHA256.digest("salt:".b + Shipit.user_access_tokens_key),
52
- }
53
- end
54
56
  end
55
57
 
56
58
  config.after_initialize do
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Shipit
3
- VERSION = '0.36.0'
3
+ VERSION = '0.36.1'
4
4
  end
data/lib/shipit.rb CHANGED
@@ -5,6 +5,7 @@ require 'state_machines-activerecord'
5
5
  require 'validate_url'
6
6
  require 'responders'
7
7
  require 'explicit-parameters'
8
+ require 'paquito'
8
9
 
9
10
  require 'sass-rails'
10
11
  require 'coffee-rails'
@@ -63,7 +64,8 @@ module Shipit
63
64
 
64
65
  delegate :table_name_prefix, to: :secrets
65
66
 
66
- attr_accessor :disable_api_authentication, :timeout_exit_codes, :deployment_checks
67
+ attr_accessor :disable_api_authentication, :timeout_exit_codes, :deployment_checks, :respect_bare_shipit_file,
68
+ :database_serializer
67
69
  attr_writer(
68
70
  :internal_hook_receivers,
69
71
  :preferred_org_emails,
@@ -76,6 +78,9 @@ module Shipit
76
78
  end
77
79
 
78
80
  self.timeout_exit_codes = [].freeze
81
+ self.respect_bare_shipit_file = true
82
+
83
+ alias_method :respect_bare_shipit_file?, :respect_bare_shipit_file
79
84
 
80
85
  def authentication_disabled?
81
86
  ENV['SHIPIT_DISABLE_AUTH'].present?
@@ -103,6 +108,50 @@ module Shipit
103
108
  )
104
109
  end
105
110
 
111
+ module SafeJSON
112
+ class << self
113
+ def load(serial)
114
+ return nil if serial.nil?
115
+ # JSON.load is unsafe, we should use parse instead
116
+ JSON.parse(serial)
117
+ end
118
+
119
+ def dump(object)
120
+ JSON.dump(object)
121
+ end
122
+ end
123
+ end
124
+
125
+ module TransitionalSerializer
126
+ SafeYAML = Paquito::SafeYAML.new(deprecated_classes: ["ActiveSupport::HashWithIndifferentAccess"])
127
+
128
+ class << self
129
+ def load(serial)
130
+ return if serial.nil?
131
+
132
+ JSON.parse(serial)
133
+ rescue JSON::ParserError
134
+ SafeYAML.load(serial)
135
+ end
136
+
137
+ def dump(object)
138
+ return if object.nil?
139
+ JSON.dump(object)
140
+ end
141
+ end
142
+ end
143
+
144
+ self.database_serializer = TransitionalSerializer
145
+
146
+ def serialized_column(attribute_name, type: nil, coder: nil)
147
+ column = Paquito::SerializedColumn.new(database_serializer, type, attribute_name: attribute_name)
148
+ if coder
149
+ Paquito.chain(coder, column)
150
+ else
151
+ column
152
+ end
153
+ end
154
+
106
155
  def github(organization: github_default_organization)
107
156
  # Backward compatibility
108
157
  # nil signifies the single github app config schema is being used
@@ -10,7 +10,7 @@ github_repository = ARGV[1]
10
10
  def get_json(url)
11
11
  uri = URI.parse(url)
12
12
  response = Net::HTTP.get_response(uri)
13
- versions = JSON.load(response.body)
13
+ versions = JSON.parse(response.body)
14
14
  end
15
15
 
16
16
  versions = get_json("https://rubygems.org/api/v1/versions/#{gem_name}.json")
@@ -209,7 +209,7 @@ module Shipit
209
209
  end
210
210
 
211
211
  test "#refresh queues a GithubSyncJob" do
212
- assert_enqueued_with(job: GithubSyncJob, args: [id: @stack.id]) do
212
+ assert_enqueued_with(job: GithubSyncJob, args: [stack_id: @stack.id]) do
213
213
  post :refresh, params: { id: @stack.to_param }
214
214
  end
215
215
  assert_response :accepted
@@ -344,3 +344,15 @@ shipit_nocommit_task:
344
344
  status: pending
345
345
  created_at: <%= (60 - 2).minutes.ago.to_formatted_s(:db) %>
346
346
  started_at: <%= (60 - 2).minutes.ago.to_formatted_s(:db) %>
347
+
348
+ shipit_legacy_yaml_task:
349
+ id: 502
350
+ user: walrus
351
+ type: Shipit::Task
352
+ stack: shipit_task_no_commits
353
+ status: pending
354
+ created_at: <%= (60 - 1).minutes.ago.to_formatted_s(:db) %>
355
+ started_at: <%= (60 - 1).minutes.ago.to_formatted_s(:db) %>
356
+ env: |
357
+ --- !ruby/hash:ActiveSupport::HashWithIndifferentAccess
358
+ POD_ID: '12'
@@ -286,29 +286,6 @@ module Shipit
286
286
  assert_equal({ 'GLOBAL' => '1' }, @spec.machine_env)
287
287
  end
288
288
 
289
- test '#load_config can grab the env-specific shipit.yml file' do
290
- config = {}
291
- config.expects(:exist?).returns(true)
292
- config.expects(:read).returns({ 'dependencies' => { 'override' => %w(foo bar baz) } }.to_yaml)
293
- spec = DeploySpec::FileSystem.new('.', 'staging')
294
- spec.expects(:file).with('shipit.staging.yml', root: true).returns(config)
295
- assert_equal %w(foo bar baz), spec.dependencies_steps
296
- end
297
-
298
- test '#load_config grabs the global shipit.yml file if there is no env-specific file' do
299
- not_config = {}
300
- not_config.expects(:exist?).returns(false)
301
-
302
- config = {}
303
- config.expects(:exist?).returns(true)
304
- config.expects(:read).returns({ 'dependencies' => { 'override' => %w(foo bar baz) } }.to_yaml)
305
-
306
- spec = DeploySpec::FileSystem.new('.', 'staging')
307
- spec.expects(:file).with('shipit.staging.yml', root: true).returns(not_config)
308
- spec.expects(:file).with('shipit.yml', root: true).returns(config)
309
- assert_equal %w(foo bar baz), spec.dependencies_steps
310
- end
311
-
312
289
  test '#gemspec gives the path of the repo gemspec if present' do
313
290
  spec = DeploySpec::FileSystem.new('foobar/', 'production')
314
291
  Dir.expects(:[]).with('foobar/*.gemspec').returns(['foobar/foobar.gemspec'])
@@ -459,6 +459,32 @@ module Shipit
459
459
  end
460
460
  end
461
461
 
462
+ test "transitioning to aborted locks the stack if a rollback is scheduled" do
463
+ refute @stack.locked?
464
+
465
+ @deploy = shipit_deploys(:shipit_running)
466
+ @deploy.ping
467
+ @deploy.pid = 42
468
+ @deploy.abort!(rollback_once_aborted: true, aborted_by: @user)
469
+ @deploy.aborted!
470
+
471
+ assert_predicate @stack.reload, :locked?
472
+ assert_equal @user, @stack.lock_author
473
+ end
474
+
475
+ test "transitioning to aborted emits a lock hook if a rollback is scheduled" do
476
+ refute_predicate @stack, :locked?
477
+
478
+ @deploy = shipit_deploys(:shipit_running)
479
+ @deploy.ping
480
+ @deploy.pid = 42
481
+ @deploy.abort!(rollback_once_aborted: true, aborted_by: @user)
482
+
483
+ expect_hook(:lock, @stack, locked: true, lock_details: nil, stack: @stack) do
484
+ @deploy.aborted!
485
+ end
486
+ end
487
+
462
488
  test "#build_rollback returns an unsaved record" do
463
489
  assert @deploy.build_rollback.new_record?
464
490
  end
@@ -0,0 +1,81 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+ require 'tmpdir'
4
+
5
+ module Shipit
6
+ class DeploySpec
7
+ class FileSystemTest < ActiveSupport::TestCase
8
+ test 'deploy.pre calls "exit 1" if there is a bare shipit file and Shipit is configured to ignore' do
9
+ Shipit.expects(:respect_bare_shipit_file?).returns(false).at_least_once
10
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, 'env')
11
+ deploy_spec.expects(:config_file_path).returns(Pathname.new(Dir.tmpdir) + '/shipit.yml').at_least_once
12
+ deploy_spec.expects(:read_config).never
13
+ pre_commands = deploy_spec.send(:config, 'deploy', 'pre')
14
+ assert pre_commands.include?('exit 1')
15
+ assert pre_commands.first.include?('configured to ignore')
16
+ refute pre_commands.include?('test 2')
17
+ end
18
+
19
+ test 'deploy.pre does not call "exit 1" if Shipit is not configured to do so' do
20
+ Shipit.expects(:respect_bare_shipit_file?).returns(true).at_least_once
21
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, 'env')
22
+ deploy_spec.expects(:config_file_path).returns(Pathname.new(Dir.tmpdir) + '/shipit.yml').at_least_once
23
+ deploy_spec.expects(:read_config).returns(SafeYAML.load(deploy_spec_yaml))
24
+ pre_commands = deploy_spec.send(:config, 'deploy', 'pre')
25
+ refute pre_commands.include?('exit 1')
26
+ assert pre_commands.include?('test 2')
27
+ end
28
+
29
+ test 'Shipit.respect_bare_shipit_file? has no effect if the file is not a bare file' do
30
+ [true, false].each do |obey_val|
31
+ Shipit.expects(:respect_bare_shipit_file?).returns(obey_val).at_least_once
32
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, 'env')
33
+ deploy_spec.expects(:config_file_path).returns(Pathname.new(Dir.tmpdir) + '/shipit.env.yml').at_least_once
34
+ deploy_spec.expects(:read_config).returns(SafeYAML.load(deploy_spec_yaml))
35
+ pre_commands = deploy_spec.send(:config, 'deploy', 'pre')
36
+ refute pre_commands.include?('exit 1')
37
+ assert pre_commands.include?('test 2')
38
+ end
39
+ end
40
+
41
+ test '#load_config does not error if the file is empty' do
42
+ Shipit.expects(:respect_bare_shipit_file?).returns(true).at_least_once
43
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, 'env')
44
+ deploy_spec.expects(:config_file_path).returns(Pathname.new(Dir.tmpdir) + '/shipit.env.yml').at_least_once
45
+ deploy_spec.expects(:read_config).at_least_once.returns(false)
46
+ loaded_config = deploy_spec.send(:cacheable_config)
47
+ refute loaded_config == false
48
+ end
49
+
50
+ test '#load_config does not error if there is no "deploy" key' do
51
+ Shipit.expects(:respect_bare_shipit_file?).returns(false).at_least_once
52
+ deploy_spec = Shipit::DeploySpec::FileSystem.new(Dir.tmpdir, 'env')
53
+ deploy_spec.expects(:config_file_path).returns(Pathname.new(Dir.tmpdir) + '/shipit.yml').at_least_once
54
+ deploy_spec.expects(:read_config).never
55
+ loaded_config = deploy_spec.send(:load_config)
56
+ assert loaded_config.key?("deploy")
57
+ assert loaded_config["deploy"].key?("pre")
58
+ assert loaded_config["deploy"]["pre"].include?('exit 1')
59
+ end
60
+
61
+ def deploy_spec_yaml
62
+ <<~EOYAML
63
+ deploy:
64
+ pre:
65
+ - test 2
66
+ override:
67
+ - test 1
68
+ EOYAML
69
+ end
70
+
71
+ def deploy_spec_missing_deploy_yaml
72
+ <<~EOYAML
73
+ production_platform:
74
+ application: test-application
75
+ runtime_ids:
76
+ - production-unrestricted-1234
77
+ EOYAML
78
+ end
79
+ end
80
+ end
81
+ end
@@ -110,5 +110,17 @@ module Shipit
110
110
 
111
111
  assert_includes Shipit::Task.due_for_rollup, task
112
112
  end
113
+
114
+ test "load legacy YAML records" do
115
+ task = Shipit::Task.find(shipit_tasks(:shipit_legacy_yaml_task).id)
116
+ assert_equal({ "POD_ID" => "12" }, task.env)
117
+ assert_equal Hash, task.env.class
118
+
119
+ task.save
120
+ task.reload
121
+
122
+ assert_equal({ "POD_ID" => "12" }, task.env)
123
+ assert_equal Hash, task.env.class
124
+ end
113
125
  end
114
126
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shipit-engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.36.0
4
+ version: 0.36.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-15 00:00:00.000000000 Z
11
+ date: 2022-07-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: active_model_serializers
@@ -388,6 +388,20 @@ dependencies:
388
388
  - - "~>"
389
389
  - !ruby/object:Gem::Version
390
390
  version: 1.0.0
391
+ - !ruby/object:Gem::Dependency
392
+ name: paquito
393
+ requirement: !ruby/object:Gem::Requirement
394
+ requirements:
395
+ - - ">="
396
+ - !ruby/object:Gem::Version
397
+ version: '0'
398
+ type: :runtime
399
+ prerelease: false
400
+ version_requirements: !ruby/object:Gem::Requirement
401
+ requirements:
402
+ - - ">="
403
+ - !ruby/object:Gem::Version
404
+ version: '0'
391
405
  description:
392
406
  email:
393
407
  - jean.boussier@shopify.com
@@ -963,6 +977,7 @@ files:
963
977
  - test/models/release_statuses_test.rb
964
978
  - test/models/rollbacks_test.rb
965
979
  - test/models/shipit/check_run_test.rb
980
+ - test/models/shipit/deploy_spec/file_system_test.rb
966
981
  - test/models/shipit/provisioning_handler/base_test.rb
967
982
  - test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb
968
983
  - test/models/shipit/provisioning_handler_test.rb
@@ -1038,203 +1053,204 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1038
1053
  - !ruby/object:Gem::Version
1039
1054
  version: '0'
1040
1055
  requirements: []
1041
- rubygems_version: 3.2.20
1056
+ rubygems_version: 3.3.3
1042
1057
  signing_key:
1043
1058
  specification_version: 4
1044
1059
  summary: Application deployment software
1045
1060
  test_files:
1046
- - test/unit/github_url_helper_test.rb
1047
- - test/unit/shipit_deployment_checks_test.rb
1048
- - test/unit/user_serializer_test.rb
1049
- - test/unit/github_app_test.rb
1050
- - test/unit/deploy_serializer_test.rb
1051
- - test/unit/csv_serializer_test.rb
1052
- - test/unit/environment_variables_test.rb
1053
- - test/unit/commands_test.rb
1054
- - test/unit/anonymous_user_serializer_test.rb
1055
- - test/unit/command_test.rb
1056
- - test/unit/shipit_task_execution_strategy_test.rb
1057
- - test/unit/shipit_test.rb
1058
- - test/unit/github_apps_test.rb
1059
- - test/unit/variable_definition_test.rb
1060
- - test/unit/deploy_commands_test.rb
1061
- - test/unit/commit_serializer_test.rb
1062
- - test/unit/line_buffer_test.rb
1063
- - test/unit/shipit_helper_test.rb
1064
- - test/unit/rollback_commands_test.rb
1065
- - test/middleware/same_site_cookie_middleware_test.rb
1066
- - test/test_helper.rb
1067
- - test/serializers/shipit/pull_request_serializer_test.rb
1068
- - test/lib/shipit/task_commands_test.rb
1069
- - test/lib/shipit/deploy_commands_test.rb
1070
- - test/helpers/json_helper.rb
1071
- - test/helpers/api_helper.rb
1072
- - test/helpers/hooks_helper.rb
1073
- - test/helpers/links_helper.rb
1074
- - test/helpers/fixture_aliases_helper.rb
1075
- - test/helpers/payloads_helper.rb
1076
- - test/helpers/queries_helper.rb
1077
- - test/dummy/db/schema.rb
1078
- - test/dummy/db/seeds.rb
1079
- - test/dummy/app/assets/javascripts/application.js
1061
+ - test/controllers/api/base_controller_test.rb
1062
+ - test/controllers/api/ccmenu_controller_test.rb
1063
+ - test/controllers/api/commits_controller_test.rb
1064
+ - test/controllers/api/deploys_controller_test.rb
1065
+ - test/controllers/api/hooks_controller_test.rb
1066
+ - test/controllers/api/locks_controller_test.rb
1067
+ - test/controllers/api/merge_requests_controller_test.rb
1068
+ - test/controllers/api/outputs_controller_test.rb
1069
+ - test/controllers/api/release_statuses_controller_test.rb
1070
+ - test/controllers/api/rollback_controller_test.rb
1071
+ - test/controllers/api/stacks_controller_test.rb
1072
+ - test/controllers/api/tasks_controller_test.rb
1073
+ - test/controllers/api_clients_controller_test.rb
1074
+ - test/controllers/ccmenu_controller_test.rb
1075
+ - test/controllers/commit_checks_controller_test.rb
1076
+ - test/controllers/commits_controller_test.rb
1077
+ - test/controllers/deploys_controller_test.rb
1078
+ - test/controllers/github_authentication_controller_test.rb
1079
+ - test/controllers/merge_requests_controller_test.rb
1080
+ - test/controllers/merge_status_controller_test.rb
1081
+ - test/controllers/release_statuses_controller_test.rb
1082
+ - test/controllers/repositories_controller_test.rb
1083
+ - test/controllers/rollbacks_controller_test.rb
1084
+ - test/controllers/stacks_controller_test.rb
1085
+ - test/controllers/status_controller_test.rb
1086
+ - test/controllers/tasks_controller_test.rb
1087
+ - test/controllers/webhooks_controller_test.rb
1088
+ - test/dummy/Rakefile
1080
1089
  - test/dummy/app/assets/config/manifest.js
1090
+ - test/dummy/app/assets/javascripts/application.js
1081
1091
  - test/dummy/app/assets/stylesheets/application.css
1082
- - test/dummy/app/helpers/application_helper.rb
1083
1092
  - test/dummy/app/controllers/application_controller.rb
1093
+ - test/dummy/app/helpers/application_helper.rb
1084
1094
  - test/dummy/app/views/layouts/application.html.erb
1085
- - test/dummy/config.ru
1086
- - test/dummy/public/favicon.ico
1087
- - test/dummy/public/422.html
1088
- - test/dummy/public/404.html
1089
- - test/dummy/public/500.html
1090
- - test/dummy/bin/rake
1091
- - test/dummy/bin/setup
1092
1095
  - test/dummy/bin/bundle
1093
1096
  - test/dummy/bin/rails
1097
+ - test/dummy/bin/rake
1098
+ - test/dummy/bin/setup
1099
+ - test/dummy/config/application.rb
1094
1100
  - test/dummy/config/boot.rb
1095
- - test/dummy/config/database.postgresql.yml
1096
1101
  - test/dummy/config/database.mysql.yml
1097
- - test/dummy/config/secrets_double_github_app.yml
1098
- - test/dummy/config/routes.rb
1102
+ - test/dummy/config/database.postgresql.yml
1099
1103
  - test/dummy/config/database.yml
1100
- - test/dummy/config/application.rb
1101
- - test/dummy/config/environments/test.rb
1102
- - test/dummy/config/environments/production.rb
1104
+ - test/dummy/config/environment.rb
1103
1105
  - test/dummy/config/environments/development.rb
1104
- - test/dummy/config/locales/en.yml
1106
+ - test/dummy/config/environments/production.rb
1107
+ - test/dummy/config/environments/test.rb
1108
+ - test/dummy/config/initializers/0_load_development_secrets.rb
1109
+ - test/dummy/config/initializers/assets.rb
1110
+ - test/dummy/config/initializers/backtrace_silencers.rb
1105
1111
  - test/dummy/config/initializers/cookies_serializer.rb
1112
+ - test/dummy/config/initializers/filter_parameter_logging.rb
1113
+ - test/dummy/config/initializers/inflections.rb
1106
1114
  - test/dummy/config/initializers/mime_types.rb
1107
- - test/dummy/config/initializers/0_load_development_secrets.rb
1108
1115
  - test/dummy/config/initializers/session_store.rb
1109
1116
  - test/dummy/config/initializers/wrap_parameters.rb
1110
- - test/dummy/config/initializers/filter_parameter_logging.rb
1111
- - test/dummy/config/initializers/assets.rb
1112
- - test/dummy/config/initializers/inflections.rb
1113
- - test/dummy/config/initializers/backtrace_silencers.rb
1117
+ - test/dummy/config/locales/en.yml
1118
+ - test/dummy/config/routes.rb
1114
1119
  - test/dummy/config/secrets.yml
1115
- - test/dummy/config/environment.rb
1116
- - test/dummy/Rakefile
1117
- - test/controllers/tasks_controller_test.rb
1118
- - test/controllers/deploys_controller_test.rb
1119
- - test/controllers/ccmenu_controller_test.rb
1120
- - test/controllers/api/tasks_controller_test.rb
1121
- - test/controllers/api/deploys_controller_test.rb
1122
- - test/controllers/api/locks_controller_test.rb
1123
- - test/controllers/api/rollback_controller_test.rb
1124
- - test/controllers/api/ccmenu_controller_test.rb
1125
- - test/controllers/api/base_controller_test.rb
1126
- - test/controllers/api/outputs_controller_test.rb
1127
- - test/controllers/api/hooks_controller_test.rb
1128
- - test/controllers/api/commits_controller_test.rb
1129
- - test/controllers/api/release_statuses_controller_test.rb
1130
- - test/controllers/api/merge_requests_controller_test.rb
1131
- - test/controllers/api/stacks_controller_test.rb
1132
- - test/controllers/status_controller_test.rb
1133
- - test/controllers/webhooks_controller_test.rb
1134
- - test/controllers/commits_controller_test.rb
1135
- - test/controllers/api_clients_controller_test.rb
1136
- - test/controllers/release_statuses_controller_test.rb
1137
- - test/controllers/commit_checks_controller_test.rb
1138
- - test/controllers/merge_requests_controller_test.rb
1139
- - test/controllers/repositories_controller_test.rb
1140
- - test/controllers/merge_status_controller_test.rb
1141
- - test/controllers/stacks_controller_test.rb
1142
- - test/controllers/rollbacks_controller_test.rb
1143
- - test/controllers/github_authentication_controller_test.rb
1144
- - test/fixtures/timeout
1120
+ - test/dummy/config/secrets_double_github_app.yml
1121
+ - test/dummy/config.ru
1122
+ - test/dummy/db/schema.rb
1123
+ - test/dummy/db/seeds.rb
1124
+ - test/dummy/public/404.html
1125
+ - test/dummy/public/422.html
1126
+ - test/dummy/public/500.html
1127
+ - test/dummy/public/favicon.ico
1145
1128
  - test/fixtures/payloads/check_suite_master.json
1146
- - test/fixtures/payloads/pull_request_reopened.json
1147
- - test/fixtures/payloads/push_not_master.json
1148
- - test/fixtures/payloads/pull_request_with_no_repo.json
1149
- - test/fixtures/payloads/status_master.json
1129
+ - test/fixtures/payloads/invalid_pull_request.json
1130
+ - test/fixtures/payloads/provision_disabled_pull_request.json
1131
+ - test/fixtures/payloads/pull_request_assigned.json
1150
1132
  - test/fixtures/payloads/pull_request_closed.json
1133
+ - test/fixtures/payloads/pull_request_labeled.json
1134
+ - test/fixtures/payloads/pull_request_opened.json
1135
+ - test/fixtures/payloads/pull_request_reopened.json
1151
1136
  - test/fixtures/payloads/pull_request_unlabeled.json
1152
- - test/fixtures/payloads/pull_request_assigned.json
1137
+ - test/fixtures/payloads/pull_request_with_no_repo.json
1153
1138
  - test/fixtures/payloads/push_master.json
1154
- - test/fixtures/payloads/pull_request_opened.json
1155
- - test/fixtures/payloads/pull_request_labeled.json
1156
- - test/fixtures/payloads/provision_disabled_pull_request.json
1157
- - test/fixtures/payloads/invalid_pull_request.json
1158
- - test/fixtures/shipit/pull_request_assignments.yml
1159
- - test/fixtures/shipit/commit_deployments.yml
1139
+ - test/fixtures/payloads/push_not_master.json
1140
+ - test/fixtures/payloads/status_master.json
1141
+ - test/fixtures/shipit/api_clients.yml
1160
1142
  - test/fixtures/shipit/check_runs.yml
1161
- - test/fixtures/shipit/hooks.yml
1162
- - test/fixtures/shipit/release_statuses.yml
1163
- - test/fixtures/shipit/teams.yml
1164
- - test/fixtures/shipit/users.yml
1165
- - test/fixtures/shipit/repositories.yml
1166
1143
  - test/fixtures/shipit/commit_deployment_statuses.yml
1167
- - test/fixtures/shipit/stacks.yml
1144
+ - test/fixtures/shipit/commit_deployments.yml
1168
1145
  - test/fixtures/shipit/commits.yml
1169
- - test/fixtures/shipit/pull_requests.yml
1170
- - test/fixtures/shipit/tasks.yml
1146
+ - test/fixtures/shipit/deliveries.yml
1171
1147
  - test/fixtures/shipit/github_hooks.yml
1148
+ - test/fixtures/shipit/hooks.yml
1172
1149
  - test/fixtures/shipit/memberships.yml
1173
1150
  - test/fixtures/shipit/merge_requests.yml
1151
+ - test/fixtures/shipit/pull_request_assignments.yml
1152
+ - test/fixtures/shipit/pull_requests.yml
1153
+ - test/fixtures/shipit/release_statuses.yml
1154
+ - test/fixtures/shipit/repositories.yml
1155
+ - test/fixtures/shipit/stacks.yml
1174
1156
  - test/fixtures/shipit/statuses.yml
1175
- - test/fixtures/shipit/api_clients.yml
1176
- - test/fixtures/shipit/deliveries.yml
1177
- - test/models/pull_request_assignment_test.rb
1178
- - test/models/status_test.rb
1179
- - test/models/github_hook_test.rb
1157
+ - test/fixtures/shipit/tasks.yml
1158
+ - test/fixtures/shipit/teams.yml
1159
+ - test/fixtures/shipit/users.yml
1160
+ - test/fixtures/timeout
1161
+ - test/helpers/api_helper.rb
1162
+ - test/helpers/fixture_aliases_helper.rb
1163
+ - test/helpers/hooks_helper.rb
1164
+ - test/helpers/json_helper.rb
1165
+ - test/helpers/links_helper.rb
1166
+ - test/helpers/payloads_helper.rb
1167
+ - test/helpers/queries_helper.rb
1168
+ - test/jobs/cache_deploy_spec_job_test.rb
1169
+ - test/jobs/chunk_rollup_job_test.rb
1170
+ - test/jobs/deliver_hook_job_test.rb
1171
+ - test/jobs/destroy_repository_job_test.rb
1172
+ - test/jobs/destroy_stack_job_test.rb
1173
+ - test/jobs/emit_event_job_test.rb
1174
+ - test/jobs/fetch_commit_stats_job_test.rb
1175
+ - test/jobs/fetch_deployed_revision_job_test.rb
1176
+ - test/jobs/github_sync_job_test.rb
1177
+ - test/jobs/mark_deploy_healthy_job_test.rb
1178
+ - test/jobs/perform_task_job_test.rb
1179
+ - test/jobs/process_merge_requests_job_test.rb
1180
+ - test/jobs/purge_old_deliveries_job_test.rb
1181
+ - test/jobs/reap_dead_tasks_job_test.rb
1182
+ - test/jobs/refresh_github_user_job_test.rb
1183
+ - test/jobs/refresh_status_job_test.rb
1184
+ - test/jobs/unique_job_test.rb
1185
+ - test/jobs/update_github_last_deployed_ref_job_test.rb
1186
+ - test/lib/shipit/deploy_commands_test.rb
1187
+ - test/lib/shipit/task_commands_test.rb
1188
+ - test/middleware/same_site_cookie_middleware_test.rb
1189
+ - test/models/api_client_test.rb
1190
+ - test/models/commit_checks_test.rb
1191
+ - test/models/commit_deployment_status_test.rb
1180
1192
  - test/models/commit_deployment_test.rb
1181
- - test/models/delivery_test.rb
1182
- - test/models/hook_test.rb
1183
- - test/models/task_definitions_test.rb
1184
1193
  - test/models/commits_test.rb
1185
- - test/models/merge_request_test.rb
1186
- - test/models/tasks_test.rb
1187
- - test/models/commit_deployment_status_test.rb
1194
+ - test/models/delivery_test.rb
1195
+ - test/models/deploy_spec_test.rb
1188
1196
  - test/models/deploy_stats_test.rb
1189
1197
  - test/models/deploys_test.rb
1190
- - test/models/team_test.rb
1191
- - test/models/deploy_spec_test.rb
1198
+ - test/models/duration_test.rb
1199
+ - test/models/github_hook_test.rb
1200
+ - test/models/hook_test.rb
1192
1201
  - test/models/membership_test.rb
1193
- - test/models/users_test.rb
1194
- - test/models/rollbacks_test.rb
1202
+ - test/models/merge_request_test.rb
1203
+ - test/models/pull_request_assignment_test.rb
1195
1204
  - test/models/release_statuses_test.rb
1196
- - test/models/commit_checks_test.rb
1197
- - test/models/status/missing_test.rb
1198
- - test/models/status/group_test.rb
1205
+ - test/models/rollbacks_test.rb
1206
+ - test/models/shipit/check_run_test.rb
1207
+ - test/models/shipit/deploy_spec/file_system_test.rb
1208
+ - test/models/shipit/provisioning_handler/base_test.rb
1209
+ - test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb
1210
+ - test/models/shipit/provisioning_handler_test.rb
1211
+ - test/models/shipit/pull_request_test.rb
1199
1212
  - test/models/shipit/repository_test.rb
1213
+ - test/models/shipit/review_stack_provision_status_test.rb
1214
+ - test/models/shipit/review_stack_provisioning_queue_test.rb
1215
+ - test/models/shipit/review_stack_test.rb
1200
1216
  - test/models/shipit/stacks_test.rb
1217
+ - test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb
1218
+ - test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb
1219
+ - test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb
1201
1220
  - test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb
1202
1221
  - test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb
1203
1222
  - test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb
1204
- - test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb
1205
- - test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb
1206
1223
  - test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb
1207
- - test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb
1208
- - test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb
1224
+ - test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb
1209
1225
  - test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb
1210
1226
  - test/models/shipit/webhooks/handlers_test.rb
1211
- - test/models/shipit/check_run_test.rb
1212
- - test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb
1213
- - test/models/shipit/provisioning_handler/base_test.rb
1214
- - test/models/shipit/review_stack_test.rb
1215
- - test/models/shipit/provisioning_handler_test.rb
1216
- - test/models/shipit/review_stack_provisioning_queue_test.rb
1217
- - test/models/shipit/pull_request_test.rb
1218
- - test/models/shipit/review_stack_provision_status_test.rb
1219
- - test/models/api_client_test.rb
1227
+ - test/models/status/group_test.rb
1228
+ - test/models/status/missing_test.rb
1229
+ - test/models/status_test.rb
1230
+ - test/models/task_definitions_test.rb
1231
+ - test/models/tasks_test.rb
1232
+ - test/models/team_test.rb
1220
1233
  - test/models/undeployed_commits_test.rb
1221
- - test/models/duration_test.rb
1222
- - test/jobs/process_merge_requests_job_test.rb
1223
- - test/jobs/unique_job_test.rb
1224
- - test/jobs/reap_dead_tasks_job_test.rb
1225
- - test/jobs/github_sync_job_test.rb
1226
- - test/jobs/refresh_github_user_job_test.rb
1227
- - test/jobs/chunk_rollup_job_test.rb
1228
- - test/jobs/fetch_commit_stats_job_test.rb
1229
- - test/jobs/fetch_deployed_revision_job_test.rb
1230
- - test/jobs/destroy_repository_job_test.rb
1231
- - test/jobs/update_github_last_deployed_ref_job_test.rb
1232
- - test/jobs/deliver_hook_job_test.rb
1233
- - test/jobs/refresh_status_job_test.rb
1234
- - test/jobs/perform_task_job_test.rb
1235
- - test/jobs/emit_event_job_test.rb
1236
- - test/jobs/mark_deploy_healthy_job_test.rb
1237
- - test/jobs/purge_old_deliveries_job_test.rb
1238
- - test/jobs/cache_deploy_spec_job_test.rb
1239
- - test/jobs/destroy_stack_job_test.rb
1234
+ - test/models/users_test.rb
1235
+ - test/serializers/shipit/pull_request_serializer_test.rb
1240
1236
  - test/test_command_integration.rb
1237
+ - test/test_helper.rb
1238
+ - test/unit/anonymous_user_serializer_test.rb
1239
+ - test/unit/command_test.rb
1240
+ - test/unit/commands_test.rb
1241
+ - test/unit/commit_serializer_test.rb
1242
+ - test/unit/csv_serializer_test.rb
1243
+ - test/unit/deploy_commands_test.rb
1244
+ - test/unit/deploy_serializer_test.rb
1245
+ - test/unit/environment_variables_test.rb
1246
+ - test/unit/github_app_test.rb
1247
+ - test/unit/github_apps_test.rb
1248
+ - test/unit/github_url_helper_test.rb
1249
+ - test/unit/line_buffer_test.rb
1250
+ - test/unit/rollback_commands_test.rb
1251
+ - test/unit/shipit_deployment_checks_test.rb
1252
+ - test/unit/shipit_helper_test.rb
1253
+ - test/unit/shipit_task_execution_strategy_test.rb
1254
+ - test/unit/shipit_test.rb
1255
+ - test/unit/user_serializer_test.rb
1256
+ - test/unit/variable_definition_test.rb