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.
Files changed (176) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/magic-solid.svg +1 -0
  3. data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
  4. data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
  5. data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
  6. data/app/assets/stylesheets/_pages/_stacks.scss +19 -0
  7. data/app/assets/stylesheets/shipit.scss +1 -0
  8. data/app/controllers/shipit/api/{pull_requests_controller.rb → merge_requests_controller.rb} +8 -8
  9. data/app/controllers/shipit/api/stacks_controller.rb +14 -1
  10. data/app/controllers/shipit/deploys_controller.rb +2 -2
  11. data/app/controllers/shipit/merge_requests_controller.rb +31 -0
  12. data/app/controllers/shipit/merge_status_controller.rb +15 -15
  13. data/app/controllers/shipit/repositories_controller.rb +74 -0
  14. data/app/controllers/shipit/tasks_controller.rb +4 -4
  15. data/app/helpers/shipit/chunks_helper.rb +2 -2
  16. data/app/helpers/shipit/github_url_helper.rb +8 -0
  17. data/app/helpers/shipit/stacks_helper.rb +4 -0
  18. data/app/jobs/shipit/create_on_github_job.rb +1 -0
  19. data/app/jobs/shipit/destroy_repository_job.rb +24 -0
  20. data/app/jobs/shipit/destroy_stack_job.rb +2 -2
  21. data/app/jobs/shipit/perform_task_job.rb +4 -98
  22. data/app/jobs/shipit/process_merge_requests_job.rb +32 -0
  23. data/app/jobs/shipit/refresh_merge_request_job.rb +11 -0
  24. data/app/models/shipit/anonymous_user.rb +4 -0
  25. data/app/models/shipit/check_run.rb +2 -2
  26. data/app/models/shipit/command_line_user.rb +4 -0
  27. data/app/models/shipit/commit.rb +11 -11
  28. data/app/models/shipit/commit_checks.rb +1 -0
  29. data/app/models/shipit/deploy.rb +1 -0
  30. data/app/models/shipit/deploy_spec.rb +16 -4
  31. data/app/models/shipit/deploy_spec/file_system.rb +11 -5
  32. data/app/models/shipit/hook.rb +2 -0
  33. data/app/models/shipit/merge_request.rb +302 -0
  34. data/app/models/shipit/provisioning_handler.rb +32 -0
  35. data/app/models/shipit/provisioning_handler/base.rb +30 -0
  36. data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
  37. data/app/models/shipit/pull_request.rb +25 -264
  38. data/app/models/shipit/pull_request_assignment.rb +10 -0
  39. data/app/models/shipit/repository.rb +54 -0
  40. data/app/models/shipit/review_stack.rb +116 -0
  41. data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
  42. data/app/models/shipit/stack.rb +22 -8
  43. data/app/models/shipit/task.rb +56 -7
  44. data/app/models/shipit/task_execution_strategy/base.rb +20 -0
  45. data/app/models/shipit/task_execution_strategy/default.rb +110 -0
  46. data/app/models/shipit/user.rb +6 -1
  47. data/app/models/shipit/webhooks.rb +10 -0
  48. data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +74 -0
  49. data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +68 -0
  50. data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +74 -0
  51. data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +127 -0
  52. data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +106 -0
  53. data/app/models/shipit/webhooks/handlers/pull_request/opened_handler.rb +83 -0
  54. data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +88 -0
  55. data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +103 -0
  56. data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +107 -0
  57. data/app/serializers/shipit/deploy_serializer.rb +6 -0
  58. data/app/serializers/shipit/merge_request_serializer.rb +21 -0
  59. data/app/serializers/shipit/pull_request_serializer.rb +5 -8
  60. data/app/serializers/shipit/review_stack_serializer.rb +7 -0
  61. data/app/serializers/shipit/stack_serializer.rb +7 -6
  62. data/app/serializers/shipit/tail_task_serializer.rb +10 -2
  63. data/app/serializers/shipit/task_serializer.rb +1 -1
  64. data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
  65. data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
  66. data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
  67. data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
  68. data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
  69. data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
  70. data/app/views/shipit/merge_status/failure.html.erb +1 -1
  71. data/app/views/shipit/merge_status/locked.html.erb +1 -1
  72. data/app/views/shipit/merge_status/success.html.erb +2 -2
  73. data/app/views/shipit/repositories/_header.html.erb +19 -0
  74. data/app/views/shipit/repositories/index.html.erb +31 -0
  75. data/app/views/shipit/repositories/new.html.erb +23 -0
  76. data/app/views/shipit/repositories/settings.html.erb +53 -0
  77. data/app/views/shipit/repositories/show.html.erb +30 -0
  78. data/app/views/shipit/stacks/_banners.html.erb +13 -0
  79. data/app/views/shipit/stacks/_header.html.erb +5 -2
  80. data/app/views/shipit/stacks/_stack.html.erb +8 -0
  81. data/app/views/shipit/stacks/index.html.erb +2 -1
  82. data/app/views/shipit/stacks/settings.html.erb +5 -5
  83. data/app/views/shipit/stacks/show.html.erb +1 -1
  84. data/app/views/shipit/tasks/_task_output.html.erb +1 -1
  85. data/config/routes.rb +15 -5
  86. data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
  87. data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
  88. data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
  89. data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
  90. data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
  91. data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
  92. data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
  93. data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
  94. data/lib/shipit.rb +11 -1
  95. data/lib/shipit/github_app.rb +1 -1
  96. data/lib/shipit/review_stack_commands.rb +8 -0
  97. data/lib/shipit/stack_commands.rb +6 -1
  98. data/lib/shipit/task_commands.rb +1 -0
  99. data/lib/shipit/version.rb +1 -1
  100. data/lib/tasks/cron.rake +11 -2
  101. data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +12 -12
  102. data/test/controllers/api/outputs_controller_test.rb +1 -0
  103. data/test/controllers/api/rollback_controller_test.rb +1 -1
  104. data/test/controllers/api/stacks_controller_test.rb +21 -1
  105. data/test/controllers/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +6 -6
  106. data/test/controllers/repositories_controller_test.rb +71 -0
  107. data/test/controllers/stacks_controller_test.rb +9 -1
  108. data/test/controllers/tasks_controller_test.rb +14 -2
  109. data/test/controllers/webhooks_controller_test.rb +1 -1
  110. data/test/dummy/config/application.rb +6 -1
  111. data/test/dummy/config/environments/development.rb +0 -3
  112. data/test/dummy/config/environments/test.rb +0 -5
  113. data/test/dummy/db/schema.rb +52 -14
  114. data/test/dummy/db/seeds.rb +1 -1
  115. data/test/fixtures/payloads/check_suite_master.json +2 -2
  116. data/test/fixtures/payloads/invalid_pull_request.json +117 -0
  117. data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
  118. data/test/fixtures/payloads/pull_request_assigned.json +480 -0
  119. data/test/fixtures/payloads/pull_request_closed.json +454 -0
  120. data/test/fixtures/payloads/pull_request_labeled.json +461 -0
  121. data/test/fixtures/payloads/pull_request_opened.json +454 -0
  122. data/test/fixtures/payloads/pull_request_reopened.json +454 -0
  123. data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
  124. data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
  125. data/test/fixtures/shipit/commits.yml +15 -2
  126. data/test/fixtures/shipit/merge_requests.yml +141 -0
  127. data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
  128. data/test/fixtures/shipit/pull_requests.yml +10 -131
  129. data/test/fixtures/shipit/repositories.yml +1 -0
  130. data/test/fixtures/shipit/stacks.yml +145 -0
  131. data/test/fixtures/shipit/statuses.yml +9 -0
  132. data/test/fixtures/shipit/tasks.yml +3 -0
  133. data/test/fixtures/shipit/users.yml +7 -0
  134. data/test/helpers/payloads_helper.rb +4 -0
  135. data/test/jobs/chunk_rollup_job_test.rb +15 -1
  136. data/test/jobs/destroy_repository_job_test.rb +27 -0
  137. data/test/jobs/perform_task_job_test.rb +8 -8
  138. data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +18 -18
  139. data/test/lib/shipit/deploy_commands_test.rb +16 -0
  140. data/test/lib/shipit/task_commands_test.rb +17 -0
  141. data/test/models/commits_test.rb +22 -13
  142. data/test/models/deploy_spec_test.rb +57 -24
  143. data/test/models/deploys_test.rb +148 -14
  144. data/test/models/{pull_request_test.rb → merge_request_test.rb} +30 -30
  145. data/test/models/pull_request_assignment_test.rb +16 -0
  146. data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
  147. data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
  148. data/test/models/shipit/provisioning_handler_test.rb +64 -0
  149. data/test/models/shipit/pull_request_test.rb +52 -0
  150. data/test/models/shipit/repository_test.rb +5 -1
  151. data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
  152. data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
  153. data/test/models/shipit/review_stack_test.rb +59 -0
  154. data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +10 -4
  155. data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
  156. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
  157. data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
  158. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
  159. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
  160. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
  161. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
  162. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +83 -0
  163. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
  164. data/test/models/shipit/{wehbooks → webhooks}/handlers_test.rb +0 -0
  165. data/test/models/tasks_test.rb +44 -3
  166. data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
  167. data/test/unit/command_test.rb +3 -3
  168. data/test/unit/github_url_helper_test.rb +5 -0
  169. data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
  170. metadata +260 -154
  171. data/app/controllers/shipit/pull_requests_controller.rb +0 -31
  172. data/app/jobs/shipit/merge_pull_requests_job.rb +0 -32
  173. data/app/jobs/shipit/refresh_pull_request_job.rb +0 -11
  174. data/app/views/shipit/pull_requests/_pull_request.html.erb +0 -29
  175. data/test/fixtures/shipit/output_chunks.yml +0 -47
  176. 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
@@ -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.chunks.delete_all
38
- # Dont persist the chunk to the DB, as it may exceed the MySQL max packet size on CI
39
- task.chunks.build(text: 'a' * (Task::OUTPUT_SIZE_LIMIT * 1.1))
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