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
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
|
@@ -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
|
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?
|
|
@@ -678,7 +687,7 @@ module Shipit
|
|
|
678
687
|
end
|
|
679
688
|
end
|
|
680
689
|
|
|
681
|
-
test "#add_status schedule a
|
|
690
|
+
test "#add_status schedule a MergeMergeRequests job if the commit transition to `pending` or `success`" do
|
|
682
691
|
commit = shipit_commits(:second)
|
|
683
692
|
github_status = OpenStruct.new(
|
|
684
693
|
state: 'success',
|
|
@@ -688,7 +697,7 @@ module Shipit
|
|
|
688
697
|
)
|
|
689
698
|
|
|
690
699
|
assert_equal 'failure', commit.state
|
|
691
|
-
assert_enqueued_with(job:
|
|
700
|
+
assert_enqueued_with(job: ProcessMergeRequestsJob, args: [@commit.stack]) do
|
|
692
701
|
commit.create_status_from_github!(github_status)
|
|
693
702
|
assert_equal 'success', commit.state
|
|
694
703
|
end
|
|
@@ -729,12 +738,12 @@ module Shipit
|
|
|
729
738
|
sha: '5590fd8b5f2be05d1fedb763a3605ee461c39074',
|
|
730
739
|
message: "Merge pull request #62 from shipit-engine/yoloshipit\n\nyoloshipit!",
|
|
731
740
|
)
|
|
732
|
-
|
|
741
|
+
merge_request = shipit_merge_requests(:shipit_pending)
|
|
733
742
|
|
|
734
743
|
assert_predicate commit, :pull_request?
|
|
735
744
|
assert_equal 62, commit.pull_request_number
|
|
736
|
-
assert_equal
|
|
737
|
-
assert_equal
|
|
745
|
+
assert_equal merge_request.title, commit.pull_request_title
|
|
746
|
+
assert_equal merge_request, commit.merge_request
|
|
738
747
|
end
|
|
739
748
|
|
|
740
749
|
test "merge commits infer pull request number and title from the message if it's not a known pull request" do
|
|
@@ -750,7 +759,7 @@ module Shipit
|
|
|
750
759
|
assert_predicate commit, :pull_request?
|
|
751
760
|
assert_equal 99, commit.pull_request_number
|
|
752
761
|
assert_equal 'yoloshipit!', commit.pull_request_title
|
|
753
|
-
assert_nil commit.
|
|
762
|
+
assert_nil commit.merge_request
|
|
754
763
|
end
|
|
755
764
|
|
|
756
765
|
test "the merge requester if known overrides the commit author" do
|
|
@@ -779,7 +788,7 @@ module Shipit
|
|
|
779
788
|
refute_predicate commit, :pull_request?
|
|
780
789
|
assert_nil commit.pull_request_number
|
|
781
790
|
assert_nil commit.pull_request_title
|
|
782
|
-
assert_nil commit.
|
|
791
|
+
assert_nil commit.merge_request
|
|
783
792
|
end
|
|
784
793
|
|
|
785
794
|
test "#revert? returns false if the message doesn't follow the revert convention" do
|
|
@@ -838,12 +847,12 @@ module Shipit
|
|
|
838
847
|
test "when merged via the queue, deploy_requested_at is merge_requested_at" do
|
|
839
848
|
commit = shipit_commits(:cyclimse_merged)
|
|
840
849
|
assert_predicate commit, :pull_request?
|
|
841
|
-
assert_equal commit.
|
|
842
|
-
assert_equal commit.deploy_requested_at, commit.
|
|
850
|
+
assert_equal commit.merge_request, shipit_merge_requests(:cyclimse_pending_merged)
|
|
851
|
+
assert_equal commit.deploy_requested_at, commit.merge_request.merge_requested_at
|
|
843
852
|
end
|
|
844
853
|
|
|
845
854
|
test "when merged manually after being queued, deploy_requested_at is created_at" do
|
|
846
|
-
pr =
|
|
855
|
+
pr = shipit_merge_requests(:cyclimse_pending_merged)
|
|
847
856
|
pr.cancel!
|
|
848
857
|
commit = shipit_commits(:cyclimse_merged)
|
|
849
858
|
assert_equal commit.deploy_requested_at, commit.created_at
|
|
@@ -870,9 +879,9 @@ module Shipit
|
|
|
870
879
|
|
|
871
880
|
def expect_hook_emit(commit, event, status_attributes, &block)
|
|
872
881
|
matches = lambda do |payload|
|
|
873
|
-
assert_equal
|
|
874
|
-
assert_equal
|
|
875
|
-
assert_equal
|
|
882
|
+
assert_equal(commit, payload[:commit])
|
|
883
|
+
assert_equal(commit.stack, payload[:stack])
|
|
884
|
+
assert_equal(status_attributes[:state], payload[:status])
|
|
876
885
|
end
|
|
877
886
|
expect_hook(event, commit.stack, matches, &block)
|
|
878
887
|
end
|
|
@@ -106,6 +106,12 @@ module Shipit
|
|
|
106
106
|
refute @spec.bundle_install.last.include?('--frozen')
|
|
107
107
|
end
|
|
108
108
|
|
|
109
|
+
test "#provisioning_handler returns `provision.handler` if present" do
|
|
110
|
+
@spec.stubs(:load_config).returns('provision' => { 'handler_name' => 'ExpectedProvisioningHandler' })
|
|
111
|
+
|
|
112
|
+
assert_equal "ExpectedProvisioningHandler", @spec.provisioning_handler_name
|
|
113
|
+
end
|
|
114
|
+
|
|
109
115
|
test '#deploy_steps returns `deploy.override` if present' do
|
|
110
116
|
@spec.stubs(:load_config).returns('deploy' => { 'override' => %w(foo bar baz) })
|
|
111
117
|
assert_equal %w(foo bar baz), @spec.deploy_steps
|
|
@@ -175,11 +181,31 @@ module Shipit
|
|
|
175
181
|
end
|
|
176
182
|
end
|
|
177
183
|
|
|
184
|
+
test '#retries_on_deploy returns `deploy.retries` if present' do
|
|
185
|
+
@spec.stubs(:load_config).returns('deploy' => { 'retries' => 5 })
|
|
186
|
+
assert_equal 5, @spec.retries_on_deploy
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
test '#retries_on_deploy returns a default value if `deploy.retries` is not present' do
|
|
190
|
+
@spec.stubs(:load_config).returns('deploy' => {})
|
|
191
|
+
assert_nil @spec.retries_on_deploy
|
|
192
|
+
end
|
|
193
|
+
|
|
178
194
|
test '#rollback_steps returns `rollback.override` if present' do
|
|
179
195
|
@spec.stubs(:load_config).returns('rollback' => { 'override' => %w(foo bar baz) })
|
|
180
196
|
assert_equal %w(foo bar baz), @spec.rollback_steps
|
|
181
197
|
end
|
|
182
198
|
|
|
199
|
+
test '#retries_on_rollback returns `rollback.retries` if present' do
|
|
200
|
+
@spec.stubs(:load_config).returns('rollback' => { 'retries' => 5 })
|
|
201
|
+
assert_equal 5, @spec.retries_on_rollback
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
test '#retries_on_rollback returns a default value if `rollback.retries` is not present' do
|
|
205
|
+
@spec.stubs(:load_config).returns('rollback' => {})
|
|
206
|
+
assert_nil @spec.retries_on_rollback
|
|
207
|
+
end
|
|
208
|
+
|
|
183
209
|
test '#rollback_steps returns `cap $ENVIRONMENT deploy:rollback` if a `Capfile` is present' do
|
|
184
210
|
@spec.expects(:bundler?).returns(true).at_least_once
|
|
185
211
|
@spec.expects(:capistrano?).returns(true)
|
|
@@ -364,13 +390,20 @@ module Shipit
|
|
|
364
390
|
},
|
|
365
391
|
'dependencies' => { 'override' => [] },
|
|
366
392
|
'plugins' => {},
|
|
393
|
+
'provision' => {
|
|
394
|
+
'handler_name' => nil,
|
|
395
|
+
},
|
|
367
396
|
'deploy' => {
|
|
368
397
|
'override' => nil,
|
|
369
398
|
'variables' => [],
|
|
370
399
|
'max_commits' => 8,
|
|
371
400
|
'interval' => 0,
|
|
401
|
+
'retries' => nil,
|
|
402
|
+
},
|
|
403
|
+
'rollback' => {
|
|
404
|
+
'override' => nil,
|
|
405
|
+
'retries' => nil,
|
|
372
406
|
},
|
|
373
|
-
'rollback' => { 'override' => nil },
|
|
374
407
|
'fetch' => nil,
|
|
375
408
|
'tasks' => {},
|
|
376
409
|
}
|
|
@@ -559,40 +592,40 @@ module Shipit
|
|
|
559
592
|
assert_equal %w(ci/circleci soc/compliance), @spec.required_statuses
|
|
560
593
|
end
|
|
561
594
|
|
|
562
|
-
test "
|
|
595
|
+
test "merge_request_merge_method defaults to `nil`" do
|
|
563
596
|
@spec.expects(:load_config).returns({})
|
|
564
|
-
assert_nil @spec.
|
|
597
|
+
assert_nil @spec.merge_request_merge_method
|
|
565
598
|
end
|
|
566
599
|
|
|
567
|
-
test "
|
|
600
|
+
test "merge_request_merge_method returns `merge.method`" do
|
|
568
601
|
@spec.expects(:load_config).returns(
|
|
569
602
|
'merge' => {
|
|
570
603
|
'method' => 'squash',
|
|
571
604
|
},
|
|
572
605
|
)
|
|
573
|
-
assert_equal 'squash', @spec.
|
|
606
|
+
assert_equal 'squash', @spec.merge_request_merge_method
|
|
574
607
|
end
|
|
575
608
|
|
|
576
|
-
test "
|
|
609
|
+
test "merge_request_merge_method returns `nil` if `merge.method` is invalid" do
|
|
577
610
|
@spec.expects(:load_config).returns(
|
|
578
611
|
'merge' => {
|
|
579
612
|
'method' => 'squashing',
|
|
580
613
|
},
|
|
581
614
|
)
|
|
582
|
-
assert_nil @spec.
|
|
615
|
+
assert_nil @spec.merge_request_merge_method
|
|
583
616
|
end
|
|
584
617
|
|
|
585
|
-
test "
|
|
618
|
+
test "merge_request_ignored_statuses defaults to the union of ci.hide and ci.allow_failures" do
|
|
586
619
|
@spec.expects(:load_config).returns(
|
|
587
620
|
'ci' => {
|
|
588
621
|
'hide' => %w(ci/circleci ci/jenkins),
|
|
589
622
|
'allow_failures' => %w(ci/circleci ci/travis),
|
|
590
623
|
},
|
|
591
624
|
)
|
|
592
|
-
assert_equal %w(ci/circleci ci/jenkins ci/travis).sort, @spec.
|
|
625
|
+
assert_equal %w(ci/circleci ci/jenkins ci/travis).sort, @spec.merge_request_ignored_statuses.sort
|
|
593
626
|
end
|
|
594
627
|
|
|
595
|
-
test "
|
|
628
|
+
test "merge_request_ignored_statuses defaults to empty if `merge.require` is present" do
|
|
596
629
|
@spec.expects(:load_config).returns(
|
|
597
630
|
'merge' => {
|
|
598
631
|
'require' => 'bar',
|
|
@@ -602,10 +635,10 @@ module Shipit
|
|
|
602
635
|
'allow_failures' => %w(ci/circleci ci/travis),
|
|
603
636
|
},
|
|
604
637
|
)
|
|
605
|
-
assert_equal [], @spec.
|
|
638
|
+
assert_equal [], @spec.merge_request_ignored_statuses
|
|
606
639
|
end
|
|
607
640
|
|
|
608
|
-
test "
|
|
641
|
+
test "merge_request_ignored_statuses returns `merge.ignore` if present" do
|
|
609
642
|
@spec.expects(:load_config).returns(
|
|
610
643
|
'merge' => {
|
|
611
644
|
'ignore' => 'bar',
|
|
@@ -615,19 +648,19 @@ module Shipit
|
|
|
615
648
|
'allow_failures' => %w(ci/circleci ci/travis),
|
|
616
649
|
},
|
|
617
650
|
)
|
|
618
|
-
assert_equal ['bar'], @spec.
|
|
651
|
+
assert_equal ['bar'], @spec.merge_request_ignored_statuses
|
|
619
652
|
end
|
|
620
653
|
|
|
621
|
-
test "
|
|
654
|
+
test "merge_request_required_statuses defaults to ci.require" do
|
|
622
655
|
@spec.expects(:load_config).returns(
|
|
623
656
|
'ci' => {
|
|
624
657
|
'require' => %w(ci/circleci ci/jenkins),
|
|
625
658
|
},
|
|
626
659
|
)
|
|
627
|
-
assert_equal %w(ci/circleci ci/jenkins), @spec.
|
|
660
|
+
assert_equal %w(ci/circleci ci/jenkins), @spec.merge_request_required_statuses
|
|
628
661
|
end
|
|
629
662
|
|
|
630
|
-
test "
|
|
663
|
+
test "merge_request_required_statuses defaults to empty if `merge.ignore` is present" do
|
|
631
664
|
@spec.expects(:load_config).returns(
|
|
632
665
|
'merge' => {
|
|
633
666
|
'ignore' => 'bar',
|
|
@@ -636,10 +669,10 @@ module Shipit
|
|
|
636
669
|
'require' => %w(ci/circleci ci/jenkins),
|
|
637
670
|
},
|
|
638
671
|
)
|
|
639
|
-
assert_equal [], @spec.
|
|
672
|
+
assert_equal [], @spec.merge_request_required_statuses
|
|
640
673
|
end
|
|
641
674
|
|
|
642
|
-
test "
|
|
675
|
+
test "merge_request_required_statuses returns `merge.require` if present" do
|
|
643
676
|
@spec.expects(:load_config).returns(
|
|
644
677
|
'merge' => {
|
|
645
678
|
'require' => 'bar',
|
|
@@ -649,21 +682,21 @@ module Shipit
|
|
|
649
682
|
'allow_failures' => %w(ci/circleci ci/travis),
|
|
650
683
|
},
|
|
651
684
|
)
|
|
652
|
-
assert_equal ['bar'], @spec.
|
|
685
|
+
assert_equal ['bar'], @spec.merge_request_required_statuses
|
|
653
686
|
end
|
|
654
687
|
|
|
655
|
-
test "
|
|
688
|
+
test "revalidate_merge_requests_after defaults to `nil" do
|
|
656
689
|
@spec.expects(:load_config).returns({})
|
|
657
|
-
assert_nil @spec.
|
|
690
|
+
assert_nil @spec.revalidate_merge_requests_after
|
|
658
691
|
end
|
|
659
692
|
|
|
660
|
-
test "
|
|
693
|
+
test "revalidate_merge_requests_after defaults to `nil` if `merge.timeout` cannot be parsed" do
|
|
661
694
|
@spec.expects(:load_config).returns(
|
|
662
695
|
'merge' => {
|
|
663
696
|
'revalidate_after' => 'ALSKhfjsdkf',
|
|
664
697
|
},
|
|
665
698
|
)
|
|
666
|
-
assert_nil @spec.
|
|
699
|
+
assert_nil @spec.revalidate_merge_requests_after
|
|
667
700
|
end
|
|
668
701
|
|
|
669
702
|
test "revalidate_after returns `merge.revalidate_after` if present" do
|
|
@@ -672,7 +705,7 @@ module Shipit
|
|
|
672
705
|
'revalidate_after' => '5m30s',
|
|
673
706
|
},
|
|
674
707
|
)
|
|
675
|
-
assert_equal 330, @spec.
|
|
708
|
+
assert_equal 330, @spec.revalidate_merge_requests_after.to_i
|
|
676
709
|
end
|
|
677
710
|
|
|
678
711
|
test "#file is impacted by `machine.directory`" do
|