shipit-engine 0.32.0 → 0.35.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 +4 -4
- data/README.md +13 -2
- 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/_deploy.scss +2 -3
- 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/ccmenu_controller.rb +1 -1
- data/app/controllers/shipit/api/deploys_controller.rb +2 -0
- data/app/controllers/shipit/api/{pull_requests_controller.rb → merge_requests_controller.rb} +8 -8
- data/app/controllers/shipit/api/rollbacks_controller.rb +2 -1
- data/app/controllers/shipit/api/stacks_controller.rb +15 -1
- data/app/controllers/shipit/deploys_controller.rb +1 -1
- 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/stacks_controller.rb +2 -2
- data/app/controllers/shipit/tasks_controller.rb +2 -2
- data/app/controllers/shipit/webhooks_controller.rb +23 -4
- data/app/helpers/shipit/chunks_helper.rb +2 -2
- data/app/helpers/shipit/github_url_helper.rb +8 -0
- data/app/helpers/shipit/shipit_helper.rb +0 -1
- data/app/helpers/shipit/stacks_helper.rb +4 -0
- data/app/jobs/shipit/create_on_github_job.rb +1 -0
- data/app/jobs/shipit/deliver_hook_job.rb +1 -1
- data/app/jobs/shipit/destroy_repository_job.rb +24 -0
- data/app/jobs/shipit/destroy_stack_job.rb +2 -2
- data/app/jobs/shipit/github_sync_job.rb +13 -9
- 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/jobs/shipit/update_github_last_deployed_ref_job.rb +1 -1
- data/app/models/shipit/anonymous_user.rb +10 -2
- data/app/models/shipit/check_run.rb +38 -2
- data/app/models/shipit/command_line_user.rb +4 -0
- data/app/models/shipit/commit.rb +31 -20
- data/app/models/shipit/commit_checks.rb +14 -13
- data/app/models/shipit/commit_deployment.rb +3 -3
- data/app/models/shipit/commit_deployment_status.rb +3 -3
- data/app/models/shipit/deploy.rb +17 -11
- data/app/models/shipit/deploy_spec/file_system.rb +11 -5
- data/app/models/shipit/deploy_spec/lerna_discovery.rb +12 -4
- data/app/models/shipit/deploy_spec.rb +16 -4
- data/app/models/shipit/duration.rb +2 -0
- data/app/models/shipit/hook.rb +28 -2
- data/app/models/shipit/merge_request.rb +304 -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/provisioning_handler.rb +32 -0
- data/app/models/shipit/pull_request.rb +26 -265
- data/app/models/shipit/pull_request_assignment.rb +10 -0
- data/app/models/shipit/release_status.rb +1 -1
- data/app/models/shipit/repository.rb +63 -3
- data/app/models/shipit/review_stack.rb +130 -0
- data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
- data/app/models/shipit/rollback.rb +5 -0
- data/app/models/shipit/stack.rb +78 -30
- data/app/models/shipit/status/group.rb +1 -1
- data/app/models/shipit/task.rb +62 -9
- data/app/models/shipit/task_execution_strategy/base.rb +20 -0
- data/app/models/shipit/task_execution_strategy/default.rb +109 -0
- data/app/models/shipit/team.rb +4 -2
- data/app/models/shipit/user.rb +10 -1
- 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/models/shipit/webhooks/handlers/push_handler.rb +4 -1
- data/app/models/shipit/webhooks.rb +10 -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/validators/subset_validator.rb +1 -1
- data/app/views/layouts/merge_status.html.erb +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 +15 -1
- 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/new.html.erb +1 -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/config/secrets.development.example.yml +24 -0
- data/config/secrets.development.shopify.yml +20 -9
- 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/db/migrate/20210325194053_remove_stacks_branch_default.rb +5 -0
- data/db/migrate/20210504200438_add_github_updated_at_to_check_runs.rb +5 -0
- data/db/migrate/20210823075617_change_check_runs_github_updated_at_default.rb +5 -0
- data/lib/shipit/command.rb +7 -6
- data/lib/shipit/commands.rb +18 -5
- data/lib/shipit/engine.rb +2 -0
- data/lib/shipit/flock.rb +8 -1
- data/lib/shipit/github_app.rb +8 -6
- data/lib/shipit/octokit_iterator.rb +3 -3
- data/lib/shipit/review_stack_commands.rb +8 -0
- data/lib/shipit/simple_message_verifier.rb +2 -2
- data/lib/shipit/stack_commands.rb +36 -7
- data/lib/shipit/task_commands.rb +8 -1
- data/lib/shipit/version.rb +1 -1
- data/lib/shipit.rb +50 -16
- data/lib/snippets/publish-lerna-independent-packages +35 -34
- data/lib/snippets/publish-lerna-independent-packages-legacy +39 -0
- data/lib/tasks/cron.rake +11 -2
- data/test/controllers/api/ccmenu_controller_test.rb +1 -1
- data/test/controllers/api/deploys_controller_test.rb +17 -0
- 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 +42 -8
- 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 +27 -12
- data/test/dummy/app/assets/config/manifest.js +3 -0
- data/test/dummy/config/application.rb +7 -2
- data/test/dummy/config/database.yml +9 -0
- data/test/dummy/config/environments/development.rb +1 -4
- data/test/dummy/config/environments/test.rb +0 -5
- data/test/dummy/config/secrets_double_github_app.yml +79 -0
- data/test/dummy/db/schema.rb +56 -17
- data/test/dummy/db/seeds.rb +2 -1
- data/test/fixtures/payloads/check_suite_master.json +4 -32
- 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/payloads/push_master.json +1 -1
- data/test/fixtures/payloads/push_not_master.json +1 -1
- data/test/fixtures/shipit/commits.yml +17 -4
- data/test/fixtures/shipit/hooks.yml +1 -0
- 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 +4 -1
- data/test/fixtures/shipit/users.yml +7 -0
- data/test/helpers/json_helper.rb +5 -1
- 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/github_sync_job_test.rb +2 -1
- 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/commit_deployment_status_test.rb +3 -3
- data/test/models/commits_test.rb +24 -13
- data/test/models/deploy_spec_test.rb +64 -24
- data/test/models/deploys_test.rb +188 -14
- data/test/models/hook_test.rb +30 -1
- data/test/models/{pull_request_test.rb → merge_request_test.rb} +49 -34
- data/test/models/pull_request_assignment_test.rb +16 -0
- data/test/models/shipit/check_run_test.rb +124 -5
- 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 +91 -0
- data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +52 -8
- 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 +107 -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 +66 -3
- data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
- data/test/test_helper.rb +15 -0
- data/test/unit/anonymous_user_serializer_test.rb +1 -1
- data/test/unit/command_test.rb +8 -3
- data/test/unit/commit_serializer_test.rb +1 -1
- data/test/unit/deploy_commands_test.rb +73 -17
- data/test/unit/deploy_serializer_test.rb +1 -1
- data/test/unit/github_app_test.rb +2 -3
- data/test/unit/github_apps_test.rb +416 -0
- data/test/unit/github_url_helper_test.rb +5 -0
- data/test/unit/shipit_deployment_checks_test.rb +77 -0
- data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
- data/test/unit/shipit_test.rb +14 -0
- data/test/unit/user_serializer_test.rb +1 -1
- metadata +306 -188
- 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
|
@@ -134,3 +134,12 @@ canaries_fifth_success:
|
|
|
134
134
|
created_at: <%= 7.days.ago.to_s(:db) %>
|
|
135
135
|
state: success
|
|
136
136
|
target_url: "http://www.example.com"
|
|
137
|
+
|
|
138
|
+
review_stack_commit_success:
|
|
139
|
+
stack: review_stack
|
|
140
|
+
commit_id: 801
|
|
141
|
+
description: lets go
|
|
142
|
+
context: ci/travis
|
|
143
|
+
created_at: <%= 10.days.ago.to_s(:db) %>
|
|
144
|
+
state: success
|
|
145
|
+
target_url: "http://www.example.com"
|
|
@@ -11,6 +11,7 @@ shipit:
|
|
|
11
11
|
created_at: <%= (60 - 1).minutes.ago.to_s(:db) %>
|
|
12
12
|
started_at: <%= (60 - 1).minutes.ago.to_s(:db) %>
|
|
13
13
|
ended_at: <%= (60 - 6).minutes.ago.to_s(:db) %>
|
|
14
|
+
max_retries: 3
|
|
14
15
|
|
|
15
16
|
shipit2:
|
|
16
17
|
id: 2
|
|
@@ -28,7 +29,7 @@ shipit2:
|
|
|
28
29
|
|
|
29
30
|
shipit_restart:
|
|
30
31
|
id: 3
|
|
31
|
-
user:
|
|
32
|
+
user: ~
|
|
32
33
|
type: Shipit::Task
|
|
33
34
|
stack: shipit
|
|
34
35
|
status: success
|
|
@@ -60,6 +61,8 @@ shipit_pending:
|
|
|
60
61
|
deletions: 406
|
|
61
62
|
created_at: <%= (60 - 4).minutes.ago.to_s(:db) %>
|
|
62
63
|
allow_concurrency: true
|
|
64
|
+
max_retries: 1
|
|
65
|
+
retry_attempt: 0
|
|
63
66
|
|
|
64
67
|
shipit_running:
|
|
65
68
|
id: 5
|
|
@@ -5,6 +5,13 @@ walrus:
|
|
|
5
5
|
encrypted_github_access_token: "ffHk4diyVKppJGfwfJefMizxF45H\n" # t0k3n
|
|
6
6
|
encrypted_github_access_token_iv: "gRSldoTZ+fmrIDoY\n"
|
|
7
7
|
|
|
8
|
+
codertocat:
|
|
9
|
+
name: Coding Cat
|
|
10
|
+
email: coding@cat.com
|
|
11
|
+
login: Codertocat
|
|
12
|
+
encrypted_github_access_token: "ffHk4diyVKppJGfwfJefMizxF45H\n" # t0k3n
|
|
13
|
+
encrypted_github_access_token_iv: "gRSldoTZ+fmrIDoY\n"
|
|
14
|
+
|
|
8
15
|
bob:
|
|
9
16
|
name: Bob the Builder
|
|
10
17
|
email: bob@bob.com
|
data/test/helpers/json_helper.rb
CHANGED
|
@@ -3,7 +3,11 @@ module JSONHelper
|
|
|
3
3
|
UNDEFINED = Object.new.freeze
|
|
4
4
|
private_constant :UNDEFINED
|
|
5
5
|
|
|
6
|
-
def assert_json(path = nil, expected_value = UNDEFINED,
|
|
6
|
+
def assert_json(path = nil, expected_value = UNDEFINED, &block)
|
|
7
|
+
assert_json_document(response.body, path, expected_value, &block)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def assert_json_document(document, path, expected_value = UNDEFINED)
|
|
7
11
|
value = follow_path(path.to_s.split('.'), document: document)
|
|
8
12
|
if block_given?
|
|
9
13
|
yield value
|
|
@@ -5,6 +5,7 @@ module Shipit
|
|
|
5
5
|
class ChunkRollupJobTest < ActiveSupport::TestCase
|
|
6
6
|
setup do
|
|
7
7
|
@task = shipit_tasks(:shipit)
|
|
8
|
+
@task.write("dummy output")
|
|
8
9
|
@job = ChunkRollupJob.new
|
|
9
10
|
end
|
|
10
11
|
|
|
@@ -15,10 +16,10 @@ module Shipit
|
|
|
15
16
|
@job.perform(@task)
|
|
16
17
|
|
|
17
18
|
@task.reload
|
|
18
|
-
assert_equal 0, @task.chunks.count
|
|
19
19
|
assert @task.output.present?
|
|
20
20
|
assert_equal expected_output, @task.chunk_output
|
|
21
21
|
assert @task.rolled_up
|
|
22
|
+
assert_nil Shipit.redis.get(@task.send(:output_key))
|
|
22
23
|
end
|
|
23
24
|
|
|
24
25
|
test "#peform ignores non-finished jobs" do
|
|
@@ -40,5 +41,18 @@ module Shipit
|
|
|
40
41
|
|
|
41
42
|
@job.perform(@task)
|
|
42
43
|
end
|
|
44
|
+
|
|
45
|
+
test "#perform takes into account data still in the DB" do
|
|
46
|
+
output_chunks = Shipit::OutputChunk.create(text: "DB output", task: @task)
|
|
47
|
+
expected_output = [output_chunks.text, @task.chunk_output].join("\n")
|
|
48
|
+
|
|
49
|
+
@job.perform(@task)
|
|
50
|
+
|
|
51
|
+
@task.reload
|
|
52
|
+
assert_equal expected_output, @task.chunk_output
|
|
53
|
+
assert @task.rolled_up
|
|
54
|
+
assert_empty Shipit::OutputChunk.where(task: @task)
|
|
55
|
+
assert_nil Shipit.redis.get(@task.send(:output_key))
|
|
56
|
+
end
|
|
43
57
|
end
|
|
44
58
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require 'test_helper'
|
|
3
|
+
|
|
4
|
+
module Shipit
|
|
5
|
+
class DestroyRepositoryJobTest < ActiveSupport::TestCase
|
|
6
|
+
setup do
|
|
7
|
+
@job = DestroyRepositoryJob.new
|
|
8
|
+
@repository = Repository.first
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
test "perform destroys the repository" do
|
|
12
|
+
assert_difference -> { Repository.count }, -1 do
|
|
13
|
+
@job.perform(@repository)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
test "perform destroys the repository's stacks" do
|
|
18
|
+
stack = Stack.first
|
|
19
|
+
Shipit.github.api.expects(:remove_hook).times(stack.github_hooks.count)
|
|
20
|
+
@repository.stacks << stack
|
|
21
|
+
|
|
22
|
+
assert_difference -> { Stack.count }, -@repository.stacks.size do
|
|
23
|
+
@job.perform(@repository)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -91,7 +91,7 @@ module Shipit
|
|
|
91
91
|
last = stub(sha: 123)
|
|
92
92
|
first = stub(sha: 345)
|
|
93
93
|
Shipit::FirstParentCommitsIterator.any_instance.stubs(:each).multiple_yields(last, first)
|
|
94
|
-
@job.stubs(lookup_commit: nil)
|
|
94
|
+
@job.stubs(lookup_commit: nil, stack: @stack)
|
|
95
95
|
|
|
96
96
|
commits, parent = @job.fetch_missing_commits { stub }
|
|
97
97
|
assert_nil parent
|
|
@@ -104,6 +104,7 @@ module Shipit
|
|
|
104
104
|
Shipit::FirstParentCommitsIterator.any_instance.stubs(:each).multiple_yields(last, first)
|
|
105
105
|
@job.stubs(:lookup_commit).with(123).returns(nil)
|
|
106
106
|
@job.stubs(:lookup_commit).with(345).returns(first)
|
|
107
|
+
@job.stubs(stack: @stack)
|
|
107
108
|
|
|
108
109
|
commits, parent = @job.fetch_missing_commits { stub }
|
|
109
110
|
assert_equal first, parent
|
|
@@ -19,8 +19,8 @@ module Shipit
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
test "#perform fetch commits from the API" do
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture!)
|
|
23
|
+
Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture)
|
|
24
24
|
@commands = stub
|
|
25
25
|
Commands.expects(:for).with(@deploy).returns(@commands)
|
|
26
26
|
|
|
@@ -39,7 +39,7 @@ module Shipit
|
|
|
39
39
|
@deploy.stack.expects(:release_status?).at_least_once.returns(false)
|
|
40
40
|
Dir.stubs(:chdir).yields
|
|
41
41
|
DeployCommands.any_instance.expects(:perform).returns([])
|
|
42
|
-
|
|
42
|
+
Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture!)
|
|
43
43
|
|
|
44
44
|
assert_enqueued_with(job: FetchDeployedRevisionJob, args: [@deploy.stack]) do
|
|
45
45
|
@job.perform(@deploy)
|
|
@@ -50,7 +50,7 @@ module Shipit
|
|
|
50
50
|
@deploy.stack.expects(:release_status?).at_least_once.returns(false)
|
|
51
51
|
Dir.stubs(:chdir).yields
|
|
52
52
|
DeployCommands.any_instance.expects(:perform).returns([])
|
|
53
|
-
|
|
53
|
+
Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture!)
|
|
54
54
|
|
|
55
55
|
assert_equal 'pending', @deploy.status
|
|
56
56
|
@job.perform(@deploy)
|
|
@@ -63,7 +63,7 @@ module Shipit
|
|
|
63
63
|
|
|
64
64
|
Dir.stubs(:chdir).yields
|
|
65
65
|
DeployCommands.any_instance.expects(:perform).returns([])
|
|
66
|
-
|
|
66
|
+
Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture!)
|
|
67
67
|
|
|
68
68
|
assert_equal 'pending', @deploy.status
|
|
69
69
|
@job.perform(@deploy)
|
|
@@ -77,7 +77,7 @@ module Shipit
|
|
|
77
77
|
|
|
78
78
|
Dir.stubs(:chdir).yields
|
|
79
79
|
DeployCommands.any_instance.expects(:perform).returns([])
|
|
80
|
-
|
|
80
|
+
Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture!)
|
|
81
81
|
|
|
82
82
|
assert_equal 'pending', @deploy.status
|
|
83
83
|
@job.perform(@deploy)
|
|
@@ -85,7 +85,7 @@ module Shipit
|
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
test "marks deploy as `error` if any application error is raised" do
|
|
88
|
-
|
|
88
|
+
Shipit::TaskExecutionStrategy::Default.any_instance.expects(:capture!).raises("some error")
|
|
89
89
|
assert_nothing_raised do
|
|
90
90
|
@job.perform(@deploy)
|
|
91
91
|
end
|
|
@@ -94,7 +94,7 @@ module Shipit
|
|
|
94
94
|
end
|
|
95
95
|
|
|
96
96
|
test "marks deploy as `failed` if a command exit with an error code" do
|
|
97
|
-
|
|
97
|
+
Shipit::TaskExecutionStrategy::Default.any_instance.expects(:capture!).at_least_once.raises(Command::Error.new('something'))
|
|
98
98
|
@job.perform(@deploy)
|
|
99
99
|
assert_equal 'failed', @deploy.reload.status
|
|
100
100
|
end
|
|
@@ -2,22 +2,22 @@
|
|
|
2
2
|
require 'test_helper'
|
|
3
3
|
|
|
4
4
|
module Shipit
|
|
5
|
-
class
|
|
5
|
+
class ProcessMergeRequestsJobTest < ActiveSupport::TestCase
|
|
6
6
|
setup do
|
|
7
7
|
@stack = shipit_stacks(:shipit)
|
|
8
|
-
@job =
|
|
8
|
+
@job = ProcessMergeRequestsJob.new
|
|
9
9
|
|
|
10
|
-
@pending_pr =
|
|
11
|
-
@unmergeable_pr =
|
|
12
|
-
@not_ready_pr =
|
|
13
|
-
@closed_pr =
|
|
14
|
-
@merged_pr =
|
|
15
|
-
@expired_pr =
|
|
16
|
-
@mergable_pending_ci =
|
|
10
|
+
@pending_pr = shipit_merge_requests(:shipit_pending)
|
|
11
|
+
@unmergeable_pr = shipit_merge_requests(:shipit_pending_unmergeable)
|
|
12
|
+
@not_ready_pr = shipit_merge_requests(:shipit_pending_not_mergeable_yet)
|
|
13
|
+
@closed_pr = shipit_merge_requests(:shipit_pending_closed)
|
|
14
|
+
@merged_pr = shipit_merge_requests(:shipit_pending_merged)
|
|
15
|
+
@expired_pr = shipit_merge_requests(:shipit_pending_expired)
|
|
16
|
+
@mergable_pending_ci = shipit_merge_requests(:shipit_mergeable_pending_ci)
|
|
17
17
|
end
|
|
18
18
|
|
|
19
19
|
test "#perform rejects unmergeable PRs and merge the others" do
|
|
20
|
-
|
|
20
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
21
21
|
stub_request(:put, "#{@pending_pr.api_url}/merge").to_return(status: %w(200 OK), body: {
|
|
22
22
|
sha: "6dcb09b5b57875f334f61aebed695e2e4193db5e",
|
|
23
23
|
merged: true,
|
|
@@ -35,7 +35,7 @@ module Shipit
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
test "#perform rejects PRs if the merge attempt fails" do
|
|
38
|
-
|
|
38
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
39
39
|
stub_request(:put, "#{@pending_pr.api_url}/merge").to_return(status: %w(405 Method not allowed), body: {
|
|
40
40
|
message: "Pull Request is not mergeable",
|
|
41
41
|
documentation_url: "https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button",
|
|
@@ -47,24 +47,24 @@ module Shipit
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
test "#perform rejects PRs but do not attempt to merge any if the stack doesn't allow merges" do
|
|
50
|
-
|
|
50
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
51
51
|
@stack.update!(lock_reason: 'Maintenance')
|
|
52
52
|
@job.perform(@stack)
|
|
53
53
|
assert_predicate @pending_pr.reload, :pending?
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
test "#perform revalidate PRs but do not attempt to merge any if the stack doesn't allow merges" do
|
|
57
|
-
|
|
57
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
58
58
|
@stack.update!(lock_reason: 'Maintenance')
|
|
59
59
|
@job.perform(@stack)
|
|
60
60
|
assert_predicate @expired_pr.reload, :revalidating?
|
|
61
61
|
end
|
|
62
62
|
|
|
63
63
|
test "#perform schedules a new job if the first PR in the queue is not mergeable yet" do
|
|
64
|
-
|
|
64
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
65
65
|
|
|
66
66
|
@pending_pr.update!(mergeable: nil)
|
|
67
|
-
assert_enqueued_with(job:
|
|
67
|
+
assert_enqueued_with(job: ProcessMergeRequestsJob) do
|
|
68
68
|
@job.perform(@stack)
|
|
69
69
|
end
|
|
70
70
|
assert_predicate @pending_pr.reload, :pending?
|
|
@@ -72,21 +72,21 @@ module Shipit
|
|
|
72
72
|
|
|
73
73
|
test "#perform cancels merge requests for closed PRs" do
|
|
74
74
|
@pending_pr.cancel!
|
|
75
|
-
|
|
75
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
76
76
|
@job.perform(@stack)
|
|
77
77
|
assert_predicate @closed_pr.reload, :canceled?
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
test "#perform cancels merge requests for manually merged PRs" do
|
|
81
81
|
@pending_pr.cancel!
|
|
82
|
-
|
|
82
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
83
83
|
@job.perform(@stack)
|
|
84
84
|
assert_predicate @merged_pr.reload, :canceled?
|
|
85
85
|
end
|
|
86
86
|
|
|
87
87
|
test "#perform does not reject pull requests with pending statuses" do
|
|
88
88
|
@pending_pr.cancel!
|
|
89
|
-
|
|
89
|
+
MergeRequest.any_instance.stubs(:refresh!)
|
|
90
90
|
@job.perform(@stack)
|
|
91
91
|
refute_predicate @mergable_pending_ci.reload, :rejected?
|
|
92
92
|
refute_predicate @mergable_pending_ci.reload, :merged?
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
class DeployCommandsTest < ActiveSupport::TestCase
|
|
6
|
+
test "#env includes the stack's pull request labels" do
|
|
7
|
+
stack = shipit_stacks(:review_stack)
|
|
8
|
+
deploy = stack.trigger_continuous_delivery
|
|
9
|
+
stack.pull_request.labels = ["wip", "bug"]
|
|
10
|
+
|
|
11
|
+
env = Shipit::DeployCommands.new(deploy).env
|
|
12
|
+
|
|
13
|
+
assert_equal env["WIP"], "true"
|
|
14
|
+
assert_equal env["BUG"], "true"
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
class TaskCommandsTest < ActiveSupport::TestCase
|
|
6
|
+
test "#env includes a ReviewStack's pull request labels" do
|
|
7
|
+
stack = shipit_stacks(:review_stack)
|
|
8
|
+
stack.pull_request.labels = ["wip", "bug"]
|
|
9
|
+
task = shipit_tasks(:shipit_restart)
|
|
10
|
+
task.stack = stack
|
|
11
|
+
|
|
12
|
+
env = Shipit::TaskCommands.new(task).env
|
|
13
|
+
|
|
14
|
+
assert_equal env["WIP"], "true"
|
|
15
|
+
assert_equal env["BUG"], "true"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -12,7 +12,7 @@ module Shipit
|
|
|
12
12
|
|
|
13
13
|
test 'creation on GitHub' do
|
|
14
14
|
response = stub(id: 44, url: 'https://example.com')
|
|
15
|
-
@author.github_api.expects(:create_deployment_status).with(
|
|
15
|
+
@author.github_api.class.any_instance.expects(:create_deployment_status).with(
|
|
16
16
|
@deployment.api_url,
|
|
17
17
|
'in_progress',
|
|
18
18
|
accept: "application/vnd.github.flash-preview+json",
|
|
@@ -33,7 +33,7 @@ module Shipit
|
|
|
33
33
|
status = deployment.statuses.create!(status: 'success')
|
|
34
34
|
status.stubs(:description).returns('desc' * limit)
|
|
35
35
|
create_status_response = stub(id: 'abcd', url: 'https://github.com/status/abcd')
|
|
36
|
-
status.author.github_api.expects(:create_deployment_status).with do
|
|
36
|
+
status.author.github_api.class.any_instance.expects(:create_deployment_status).with do |_url, _status, kwargs|
|
|
37
37
|
kwargs[:description].size <= limit
|
|
38
38
|
end.returns(create_status_response)
|
|
39
39
|
|
|
@@ -47,7 +47,7 @@ module Shipit
|
|
|
47
47
|
stack = status.stack
|
|
48
48
|
stack.deploy_url = "stack-deploy-url"
|
|
49
49
|
create_status_response = stub(id: 'abcd', url: 'https://github.com/status/abcd')
|
|
50
|
-
status.author.github_api.expects(:create_deployment_status).with do
|
|
50
|
+
status.author.github_api.class.any_instance.expects(:create_deployment_status).with do |_url, _status, kwargs|
|
|
51
51
|
kwargs[:environment_url] == 'stack-deploy-url'
|
|
52
52
|
end.returns(create_status_response)
|
|
53
53
|
|
data/test/models/commits_test.rb
CHANGED
|
@@ -170,6 +170,15 @@ module Shipit
|
|
|
170
170
|
assert_equal limit, @commit.message.bytesize
|
|
171
171
|
end
|
|
172
172
|
|
|
173
|
+
test "#message= truncates multibyte messages" do
|
|
174
|
+
skip unless Shipit::Commit.columns_hash['message'].limit
|
|
175
|
+
limit = Shipit::Commit.columns_hash['message'].limit
|
|
176
|
+
|
|
177
|
+
@commit.update!(message: '国' * limit)
|
|
178
|
+
assert_operator @commit.message.length, :<=, limit
|
|
179
|
+
assert_operator @commit.message.bytesize, :<=, limit
|
|
180
|
+
end
|
|
181
|
+
|
|
173
182
|
test "#pull_request? detect pull request based on message format" do
|
|
174
183
|
assert @pr.pull_request?
|
|
175
184
|
refute @commit.pull_request?
|
|
@@ -341,6 +350,8 @@ module Shipit
|
|
|
341
350
|
output: mock(
|
|
342
351
|
title: 'Tests build ran successfully',
|
|
343
352
|
),
|
|
353
|
+
completed_at: Time.now,
|
|
354
|
+
started_at: Time.now - 1.minute,
|
|
344
355
|
)
|
|
345
356
|
response = mock(
|
|
346
357
|
check_runs: [check_run],
|
|
@@ -678,7 +689,7 @@ module Shipit
|
|
|
678
689
|
end
|
|
679
690
|
end
|
|
680
691
|
|
|
681
|
-
test "#add_status schedule a
|
|
692
|
+
test "#add_status schedule a MergeMergeRequests job if the commit transition to `pending` or `success`" do
|
|
682
693
|
commit = shipit_commits(:second)
|
|
683
694
|
github_status = OpenStruct.new(
|
|
684
695
|
state: 'success',
|
|
@@ -688,7 +699,7 @@ module Shipit
|
|
|
688
699
|
)
|
|
689
700
|
|
|
690
701
|
assert_equal 'failure', commit.state
|
|
691
|
-
assert_enqueued_with(job:
|
|
702
|
+
assert_enqueued_with(job: ProcessMergeRequestsJob, args: [@commit.stack]) do
|
|
692
703
|
commit.create_status_from_github!(github_status)
|
|
693
704
|
assert_equal 'success', commit.state
|
|
694
705
|
end
|
|
@@ -729,12 +740,12 @@ module Shipit
|
|
|
729
740
|
sha: '5590fd8b5f2be05d1fedb763a3605ee461c39074',
|
|
730
741
|
message: "Merge pull request #62 from shipit-engine/yoloshipit\n\nyoloshipit!",
|
|
731
742
|
)
|
|
732
|
-
|
|
743
|
+
merge_request = shipit_merge_requests(:shipit_pending)
|
|
733
744
|
|
|
734
745
|
assert_predicate commit, :pull_request?
|
|
735
746
|
assert_equal 62, commit.pull_request_number
|
|
736
|
-
assert_equal
|
|
737
|
-
assert_equal
|
|
747
|
+
assert_equal merge_request.title, commit.pull_request_title
|
|
748
|
+
assert_equal merge_request, commit.merge_request
|
|
738
749
|
end
|
|
739
750
|
|
|
740
751
|
test "merge commits infer pull request number and title from the message if it's not a known pull request" do
|
|
@@ -750,7 +761,7 @@ module Shipit
|
|
|
750
761
|
assert_predicate commit, :pull_request?
|
|
751
762
|
assert_equal 99, commit.pull_request_number
|
|
752
763
|
assert_equal 'yoloshipit!', commit.pull_request_title
|
|
753
|
-
assert_nil commit.
|
|
764
|
+
assert_nil commit.merge_request
|
|
754
765
|
end
|
|
755
766
|
|
|
756
767
|
test "the merge requester if known overrides the commit author" do
|
|
@@ -779,7 +790,7 @@ module Shipit
|
|
|
779
790
|
refute_predicate commit, :pull_request?
|
|
780
791
|
assert_nil commit.pull_request_number
|
|
781
792
|
assert_nil commit.pull_request_title
|
|
782
|
-
assert_nil commit.
|
|
793
|
+
assert_nil commit.merge_request
|
|
783
794
|
end
|
|
784
795
|
|
|
785
796
|
test "#revert? returns false if the message doesn't follow the revert convention" do
|
|
@@ -838,12 +849,12 @@ module Shipit
|
|
|
838
849
|
test "when merged via the queue, deploy_requested_at is merge_requested_at" do
|
|
839
850
|
commit = shipit_commits(:cyclimse_merged)
|
|
840
851
|
assert_predicate commit, :pull_request?
|
|
841
|
-
assert_equal commit.
|
|
842
|
-
assert_equal commit.deploy_requested_at, commit.
|
|
852
|
+
assert_equal commit.merge_request, shipit_merge_requests(:cyclimse_pending_merged)
|
|
853
|
+
assert_equal commit.deploy_requested_at, commit.merge_request.merge_requested_at
|
|
843
854
|
end
|
|
844
855
|
|
|
845
856
|
test "when merged manually after being queued, deploy_requested_at is created_at" do
|
|
846
|
-
pr =
|
|
857
|
+
pr = shipit_merge_requests(:cyclimse_pending_merged)
|
|
847
858
|
pr.cancel!
|
|
848
859
|
commit = shipit_commits(:cyclimse_merged)
|
|
849
860
|
assert_equal commit.deploy_requested_at, commit.created_at
|
|
@@ -870,9 +881,9 @@ module Shipit
|
|
|
870
881
|
|
|
871
882
|
def expect_hook_emit(commit, event, status_attributes, &block)
|
|
872
883
|
matches = lambda do |payload|
|
|
873
|
-
assert_equal
|
|
874
|
-
assert_equal
|
|
875
|
-
assert_equal
|
|
884
|
+
assert_equal(commit, payload[:commit])
|
|
885
|
+
assert_equal(commit.stack, payload[:stack])
|
|
886
|
+
assert_equal(status_attributes[:state], payload[:status])
|
|
876
887
|
end
|
|
877
888
|
expect_hook(event, commit.stack, matches, &block)
|
|
878
889
|
end
|