shipit-engine 0.32.0 → 0.33.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/app/assets/images/magic-solid.svg +1 -0
- data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
- data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
- data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
- data/app/assets/stylesheets/_pages/_stacks.scss +19 -0
- data/app/assets/stylesheets/shipit.scss +1 -0
- data/app/controllers/shipit/api/{pull_requests_controller.rb → merge_requests_controller.rb} +8 -8
- data/app/controllers/shipit/api/stacks_controller.rb +14 -1
- data/app/controllers/shipit/deploys_controller.rb +2 -2
- data/app/controllers/shipit/merge_requests_controller.rb +31 -0
- data/app/controllers/shipit/merge_status_controller.rb +15 -15
- data/app/controllers/shipit/repositories_controller.rb +74 -0
- data/app/controllers/shipit/tasks_controller.rb +4 -4
- data/app/helpers/shipit/chunks_helper.rb +2 -2
- data/app/helpers/shipit/github_url_helper.rb +8 -0
- data/app/helpers/shipit/stacks_helper.rb +4 -0
- data/app/jobs/shipit/create_on_github_job.rb +1 -0
- data/app/jobs/shipit/destroy_repository_job.rb +24 -0
- data/app/jobs/shipit/destroy_stack_job.rb +2 -2
- data/app/jobs/shipit/perform_task_job.rb +4 -98
- data/app/jobs/shipit/process_merge_requests_job.rb +32 -0
- data/app/jobs/shipit/refresh_merge_request_job.rb +11 -0
- data/app/models/shipit/anonymous_user.rb +4 -0
- data/app/models/shipit/check_run.rb +2 -2
- data/app/models/shipit/command_line_user.rb +4 -0
- data/app/models/shipit/commit.rb +11 -11
- data/app/models/shipit/commit_checks.rb +1 -0
- data/app/models/shipit/deploy.rb +1 -0
- data/app/models/shipit/deploy_spec.rb +16 -4
- data/app/models/shipit/deploy_spec/file_system.rb +11 -5
- data/app/models/shipit/hook.rb +2 -0
- data/app/models/shipit/merge_request.rb +302 -0
- data/app/models/shipit/provisioning_handler.rb +32 -0
- data/app/models/shipit/provisioning_handler/base.rb +30 -0
- data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
- data/app/models/shipit/pull_request.rb +25 -264
- data/app/models/shipit/pull_request_assignment.rb +10 -0
- data/app/models/shipit/repository.rb +54 -0
- data/app/models/shipit/review_stack.rb +116 -0
- data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
- data/app/models/shipit/stack.rb +22 -8
- data/app/models/shipit/task.rb +56 -7
- data/app/models/shipit/task_execution_strategy/base.rb +20 -0
- data/app/models/shipit/task_execution_strategy/default.rb +110 -0
- data/app/models/shipit/user.rb +6 -1
- data/app/models/shipit/webhooks.rb +10 -0
- data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +74 -0
- data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +68 -0
- data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +74 -0
- data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +127 -0
- data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +106 -0
- data/app/models/shipit/webhooks/handlers/pull_request/opened_handler.rb +83 -0
- data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +88 -0
- data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +103 -0
- data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +107 -0
- data/app/serializers/shipit/deploy_serializer.rb +6 -0
- data/app/serializers/shipit/merge_request_serializer.rb +21 -0
- data/app/serializers/shipit/pull_request_serializer.rb +5 -8
- data/app/serializers/shipit/review_stack_serializer.rb +7 -0
- data/app/serializers/shipit/stack_serializer.rb +7 -6
- data/app/serializers/shipit/tail_task_serializer.rb +10 -2
- data/app/serializers/shipit/task_serializer.rb +1 -1
- data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
- data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
- data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
- data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
- data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
- data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
- data/app/views/shipit/merge_status/failure.html.erb +1 -1
- data/app/views/shipit/merge_status/locked.html.erb +1 -1
- data/app/views/shipit/merge_status/success.html.erb +2 -2
- data/app/views/shipit/repositories/_header.html.erb +19 -0
- data/app/views/shipit/repositories/index.html.erb +31 -0
- data/app/views/shipit/repositories/new.html.erb +23 -0
- data/app/views/shipit/repositories/settings.html.erb +53 -0
- data/app/views/shipit/repositories/show.html.erb +30 -0
- data/app/views/shipit/stacks/_banners.html.erb +13 -0
- data/app/views/shipit/stacks/_header.html.erb +5 -2
- data/app/views/shipit/stacks/_stack.html.erb +8 -0
- data/app/views/shipit/stacks/index.html.erb +2 -1
- data/app/views/shipit/stacks/settings.html.erb +5 -5
- data/app/views/shipit/stacks/show.html.erb +1 -1
- data/app/views/shipit/tasks/_task_output.html.erb +1 -1
- data/config/routes.rb +15 -5
- data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
- data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
- data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
- data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
- data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
- data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
- data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
- data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
- data/lib/shipit.rb +11 -1
- data/lib/shipit/github_app.rb +1 -1
- data/lib/shipit/review_stack_commands.rb +8 -0
- data/lib/shipit/stack_commands.rb +6 -1
- data/lib/shipit/task_commands.rb +1 -0
- data/lib/shipit/version.rb +1 -1
- data/lib/tasks/cron.rake +11 -2
- data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +12 -12
- data/test/controllers/api/outputs_controller_test.rb +1 -0
- data/test/controllers/api/rollback_controller_test.rb +1 -1
- data/test/controllers/api/stacks_controller_test.rb +21 -1
- data/test/controllers/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +6 -6
- data/test/controllers/repositories_controller_test.rb +71 -0
- data/test/controllers/stacks_controller_test.rb +9 -1
- data/test/controllers/tasks_controller_test.rb +14 -2
- data/test/controllers/webhooks_controller_test.rb +1 -1
- data/test/dummy/config/application.rb +6 -1
- data/test/dummy/config/environments/development.rb +0 -3
- data/test/dummy/config/environments/test.rb +0 -5
- data/test/dummy/db/schema.rb +52 -14
- data/test/dummy/db/seeds.rb +1 -1
- data/test/fixtures/payloads/check_suite_master.json +2 -2
- data/test/fixtures/payloads/invalid_pull_request.json +117 -0
- data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
- data/test/fixtures/payloads/pull_request_assigned.json +480 -0
- data/test/fixtures/payloads/pull_request_closed.json +454 -0
- data/test/fixtures/payloads/pull_request_labeled.json +461 -0
- data/test/fixtures/payloads/pull_request_opened.json +454 -0
- data/test/fixtures/payloads/pull_request_reopened.json +454 -0
- data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
- data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
- data/test/fixtures/shipit/commits.yml +15 -2
- data/test/fixtures/shipit/merge_requests.yml +141 -0
- data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
- data/test/fixtures/shipit/pull_requests.yml +10 -131
- data/test/fixtures/shipit/repositories.yml +1 -0
- data/test/fixtures/shipit/stacks.yml +145 -0
- data/test/fixtures/shipit/statuses.yml +9 -0
- data/test/fixtures/shipit/tasks.yml +3 -0
- data/test/fixtures/shipit/users.yml +7 -0
- data/test/helpers/payloads_helper.rb +4 -0
- data/test/jobs/chunk_rollup_job_test.rb +15 -1
- data/test/jobs/destroy_repository_job_test.rb +27 -0
- data/test/jobs/perform_task_job_test.rb +8 -8
- data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +18 -18
- data/test/lib/shipit/deploy_commands_test.rb +16 -0
- data/test/lib/shipit/task_commands_test.rb +17 -0
- data/test/models/commits_test.rb +22 -13
- data/test/models/deploy_spec_test.rb +57 -24
- data/test/models/deploys_test.rb +148 -14
- data/test/models/{pull_request_test.rb → merge_request_test.rb} +30 -30
- data/test/models/pull_request_assignment_test.rb +16 -0
- data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
- data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
- data/test/models/shipit/provisioning_handler_test.rb +64 -0
- data/test/models/shipit/pull_request_test.rb +52 -0
- data/test/models/shipit/repository_test.rb +5 -1
- data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
- data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
- data/test/models/shipit/review_stack_test.rb +59 -0
- data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +10 -4
- data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
- data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
- data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
- data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
- data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
- data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
- data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
- data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +83 -0
- data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
- data/test/models/shipit/{wehbooks → webhooks}/handlers_test.rb +0 -0
- data/test/models/tasks_test.rb +44 -3
- data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
- data/test/unit/command_test.rb +3 -3
- data/test/unit/github_url_helper_test.rb +5 -0
- data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
- metadata +260 -154
- data/app/controllers/shipit/pull_requests_controller.rb +0 -31
- data/app/jobs/shipit/merge_pull_requests_job.rb +0 -32
- data/app/jobs/shipit/refresh_pull_request_job.rb +0 -11
- data/app/views/shipit/pull_requests/_pull_request.html.erb +0 -29
- data/test/fixtures/shipit/output_chunks.yml +0 -47
- data/test/models/output_chunk_test.rb +0 -21
data/test/models/deploys_test.rb
CHANGED
|
@@ -5,6 +5,7 @@ module Shipit
|
|
|
5
5
|
class DeploysTest < ActiveSupport::TestCase
|
|
6
6
|
def setup
|
|
7
7
|
@deploy = shipit_deploys(:shipit)
|
|
8
|
+
@deploy.write("dummy output")
|
|
8
9
|
@deploy.pid = 42
|
|
9
10
|
@stack = shipit_stacks(:shipit)
|
|
10
11
|
@user = shipit_users(:walrus)
|
|
@@ -60,6 +61,146 @@ module Shipit
|
|
|
60
61
|
assert_equal [], @deploy.commits
|
|
61
62
|
end
|
|
62
63
|
|
|
64
|
+
test "deploys retry up to limit upon timeout when configured" do
|
|
65
|
+
runnable_deploy = shipit_deploys(:shipit_pending)
|
|
66
|
+
deploy_stack = runnable_deploy.stack
|
|
67
|
+
|
|
68
|
+
Shipit::Deploy.any_instance.expects(:acquire_git_cache_lock).twice
|
|
69
|
+
.raises(Shipit::Command::TimedOut, 'Deploy timed out')
|
|
70
|
+
.then.raises(Shipit::Command::Error, "Second command error failure")
|
|
71
|
+
|
|
72
|
+
perform_enqueued_jobs(only: Shipit::PerformTaskJob) do
|
|
73
|
+
runnable_deploy.enqueue
|
|
74
|
+
end
|
|
75
|
+
assert_performed_jobs 2
|
|
76
|
+
|
|
77
|
+
runnable_deploy.reload
|
|
78
|
+
assert_equal 'timedout', runnable_deploy.status
|
|
79
|
+
|
|
80
|
+
retried_deploy = deploy_stack.deploys.last
|
|
81
|
+
assert_not_equal runnable_deploy.id, retried_deploy.id
|
|
82
|
+
assert_equal runnable_deploy.since_commit, retried_deploy.since_commit
|
|
83
|
+
assert_equal runnable_deploy.until_commit, retried_deploy.until_commit
|
|
84
|
+
assert_equal 'failed', retried_deploy.status
|
|
85
|
+
assert_equal 1, retried_deploy.retry_attempt
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
test "deploys retry up to limit upon failure when configured" do
|
|
89
|
+
runnable_deploy = shipit_deploys(:shipit_pending)
|
|
90
|
+
deploy_stack = runnable_deploy.stack
|
|
91
|
+
|
|
92
|
+
Shipit::Deploy.any_instance.expects(:acquire_git_cache_lock).twice
|
|
93
|
+
.raises(Shipit::Command::Error, 'Deploy failed')
|
|
94
|
+
.then.raises(Shipit::Command::Error, "Second deploy failed")
|
|
95
|
+
|
|
96
|
+
perform_enqueued_jobs(only: Shipit::PerformTaskJob) do
|
|
97
|
+
runnable_deploy.enqueue
|
|
98
|
+
end
|
|
99
|
+
assert_performed_jobs 2
|
|
100
|
+
|
|
101
|
+
runnable_deploy.reload
|
|
102
|
+
assert_equal 'failed', runnable_deploy.status
|
|
103
|
+
|
|
104
|
+
retried_deploy = deploy_stack.deploys.last
|
|
105
|
+
assert_not_equal runnable_deploy.id, retried_deploy.id
|
|
106
|
+
assert_equal runnable_deploy.since_commit, retried_deploy.since_commit
|
|
107
|
+
assert_equal runnable_deploy.until_commit, retried_deploy.until_commit
|
|
108
|
+
assert_equal 'failed', retried_deploy.status
|
|
109
|
+
assert_equal 1, retried_deploy.retry_attempt
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
test "deploys retry up to limit upon error when configured" do
|
|
113
|
+
runnable_deploy = shipit_deploys(:shipit_pending)
|
|
114
|
+
deploy_stack = runnable_deploy.stack
|
|
115
|
+
|
|
116
|
+
Shipit::Deploy.any_instance.expects(:acquire_git_cache_lock).twice
|
|
117
|
+
.raises(StandardError, 'Deploy failed')
|
|
118
|
+
.then.raises(StandardError, "Second deploy failed")
|
|
119
|
+
|
|
120
|
+
perform_enqueued_jobs(only: Shipit::PerformTaskJob) do
|
|
121
|
+
runnable_deploy.enqueue
|
|
122
|
+
end
|
|
123
|
+
assert_performed_jobs 2
|
|
124
|
+
|
|
125
|
+
runnable_deploy.reload
|
|
126
|
+
assert_equal 'error', runnable_deploy.status
|
|
127
|
+
|
|
128
|
+
retried_deploy = deploy_stack.deploys.last
|
|
129
|
+
assert_not_equal runnable_deploy.id, retried_deploy.id
|
|
130
|
+
assert_equal runnable_deploy.since_commit, retried_deploy.since_commit
|
|
131
|
+
assert_equal runnable_deploy.until_commit, retried_deploy.until_commit
|
|
132
|
+
assert_equal 'error', retried_deploy.status
|
|
133
|
+
assert_equal 1, retried_deploy.retry_attempt
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
test "deploys do not retry upon timeout when not configured" do
|
|
137
|
+
runnable_deploy = shipit_deploys(:shipit_pending)
|
|
138
|
+
runnable_deploy.update!(retry_attempt: 0, max_retries: 0)
|
|
139
|
+
|
|
140
|
+
Shipit::Deploy.any_instance.expects(:acquire_git_cache_lock)
|
|
141
|
+
.raises(Shipit::Command::TimedOut, 'Deploy timed out')
|
|
142
|
+
|
|
143
|
+
perform_enqueued_jobs(only: Shipit::PerformTaskJob) do
|
|
144
|
+
runnable_deploy.enqueue
|
|
145
|
+
end
|
|
146
|
+
assert_performed_jobs 1
|
|
147
|
+
|
|
148
|
+
runnable_deploy.reload
|
|
149
|
+
|
|
150
|
+
assert_equal 'timedout', runnable_deploy.status
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
test "rollbacks retry on timeouts if configured" do
|
|
154
|
+
deploy = shipit_deploys(:shipit)
|
|
155
|
+
deploy_stack = deploy.stack
|
|
156
|
+
|
|
157
|
+
DeploySpec.any_instance.expects(:retries_on_rollback).returns(1)
|
|
158
|
+
|
|
159
|
+
Shipit::Command.any_instance.expects(:run).twice
|
|
160
|
+
.raises(Shipit::Command::TimedOut, 'Rollback timed out')
|
|
161
|
+
.then.raises(Shipit::Command::Error, "Second command error failure")
|
|
162
|
+
|
|
163
|
+
first_rollback = nil
|
|
164
|
+
|
|
165
|
+
perform_enqueued_jobs(only: Shipit::PerformTaskJob) do
|
|
166
|
+
first_rollback = deploy.trigger_rollback(@user, force: true)
|
|
167
|
+
end
|
|
168
|
+
assert_performed_jobs 2
|
|
169
|
+
|
|
170
|
+
first_rollback.reload
|
|
171
|
+
|
|
172
|
+
assert_equal 'timedout', first_rollback.status
|
|
173
|
+
retried_rollback = deploy_stack.deploys_and_rollbacks.last
|
|
174
|
+
|
|
175
|
+
assert_not_equal first_rollback.id, retried_rollback.id
|
|
176
|
+
assert_equal first_rollback.since_commit, retried_rollback.since_commit
|
|
177
|
+
assert_equal first_rollback.until_commit, retried_rollback.until_commit
|
|
178
|
+
assert_equal 'failed', retried_rollback.status
|
|
179
|
+
assert_equal 1, retried_rollback.max_retries
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
test "rollbacks do not retry if not configured" do
|
|
183
|
+
deploy_stack = @deploy.stack
|
|
184
|
+
|
|
185
|
+
DeploySpec.any_instance.expects(:retries_on_rollback).returns(0)
|
|
186
|
+
|
|
187
|
+
Shipit::Command.any_instance.expects(:run).once
|
|
188
|
+
.raises(Shipit::Command::TimedOut, 'Rollback timed out')
|
|
189
|
+
.then.raises(Shipit::Command::Error, "Second command error failure")
|
|
190
|
+
|
|
191
|
+
first_rollback = nil
|
|
192
|
+
|
|
193
|
+
perform_enqueued_jobs(only: Shipit::PerformTaskJob) do
|
|
194
|
+
first_rollback = @deploy.trigger_rollback(@user, force: true)
|
|
195
|
+
end
|
|
196
|
+
assert_performed_jobs 1
|
|
197
|
+
|
|
198
|
+
first_rollback.reload
|
|
199
|
+
|
|
200
|
+
assert_equal 'timedout', first_rollback.status
|
|
201
|
+
assert_equal first_rollback, deploy_stack.deploys_and_rollbacks.last
|
|
202
|
+
end
|
|
203
|
+
|
|
63
204
|
test "additions and deletions are denormalized on before create" do
|
|
64
205
|
stack = shipit_stacks(:shipit)
|
|
65
206
|
first = shipit_commits(:first)
|
|
@@ -200,7 +341,7 @@ module Shipit
|
|
|
200
341
|
since_commit: shipit.commits.first,
|
|
201
342
|
until_commit: shipit.commits.last,
|
|
202
343
|
)
|
|
203
|
-
deploy.stubs(:
|
|
344
|
+
deploy.stubs(:merge_request_head_for_commit).returns(nil)
|
|
204
345
|
|
|
205
346
|
expect_event(deploy)
|
|
206
347
|
deploy.save!
|
|
@@ -263,9 +404,9 @@ module Shipit
|
|
|
263
404
|
assert_in_delta @deploy.ended_at, @stack.last_deployed_at, 2
|
|
264
405
|
end
|
|
265
406
|
|
|
266
|
-
test "transitioning to success schedule a
|
|
407
|
+
test "transitioning to success schedule a MergeMergeRequests job" do
|
|
267
408
|
@deploy = shipit_deploys(:shipit_running)
|
|
268
|
-
assert_enqueued_with(job:
|
|
409
|
+
assert_enqueued_with(job: ProcessMergeRequestsJob, args: [@deploy.stack]) do
|
|
269
410
|
@deploy.complete!
|
|
270
411
|
end
|
|
271
412
|
end
|
|
@@ -393,7 +534,7 @@ module Shipit
|
|
|
393
534
|
# Check that the next item in the series is 1 greater than the last.
|
|
394
535
|
def assert_generated_record_ids_are_sequential(record_id_series)
|
|
395
536
|
record_id_series[0..-2].each_with_index do |id_element, index|
|
|
396
|
-
assert_equal
|
|
537
|
+
assert_equal(id_element + 1, record_id_series[index + 1])
|
|
397
538
|
end
|
|
398
539
|
end
|
|
399
540
|
|
|
@@ -699,20 +840,13 @@ module Shipit
|
|
|
699
840
|
assert_predicate @deploy, :error?
|
|
700
841
|
end
|
|
701
842
|
|
|
702
|
-
test "
|
|
703
|
-
|
|
704
|
-
@deploy.destroy
|
|
705
|
-
end
|
|
706
|
-
end
|
|
707
|
-
|
|
708
|
-
test "#chunk_output joins all chunk test if logs not rolled up" do
|
|
709
|
-
assert_equal @deploy.chunks.count, @deploy.chunks.count
|
|
710
|
-
assert_equal @deploy.chunks.pluck(:text).join, @deploy.chunk_output
|
|
843
|
+
test "#chunk_output fetches from Redis if logs not rolled up" do
|
|
844
|
+
assert_equal Shipit.redis.get(@deploy.send(:output_key)), @deploy.chunk_output
|
|
711
845
|
refute @deploy.rolled_up
|
|
712
846
|
end
|
|
713
847
|
|
|
714
848
|
test "#chunk_output returns logs from records if rolled up" do
|
|
715
|
-
expected_output = @deploy.
|
|
849
|
+
expected_output = Shipit.redis.get(@deploy.send(:output_key))
|
|
716
850
|
@deploy.rollup_chunks
|
|
717
851
|
|
|
718
852
|
assert_no_queries do
|
|
@@ -2,24 +2,24 @@
|
|
|
2
2
|
require 'test_helper'
|
|
3
3
|
|
|
4
4
|
module Shipit
|
|
5
|
-
class
|
|
5
|
+
class MergeRequestTest < ActiveSupport::TestCase
|
|
6
6
|
setup do
|
|
7
7
|
@stack = shipit_stacks(:shipit)
|
|
8
|
-
@pr =
|
|
8
|
+
@pr = shipit_merge_requests(:shipit_pending)
|
|
9
9
|
@user = shipit_users(:walrus)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
test ".request_merge! creates a record and schedule a refresh" do
|
|
13
|
-
|
|
14
|
-
assert_enqueued_with(job:
|
|
15
|
-
|
|
13
|
+
merge_request = nil
|
|
14
|
+
assert_enqueued_with(job: RefreshMergeRequestJob) do
|
|
15
|
+
merge_request = MergeRequest.request_merge!(@stack, 64, @user)
|
|
16
16
|
end
|
|
17
|
-
assert_predicate
|
|
17
|
+
assert_predicate merge_request, :persisted?
|
|
18
18
|
end
|
|
19
19
|
|
|
20
20
|
test ".request_merge! only track pull requests once" do
|
|
21
|
-
assert_difference -> {
|
|
22
|
-
5.times {
|
|
21
|
+
assert_difference -> { MergeRequest.count }, +1 do
|
|
22
|
+
5.times { MergeRequest.request_merge!(@stack, 999, @user) }
|
|
23
23
|
end
|
|
24
24
|
end
|
|
25
25
|
|
|
@@ -27,7 +27,7 @@ module Shipit
|
|
|
27
27
|
original_merge_requested_at = @pr.merge_requested_at
|
|
28
28
|
@pr.cancel!
|
|
29
29
|
assert_predicate @pr, :canceled?
|
|
30
|
-
|
|
30
|
+
MergeRequest.request_merge!(@stack, @pr.number, @user)
|
|
31
31
|
assert_predicate @pr.reload, :pending?
|
|
32
32
|
assert_not_equal original_merge_requested_at, @pr.merge_requested_at
|
|
33
33
|
assert_in_delta Time.now.utc, @pr.merge_requested_at, 2
|
|
@@ -37,7 +37,7 @@ module Shipit
|
|
|
37
37
|
original_merge_requested_at = @pr.merge_requested_at
|
|
38
38
|
@pr.reject!('merge_conflict')
|
|
39
39
|
assert_predicate @pr, :rejected?
|
|
40
|
-
|
|
40
|
+
MergeRequest.request_merge!(@stack, @pr.number, @user)
|
|
41
41
|
assert_predicate @pr.reload, :pending?
|
|
42
42
|
assert_not_equal original_merge_requested_at, @pr.merge_requested_at
|
|
43
43
|
assert_in_delta Time.now.utc, @pr.merge_requested_at, 2
|
|
@@ -48,29 +48,29 @@ module Shipit
|
|
|
48
48
|
original_merge_requested_at = @pr.merge_requested_at
|
|
49
49
|
@pr.revalidate!
|
|
50
50
|
assert_predicate @pr, :revalidating?
|
|
51
|
-
|
|
51
|
+
MergeRequest.request_merge!(@stack, @pr.number, @user)
|
|
52
52
|
assert_predicate @pr.reload, :pending?
|
|
53
53
|
assert_equal original_merge_requested_at, @pr.merge_requested_at
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
test ".extract_number can get a pull request number from different formats" do
|
|
57
|
-
assert_equal 42,
|
|
58
|
-
assert_equal 42,
|
|
59
|
-
assert_equal 42,
|
|
57
|
+
assert_equal 42, MergeRequest.extract_number(@stack, '42')
|
|
58
|
+
assert_equal 42, MergeRequest.extract_number(@stack, '#42')
|
|
59
|
+
assert_equal 42, MergeRequest.extract_number(@stack, 'https://github.com/Shopify/shipit-engine/pull/42')
|
|
60
60
|
|
|
61
|
-
assert_nil
|
|
61
|
+
assert_nil MergeRequest.extract_number(@stack, 'https://github.com/ACME/shipit-engine/pull/42')
|
|
62
62
|
|
|
63
63
|
Shipit.github.expects(:domain).returns('github.acme.com').at_least_once
|
|
64
|
-
assert_equal 42,
|
|
65
|
-
assert_nil
|
|
64
|
+
assert_equal 42, MergeRequest.extract_number(@stack, 'https://github.acme.com/Shopify/shipit-engine/pull/42')
|
|
65
|
+
assert_nil MergeRequest.extract_number(@stack, 'https://github.com/Shopify/shipit-engine/pull/42')
|
|
66
66
|
end
|
|
67
67
|
|
|
68
68
|
test "refresh! pulls state from GitHub" do
|
|
69
|
-
|
|
69
|
+
merge_request = shipit_merge_requests(:shipit_fetching)
|
|
70
70
|
|
|
71
71
|
head_sha = '64b3833d39def7ec65b57b42f496eb27ab4980b6'
|
|
72
72
|
base_sha = 'ba7ab50e02286f7d6c60c1ef75258133dd9ea763'
|
|
73
|
-
Shipit.github.api.expects(:pull_request).with(@stack.github_repo_name,
|
|
73
|
+
Shipit.github.api.expects(:pull_request).with(@stack.github_repo_name, merge_request.number).returns(
|
|
74
74
|
stub(
|
|
75
75
|
id: 4_857_578,
|
|
76
76
|
url: 'https://api.github.com/repos/Shopify/shipit-engine/pulls/64',
|
|
@@ -125,15 +125,15 @@ module Shipit
|
|
|
125
125
|
created_at: 1.day.ago,
|
|
126
126
|
)])
|
|
127
127
|
|
|
128
|
-
|
|
128
|
+
merge_request.refresh!
|
|
129
129
|
|
|
130
|
-
assert_predicate
|
|
131
|
-
assert_predicate
|
|
132
|
-
assert_equal 'super-branch',
|
|
130
|
+
assert_predicate merge_request, :mergeable?
|
|
131
|
+
assert_predicate merge_request, :pending?
|
|
132
|
+
assert_equal 'super-branch', merge_request.branch
|
|
133
133
|
|
|
134
|
-
assert_not_nil
|
|
135
|
-
assert_predicate
|
|
136
|
-
assert_predicate
|
|
134
|
+
assert_not_nil merge_request.head
|
|
135
|
+
assert_predicate merge_request.head, :detached?
|
|
136
|
+
assert_predicate merge_request.head, :success?
|
|
137
137
|
end
|
|
138
138
|
|
|
139
139
|
test "#reject! records the reason" do
|
|
@@ -216,11 +216,11 @@ module Shipit
|
|
|
216
216
|
assert_equal 'requires_rebase', @pr.rejection_reason
|
|
217
217
|
end
|
|
218
218
|
|
|
219
|
-
test "#merge! raises a
|
|
219
|
+
test "#merge! raises a MergeRequest::NotReady if the PR isn't mergeable yet" do
|
|
220
220
|
@pr.update!(mergeable: nil)
|
|
221
221
|
|
|
222
222
|
assert_predicate @pr, :not_mergeable_yet?
|
|
223
|
-
assert_raises
|
|
223
|
+
assert_raises MergeRequest::NotReady do
|
|
224
224
|
@pr.merge!
|
|
225
225
|
end
|
|
226
226
|
@pr.reload
|
|
@@ -234,8 +234,8 @@ module Shipit
|
|
|
234
234
|
params = job.arguments.first
|
|
235
235
|
assert_equal 'merge', params[:event]
|
|
236
236
|
assert_json 'status', 'rejected', document: params[:payload]
|
|
237
|
-
assert_json '
|
|
238
|
-
assert_json '
|
|
237
|
+
assert_json 'merge_request.rejection_reason', 'merge_conflict', document: params[:payload]
|
|
238
|
+
assert_json 'merge_request.number', @pr.number, document: params[:payload]
|
|
239
239
|
end
|
|
240
240
|
|
|
241
241
|
test "#merge! doesnt delete the branch if there are open PRs against it" do
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
class PullRequestAssignmentTest < ActiveSupport::TestCase
|
|
7
|
+
setup do
|
|
8
|
+
@assignment = shipit_pull_request_assignments(:walrus_shopify_developers)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "no duplicates are accepted" do
|
|
12
|
+
assignment = PullRequestAssignment.new(user: @assignment.user, pull_request: @assignment.pull_request)
|
|
13
|
+
refute assignment.valid?
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
module ProvisioningHandler
|
|
7
|
+
class BaseTest < ActiveSupport::TestCase
|
|
8
|
+
test "provides a default #up handler" do
|
|
9
|
+
assert(
|
|
10
|
+
handler.respond_to?(:up),
|
|
11
|
+
"expected #{handler.class.name} to provide a default #up handler"
|
|
12
|
+
)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
test "provides a default #down handler" do
|
|
16
|
+
assert(
|
|
17
|
+
handler.respond_to?(:down),
|
|
18
|
+
"expected #{handler.class.name} to provide a default #down handler"
|
|
19
|
+
)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
test "provides a default #provision? handler" do
|
|
23
|
+
assert_equal true, handler.provision?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def handler
|
|
29
|
+
ProvisioningHandler::Base.new(mock("Stack"))
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
module ProvisioningHandler
|
|
7
|
+
class UnregisteredProvisioningHandlerTest < ActiveSupport::TestCase
|
|
8
|
+
test "#up stops transitions" do
|
|
9
|
+
stack = shipit_stacks(:shipit)
|
|
10
|
+
stack.update(provision_status: :deprovisioned)
|
|
11
|
+
|
|
12
|
+
assert_throws :halt do
|
|
13
|
+
UnregisteredProvisioningHandler.new(stack).up
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
test "#up locks the stack" do
|
|
18
|
+
stack = shipit_stacks(:shipit)
|
|
19
|
+
stack.update(provision_status: :deprovisioned)
|
|
20
|
+
|
|
21
|
+
assert_changes -> { stack.locked? }, from: false, to: true do
|
|
22
|
+
catch :halt do
|
|
23
|
+
UnregisteredProvisioningHandler.new(stack).up
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
test "#down stops transitions" do
|
|
29
|
+
stack = shipit_stacks(:shipit)
|
|
30
|
+
stack.update(provision_status: :deprovisioned)
|
|
31
|
+
|
|
32
|
+
assert_throws :halt do
|
|
33
|
+
UnregisteredProvisioningHandler.new(stack).down
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
test "#down prevents transitions" do
|
|
38
|
+
stack = shipit_stacks(:shipit)
|
|
39
|
+
stack.update(provision_status: :deprovisioned)
|
|
40
|
+
|
|
41
|
+
assert_changes -> { stack.locked? }, from: false, to: true do
|
|
42
|
+
catch :halt do
|
|
43
|
+
UnregisteredProvisioningHandler.new(stack).down
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'test_helper'
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
class StackProvisioningHandlerTest < ActiveSupport::TestCase
|
|
7
|
+
teardown do
|
|
8
|
+
Shipit::ProvisioningHandler.reset_registry!
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "uses the no-op handler as default when no default handler is registered" do
|
|
12
|
+
assert_equal Shipit::ProvisioningHandler::Base, Shipit::ProvisioningHandler.default
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
test "allows registration of a default handler" do
|
|
16
|
+
mock_handler = mock("Mock Provisioning Handler")
|
|
17
|
+
|
|
18
|
+
Shipit::ProvisioningHandler.default = mock_handler
|
|
19
|
+
|
|
20
|
+
assert_equal mock_handler, Shipit::ProvisioningHandler.default
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
test "UnregisteredProvisioningHandler is returned when an attempt to fetch an unregistered handler is made" do
|
|
24
|
+
unregistered_handler = mock("Mock Provisioning Handler")
|
|
25
|
+
|
|
26
|
+
assert_equal(
|
|
27
|
+
Shipit::ProvisioningHandler::UnregisteredProvisioningHandler,
|
|
28
|
+
Shipit::ProvisioningHandler.fetch(unregistered_handler)
|
|
29
|
+
)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
test "registers handlers so they become fetchable" do
|
|
33
|
+
mock_handler = mock("Mock Provisioning Handler")
|
|
34
|
+
|
|
35
|
+
Shipit::ProvisioningHandler.register(mock_handler)
|
|
36
|
+
|
|
37
|
+
assert_equal mock_handler, Shipit::ProvisioningHandler.fetch(mock_handler.to_s)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
test "handlers are called during provisioning" do
|
|
41
|
+
stack = shipit_stacks(:review_stack)
|
|
42
|
+
stack.update(
|
|
43
|
+
provision_status: :deprovisioned
|
|
44
|
+
)
|
|
45
|
+
handler = Shipit::ProvisioningHandler.default
|
|
46
|
+
|
|
47
|
+
handler.any_instance.expects(:up)
|
|
48
|
+
|
|
49
|
+
assert stack.provision!, "stack should have provisioned."
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test "handlers are called during deprovisioning" do
|
|
53
|
+
stack = shipit_stacks(:review_stack)
|
|
54
|
+
stack.update(
|
|
55
|
+
provision_status: :provisioned
|
|
56
|
+
)
|
|
57
|
+
handler = Shipit::ProvisioningHandler.default
|
|
58
|
+
|
|
59
|
+
handler.any_instance.expects(:down)
|
|
60
|
+
|
|
61
|
+
assert stack.deprovision!, "stack should have deprovisioned."
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|