shipit-engine 0.37.0 → 0.39.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 +8 -3
- data/app/controllers/shipit/api/base_controller.rb +2 -2
- data/app/controllers/shipit/api/deploys_controller.rb +5 -1
- data/app/controllers/shipit/api/stacks_controller.rb +25 -1
- data/app/helpers/shipit/api_clients_helper.rb +12 -0
- data/app/jobs/shipit/continuous_delivery_job.rb +4 -1
- data/app/models/shipit/api_client.rb +1 -1
- data/app/models/shipit/commit_deployment_status.rb +0 -1
- data/app/models/shipit/delivery.rb +1 -1
- data/app/models/shipit/deploy_spec/file_system.rb +14 -2
- data/app/models/shipit/hook.rb +1 -1
- data/app/models/shipit/pull_request.rb +1 -1
- data/app/models/shipit/stack.rb +21 -5
- data/app/models/shipit/task.rb +7 -3
- data/app/models/shipit/task_execution_strategy/default.rb +1 -1
- data/app/models/shipit/user.rb +2 -0
- data/app/views/shipit/_variables.html.erb +1 -1
- data/app/views/shipit/api_clients/show.html.erb +1 -1
- data/app/views/shipit/merge_status/failure.html.erb +1 -1
- data/app/views/shipit/missing_settings.html.erb +1 -1
- data/config/secrets.development.example.yml +1 -1
- data/config/secrets.development.shopify.yml +1 -1
- data/db/migrate/20230703181143_change_commit_deployment_statuses_github_id_to_big_int.rb +5 -0
- data/lib/shipit/engine.rb +1 -1
- data/lib/shipit/github_app.rb +0 -1
- data/lib/shipit/octokit_check_runs.rb +1 -3
- data/lib/shipit/octokit_iterator.rb +2 -0
- data/lib/shipit/stack_commands.rb +11 -1
- data/lib/shipit/task_commands.rb +1 -1
- data/lib/shipit/version.rb +1 -1
- data/lib/shipit.rb +1 -1
- data/test/controllers/api/base_controller_test.rb +1 -1
- data/test/controllers/api/ccmenu_controller_test.rb +1 -1
- data/test/controllers/api/commits_controller_test.rb +1 -1
- data/test/controllers/api/deploys_controller_test.rb +25 -1
- data/test/controllers/api/hooks_controller_test.rb +1 -1
- data/test/controllers/api/locks_controller_test.rb +1 -1
- data/test/controllers/api/merge_requests_controller_test.rb +1 -1
- data/test/controllers/api/outputs_controller_test.rb +1 -1
- data/test/controllers/api/release_statuses_controller_test.rb +1 -1
- data/test/controllers/api/rollback_controller_test.rb +1 -1
- data/test/controllers/api/stacks_controller_test.rb +52 -1
- data/test/controllers/api/tasks_controller_test.rb +1 -1
- data/test/controllers/stacks_controller_test.rb +1 -1
- data/test/controllers/tasks_controller_test.rb +8 -1
- data/test/dummy/config/application.rb +2 -1
- data/test/dummy/config/initializers/0_load_development_secrets.rb +2 -2
- data/test/dummy/config/secrets.development.json +3 -0
- data/test/dummy/config/secrets.test.json +21 -0
- data/test/dummy/db/schema.rb +2 -2
- data/test/helpers/api_helper.rb +13 -0
- data/test/models/commit_deployment_status_test.rb +0 -1
- data/test/models/merge_request_test.rb +4 -1
- data/test/models/shipit/{stacks_test.rb → stack_test.rb} +48 -5
- data/test/models/users_test.rb +8 -0
- data/test/test_helper.rb +2 -2
- data/test/unit/deploy_commands_test.rb +94 -6
- data/test/unit/github_app_test.rb +1 -1
- metadata +15 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d14e4fec687523820d46bf58196894deb71b3acb79358059b743d33c31bf9305
|
4
|
+
data.tar.gz: e5d756e9bc4f452408f40d0a3f1f2d6f06cbeceb7544ae47d91b245acb1fc83b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e4a7e88bdf8fe9c40fe6520054fad67a72af184524bb1a8f3a20c0bea07b858cf5d568b272ce0a95060c8bfa2c64b5cb1adec7487a877e23f37e6a8bf3f143ed
|
7
|
+
data.tar.gz: 6cab2f24a84a81251991dc20b23c4d9f966fa8b98f053b904b34227850efca196133ec2c395a5e0c8444b8c41d6672d1362058fd1c90e543e7b1c97d6f07732a
|
data/README.md
CHANGED
@@ -25,8 +25,8 @@ This guide aims to help you [set up](#installation-and-setup), [use](#using-ship
|
|
25
25
|
**II. USING SHIPIT**
|
26
26
|
|
27
27
|
* [Adding stacks](#adding-stacks)
|
28
|
-
* [Working on stacks](#working-on-stacks)
|
29
|
-
* [Configuring stacks](#configuring-stacks)
|
28
|
+
* [Working on stacks](#working-on-stacks)
|
29
|
+
* [Configuring stacks](#configuring-stacks)
|
30
30
|
|
31
31
|
**III. REFERENCE**
|
32
32
|
|
@@ -357,6 +357,11 @@ For example:
|
|
357
357
|
fetch:
|
358
358
|
curl --silent https://app.example.com/services/ping/version
|
359
359
|
```
|
360
|
+
|
361
|
+
**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),
|
362
|
+
whose `allow_concurrency` keyword argument defaults to `force`, where `force` is true when emergency mode is enabled.
|
363
|
+
If you'd like to separate these two from one another, override this method as desired in your service.
|
364
|
+
|
360
365
|
<h3 id="kubernetes">Kubernetes</h3>
|
361
366
|
|
362
367
|
**<code>kubernetes</code>** allows to specify a Kubernetes namespace and context to deploy to.
|
@@ -641,7 +646,7 @@ Your deploy scripts have access to the following environment variables:
|
|
641
646
|
* `GITHUB_REPO_OWNER`: The GitHub username of the repository owner for the current deploy/task.
|
642
647
|
* `EMAIL`: Email of the user that triggered the deploy/task (if available)
|
643
648
|
* `ENVIRONMENT`: The stack environment (e.g `production` / `staging`)
|
644
|
-
* `BRANCH`: The stack branch (e.g `
|
649
|
+
* `BRANCH`: The stack branch (e.g `main`)
|
645
650
|
* `LAST_DEPLOYED_SHA`: The git SHA of the last deployed commit
|
646
651
|
* `DIFF_LINK`: URL to the diff on GitHub.
|
647
652
|
* `TASK_ID`: ID of the task that is running
|
@@ -93,8 +93,8 @@ module Shipit
|
|
93
93
|
render(status: :not_found, json: { status: '404', error: 'Not Found' })
|
94
94
|
end
|
95
95
|
|
96
|
-
def conflict(
|
97
|
-
render(status: :conflict, json: { status: '409', error:
|
96
|
+
def conflict(error)
|
97
|
+
render(status: :conflict, json: { status: '409', error: error.message })
|
98
98
|
end
|
99
99
|
end
|
100
100
|
end
|
@@ -11,6 +11,7 @@ module Shipit
|
|
11
11
|
params do
|
12
12
|
requires :sha, String, length: { in: 6..40 }
|
13
13
|
accepts :force, Boolean, default: false
|
14
|
+
accepts :allow_concurrency, Boolean
|
14
15
|
accepts :require_ci, Boolean, default: false
|
15
16
|
accepts :env, Hash, default: {}
|
16
17
|
end
|
@@ -18,7 +19,10 @@ module Shipit
|
|
18
19
|
commit = stack.commits.by_sha(params.sha) || param_error!(:sha, 'Unknown revision')
|
19
20
|
param_error!(:force, "Can't deploy a locked stack") if !params.force && stack.locked?
|
20
21
|
param_error!(:require_ci, "Commit is not deployable") if params.require_ci && !commit.deployable?
|
21
|
-
|
22
|
+
|
23
|
+
allow_concurrency = params.allow_concurrency.nil? ? params.force : params.allow_concurrency
|
24
|
+
deploy = stack.trigger_deploy(commit, current_user, env: params.env, force: params.force,
|
25
|
+
allow_concurrency: allow_concurrency)
|
22
26
|
render_resource(deploy, status: :accepted)
|
23
27
|
end
|
24
28
|
end
|
@@ -46,9 +46,13 @@ module Shipit
|
|
46
46
|
accepts :ignore_ci, Boolean
|
47
47
|
accepts :merge_queue_enabled, Boolean
|
48
48
|
accepts :continuous_deployment, Boolean
|
49
|
+
accepts :archived, Boolean
|
49
50
|
end
|
50
51
|
def update
|
51
|
-
stack.update(
|
52
|
+
stack.update(update_params)
|
53
|
+
|
54
|
+
update_archived
|
55
|
+
|
52
56
|
render_resource(stack)
|
53
57
|
end
|
54
58
|
|
@@ -78,6 +82,26 @@ module Shipit
|
|
78
82
|
@stack ||= stacks.from_param!(params[:id])
|
79
83
|
end
|
80
84
|
|
85
|
+
def update_archived
|
86
|
+
if key?(:archived)
|
87
|
+
if params[:archived]
|
88
|
+
stack.archive!(nil)
|
89
|
+
elsif stack.archived?
|
90
|
+
stack.unarchive!
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
def key?(key)
|
96
|
+
params.to_h.key?(key)
|
97
|
+
end
|
98
|
+
|
99
|
+
def update_params
|
100
|
+
params.select do |key, _|
|
101
|
+
%i(environment branch deploy_url ignore_ci merge_queue_enabled continuous_deployment).include?(key)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
81
105
|
def repository
|
82
106
|
@repository ||= Repository.find_or_create_by(owner: repo_owner, name: repo_name)
|
83
107
|
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module Shipit
|
3
|
+
module ApiClientsHelper
|
4
|
+
def api_client_token(api_client)
|
5
|
+
if api_client.created_at >= 5.minutes.ago && current_user == api_client.creator
|
6
|
+
api_client.authentication_token
|
7
|
+
else
|
8
|
+
"#{api_client.authentication_token[0..5]}************************"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -8,7 +8,10 @@ module Shipit
|
|
8
8
|
|
9
9
|
def perform(stack)
|
10
10
|
return unless stack.continuous_deployment?
|
11
|
-
|
11
|
+
|
12
|
+
# checks if there are any tasks running, including concurrent tasks
|
13
|
+
return if stack.occupied?
|
14
|
+
|
12
15
|
stack.trigger_continuous_delivery
|
13
16
|
end
|
14
17
|
end
|
@@ -8,7 +8,7 @@ module Shipit
|
|
8
8
|
|
9
9
|
validates :creator, :name, presence: true
|
10
10
|
|
11
|
-
serialize :permissions, Shipit.serialized_column(:permissions, type: Array)
|
11
|
+
serialize :permissions, coder: Shipit.serialized_column(:permissions, type: Array)
|
12
12
|
PERMISSIONS = %w(
|
13
13
|
read:stack
|
14
14
|
write:stack
|
@@ -48,7 +48,6 @@ module Shipit
|
|
48
48
|
client.create_deployment_status(
|
49
49
|
commit_deployment.api_url,
|
50
50
|
status,
|
51
|
-
accept: 'application/vnd.github.flash-preview+json',
|
52
51
|
target_url: url_helpers.stack_deploy_url(stack, task),
|
53
52
|
description: description.truncate(DESCRIPTION_CHARACTER_LIMIT_ON_GITHUB),
|
54
53
|
environment_url: stack.deploy_url,
|
@@ -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, SafeJSON
|
12
|
+
serialize :response_headers, coder: SafeJSON
|
13
13
|
|
14
14
|
after_commit :purge_old_deliveries, on: :create
|
15
15
|
|
@@ -101,11 +101,23 @@ module Shipit
|
|
101
101
|
end
|
102
102
|
|
103
103
|
def shipit_file_names_in_priority_order
|
104
|
-
[
|
104
|
+
[
|
105
|
+
"#{app_name}.#{@env}.yml",
|
106
|
+
".shipit/#{app_name}.#{@env}.yml",
|
107
|
+
|
108
|
+
"#{app_name}.yml",
|
109
|
+
".shipit/#{app_name}.yml",
|
110
|
+
|
111
|
+
"shipit.#{@env}.yml",
|
112
|
+
".shipit/#{@env}.yml",
|
113
|
+
|
114
|
+
"shipit.yml",
|
115
|
+
".shipit/shipit.yml",
|
116
|
+
].uniq
|
105
117
|
end
|
106
118
|
|
107
119
|
def bare_shipit_filenames
|
108
|
-
["#{app_name}.yml", "shipit.yml"].uniq
|
120
|
+
["#{app_name}.yml", "shipit.yml", ".shipit/#{app_name}.yml", ".shipit/shipit.yml"].uniq
|
109
121
|
end
|
110
122
|
|
111
123
|
def config_file_path
|
data/app/models/shipit/hook.rb
CHANGED
@@ -87,7 +87,7 @@ module Shipit
|
|
87
87
|
validates :content_type, presence: true, inclusion: { in: CONTENT_TYPES.keys }
|
88
88
|
validates :events, presence: true, subset: { of: EVENTS }
|
89
89
|
|
90
|
-
serialize :events, Shipit::CSVSerializer
|
90
|
+
serialize :events, coder: Shipit::CSVSerializer
|
91
91
|
|
92
92
|
scope :global, -> { where(stack_id: nil) }
|
93
93
|
scope :scoped_to, ->(stack) { where(stack_id: stack.id) }
|
@@ -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, Shipit.serialized_column(:labels, type: Array)
|
14
|
+
serialize :labels, coder: Shipit.serialized_column(:labels, type: Array)
|
15
15
|
|
16
16
|
after_create_commit :emit_create_hooks
|
17
17
|
after_update_commit :emit_update_hooks
|
data/app/models/shipit/stack.rb
CHANGED
@@ -101,7 +101,7 @@ module Shipit
|
|
101
101
|
|
102
102
|
validates :lock_reason, length: { maximum: 4096 }
|
103
103
|
|
104
|
-
serialize :cached_deploy_spec, DeploySpec
|
104
|
+
serialize :cached_deploy_spec, coder: DeploySpec
|
105
105
|
delegate(
|
106
106
|
:provisioning_handler_name,
|
107
107
|
:find_task_definition,
|
@@ -150,14 +150,14 @@ module Shipit
|
|
150
150
|
task
|
151
151
|
end
|
152
152
|
|
153
|
-
def build_deploy(until_commit, user, env: nil, force: false)
|
153
|
+
def build_deploy(until_commit, user, env: nil, force: false, allow_concurrency: force)
|
154
154
|
since_commit = last_deployed_commit.presence || commits.first
|
155
155
|
deploys.build(
|
156
156
|
user_id: user.id,
|
157
157
|
until_commit: until_commit,
|
158
158
|
since_commit: since_commit,
|
159
159
|
env: filter_deploy_envs(env&.to_h || {}),
|
160
|
-
allow_concurrency:
|
160
|
+
allow_concurrency: allow_concurrency,
|
161
161
|
ignored_safeties: force || !until_commit.deployable?,
|
162
162
|
max_retries: retries_on_deploy,
|
163
163
|
)
|
@@ -226,8 +226,12 @@ module Shipit
|
|
226
226
|
|
227
227
|
def next_commit_to_deploy
|
228
228
|
commits_to_deploy = commits.order(id: :asc).newer_than(last_deployed_commit).reachable.preload(:statuses)
|
229
|
-
|
230
|
-
|
229
|
+
if maximum_commits_per_deploy
|
230
|
+
commits_with_max_applied = commits_to_deploy.limit(maximum_commits_per_deploy)
|
231
|
+
deployable_commits(commits_with_max_applied) || deployable_commits(commits_to_deploy)
|
232
|
+
else
|
233
|
+
deployable_commits(commits_to_deploy)
|
234
|
+
end
|
231
235
|
end
|
232
236
|
|
233
237
|
def deployed_too_recently?
|
@@ -453,6 +457,14 @@ module Shipit
|
|
453
457
|
@active_task ||= tasks.current
|
454
458
|
end
|
455
459
|
|
460
|
+
def occupied?
|
461
|
+
!!occupied
|
462
|
+
end
|
463
|
+
|
464
|
+
def occupied
|
465
|
+
@occupied ||= tasks.active.last
|
466
|
+
end
|
467
|
+
|
456
468
|
def locked?
|
457
469
|
lock_reason.present?
|
458
470
|
end
|
@@ -620,6 +632,10 @@ module Shipit
|
|
620
632
|
|
621
633
|
private
|
622
634
|
|
635
|
+
def deployable_commits(commits)
|
636
|
+
commits.to_a.reverse.find(&:deployable?)
|
637
|
+
end
|
638
|
+
|
623
639
|
def clear_cache
|
624
640
|
remove_instance_variable(:@active_task) if defined?(@active_task)
|
625
641
|
end
|
data/app/models/shipit/task.rb
CHANGED
@@ -3,7 +3,11 @@ module Shipit
|
|
3
3
|
class Task < Record
|
4
4
|
include DeferredTouch
|
5
5
|
|
6
|
-
ConcurrentTaskRunning
|
6
|
+
class ConcurrentTaskRunning < StandardError
|
7
|
+
def message
|
8
|
+
"A task is already running."
|
9
|
+
end
|
10
|
+
end
|
7
11
|
|
8
12
|
PRESENCE_CHECK_TIMEOUT = 30
|
9
13
|
ACTIVE_STATUSES = %w(pending running aborting).freeze
|
@@ -54,8 +58,8 @@ module Shipit
|
|
54
58
|
end
|
55
59
|
end
|
56
60
|
|
57
|
-
serialize :definition, TaskDefinition
|
58
|
-
serialize :env, Shipit.serialized_column(:env, coder: EnvHash)
|
61
|
+
serialize :definition, coder: TaskDefinition
|
62
|
+
serialize :env, coder: Shipit.serialized_column(:env, coder: EnvHash)
|
59
63
|
|
60
64
|
scope :success, -> { where(status: 'success') }
|
61
65
|
scope :completed, -> { where(status: COMPLETED_STATUSES) }
|
data/app/models/shipit/user.rb
CHANGED
@@ -95,6 +95,8 @@ module Shipit
|
|
95
95
|
update!(github_user: Shipit.github.api.user(github_id))
|
96
96
|
rescue Octokit::NotFound
|
97
97
|
identify_renamed_user!
|
98
|
+
rescue Octokit::Forbidden
|
99
|
+
Rails.logger.info("User #{name}, github_id #{github_id} has forbidden access to their GitHub, likely deleted.")
|
98
100
|
end
|
99
101
|
|
100
102
|
def github_user=(github_user)
|
@@ -9,7 +9,7 @@
|
|
9
9
|
<% if variable.select %>
|
10
10
|
<%= field.select variable.name, options_for_select([["Please select...", { disabled: "disabled" }]] + variable.select, variable.default || "Please select...") %>
|
11
11
|
<% else %>
|
12
|
-
<%= field.text_field variable.name, value: variable.default %>
|
12
|
+
<%= field.text_field variable.name, value: params[variable.name].presence || variable.default %>
|
13
13
|
<% end %>
|
14
14
|
<%= field.label variable.name, variable.title || variable.name %>
|
15
15
|
</p>
|
@@ -15,7 +15,7 @@
|
|
15
15
|
</h4>
|
16
16
|
<span class="status-meta">
|
17
17
|
<%= link_to @stack.to_param, stack_url(@stack), target: '_blank', rel: 'noopener' %>
|
18
|
-
<strong>
|
18
|
+
<strong>main branch is failing!</strong>
|
19
19
|
</span>
|
20
20
|
<%= render 'commit_count_warning' if display_commit_count_warning?(params[:commits].to_i) %>
|
21
21
|
</div>
|
@@ -1,7 +1,7 @@
|
|
1
1
|
host: 'localhost:3000'
|
2
2
|
redis_url: 'redis://127.0.0.1:6379/0'
|
3
3
|
|
4
|
-
# For creating an app see: https://github.com/Shopify/shipit-engine/blob/
|
4
|
+
# For creating an app see: https://github.com/Shopify/shipit-engine/blob/main/docs/setup.md#creating-the-github-app
|
5
5
|
# Can be obtained there: https://github.com/settings/apps
|
6
6
|
# Set the "Authorization callback URL" as `<host>/github/auth/github/callback`
|
7
7
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
host: 'shipit-engine.myshopify.io'
|
2
2
|
redis_url: 'redis://shipit-engine.railgun:6379'
|
3
3
|
|
4
|
-
# For creating an app see: https://github.com/Shopify/shipit-engine/blob/
|
4
|
+
# For creating an app see: https://github.com/Shopify/shipit-engine/blob/main/docs/setup.md#creating-the-github-app
|
5
5
|
|
6
6
|
github:
|
7
7
|
somegithuborg:
|
data/lib/shipit/engine.rb
CHANGED
@@ -21,7 +21,7 @@ module Shipit
|
|
21
21
|
Shipit::Engine.routes.default_url_options[:host] = Shipit.host
|
22
22
|
Pubsubstub.redis_url = Shipit.redis_url.to_s
|
23
23
|
|
24
|
-
Rails.application.
|
24
|
+
Rails.application.credentials.deep_symbolize_keys!
|
25
25
|
|
26
26
|
app.config.assets.paths << Emoji.images_path
|
27
27
|
app.config.assets.precompile += %w(
|
data/lib/shipit/github_app.rb
CHANGED
@@ -103,7 +103,6 @@ module Shipit
|
|
103
103
|
) do
|
104
104
|
response = new_client(bearer_token: authentication_payload).create_app_installation_access_token(
|
105
105
|
installation_id,
|
106
|
-
accept: 'application/vnd.github.machine-man-preview+json',
|
107
106
|
)
|
108
107
|
token = Token.from_github(response)
|
109
108
|
raise AuthenticationFailed if token.blank?
|
@@ -1,9 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module OctokitCheckRuns
|
3
3
|
def check_runs(repo, sha, options = {})
|
4
|
-
paginate("#{Octokit::Repository.path(repo)}/commits/#{sha}/check-runs", options
|
5
|
-
accept: 'application/vnd.github.antiope-preview+json',
|
6
|
-
))
|
4
|
+
paginate("#{Octokit::Repository.path(repo)}/commits/#{sha}/check-runs", options)
|
7
5
|
end
|
8
6
|
end
|
9
7
|
|
@@ -13,6 +13,16 @@ module Shipit
|
|
13
13
|
super.merge(@stack.env)
|
14
14
|
end
|
15
15
|
|
16
|
+
def fetch_commit(commit)
|
17
|
+
create_directories
|
18
|
+
if valid_git_repository?(@stack.git_path)
|
19
|
+
git('fetch', 'origin', '--quiet', '--tags', commit.sha, env: env, chdir: @stack.git_path)
|
20
|
+
else
|
21
|
+
@stack.clear_git_cache!
|
22
|
+
git_clone(@stack.repo_git_url, @stack.git_path, branch: @stack.branch, env: env, chdir: @stack.deploys_path)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
16
26
|
def fetch
|
17
27
|
create_directories
|
18
28
|
if valid_git_repository?(@stack.git_path)
|
@@ -96,7 +106,7 @@ module Shipit
|
|
96
106
|
.success?
|
97
107
|
end
|
98
108
|
|
99
|
-
def git_clone(url, path, branch: '
|
109
|
+
def git_clone(url, path, branch: 'main', **kwargs)
|
100
110
|
git('clone', '--quiet', *modern_git_args, '--recursive', '--branch', branch, url, path, **kwargs)
|
101
111
|
end
|
102
112
|
|
data/lib/shipit/task_commands.rb
CHANGED
data/lib/shipit/version.rb
CHANGED
data/lib/shipit.rb
CHANGED
@@ -3,7 +3,7 @@ require 'test_helper'
|
|
3
3
|
|
4
4
|
module Shipit
|
5
5
|
module Api
|
6
|
-
class DeploysControllerTest <
|
6
|
+
class DeploysControllerTest < ApiControllerTestCase
|
7
7
|
setup do
|
8
8
|
authenticate!
|
9
9
|
@user = shipit_users(:walrus)
|
@@ -81,6 +81,7 @@ module Shipit
|
|
81
81
|
end
|
82
82
|
|
83
83
|
assert_response :conflict
|
84
|
+
assert_json 'error', 'A task is already running.'
|
84
85
|
end
|
85
86
|
|
86
87
|
test "#create refuses to deploy unsuccessful commits if the require_ci flag is passed" do
|
@@ -119,6 +120,29 @@ module Shipit
|
|
119
120
|
assert_response :accepted
|
120
121
|
assert_json 'status', 'pending'
|
121
122
|
end
|
123
|
+
|
124
|
+
test "#create uses allow_concurrency param when provided" do
|
125
|
+
@stack.update!(lock_reason: 'Something broken')
|
126
|
+
|
127
|
+
assert_difference -> { @stack.deploys.count }, 1 do
|
128
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha, force: 'true', allow_concurrency: 'false' }
|
129
|
+
end
|
130
|
+
assert_response :accepted
|
131
|
+
assert_json 'status', 'pending'
|
132
|
+
refute @stack.deploys.last.allow_concurrency
|
133
|
+
end
|
134
|
+
|
135
|
+
test "#create defaults allow_concurrency to force param when not provided" do
|
136
|
+
@stack.update!(lock_reason: 'Something broken')
|
137
|
+
expected_force = true
|
138
|
+
|
139
|
+
assert_difference -> { @stack.deploys.count }, 1 do
|
140
|
+
post :create, params: { stack_id: @stack.to_param, sha: @commit.sha, force: expected_force }
|
141
|
+
end
|
142
|
+
assert_response :accepted
|
143
|
+
assert_json 'status', 'pending'
|
144
|
+
assert_equal expected_force, @stack.deploys.last.allow_concurrency
|
145
|
+
end
|
122
146
|
end
|
123
147
|
end
|
124
148
|
end
|
@@ -3,7 +3,7 @@ require 'test_helper'
|
|
3
3
|
|
4
4
|
module Shipit
|
5
5
|
module Api
|
6
|
-
class MergeRequestsControllerTest <
|
6
|
+
class MergeRequestsControllerTest < ApiControllerTestCase
|
7
7
|
setup do
|
8
8
|
@stack = shipit_stacks(:shipit)
|
9
9
|
@merge_request = shipit_merge_requests(:shipit_pending)
|
@@ -3,7 +3,7 @@ require 'test_helper'
|
|
3
3
|
|
4
4
|
module Shipit
|
5
5
|
module Api
|
6
|
-
class StacksControllerTest <
|
6
|
+
class StacksControllerTest < ApiControllerTestCase
|
7
7
|
setup do
|
8
8
|
authenticate!
|
9
9
|
@stack = shipit_stacks(:shipit)
|
@@ -114,6 +114,57 @@ module Shipit
|
|
114
114
|
refute @stack.continuous_deployment
|
115
115
|
end
|
116
116
|
|
117
|
+
test "#update does not perform archive when key is not provided" do
|
118
|
+
refute_predicate @stack, :archived?
|
119
|
+
refute_predicate @stack, :locked?
|
120
|
+
|
121
|
+
patch :update, params: { id: @stack.to_param }
|
122
|
+
|
123
|
+
@stack.reload
|
124
|
+
refute_predicate @stack, :archived?
|
125
|
+
refute_predicate @stack, :locked?
|
126
|
+
end
|
127
|
+
|
128
|
+
test "#update does not perform unarchive when key is not provided" do
|
129
|
+
@stack.archive!(shipit_users(:walrus))
|
130
|
+
assert_predicate @stack, :locked?
|
131
|
+
assert_predicate @stack, :archived?
|
132
|
+
|
133
|
+
patch :update, params: { id: @stack.to_param }
|
134
|
+
|
135
|
+
@stack.reload
|
136
|
+
assert_predicate @stack, :locked?
|
137
|
+
assert_predicate @stack, :archived?
|
138
|
+
end
|
139
|
+
|
140
|
+
test "#update allows to archive the stack" do
|
141
|
+
refute_predicate @stack, :archived?
|
142
|
+
refute_predicate @stack, :locked?
|
143
|
+
|
144
|
+
patch :update, params: { id: @stack.to_param, archived: true }
|
145
|
+
|
146
|
+
@stack.reload
|
147
|
+
assert_predicate @stack, :locked?
|
148
|
+
assert_predicate @stack, :archived?
|
149
|
+
assert_instance_of AnonymousUser, @stack.lock_author
|
150
|
+
assert_equal "Archived", @stack.lock_reason
|
151
|
+
end
|
152
|
+
|
153
|
+
test "#update allows to unarchive the stack" do
|
154
|
+
@stack.archive!(shipit_users(:walrus))
|
155
|
+
assert_predicate @stack, :locked?
|
156
|
+
assert_predicate @stack, :archived?
|
157
|
+
|
158
|
+
patch :update, params: { id: @stack.to_param, archived: false }
|
159
|
+
|
160
|
+
@stack.reload
|
161
|
+
refute_predicate @stack, :archived?
|
162
|
+
refute_predicate @stack, :locked?
|
163
|
+
assert_nil @stack.locked_since
|
164
|
+
assert_nil @stack.lock_reason
|
165
|
+
assert_instance_of AnonymousUser, @stack.lock_author
|
166
|
+
end
|
167
|
+
|
117
168
|
test "#index returns a list of stacks" do
|
118
169
|
stack = Stack.last
|
119
170
|
get :index
|
@@ -10,7 +10,7 @@ module Shipit
|
|
10
10
|
end
|
11
11
|
|
12
12
|
test "validates that Shipit.github is present" do
|
13
|
-
Rails.application.
|
13
|
+
Rails.application.credentials.stubs(:github).returns(nil)
|
14
14
|
get :index
|
15
15
|
assert_select "#github_app .missing"
|
16
16
|
assert_select ".missing", count: 1
|
@@ -11,9 +11,16 @@ module Shipit
|
|
11
11
|
session[:user_id] = shipit_users(:walrus).id
|
12
12
|
end
|
13
13
|
|
14
|
-
test "tasks defined in the shipit.yml can be displayed" do
|
14
|
+
test "tasks defined in the shipit.yml can be displayed with default variable values" do
|
15
15
|
get :new, params: { stack_id: @stack, definition_id: @definition.id }
|
16
16
|
assert_response :ok
|
17
|
+
assert_select 'input[name="task[env][FOO]"][value="1"]'
|
18
|
+
end
|
19
|
+
|
20
|
+
test "it is possible to provide a default value override for a task" do
|
21
|
+
get :new, params: { stack_id: @stack, definition_id: @definition.id, FOO: '42' }
|
22
|
+
assert_response :ok
|
23
|
+
assert_select 'input[name="task[env][FOO]"][value="42"]'
|
17
24
|
end
|
18
25
|
|
19
26
|
test "tasks defined in the shipit.yml can't be triggered if the stack is being deployed" do
|
@@ -2,8 +2,8 @@ local_secrets = Shipit::Engine.root.join('config/secrets.development.yml')
|
|
2
2
|
if local_secrets.exist?
|
3
3
|
secrets = YAML.load(local_secrets.read).deep_symbolize_keys
|
4
4
|
if Rails.env.development?
|
5
|
-
Rails.application.
|
5
|
+
Rails.application.credentials.deep_merge!(secrets)
|
6
6
|
elsif Rails.env.test?
|
7
|
-
Rails.application.
|
7
|
+
Rails.application.credentials.merge!(redis_url: secrets[:redis_url])
|
8
8
|
end
|
9
9
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
{
|
2
|
+
"host": "shipit.com",
|
3
|
+
"secret_key_base": "s3cr3ts3cr3ts3cr3ts3cr3ts3cr3ts3cr3t",
|
4
|
+
"github_api": {
|
5
|
+
"token": "t0k3n"
|
6
|
+
},
|
7
|
+
"github": {
|
8
|
+
"domain": null,
|
9
|
+
"app_id": 42,
|
10
|
+
"installation_id": 43,
|
11
|
+
"bot_login": "shipit[bot]",
|
12
|
+
"webhook_secret": null,
|
13
|
+
"private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEA7iUQC2uUq/gtQg0gxtyaccuicYgmq1LUr1mOWbmwM1Cv63+S\n73qo8h87FX+YyclY5fZF6SMXIys02JOkImGgbnvEOLcHnImCYrWs03msOzEIO/pG\nM0YedAPtQ2MEiLIu4y8htosVxeqfEOPiq9kQgFxNKyETzjdIA9q1md8sofuJUmPv\nibacW1PecuAMnn+P8qf0XIDp7uh6noB751KvhCaCNTAPtVE9NZ18OmNG9GOyX/pu\npQHIrPgTpTG6KlAe3r6LWvemzwsMtuRGU+K+KhK9dFIlSE+v9rA32KScO8efOh6s\nGu3rWorV4iDu14U62rzEfdzzc63YL94sUbZxbwIDAQABAoIBADLJ8r8MxZtbhYN1\nu0zOFZ45WL6v09dsBfITvnlCUeLPzYUDIzoxxcBFittN6C744x3ARS6wjimw+EdM\nTZALlCSb/sA9wMDQzt7wchhz9Zh2H5RzDu+2f54sjDh38KqancdT8PO2fAFGxX/b\nqicOVyeZB9gv6MJtJc20olBbuXAeBNfcDABF9oxF+0i+Ssg7B4VXiqgcjtGbr/Og\nqRll7AqyTArVx2xEcVfZxeZ4zGnigzcJq4te7yYpxzwk+RxblkPh54Yt4WxZ+8DI\nRsn3r6ajlpwzpwvsJFU2Txq7xBTzGQMFmy/Pnjk83kP2cogxB2+tRyjITGqTwD8b\ngg9PFCkCgYEA+7u8A0l0Cz6p0SI6c7ftVePVRiIhpawWN7og/wEmI6zUjm/3rA+R\nhrhaVKuOD8QF/HdDsqTck5gjGAjTmJz6r33/cl1Tz+pr62znsrB4r0yMKvQbKN81\nWGaWOsi2+ZXqLNv5h5wpUF0MTKlXHeKnwP5kuEvGwVn6WURFCh6PhLMCgYEA8i5e\nJjulJVGyd5HuoY3xyO7E6DjidsqRnVRq+hYpORjnHvTmSwe4+tH4ha2p9Kv2Y6k3\nC1NYY/fSMQoYCCRaYyJleI+la/9tsZqAmtms4ZB8KhFmPHf9fW75i6G0xKWyZ8K+\nE2Ft/UaEiM282593cguV6+Kt5uExnyPxLLK4FlUCgYEAwRJ/JGI8/7bjFkTTYheq\nj5q75BufhOrU6471acAe2XPgXxLfefdC3Xodxh0CS3NESBvNL4Ikr4sbN37lk4Kq\n/th7iOKtuqUIeru/hZy2I3VpeDRbdGCmEJQ2GwYA2LKztg5Nd0Y9paaIHXAwIfrK\nQUqcQ4HTAk8ZpUeoUBeaaeMCgYANLmbjb9WiPVsYVPIHCwHA7PX8qbPxwT7BsGmO\nKQyfVfKmZa/vH4F67Vi4deZNMdrcO8aKMEQcVM2065a5QrlEsgeR00eupB1lUEJ1\nqylUsZeAdqf43JMIc7TTW77KATa/nQLZbTEeWus1wvTngztuEqFbUGAks9cOkVc8\nFpIcbQKBgQDVIL8gPLmn0f+4oLF8MBC+oxtKpz14X5iJ1saGFkzW5I+nIEskpS0S\nqtirnTCnJFGdCrFwctnxiuiCmyGwpBYdjIfHyvYAHnqAtMnESzCUyeSFZiquVW5W\nMvbMmDPoV27XOHU9kIq6NXtfrkpufiyo6/VEYWozXalxKLNuqLYfPQ==\n-----END RSA PRIVATE KEY-----\n",
|
14
|
+
"oauth": {
|
15
|
+
"id": "Iv1.bf2c2c45b449bfd9",
|
16
|
+
"secret": "ef694cd6e45223075d78d138ef014049052665f1",
|
17
|
+
"teams": null
|
18
|
+
}
|
19
|
+
},
|
20
|
+
"redis_url": "redis://127.0.0.1:6379/7"
|
21
|
+
}
|
data/test/dummy/db/schema.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
#
|
11
11
|
# It's strongly recommended that you check this file into your version control system.
|
12
12
|
|
13
|
-
ActiveRecord::Schema.define(version:
|
13
|
+
ActiveRecord::Schema.define(version: 2023_07_03_181143) do
|
14
14
|
|
15
15
|
create_table "api_clients", force: :cascade do |t|
|
16
16
|
t.text "permissions", limit: 65535
|
@@ -42,7 +42,7 @@ ActiveRecord::Schema.define(version: 2021_11_03_154121) do
|
|
42
42
|
create_table "commit_deployment_statuses", force: :cascade do |t|
|
43
43
|
t.integer "commit_deployment_id"
|
44
44
|
t.string "status"
|
45
|
-
t.
|
45
|
+
t.bigint "github_id"
|
46
46
|
t.string "api_url"
|
47
47
|
t.datetime "created_at", null: false
|
48
48
|
t.datetime "updated_at", null: false
|
data/test/helpers/api_helper.rb
CHANGED
@@ -8,3 +8,16 @@ module ApiHelper
|
|
8
8
|
request.headers['Authorization'] = "Basic #{Base64.encode64(client.authentication_token)}"
|
9
9
|
end
|
10
10
|
end
|
11
|
+
|
12
|
+
module Shipit
|
13
|
+
class ApiControllerTestCase < ActionController::TestCase
|
14
|
+
private
|
15
|
+
|
16
|
+
def process(_action, **kwargs)
|
17
|
+
if kwargs[:method] != "GET"
|
18
|
+
kwargs[:as] ||= :json
|
19
|
+
end
|
20
|
+
super
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -15,7 +15,6 @@ module Shipit
|
|
15
15
|
@author.github_api.class.any_instance.expects(:create_deployment_status).with(
|
16
16
|
@deployment.api_url,
|
17
17
|
'in_progress',
|
18
|
-
accept: "application/vnd.github.flash-preview+json",
|
19
18
|
target_url: "http://shipit.com/shopify/shipit-engine/production/deploys/#{@task.id}",
|
20
19
|
description: "walrus triggered the deploy of shopify/shipit-engine/production to #{@deployment.short_sha}",
|
21
20
|
environment_url: "https://shipit.shopify.com",
|
@@ -243,7 +243,10 @@ module Shipit
|
|
243
243
|
end
|
244
244
|
|
245
245
|
test "status transitions emit hooks" do
|
246
|
-
|
246
|
+
expected_args = ->(job_args) do
|
247
|
+
job_args.first[:event] == 'merge'
|
248
|
+
end
|
249
|
+
job = assert_enqueued_with(job: EmitEventJob, args: expected_args) do
|
247
250
|
@pr.reject!('merge_conflict')
|
248
251
|
end
|
249
252
|
params = job.arguments.first
|
@@ -3,7 +3,7 @@ require 'test_helper'
|
|
3
3
|
require 'securerandom'
|
4
4
|
|
5
5
|
module Shipit
|
6
|
-
class
|
6
|
+
class StackTest < ActiveSupport::TestCase
|
7
7
|
def setup
|
8
8
|
@stack = shipit_stacks(:shipit)
|
9
9
|
@expected_base_path = Rails.root.join('data', 'stacks', @stack.to_param).to_s
|
@@ -278,6 +278,36 @@ module Shipit
|
|
278
278
|
end
|
279
279
|
end
|
280
280
|
|
281
|
+
test "#active_task? is false if stack has a concurrent deploy in active state" do
|
282
|
+
@stack.trigger_deploy(shipit_commits(:third), AnonymousUser.new, force: true)
|
283
|
+
refute @stack.active_task?
|
284
|
+
end
|
285
|
+
|
286
|
+
test "#occupied? is false if stack has no deploy in either pending or running state" do
|
287
|
+
@stack.deploys.active.destroy_all
|
288
|
+
refute @stack.occupied?
|
289
|
+
end
|
290
|
+
|
291
|
+
test "#occupied? is false if stack has no deploy at all" do
|
292
|
+
@stack.deploys.destroy_all
|
293
|
+
refute @stack.occupied?
|
294
|
+
end
|
295
|
+
|
296
|
+
test "occupied? is true if stack has a concurrent deploy in active state" do
|
297
|
+
@stack.trigger_deploy(shipit_commits(:third), AnonymousUser.new, force: true)
|
298
|
+
assert @stack.occupied?
|
299
|
+
end
|
300
|
+
|
301
|
+
test "occupied? is true if stack has a deploy in pending state" do
|
302
|
+
@stack.trigger_deploy(shipit_commits(:third), AnonymousUser.new)
|
303
|
+
assert @stack.occupied?
|
304
|
+
end
|
305
|
+
|
306
|
+
test "#occupied? is true if a rollback is ongoing" do
|
307
|
+
shipit_deploys(:shipit_complete).trigger_rollback(AnonymousUser.new)
|
308
|
+
assert @stack.occupied?
|
309
|
+
end
|
310
|
+
|
281
311
|
test "#deployable? returns true if the stack is not locked, not awaiting provision, and is not deploying" do
|
282
312
|
@stack.deploys.destroy_all
|
283
313
|
@stack.update!(lock_reason: nil, awaiting_provision: false)
|
@@ -674,12 +704,12 @@ module Shipit
|
|
674
704
|
assert_equal shipit_commits(:fifth), @stack.next_commit_to_deploy
|
675
705
|
end
|
676
706
|
|
677
|
-
test "#next_commit_to_deploy respects the deploy.max_commits directive" do
|
707
|
+
test "#next_commit_to_deploy respects the deploy.max_commits directive given the commit is deployable" do
|
678
708
|
@stack.tasks.destroy_all
|
679
709
|
|
680
|
-
|
681
|
-
|
682
|
-
assert_predicate
|
710
|
+
third_commit = shipit_commits(:third)
|
711
|
+
third_commit.statuses.create!(stack_id: @stack.id, state: 'success', context: 'ci/travis')
|
712
|
+
assert_predicate third_commit, :deployable?
|
683
713
|
|
684
714
|
assert_equal shipit_commits(:third), @stack.next_commit_to_deploy
|
685
715
|
|
@@ -687,6 +717,19 @@ module Shipit
|
|
687
717
|
assert_equal shipit_commits(:third), @stack.next_commit_to_deploy
|
688
718
|
end
|
689
719
|
|
720
|
+
test "#next_commit_to_deploy deploys the first deployable commit when deploy.max_commits directive fails to find a deployable commit" do
|
721
|
+
@stack.tasks.destroy_all
|
722
|
+
|
723
|
+
third_commit = shipit_commits(:third)
|
724
|
+
third_commit.statuses.create!(stack_id: @stack.id, state: 'success', context: 'ci/travis')
|
725
|
+
assert_predicate third_commit, :deployable?
|
726
|
+
|
727
|
+
assert_equal shipit_commits(:third), @stack.next_commit_to_deploy
|
728
|
+
|
729
|
+
@stack.expects(:maximum_commits_per_deploy).returns(1).at_least_once
|
730
|
+
assert_equal shipit_commits(:third), @stack.next_commit_to_deploy
|
731
|
+
end
|
732
|
+
|
690
733
|
test "setting #lock_reason also sets #locked_since" do
|
691
734
|
assert_predicate @stack.locked_since, :nil?
|
692
735
|
|
data/test/models/users_test.rb
CHANGED
@@ -203,6 +203,14 @@ module Shipit
|
|
203
203
|
assert_equal 'george@cyclim.se', user.email
|
204
204
|
end
|
205
205
|
|
206
|
+
test "#refresh_from_github! logs deleted users" do
|
207
|
+
Shipit.github.api.expects(:user).with(@user.github_id).raises(Octokit::Forbidden)
|
208
|
+
|
209
|
+
Rails.logger.expects(:info).with("User #{@user.name}, github_id #{@user.github_id} has forbidden access to their GitHub, likely deleted.")
|
210
|
+
|
211
|
+
@user.refresh_from_github!
|
212
|
+
end
|
213
|
+
|
206
214
|
test "#github_api uses the user's access token" do
|
207
215
|
assert_equal @user.github_access_token, @user.github_api.access_token
|
208
216
|
end
|
data/test/test_helper.rb
CHANGED
@@ -23,7 +23,7 @@ require 'spy/integration'
|
|
23
23
|
|
24
24
|
# Load fixtures from the engine
|
25
25
|
if ActiveSupport::TestCase.respond_to?(:fixture_path=)
|
26
|
-
ActiveSupport::TestCase.
|
26
|
+
ActiveSupport::TestCase.fixture_paths << File.expand_path("../fixtures", __FILE__)
|
27
27
|
ActiveSupport::TestCase.fixtures(:all)
|
28
28
|
end
|
29
29
|
|
@@ -71,7 +71,7 @@ module ActiveSupport
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
ActiveRecord::Migration.
|
74
|
+
ActiveRecord::Migration.check_all_pending!
|
75
75
|
|
76
76
|
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
|
77
77
|
#
|
@@ -21,6 +21,100 @@ module Shipit
|
|
21
21
|
StackCommands.stubs(git_version: Gem::Version.new('1.8.4.3'))
|
22
22
|
end
|
23
23
|
|
24
|
+
test "#fetch_commit calls git fetch if repository cache already exist" do
|
25
|
+
@stack.git_path.stubs(:exist?).returns(true)
|
26
|
+
@stack.git_path.stubs(:empty?).returns(false)
|
27
|
+
|
28
|
+
command = @commands.fetch_commit(@deploy.until_commit)
|
29
|
+
|
30
|
+
assert_equal %W(git fetch origin --quiet --tags #{@deploy.until_commit.sha}), command.args
|
31
|
+
end
|
32
|
+
|
33
|
+
test "#fetch_commit calls git fetch in git_path directory if repository cache already exist" do
|
34
|
+
@stack.git_path.stubs(:exist?).returns(true)
|
35
|
+
@stack.git_path.stubs(:empty?).returns(false)
|
36
|
+
|
37
|
+
command = @commands.fetch_commit(@deploy.until_commit)
|
38
|
+
|
39
|
+
assert_equal @stack.git_path.to_s, command.chdir
|
40
|
+
end
|
41
|
+
|
42
|
+
test "#fetch_commit calls git clone if repository cache do not exist" do
|
43
|
+
@stack.git_path.stubs(:exist?).returns(false)
|
44
|
+
|
45
|
+
command = @commands.fetch_commit(@deploy.until_commit)
|
46
|
+
|
47
|
+
expected = %W(git clone --quiet --single-branch --recursive --branch master #{@stack.repo_git_url} #{@stack.git_path})
|
48
|
+
assert_equal expected, command.args.map(&:to_s)
|
49
|
+
end
|
50
|
+
|
51
|
+
test "#fetch_commit calls git clone if repository cache is empty" do
|
52
|
+
@stack.git_path.stubs(:exist?).returns(true)
|
53
|
+
@stack.git_path.stubs(:empty?).returns(true)
|
54
|
+
|
55
|
+
command = @commands.fetch_commit(@deploy.until_commit)
|
56
|
+
|
57
|
+
expected = %W(git clone --quiet --single-branch --recursive --branch master #{@stack.repo_git_url} #{@stack.git_path})
|
58
|
+
assert_equal expected, command.args
|
59
|
+
end
|
60
|
+
|
61
|
+
test "#fetch_commit calls git clone if repository cache corrupt" do
|
62
|
+
@stack.git_path.stubs(:exist?).returns(true)
|
63
|
+
@stack.git_path.stubs(:empty?).returns(false)
|
64
|
+
StackCommands.any_instance.expects(:git_cmd_succeeds?)
|
65
|
+
.with(@stack.git_path)
|
66
|
+
.returns(false)
|
67
|
+
|
68
|
+
command = @commands.fetch_commit(@deploy.until_commit)
|
69
|
+
|
70
|
+
expected = %W(git clone --quiet --single-branch --recursive --branch master #{@stack.repo_git_url} #{@stack.git_path})
|
71
|
+
assert_equal expected, command.args
|
72
|
+
end
|
73
|
+
|
74
|
+
test "#fetch_commit clears a corrupted git stash before cloning" do
|
75
|
+
@stack.expects(:clear_git_cache!)
|
76
|
+
@stack.git_path.stubs(:exist?).returns(true)
|
77
|
+
@stack.git_path.stubs(:empty?).returns(false)
|
78
|
+
StackCommands.any_instance.expects(:git_cmd_succeeds?)
|
79
|
+
.with(@stack.git_path)
|
80
|
+
.returns(false)
|
81
|
+
|
82
|
+
command = @commands.fetch_commit(@deploy.until_commit)
|
83
|
+
|
84
|
+
expected = %W(git clone --quiet --single-branch --recursive --branch master #{@stack.repo_git_url} #{@stack.git_path})
|
85
|
+
assert_equal expected, command.args
|
86
|
+
end
|
87
|
+
|
88
|
+
test "#fetch_commit does not use --single-branch if git is outdated" do
|
89
|
+
@stack.git_path.stubs(:exist?).returns(false)
|
90
|
+
StackCommands.stubs(git_version: Gem::Version.new('1.7.2.30'))
|
91
|
+
|
92
|
+
command = @commands.fetch_commit(@deploy.until_commit)
|
93
|
+
|
94
|
+
expected = %W(git clone --quiet --recursive --branch master #{@stack.repo_git_url} #{@stack.git_path})
|
95
|
+
assert_equal expected, command.args.map(&:to_s)
|
96
|
+
end
|
97
|
+
|
98
|
+
test "#fetch_commit calls git fetch in base_path directory if repository cache do not exist" do
|
99
|
+
@stack.git_path.stubs(:exist?).returns(false)
|
100
|
+
|
101
|
+
command = @commands.fetch_commit(@deploy.until_commit)
|
102
|
+
|
103
|
+
assert_equal @stack.deploys_path.to_s, command.chdir
|
104
|
+
end
|
105
|
+
|
106
|
+
test "#fetch_commit merges Shipit.env in ENVIRONMENT" do
|
107
|
+
Shipit.stubs(:env).returns("SPECIFIC_CONFIG" => 5)
|
108
|
+
command = @commands.fetch_commit(@deploy.until_commit)
|
109
|
+
assert_equal '5', command.env["SPECIFIC_CONFIG"]
|
110
|
+
end
|
111
|
+
|
112
|
+
test "#env uses the correct Github token for a stack" do
|
113
|
+
Shipit.github(organization: 'shopify').stubs(:token).returns('aS3cr3Tt0kEn')
|
114
|
+
command = @commands.fetch_commit(@deploy.until_commit)
|
115
|
+
assert_equal 'aS3cr3Tt0kEn', command.env["GITHUB_TOKEN"]
|
116
|
+
end
|
117
|
+
|
24
118
|
test "#fetch calls git fetch if repository cache already exist" do
|
25
119
|
@stack.git_path.stubs(:exist?).returns(true)
|
26
120
|
@stack.git_path.stubs(:empty?).returns(false)
|
@@ -109,12 +203,6 @@ module Shipit
|
|
109
203
|
assert_equal '5', command.env["SPECIFIC_CONFIG"]
|
110
204
|
end
|
111
205
|
|
112
|
-
test "#env uses the correct Github token for a stack" do
|
113
|
-
Shipit.github(organization: 'shopify').stubs(:token).returns('aS3cr3Tt0kEn')
|
114
|
-
command = @commands.fetch
|
115
|
-
assert_equal 'aS3cr3Tt0kEn', command.env["GITHUB_TOKEN"]
|
116
|
-
end
|
117
|
-
|
118
206
|
test "#clone clones the repository cache into the working directory" do
|
119
207
|
commands = @commands.clone
|
120
208
|
assert_equal 2, commands.size
|
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.
|
4
|
+
version: 0.39.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean Boussier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-04-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: active_model_serializers
|
@@ -156,14 +156,14 @@ dependencies:
|
|
156
156
|
requirements:
|
157
157
|
- - "~>"
|
158
158
|
- !ruby/object:Gem::Version
|
159
|
-
version:
|
159
|
+
version: 5.6.0
|
160
160
|
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
|
-
version:
|
166
|
+
version: 5.6.0
|
167
167
|
- !ruby/object:Gem::Dependency
|
168
168
|
name: omniauth-github
|
169
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -198,14 +198,14 @@ dependencies:
|
|
198
198
|
requirements:
|
199
199
|
- - "~>"
|
200
200
|
- !ruby/object:Gem::Version
|
201
|
-
version: 7.
|
201
|
+
version: 7.1.1
|
202
202
|
type: :runtime
|
203
203
|
prerelease: false
|
204
204
|
version_requirements: !ruby/object:Gem::Requirement
|
205
205
|
requirements:
|
206
206
|
- - "~>"
|
207
207
|
- !ruby/object:Gem::Version
|
208
|
-
version: 7.
|
208
|
+
version: 7.1.1
|
209
209
|
- !ruby/object:Gem::Dependency
|
210
210
|
name: rails-timeago
|
211
211
|
requirement: !ruby/object:Gem::Requirement
|
@@ -507,6 +507,7 @@ files:
|
|
507
507
|
- app/controllers/shipit/status_controller.rb
|
508
508
|
- app/controllers/shipit/tasks_controller.rb
|
509
509
|
- app/controllers/shipit/webhooks_controller.rb
|
510
|
+
- app/helpers/shipit/api_clients_helper.rb
|
510
511
|
- app/helpers/shipit/chunks_helper.rb
|
511
512
|
- app/helpers/shipit/deploys_helper.rb
|
512
513
|
- app/helpers/shipit/github_url_helper.rb
|
@@ -771,6 +772,7 @@ files:
|
|
771
772
|
- db/migrate/20210504200438_add_github_updated_at_to_check_runs.rb
|
772
773
|
- db/migrate/20210823075617_change_check_runs_github_updated_at_default.rb
|
773
774
|
- db/migrate/20211103154121_increase_github_team_slug_size.rb
|
775
|
+
- db/migrate/20230703181143_change_commit_deployment_statuses_github_id_to_big_int.rb
|
774
776
|
- lib/shipit-engine.rb
|
775
777
|
- lib/shipit.rb
|
776
778
|
- lib/shipit/cast_value.rb
|
@@ -876,6 +878,8 @@ files:
|
|
876
878
|
- test/dummy/config/initializers/wrap_parameters.rb
|
877
879
|
- test/dummy/config/locales/en.yml
|
878
880
|
- test/dummy/config/routes.rb
|
881
|
+
- test/dummy/config/secrets.development.json
|
882
|
+
- test/dummy/config/secrets.test.json
|
879
883
|
- test/dummy/config/secrets.yml
|
880
884
|
- test/dummy/config/secrets_double_github_app.yml
|
881
885
|
- test/dummy/db/schema.rb
|
@@ -972,7 +976,7 @@ files:
|
|
972
976
|
- test/models/shipit/review_stack_provision_status_test.rb
|
973
977
|
- test/models/shipit/review_stack_provisioning_queue_test.rb
|
974
978
|
- test/models/shipit/review_stack_test.rb
|
975
|
-
- test/models/shipit/
|
979
|
+
- test/models/shipit/stack_test.rb
|
976
980
|
- test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb
|
977
981
|
- test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb
|
978
982
|
- test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb
|
@@ -1039,7 +1043,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1039
1043
|
- !ruby/object:Gem::Version
|
1040
1044
|
version: '0'
|
1041
1045
|
requirements: []
|
1042
|
-
rubygems_version: 3.
|
1046
|
+
rubygems_version: 3.5.7
|
1043
1047
|
signing_key:
|
1044
1048
|
specification_version: 4
|
1045
1049
|
summary: Application deployment software
|
@@ -1102,6 +1106,8 @@ test_files:
|
|
1102
1106
|
- test/dummy/config/initializers/wrap_parameters.rb
|
1103
1107
|
- test/dummy/config/locales/en.yml
|
1104
1108
|
- test/dummy/config/routes.rb
|
1109
|
+
- test/dummy/config/secrets.development.json
|
1110
|
+
- test/dummy/config/secrets.test.json
|
1105
1111
|
- test/dummy/config/secrets.yml
|
1106
1112
|
- test/dummy/config/secrets_double_github_app.yml
|
1107
1113
|
- test/dummy/config.ru
|
@@ -1199,7 +1205,7 @@ test_files:
|
|
1199
1205
|
- test/models/shipit/review_stack_provision_status_test.rb
|
1200
1206
|
- test/models/shipit/review_stack_provisioning_queue_test.rb
|
1201
1207
|
- test/models/shipit/review_stack_test.rb
|
1202
|
-
- test/models/shipit/
|
1208
|
+
- test/models/shipit/stack_test.rb
|
1203
1209
|
- test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb
|
1204
1210
|
- test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb
|
1205
1211
|
- test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb
|