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
|
@@ -0,0 +1,332 @@
|
|
|
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 LabeledHandlerTest < ActiveSupport::TestCase
|
|
10
|
+
test "validates payload" do
|
|
11
|
+
assert_raise(StandardError) { LabeledHandler.new(payload_parsed(:invalid_pull_request)) }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
test "ignores Github webhooks when the event is NOT 'labeled'" do
|
|
15
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
16
|
+
LabeledHandler.new(payload_parsed(:pull_request_labeled).merge(action: "assigned")).process
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test "ignores Github PullRequest webhooks by default" do
|
|
21
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
22
|
+
LabeledHandler.new(payload_parsed(:pull_request_with_no_repo)).process
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test "ignores Github PullRequest webhooks when the Repository has disabled the Review Stacks feature" do
|
|
27
|
+
repository = shipit_repositories(:shipit)
|
|
28
|
+
configure_provisioning_behavior(
|
|
29
|
+
repository: repository,
|
|
30
|
+
provisioning_enabled: false,
|
|
31
|
+
behavior: :allow_with_label,
|
|
32
|
+
label: "pull-requests-label"
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
36
|
+
LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
test "ignores Github PullRequest webhooks when the repository allows_all PullRequests to create ReviewStacks" do
|
|
41
|
+
repository = shipit_repositories(:shipit)
|
|
42
|
+
configure_provisioning_behavior(
|
|
43
|
+
repository: repository,
|
|
44
|
+
behavior: :allow_all
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
48
|
+
LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
test "unarchives existing review stack when the repository creates ReviewStacks with allow_with_label and the label is present" do
|
|
53
|
+
stack = create_archived_stack
|
|
54
|
+
repository = shipit_repositories(:shipit)
|
|
55
|
+
configure_provisioning_behavior(
|
|
56
|
+
repository: repository,
|
|
57
|
+
behavior: :allow_with_label,
|
|
58
|
+
label: "pull-requests-label"
|
|
59
|
+
)
|
|
60
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
61
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
62
|
+
|
|
63
|
+
LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
|
|
64
|
+
|
|
65
|
+
assert_not stack.reload.archived?, "Expected stack to be NOT be archived"
|
|
66
|
+
assert_pending_provision(stack)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
test "creates and provisions a new review stack when the repository creates ReviewStacks with allow_with_label and the label is present" do
|
|
70
|
+
repository = shipit_repositories(:shipit)
|
|
71
|
+
configure_provisioning_behavior(
|
|
72
|
+
repository: repository,
|
|
73
|
+
behavior: :allow_with_label,
|
|
74
|
+
label: "pull-requests-label"
|
|
75
|
+
)
|
|
76
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
77
|
+
payload["pull_request"]["labels"] = [{ "name" => "pull-requests-label" }]
|
|
78
|
+
|
|
79
|
+
LabeledHandler.new(payload).process
|
|
80
|
+
|
|
81
|
+
stack = shipit_repositories(:shipit).stacks.last
|
|
82
|
+
assert_equal stack.environment, "pr#{payload['number']}"
|
|
83
|
+
assert_equal stack.continuous_deployment, false
|
|
84
|
+
assert_equal stack.ignore_ci, false
|
|
85
|
+
assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
|
|
86
|
+
assert_not stack.archived?, "Expected stack to be NOT be archived"
|
|
87
|
+
assert_pending_provision(stack)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
test "archives an existing review stack when the repository creates ReviewStacks with allow_with_label and the label is absent" do
|
|
91
|
+
stack = create_stack
|
|
92
|
+
repository = shipit_repositories(:shipit)
|
|
93
|
+
configure_provisioning_behavior(
|
|
94
|
+
repository: repository,
|
|
95
|
+
behavior: :allow_with_label,
|
|
96
|
+
label: "pull-requests-label"
|
|
97
|
+
)
|
|
98
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
99
|
+
payload["pull_request"]["labels"] = []
|
|
100
|
+
|
|
101
|
+
LabeledHandler.new(payload).process
|
|
102
|
+
|
|
103
|
+
assert stack.reload.archived?, "Expected stack to be archived"
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
test "deprovisions an existing review stack when the repository creates ReviewStacks with allow_with_label and the label is absent" do
|
|
107
|
+
stack = create_stack
|
|
108
|
+
repository = shipit_repositories(:shipit)
|
|
109
|
+
configure_provisioning_behavior(
|
|
110
|
+
repository: repository,
|
|
111
|
+
behavior: :allow_with_label,
|
|
112
|
+
label: "pull-requests-label"
|
|
113
|
+
)
|
|
114
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
115
|
+
payload["pull_request"]["labels"] = []
|
|
116
|
+
|
|
117
|
+
LabeledHandler.new(payload).process
|
|
118
|
+
|
|
119
|
+
assert_equal stack.reload.provision_status, "deprovisioning"
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
test "ignores Github PullRequest webhooks when the repository allow_with_label to create ReviewStacks and the label is absent" do
|
|
123
|
+
repository = shipit_repositories(:shipit)
|
|
124
|
+
configure_provisioning_behavior(
|
|
125
|
+
repository: repository,
|
|
126
|
+
behavior: :allow_with_label,
|
|
127
|
+
label: "pull-requests-label"
|
|
128
|
+
)
|
|
129
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
130
|
+
payload["pull_request"]["labels"] = []
|
|
131
|
+
|
|
132
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
133
|
+
LabeledHandler.new(payload).process
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
test "archives an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is present" do
|
|
138
|
+
stack = create_stack
|
|
139
|
+
repository = shipit_repositories(:shipit)
|
|
140
|
+
configure_provisioning_behavior(
|
|
141
|
+
repository: repository,
|
|
142
|
+
behavior: :prevent_with_label,
|
|
143
|
+
label: "pull-requests-label"
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
|
|
147
|
+
|
|
148
|
+
assert stack.reload.archived?, "Expected stack to be archived"
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
test "deprovisions an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is present" do
|
|
152
|
+
stack = create_stack
|
|
153
|
+
repository = shipit_repositories(:shipit)
|
|
154
|
+
configure_provisioning_behavior(
|
|
155
|
+
repository: repository,
|
|
156
|
+
behavior: :prevent_with_label,
|
|
157
|
+
label: "pull-requests-label"
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
|
|
161
|
+
|
|
162
|
+
assert_equal stack.reload.provision_status, "deprovisioning"
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
test "ignores Github PullRequest webhooks when the repository prevent_with_label to create ReviewStacks and the label is present" do
|
|
166
|
+
repository = shipit_repositories(:shipit)
|
|
167
|
+
configure_provisioning_behavior(
|
|
168
|
+
repository: repository,
|
|
169
|
+
behavior: :prevent_with_label,
|
|
170
|
+
label: "pull-requests-label"
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
174
|
+
LabeledHandler.new(payload_parsed(:pull_request_labeled)).process
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
test "unarchives an existing review stack when the repository creates ReviewStacks with prevent_with_label and the label is absent" do
|
|
179
|
+
stack = create_archived_stack
|
|
180
|
+
repository = shipit_repositories(:shipit)
|
|
181
|
+
configure_provisioning_behavior(
|
|
182
|
+
repository: repository,
|
|
183
|
+
behavior: :prevent_with_label,
|
|
184
|
+
label: "pull-requests-label"
|
|
185
|
+
)
|
|
186
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
187
|
+
payload["pull_request"]["labels"] = []
|
|
188
|
+
|
|
189
|
+
LabeledHandler.new(payload).process
|
|
190
|
+
|
|
191
|
+
assert_not stack.reload.archived?, "Expected stack to NOT be archived"
|
|
192
|
+
assert_pending_provision(stack)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
test "creates and provisions a new review stack when the repository creates ReviewStacks with prevent_with_label and the label is absent" do
|
|
196
|
+
repository = shipit_repositories(:shipit)
|
|
197
|
+
configure_provisioning_behavior(
|
|
198
|
+
repository: repository,
|
|
199
|
+
behavior: :prevent_with_label,
|
|
200
|
+
label: "pull-requests-label"
|
|
201
|
+
)
|
|
202
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
203
|
+
payload["pull_request"]["labels"] = []
|
|
204
|
+
|
|
205
|
+
LabeledHandler.new(payload).process
|
|
206
|
+
|
|
207
|
+
stack = shipit_repositories(:shipit).stacks.last
|
|
208
|
+
assert_equal stack.environment, "pr#{payload['number']}"
|
|
209
|
+
assert_equal stack.continuous_deployment, false
|
|
210
|
+
assert_equal stack.ignore_ci, false
|
|
211
|
+
assert_equal stack.branch, payload["pull_request"]["head"]["ref"]
|
|
212
|
+
assert_not stack.archived?, "Expected stack to be NOT be archived"
|
|
213
|
+
assert_pending_provision(stack)
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
test "assigns the PullRequest to newly created stacks" do
|
|
217
|
+
repository = shipit_repositories(:shipit)
|
|
218
|
+
configure_provisioning_behavior(
|
|
219
|
+
repository: repository,
|
|
220
|
+
behavior: :prevent_with_label,
|
|
221
|
+
label: "pull-requests-label"
|
|
222
|
+
)
|
|
223
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
224
|
+
payload["pull_request"]["labels"] = []
|
|
225
|
+
|
|
226
|
+
assert_difference -> { Shipit::PullRequest.count } do
|
|
227
|
+
LabeledHandler.new(payload).process
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
test "ignores Github Webhooks for closed PullRequests" do
|
|
232
|
+
create_archived_stack
|
|
233
|
+
repository = shipit_repositories(:shipit)
|
|
234
|
+
configure_provisioning_behavior(
|
|
235
|
+
repository: repository,
|
|
236
|
+
behavior: :allow_with_label,
|
|
237
|
+
label: "pull-requests-label"
|
|
238
|
+
)
|
|
239
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
240
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
241
|
+
payload["pull_request"]["state"] = "closed"
|
|
242
|
+
|
|
243
|
+
Shipit::ReviewStackProvisioningQueue.expects(:add).never
|
|
244
|
+
|
|
245
|
+
LabeledHandler.new(payload).process
|
|
246
|
+
end
|
|
247
|
+
|
|
248
|
+
def configure_provisioning_behavior(repository:, provisioning_enabled: true, behavior: :allow_all, label: nil)
|
|
249
|
+
repository.review_stacks_enabled = provisioning_enabled
|
|
250
|
+
repository.provisioning_behavior = behavior
|
|
251
|
+
repository.provisioning_label_name = label
|
|
252
|
+
repository.save!
|
|
253
|
+
|
|
254
|
+
repository
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
def create_archived_stack
|
|
258
|
+
stack = create_stack
|
|
259
|
+
stack.update(provision_status: :deprovisioned)
|
|
260
|
+
stack.archive!(shipit_users(:codertocat))
|
|
261
|
+
|
|
262
|
+
stack
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
def create_stack
|
|
266
|
+
repository = shipit_repositories(:shipit)
|
|
267
|
+
repository.provisioning_behavior = :allow_all
|
|
268
|
+
repository.save!
|
|
269
|
+
|
|
270
|
+
payload = payload_parsed(:pull_request_labeled)
|
|
271
|
+
payload["action"] = "opened"
|
|
272
|
+
|
|
273
|
+
OpenedHandler.new(payload).process
|
|
274
|
+
|
|
275
|
+
stack = repository.review_stacks.last
|
|
276
|
+
stack.update(provision_status: :provisioned)
|
|
277
|
+
complete_active_tasks(stack)
|
|
278
|
+
|
|
279
|
+
stack
|
|
280
|
+
end
|
|
281
|
+
|
|
282
|
+
def complete_active_tasks(stack)
|
|
283
|
+
active_tasks = stack
|
|
284
|
+
.tasks
|
|
285
|
+
.active
|
|
286
|
+
|
|
287
|
+
active_tasks.map(&:run)
|
|
288
|
+
active_tasks.reload
|
|
289
|
+
active_tasks.map(&:complete)
|
|
290
|
+
end
|
|
291
|
+
|
|
292
|
+
def assert_pending_provision(stack)
|
|
293
|
+
stack.reload
|
|
294
|
+
|
|
295
|
+
assert(stack.awaiting_provision?, "Stack #{stack.environment} should be in the provisioning queue")
|
|
296
|
+
assert(stack.deprovisioned?, "Stack #{stack.environment} should be pending provision")
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
setup do
|
|
300
|
+
Shipit.github.api.stubs(:commit)
|
|
301
|
+
.with("shopify/shipit-engine", "ec26c3e57ca3a959ca5aad62de7213c562f8c821")
|
|
302
|
+
.returns(
|
|
303
|
+
resource(
|
|
304
|
+
{
|
|
305
|
+
sha: "ec26c3e57ca3a959ca5aad62de7213c562f8c821",
|
|
306
|
+
commit: {
|
|
307
|
+
author: {
|
|
308
|
+
name: "Codertocat",
|
|
309
|
+
email: "21031067+Codertocat@users.noreply.github.com",
|
|
310
|
+
date: "2019-05-15 15:20:30",
|
|
311
|
+
},
|
|
312
|
+
committer: {
|
|
313
|
+
name: "Codertocat",
|
|
314
|
+
email: "21031067+Codertocat@users.noreply.github.com",
|
|
315
|
+
date: "2019-05-15 15:20:30",
|
|
316
|
+
},
|
|
317
|
+
message: "Update README.md",
|
|
318
|
+
},
|
|
319
|
+
stats: {
|
|
320
|
+
total: 2,
|
|
321
|
+
additions: 1,
|
|
322
|
+
deletions: 1,
|
|
323
|
+
},
|
|
324
|
+
}
|
|
325
|
+
)
|
|
326
|
+
)
|
|
327
|
+
end
|
|
328
|
+
end
|
|
329
|
+
end
|
|
330
|
+
end
|
|
331
|
+
end
|
|
332
|
+
end
|
|
@@ -0,0 +1,238 @@
|
|
|
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 OpenedHandlerTest < ActiveSupport::TestCase
|
|
10
|
+
test "validates payload" do
|
|
11
|
+
assert_raise(StandardError) { OpenedHandler.new(payload_parsed(:invalid_pull_request)) }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
test "ignores irrelevant PR actions" do
|
|
15
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
16
|
+
OpenedHandler.new(payload_parsed(:pull_request_opened).merge(action: "assigned")).process
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
test "does not create stacks for repos that are not tracked" do
|
|
21
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
22
|
+
OpenedHandler.new(payload_parsed(:pull_request_with_no_repo)).process
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
test "does not create a stack when the Pull Request data can be saved" do
|
|
27
|
+
Shipit::PullRequest
|
|
28
|
+
.any_instance
|
|
29
|
+
.expects(:update!)
|
|
30
|
+
.raises(ActiveRecord::StatementInvalid)
|
|
31
|
+
|
|
32
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
33
|
+
OpenedHandler.new(payload_parsed(:pull_request_opened)).process
|
|
34
|
+
rescue ActiveRecord::StatementInvalid # We expect this to be raised, so it shouldn't fail the test
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
test "creates stacks for repos that are tracked" do
|
|
39
|
+
assert_difference -> { Shipit::Stack.count } do
|
|
40
|
+
OpenedHandler.new(payload_parsed(:pull_request_opened)).process
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
test "creates Shipit::Users when they're not already present" do
|
|
45
|
+
github_user = stub(
|
|
46
|
+
id: 42,
|
|
47
|
+
name: "Somenew Userlogin",
|
|
48
|
+
login: "some-new-user-login",
|
|
49
|
+
email: "somenewuser@login.com",
|
|
50
|
+
avatar_url: "https://avatars.githubusercontent.com/u/42?v=3",
|
|
51
|
+
url: "https://api.github.com/user/some-new-user-login"
|
|
52
|
+
)
|
|
53
|
+
Shipit.github.api.expects(:user).with("some-new-user-login")
|
|
54
|
+
.returns(github_user)
|
|
55
|
+
payload = payload_parsed(:pull_request_opened)
|
|
56
|
+
payload["pull_request"]["user"]["login"] = github_user.login
|
|
57
|
+
|
|
58
|
+
OpenedHandler.new(payload).process
|
|
59
|
+
|
|
60
|
+
user = Shipit::User.find_by(login: "some-new-user-login")
|
|
61
|
+
assert_equal github_user.login, user.login
|
|
62
|
+
assert_equal github_user.name, user.name
|
|
63
|
+
assert_equal github_user.email, user.email
|
|
64
|
+
assert_equal github_user.url, user.api_url
|
|
65
|
+
assert_equal github_user.avatar_url, user.avatar_url
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
test "does not create Shipit::Users when they're already present" do
|
|
69
|
+
payload = payload_parsed(:pull_request_opened)
|
|
70
|
+
user_login = payload["pull_request"]["user"]["login"]
|
|
71
|
+
|
|
72
|
+
assert_no_difference -> { Shipit::User.where(login: user_login).count } do
|
|
73
|
+
OpenedHandler.new(payload).process
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
test "auto-created stack should have default configuration values" do
|
|
78
|
+
payload = payload_parsed(:pull_request_opened)
|
|
79
|
+
OpenedHandler.new(payload).process
|
|
80
|
+
stack = shipit_repositories(:shipit).stacks.last
|
|
81
|
+
assert_equal stack.environment, "pr2"
|
|
82
|
+
assert_equal stack.continuous_deployment, false
|
|
83
|
+
assert_equal stack.ignore_ci, false
|
|
84
|
+
assert_equal stack.branch, payload_parsed(:pull_request_opened)["pull_request"]["head"]["ref"]
|
|
85
|
+
assert_pending_provision(stack)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
test "auto-created stack should have pull request assigned" do
|
|
89
|
+
payload = payload_parsed(:pull_request_opened)
|
|
90
|
+
|
|
91
|
+
assert_difference -> { Shipit::PullRequest.count } do
|
|
92
|
+
OpenedHandler.new(payload).process
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
test "only provision stacks for repos with auto-provisioning enabled" do
|
|
97
|
+
repository = shipit_repositories(:shipit)
|
|
98
|
+
configure_provisioning_behavior(
|
|
99
|
+
repository: repository,
|
|
100
|
+
provisioning_enabled: false,
|
|
101
|
+
behavior: :allow_all
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
105
|
+
OpenedHandler.new(payload_parsed(:provision_disabled_pull_request)).process
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
test "ignored duplicate deliveries" do
|
|
110
|
+
OpenedHandler.new(payload_parsed(:pull_request_opened)).process
|
|
111
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
112
|
+
OpenedHandler.new(payload_parsed(:pull_request_opened)).process
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
test "creates stacks for repos that allow_all" do
|
|
117
|
+
repository = shipit_repositories(:shipit)
|
|
118
|
+
configure_provisioning_behavior(
|
|
119
|
+
repository: repository,
|
|
120
|
+
behavior: :allow_all,
|
|
121
|
+
label: "pull-requests-label"
|
|
122
|
+
)
|
|
123
|
+
|
|
124
|
+
assert_difference -> { Shipit::Stack.count } do
|
|
125
|
+
OpenedHandler.new(payload_parsed(:pull_request_opened)).process
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
test "creates stacks for repos that allow_with_label when label is present" do
|
|
130
|
+
repository = shipit_repositories(:shipit)
|
|
131
|
+
configure_provisioning_behavior(
|
|
132
|
+
repository: repository,
|
|
133
|
+
behavior: :allow_with_label,
|
|
134
|
+
label: "pull-requests-label"
|
|
135
|
+
)
|
|
136
|
+
payload = payload_parsed(:pull_request_opened)
|
|
137
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
138
|
+
|
|
139
|
+
assert_difference -> { Shipit::Stack.count } do
|
|
140
|
+
OpenedHandler.new(payload).process
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
test "does not create stacks for repos that allow_with_label when label is absent" do
|
|
145
|
+
repository = shipit_repositories(:shipit)
|
|
146
|
+
configure_provisioning_behavior(
|
|
147
|
+
repository: repository,
|
|
148
|
+
behavior: :allow_with_label,
|
|
149
|
+
label: "pull-requests-label"
|
|
150
|
+
)
|
|
151
|
+
payload = payload_parsed(:pull_request_opened)
|
|
152
|
+
payload["pull_request"]["labels"] = []
|
|
153
|
+
|
|
154
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
155
|
+
OpenedHandler.new(payload).process
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
test "create stacks for repos what prevent_with_label when label is absent" do
|
|
160
|
+
repository = shipit_repositories(:shipit)
|
|
161
|
+
configure_provisioning_behavior(
|
|
162
|
+
repository: repository,
|
|
163
|
+
behavior: :prevent_with_label,
|
|
164
|
+
label: "pull-requests-label"
|
|
165
|
+
)
|
|
166
|
+
payload = payload_parsed(:pull_request_opened)
|
|
167
|
+
payload["pull_request"]["labels"] = []
|
|
168
|
+
|
|
169
|
+
assert_difference -> { Shipit::Stack.count } do
|
|
170
|
+
OpenedHandler.new(payload).process
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
test "does not create stacks for repos what prevent_with_label when label is present" do
|
|
175
|
+
repository = shipit_repositories(:shipit)
|
|
176
|
+
configure_provisioning_behavior(
|
|
177
|
+
repository: repository,
|
|
178
|
+
behavior: :prevent_with_label,
|
|
179
|
+
label: "pull-requests-label"
|
|
180
|
+
)
|
|
181
|
+
payload = payload_parsed(:pull_request_opened)
|
|
182
|
+
payload["pull_request"]["labels"] << { "name" => "pull-requests-label" }
|
|
183
|
+
|
|
184
|
+
assert_no_difference -> { Shipit::Stack.count } do
|
|
185
|
+
OpenedHandler.new(payload).process
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
|
|
189
|
+
def configure_provisioning_behavior(repository:, provisioning_enabled: true, behavior: :allow_all, label: nil)
|
|
190
|
+
repository.review_stacks_enabled = provisioning_enabled
|
|
191
|
+
repository.provisioning_behavior = behavior
|
|
192
|
+
repository.provisioning_label_name = label
|
|
193
|
+
repository.save!
|
|
194
|
+
|
|
195
|
+
repository
|
|
196
|
+
end
|
|
197
|
+
|
|
198
|
+
def assert_pending_provision(stack)
|
|
199
|
+
stack.reload
|
|
200
|
+
|
|
201
|
+
assert(stack.awaiting_provision?, "Stack #{stack.environment} should be in the provisioning queue")
|
|
202
|
+
assert(stack.deprovisioned?, "Stack #{stack.environment} should be pending provision")
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
setup do
|
|
206
|
+
Shipit.github.api.stubs(:commit)
|
|
207
|
+
.with("shopify/shipit-engine", "ec26c3e57ca3a959ca5aad62de7213c562f8c821")
|
|
208
|
+
.returns(
|
|
209
|
+
resource(
|
|
210
|
+
{
|
|
211
|
+
sha: "ec26c3e57ca3a959ca5aad62de7213c562f8c821",
|
|
212
|
+
commit: {
|
|
213
|
+
author: {
|
|
214
|
+
name: "Codertocat",
|
|
215
|
+
email: "21031067+Codertocat@users.noreply.github.com",
|
|
216
|
+
date: "2019-05-15 15:20:30",
|
|
217
|
+
},
|
|
218
|
+
committer: {
|
|
219
|
+
name: "Codertocat",
|
|
220
|
+
email: "21031067+Codertocat@users.noreply.github.com",
|
|
221
|
+
date: "2019-05-15 15:20:30",
|
|
222
|
+
},
|
|
223
|
+
message: "Update README.md",
|
|
224
|
+
},
|
|
225
|
+
stats: {
|
|
226
|
+
total: 2,
|
|
227
|
+
additions: 1,
|
|
228
|
+
deletions: 1,
|
|
229
|
+
},
|
|
230
|
+
}
|
|
231
|
+
)
|
|
232
|
+
)
|
|
233
|
+
end
|
|
234
|
+
end
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
end
|
|
238
|
+
end
|