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
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
module Webhooks
|
|
7
|
+
module Handlers
|
|
8
|
+
module PullRequest
|
|
9
|
+
class ReviewStackAdapterTest < ActiveSupport::TestCase
|
|
10
|
+
test "unarchive! on an unarchived stack is a no-op" do
|
|
11
|
+
stack = create_stack
|
|
12
|
+
review_stack = Shipit::Webhooks::Handlers::PullRequest::ReviewStackAdapter.new(
|
|
13
|
+
params_for(stack),
|
|
14
|
+
scope: stack.repository.stacks
|
|
15
|
+
)
|
|
16
|
+
Shipit::ReviewStack.any_instance.expects(:unarchive!).never
|
|
17
|
+
Shipit::ReviewStackProvisioningQueue.expects(:add).never
|
|
18
|
+
|
|
19
|
+
review_stack.unarchive!
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
test "archive! on an archived stack is a no-op" do
|
|
23
|
+
stack = create_archived_stack
|
|
24
|
+
review_stack = Shipit::Webhooks::Handlers::PullRequest::ReviewStackAdapter.new(
|
|
25
|
+
params_for(stack),
|
|
26
|
+
scope: stack.repository.stacks
|
|
27
|
+
)
|
|
28
|
+
Shipit::Stack.any_instance.expects(:archive!).never
|
|
29
|
+
|
|
30
|
+
review_stack.archive!
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
test "archive! removes stacks awaiting provisioning from the provisioning queue" do
|
|
34
|
+
stack = create_stack
|
|
35
|
+
stack.enqueue_for_provisioning
|
|
36
|
+
review_stack = Shipit::Webhooks::Handlers::PullRequest::ReviewStackAdapter.new(
|
|
37
|
+
params_for(stack),
|
|
38
|
+
scope: stack.repository.stacks
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
assert_changes -> { stack.reload.awaiting_provision }, from: true, to: false do
|
|
42
|
+
review_stack.archive!
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def params_for(stack)
|
|
47
|
+
OpenStruct.new(
|
|
48
|
+
number: pr_number,
|
|
49
|
+
repository: {
|
|
50
|
+
"full_name" => stack.github_repo_name,
|
|
51
|
+
},
|
|
52
|
+
sender: { login: shipit_users(:walrus).login }
|
|
53
|
+
)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def create_stack
|
|
57
|
+
stack = shipit_stacks(:review_stack)
|
|
58
|
+
stack.environment = environment
|
|
59
|
+
|
|
60
|
+
stack.save!
|
|
61
|
+
|
|
62
|
+
stack
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def create_archived_stack
|
|
66
|
+
stack = create_stack
|
|
67
|
+
stack.archive!(shipit_users(:walrus))
|
|
68
|
+
|
|
69
|
+
stack
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def pr_number
|
|
73
|
+
1
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def environment
|
|
77
|
+
"pr#{pr_number}"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "test_helper"
|
|
4
|
+
|
|
5
|
+
module Shipit
|
|
6
|
+
module Webhooks
|
|
7
|
+
module Handlers
|
|
8
|
+
module PullRequest
|
|
9
|
+
class UnlabeledHandlerTest < ActiveSupport::TestCase
|
|
10
|
+
test "validates payload" do
|
|
11
|
+
assert_raise(StandardError) { UnlabeledHandler.new(payload_parsed(:invalid_pull_request)) }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
test "ignores Github webhooks when the event is NOT 'unlabeled'" do
|
|
15
|
+
assert_no_difference -> { Shipit::Stack.not_archived.count } do
|
|
16
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_opened).merge(action: "assigned")).process
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test "ignores Github PullRequest webhooks by default" do
|
|
21
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_with_no_repo).merge(action: "closed")).process
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
test "ignores Github PullRequest webhooks when the Repository has disabled the Review Stacks feature" do
|
|
25
|
+
repository = shipit_repositories(:shipit)
|
|
26
|
+
configure_provisioning_behavior(
|
|
27
|
+
repository: repository,
|
|
28
|
+
provisioning_enabled: false,
|
|
29
|
+
behavior: :allow_with_label,
|
|
30
|
+
label: "pull-requests-label"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
34
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_unlabeled)).process
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
test "ignores Github PullRequest webhooks when the repository allows_all PullRequests to create ReviewStacks" do
|
|
39
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
40
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_unlabeled)).process
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
test "archives existing review stack when the repository creates ReviewStacks with allow_with_label and the label is absent" do
|
|
45
|
+
stack = create_stack
|
|
46
|
+
repository = shipit_repositories(:shipit)
|
|
47
|
+
configure_provisioning_behavior(
|
|
48
|
+
repository: repository,
|
|
49
|
+
behavior: :allow_with_label,
|
|
50
|
+
label: "pull-requests-label"
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_unlabeled)).process
|
|
54
|
+
|
|
55
|
+
assert stack.reload.archived?, "Expected stack to be archived"
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
test "deprovisions existing review stack when the repository creates ReviewStacks with allow_with_label and the label is absent" do
|
|
59
|
+
stack = create_stack
|
|
60
|
+
repository = shipit_repositories(:shipit)
|
|
61
|
+
configure_provisioning_behavior(
|
|
62
|
+
repository: repository,
|
|
63
|
+
behavior: :allow_with_label,
|
|
64
|
+
label: "pull-requests-label"
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_unlabeled)).process
|
|
68
|
+
|
|
69
|
+
assert_equal stack.reload.provision_status, "deprovisioning"
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
test "ignores Github PullRequest webhooks when the repository allow_with_label to create ReviewStacks and the label is absent" do
|
|
73
|
+
repository = shipit_repositories(:shipit)
|
|
74
|
+
configure_provisioning_behavior(
|
|
75
|
+
repository: repository,
|
|
76
|
+
behavior: :allow_with_label,
|
|
77
|
+
label: "pull-requests-label"
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
81
|
+
UnlabeledHandler.new(payload_parsed(:pull_request_unlabeled)).process
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
test "unarchives existing review stack when the repository creates ReviewStacks with allow_with_label and the label is present" do
|
|
86
|
+
stack = create_archived_stack
|
|
87
|
+
repository = shipit_repositories(:shipit)
|
|
88
|
+
configure_provisioning_behavior(
|
|
89
|
+
repository: repository,
|
|
90
|
+
behavior: :allow_with_label,
|
|
91
|
+
label: "pull-requests-label"
|
|
92
|
+
)
|
|
93
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
94
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
95
|
+
|
|
96
|
+
UnlabeledHandler.new(payload).process
|
|
97
|
+
|
|
98
|
+
assert_not stack.reload.archived?, "Expected stack to NOT be archived"
|
|
99
|
+
assert_pending_provision(stack)
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
test "creates and provisions a new review stack when the repository creates ReviewStacks with allow_with_label and the label is present" do
|
|
103
|
+
repository = shipit_repositories(:shipit)
|
|
104
|
+
configure_provisioning_behavior(
|
|
105
|
+
repository: repository,
|
|
106
|
+
behavior: :allow_with_label,
|
|
107
|
+
label: "pull-requests-label"
|
|
108
|
+
)
|
|
109
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
110
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
111
|
+
|
|
112
|
+
UnlabeledHandler.new(payload).process
|
|
113
|
+
|
|
114
|
+
stack = shipit_repositories(:shipit).stacks.last
|
|
115
|
+
assert_equal stack.environment, "pr#{payload['number']}"
|
|
116
|
+
assert_equal stack.continuous_deployment, false
|
|
117
|
+
assert_equal stack.ignore_ci, false
|
|
118
|
+
assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
|
|
119
|
+
assert_not stack.archived?, "Expected stack to be NOT be archived"
|
|
120
|
+
assert_pending_provision(stack)
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
test "archives an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is present" do
|
|
124
|
+
stack = create_stack
|
|
125
|
+
repository = shipit_repositories(:shipit)
|
|
126
|
+
configure_provisioning_behavior(
|
|
127
|
+
repository: repository,
|
|
128
|
+
behavior: :prevent_with_label,
|
|
129
|
+
label: "pull-requests-label"
|
|
130
|
+
)
|
|
131
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
132
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
133
|
+
|
|
134
|
+
UnlabeledHandler.new(payload).process
|
|
135
|
+
|
|
136
|
+
assert stack.reload.archived?, "Expected stack to be archived"
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
test "deprovisions an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is present" do
|
|
140
|
+
stack = create_stack
|
|
141
|
+
repository = shipit_repositories(:shipit)
|
|
142
|
+
configure_provisioning_behavior(
|
|
143
|
+
repository: repository,
|
|
144
|
+
behavior: :prevent_with_label,
|
|
145
|
+
label: "pull-requests-label"
|
|
146
|
+
)
|
|
147
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
148
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
149
|
+
|
|
150
|
+
UnlabeledHandler.new(payload).process
|
|
151
|
+
|
|
152
|
+
assert_equal stack.reload.provision_status, "deprovisioning"
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
test "ignores Github PullRequest webhooks when the repository prevent_with_label to create ReviewStacks and the label is present" do
|
|
156
|
+
repository = shipit_repositories(:shipit)
|
|
157
|
+
configure_provisioning_behavior(
|
|
158
|
+
repository: repository,
|
|
159
|
+
behavior: :prevent_with_label,
|
|
160
|
+
label: "pull-requests-label"
|
|
161
|
+
)
|
|
162
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
163
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
164
|
+
|
|
165
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
166
|
+
UnlabeledHandler.new(payload).process
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
test "unarchives an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is absent" do
|
|
171
|
+
stack = create_archived_stack
|
|
172
|
+
repository = shipit_repositories(:shipit)
|
|
173
|
+
configure_provisioning_behavior(
|
|
174
|
+
repository: repository,
|
|
175
|
+
behavior: :prevent_with_label,
|
|
176
|
+
label: "pull-requests-label"
|
|
177
|
+
)
|
|
178
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
179
|
+
payload["pull_request"]["labels"] = []
|
|
180
|
+
|
|
181
|
+
UnlabeledHandler.new(payload).process
|
|
182
|
+
|
|
183
|
+
assert_not stack.reload.archived?, "Expected stack to NOT be archived"
|
|
184
|
+
assert_pending_provision(stack)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
test "creates and provisions a new review stack when the repository creates ReviewStacks with prevent_with_label and the label is absent" do
|
|
188
|
+
repository = shipit_repositories(:shipit)
|
|
189
|
+
configure_provisioning_behavior(
|
|
190
|
+
repository: repository,
|
|
191
|
+
behavior: :prevent_with_label,
|
|
192
|
+
label: "pull-requests-label"
|
|
193
|
+
)
|
|
194
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
195
|
+
payload["pull_request"]["labels"] = []
|
|
196
|
+
|
|
197
|
+
UnlabeledHandler.new(payload).process
|
|
198
|
+
|
|
199
|
+
stack = shipit_repositories(:shipit).stacks.last
|
|
200
|
+
assert_equal stack.environment, "pr#{payload['number']}"
|
|
201
|
+
assert_equal stack.continuous_deployment, false
|
|
202
|
+
assert_equal stack.ignore_ci, false
|
|
203
|
+
assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
|
|
204
|
+
assert_not stack.archived?, "Expected stack to be NOT be archived"
|
|
205
|
+
assert_pending_provision(stack)
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
test "assigns the PullRequest to newly created stacks" do
|
|
209
|
+
repository = shipit_repositories(:shipit)
|
|
210
|
+
configure_provisioning_behavior(
|
|
211
|
+
repository: repository,
|
|
212
|
+
behavior: :prevent_with_label,
|
|
213
|
+
label: "pull-requests-label"
|
|
214
|
+
)
|
|
215
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
216
|
+
payload["pull_request"]["labels"] = []
|
|
217
|
+
|
|
218
|
+
assert_difference -> { Shipit::PullRequest.count } do
|
|
219
|
+
UnlabeledHandler.new(payload).process
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
test "ignores Github Webhooks for closed PullRequests" do
|
|
224
|
+
create_archived_stack
|
|
225
|
+
repository = shipit_repositories(:shipit)
|
|
226
|
+
configure_provisioning_behavior(
|
|
227
|
+
repository: repository,
|
|
228
|
+
behavior: :allow_with_label,
|
|
229
|
+
label: "pull-requests-label"
|
|
230
|
+
)
|
|
231
|
+
payload = payload_parsed(:pull_request_unlabeled)
|
|
232
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
233
|
+
payload["pull_request"]["state"] = "closed"
|
|
234
|
+
|
|
235
|
+
Shipit::ReviewStackProvisioningQueue.expects(:add).never
|
|
236
|
+
|
|
237
|
+
UnlabeledHandler.new(payload).process
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
def configure_provisioning_behavior(repository:, provisioning_enabled: true, behavior: :allow_all, label: nil)
|
|
241
|
+
repository.review_stacks_enabled = provisioning_enabled
|
|
242
|
+
repository.provisioning_behavior = behavior
|
|
243
|
+
repository.provisioning_label_name = label
|
|
244
|
+
repository.save!
|
|
245
|
+
|
|
246
|
+
repository
|
|
247
|
+
end
|
|
248
|
+
|
|
249
|
+
def create_archived_stack
|
|
250
|
+
stack = create_stack
|
|
251
|
+
stack.update(provision_status: :deprovisioned)
|
|
252
|
+
stack.archive!(shipit_users(:codertocat))
|
|
253
|
+
|
|
254
|
+
stack
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def create_stack
|
|
258
|
+
repository = shipit_repositories(:shipit)
|
|
259
|
+
repository.provisioning_behavior = :allow_all
|
|
260
|
+
repository.save!
|
|
261
|
+
|
|
262
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
263
|
+
payload["action"] = "opened"
|
|
264
|
+
|
|
265
|
+
OpenedHandler.new(payload).process
|
|
266
|
+
|
|
267
|
+
stack = repository.stacks.last
|
|
268
|
+
stack.update(provision_status: :provisioned)
|
|
269
|
+
complete_active_tasks(stack)
|
|
270
|
+
|
|
271
|
+
stack
|
|
272
|
+
end
|
|
273
|
+
|
|
274
|
+
def complete_active_tasks(stack)
|
|
275
|
+
active_tasks = stack
|
|
276
|
+
.tasks
|
|
277
|
+
.active
|
|
278
|
+
|
|
279
|
+
active_tasks.map(&:run)
|
|
280
|
+
active_tasks.reload
|
|
281
|
+
active_tasks.map(&:complete)
|
|
282
|
+
end
|
|
283
|
+
|
|
284
|
+
def assert_pending_provision(stack)
|
|
285
|
+
stack.reload
|
|
286
|
+
|
|
287
|
+
assert(stack.awaiting_provision?, "Stack #{stack.environment} should be in the provisioning queue")
|
|
288
|
+
assert(stack.deprovisioned?, "Stack #{stack.environment} should be pending provision")
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
setup do
|
|
292
|
+
Shipit.github.api.stubs(:commit)
|
|
293
|
+
.with("shopify/shipit-engine", "ec26c3e57ca3a959ca5aad62de7213c562f8c821")
|
|
294
|
+
.returns(
|
|
295
|
+
resource(
|
|
296
|
+
{
|
|
297
|
+
sha: "ec26c3e57ca3a959ca5aad62de7213c562f8c821",
|
|
298
|
+
commit: {
|
|
299
|
+
author: {
|
|
300
|
+
name: "Codertocat",
|
|
301
|
+
email: "21031067+Codertocat@users.noreply.github.com",
|
|
302
|
+
date: "2019-05-15 15:20:30",
|
|
303
|
+
},
|
|
304
|
+
committer: {
|
|
305
|
+
name: "Codertocat",
|
|
306
|
+
email: "21031067+Codertocat@users.noreply.github.com",
|
|
307
|
+
date: "2019-05-15 15:20:30",
|
|
308
|
+
},
|
|
309
|
+
message: "Update README.md",
|
|
310
|
+
},
|
|
311
|
+
stats: {
|
|
312
|
+
total: 2,
|
|
313
|
+
additions: 1,
|
|
314
|
+
deletions: 1,
|
|
315
|
+
},
|
|
316
|
+
}
|
|
317
|
+
)
|
|
318
|
+
)
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
end
|
|
323
|
+
end
|
|
324
|
+
end
|
|
File without changes
|
data/test/models/tasks_test.rb
CHANGED
|
@@ -34,9 +34,9 @@ module Shipit
|
|
|
34
34
|
|
|
35
35
|
test "#chunk_output truncates output exceeding the storage limit" do
|
|
36
36
|
task = shipit_tasks(:shipit)
|
|
37
|
-
task.
|
|
38
|
-
|
|
39
|
-
task.
|
|
37
|
+
Shipit.redis.del(task.send(:output_key))
|
|
38
|
+
|
|
39
|
+
task.write('a' * (Task::OUTPUT_SIZE_LIMIT * 1.1))
|
|
40
40
|
|
|
41
41
|
output = task.chunk_output
|
|
42
42
|
|
|
@@ -47,5 +47,46 @@ module Shipit
|
|
|
47
47
|
"'#{Task::OUTPUT_TRUNCATED_MESSAGE.chomp}' was not present in the output",
|
|
48
48
|
)
|
|
49
49
|
end
|
|
50
|
+
|
|
51
|
+
test "#retry_if_necessary creates a duplicated task object with pending status and nil created_at and ended_at" do
|
|
52
|
+
task = shipit_tasks(:shipit)
|
|
53
|
+
task_stack = task.stack
|
|
54
|
+
task.retry_if_necessary
|
|
55
|
+
|
|
56
|
+
retried_task = task_stack.deploys.last
|
|
57
|
+
|
|
58
|
+
assert_not_equal task.id, retried_task.id
|
|
59
|
+
assert_nil retried_task.started_at
|
|
60
|
+
assert_nil retried_task.ended_at
|
|
61
|
+
assert_equal 'pending', retried_task.status
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
test "#retry_if_necessary does not create a new task object if max_retries is nil" do
|
|
65
|
+
task = shipit_tasks(:shipit2)
|
|
66
|
+
|
|
67
|
+
assert_no_difference 'Task.count', 'No new task should be created' do
|
|
68
|
+
task.retry_if_necessary
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
test "#retry_if_necessary does not create a new task object if the stack is locked" do
|
|
73
|
+
task = shipit_tasks(:shipit2)
|
|
74
|
+
task.stack.lock("test", task.user)
|
|
75
|
+
|
|
76
|
+
assert_no_difference 'Task.count', 'No new task should be created' do
|
|
77
|
+
task.retry_if_necessary
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
test "#retries_configured? returns true when max_retries is not nil and is greater than zero" do
|
|
82
|
+
task_with_three_retries = shipit_tasks(:shipit)
|
|
83
|
+
assert_predicate task_with_three_retries, :retries_configured?
|
|
84
|
+
|
|
85
|
+
task_with_nil_retries = shipit_tasks(:shipit2)
|
|
86
|
+
refute_predicate task_with_nil_retries, :retries_configured?
|
|
87
|
+
|
|
88
|
+
task_with_zero_retries = shipit_tasks(:shipit_restart)
|
|
89
|
+
refute_predicate task_with_zero_retries, :retries_configured?
|
|
90
|
+
end
|
|
50
91
|
end
|
|
51
92
|
end
|