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.
Files changed (235) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -2
  3. data/app/assets/images/magic-solid.svg +1 -0
  4. data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
  5. data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
  6. data/app/assets/stylesheets/_pages/_deploy.scss +2 -3
  7. data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
  8. data/app/assets/stylesheets/_pages/_stacks.scss +19 -0
  9. data/app/assets/stylesheets/shipit.scss +1 -0
  10. data/app/controllers/shipit/api/ccmenu_controller.rb +1 -1
  11. data/app/controllers/shipit/api/deploys_controller.rb +2 -0
  12. data/app/controllers/shipit/api/{pull_requests_controller.rb → merge_requests_controller.rb} +8 -8
  13. data/app/controllers/shipit/api/rollbacks_controller.rb +2 -1
  14. data/app/controllers/shipit/api/stacks_controller.rb +15 -1
  15. data/app/controllers/shipit/deploys_controller.rb +1 -1
  16. data/app/controllers/shipit/merge_requests_controller.rb +31 -0
  17. data/app/controllers/shipit/merge_status_controller.rb +15 -15
  18. data/app/controllers/shipit/repositories_controller.rb +74 -0
  19. data/app/controllers/shipit/stacks_controller.rb +2 -2
  20. data/app/controllers/shipit/tasks_controller.rb +2 -2
  21. data/app/controllers/shipit/webhooks_controller.rb +23 -4
  22. data/app/helpers/shipit/chunks_helper.rb +2 -2
  23. data/app/helpers/shipit/github_url_helper.rb +8 -0
  24. data/app/helpers/shipit/shipit_helper.rb +0 -1
  25. data/app/helpers/shipit/stacks_helper.rb +4 -0
  26. data/app/jobs/shipit/create_on_github_job.rb +1 -0
  27. data/app/jobs/shipit/deliver_hook_job.rb +1 -1
  28. data/app/jobs/shipit/destroy_repository_job.rb +24 -0
  29. data/app/jobs/shipit/destroy_stack_job.rb +2 -2
  30. data/app/jobs/shipit/github_sync_job.rb +13 -9
  31. data/app/jobs/shipit/perform_task_job.rb +4 -98
  32. data/app/jobs/shipit/process_merge_requests_job.rb +32 -0
  33. data/app/jobs/shipit/refresh_merge_request_job.rb +11 -0
  34. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +1 -1
  35. data/app/models/shipit/anonymous_user.rb +10 -2
  36. data/app/models/shipit/check_run.rb +38 -2
  37. data/app/models/shipit/command_line_user.rb +4 -0
  38. data/app/models/shipit/commit.rb +31 -20
  39. data/app/models/shipit/commit_checks.rb +14 -13
  40. data/app/models/shipit/commit_deployment.rb +3 -3
  41. data/app/models/shipit/commit_deployment_status.rb +3 -3
  42. data/app/models/shipit/deploy.rb +17 -11
  43. data/app/models/shipit/deploy_spec/file_system.rb +11 -5
  44. data/app/models/shipit/deploy_spec/lerna_discovery.rb +12 -4
  45. data/app/models/shipit/deploy_spec.rb +16 -4
  46. data/app/models/shipit/duration.rb +2 -0
  47. data/app/models/shipit/hook.rb +28 -2
  48. data/app/models/shipit/merge_request.rb +304 -0
  49. data/app/models/shipit/provisioning_handler/base.rb +30 -0
  50. data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
  51. data/app/models/shipit/provisioning_handler.rb +32 -0
  52. data/app/models/shipit/pull_request.rb +26 -265
  53. data/app/models/shipit/pull_request_assignment.rb +10 -0
  54. data/app/models/shipit/release_status.rb +1 -1
  55. data/app/models/shipit/repository.rb +63 -3
  56. data/app/models/shipit/review_stack.rb +130 -0
  57. data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
  58. data/app/models/shipit/rollback.rb +5 -0
  59. data/app/models/shipit/stack.rb +78 -30
  60. data/app/models/shipit/status/group.rb +1 -1
  61. data/app/models/shipit/task.rb +62 -9
  62. data/app/models/shipit/task_execution_strategy/base.rb +20 -0
  63. data/app/models/shipit/task_execution_strategy/default.rb +109 -0
  64. data/app/models/shipit/team.rb +4 -2
  65. data/app/models/shipit/user.rb +10 -1
  66. data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +74 -0
  67. data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +68 -0
  68. data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +74 -0
  69. data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +127 -0
  70. data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +106 -0
  71. data/app/models/shipit/webhooks/handlers/pull_request/opened_handler.rb +83 -0
  72. data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +88 -0
  73. data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +103 -0
  74. data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +107 -0
  75. data/app/models/shipit/webhooks/handlers/push_handler.rb +4 -1
  76. data/app/models/shipit/webhooks.rb +10 -0
  77. data/app/serializers/shipit/deploy_serializer.rb +6 -0
  78. data/app/serializers/shipit/merge_request_serializer.rb +21 -0
  79. data/app/serializers/shipit/pull_request_serializer.rb +5 -8
  80. data/app/serializers/shipit/review_stack_serializer.rb +7 -0
  81. data/app/serializers/shipit/stack_serializer.rb +7 -6
  82. data/app/serializers/shipit/tail_task_serializer.rb +10 -2
  83. data/app/serializers/shipit/task_serializer.rb +1 -1
  84. data/app/validators/subset_validator.rb +1 -1
  85. data/app/views/layouts/merge_status.html.erb +1 -1
  86. data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
  87. data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
  88. data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
  89. data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
  90. data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
  91. data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
  92. data/app/views/shipit/merge_status/failure.html.erb +1 -1
  93. data/app/views/shipit/merge_status/locked.html.erb +1 -1
  94. data/app/views/shipit/merge_status/success.html.erb +2 -2
  95. data/app/views/shipit/repositories/_header.html.erb +19 -0
  96. data/app/views/shipit/repositories/index.html.erb +31 -0
  97. data/app/views/shipit/repositories/new.html.erb +23 -0
  98. data/app/views/shipit/repositories/settings.html.erb +53 -0
  99. data/app/views/shipit/repositories/show.html.erb +30 -0
  100. data/app/views/shipit/stacks/_banners.html.erb +15 -1
  101. data/app/views/shipit/stacks/_header.html.erb +5 -2
  102. data/app/views/shipit/stacks/_stack.html.erb +8 -0
  103. data/app/views/shipit/stacks/index.html.erb +2 -1
  104. data/app/views/shipit/stacks/new.html.erb +1 -1
  105. data/app/views/shipit/stacks/settings.html.erb +5 -5
  106. data/app/views/shipit/stacks/show.html.erb +1 -1
  107. data/app/views/shipit/tasks/_task_output.html.erb +1 -1
  108. data/config/routes.rb +15 -5
  109. data/config/secrets.development.example.yml +24 -0
  110. data/config/secrets.development.shopify.yml +20 -9
  111. data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
  112. data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
  113. data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
  114. data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
  115. data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
  116. data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
  117. data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
  118. data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
  119. data/db/migrate/20210325194053_remove_stacks_branch_default.rb +5 -0
  120. data/db/migrate/20210504200438_add_github_updated_at_to_check_runs.rb +5 -0
  121. data/db/migrate/20210823075617_change_check_runs_github_updated_at_default.rb +5 -0
  122. data/lib/shipit/command.rb +7 -6
  123. data/lib/shipit/commands.rb +18 -5
  124. data/lib/shipit/engine.rb +2 -0
  125. data/lib/shipit/flock.rb +8 -1
  126. data/lib/shipit/github_app.rb +8 -6
  127. data/lib/shipit/octokit_iterator.rb +3 -3
  128. data/lib/shipit/review_stack_commands.rb +8 -0
  129. data/lib/shipit/simple_message_verifier.rb +2 -2
  130. data/lib/shipit/stack_commands.rb +36 -7
  131. data/lib/shipit/task_commands.rb +8 -1
  132. data/lib/shipit/version.rb +1 -1
  133. data/lib/shipit.rb +50 -16
  134. data/lib/snippets/publish-lerna-independent-packages +35 -34
  135. data/lib/snippets/publish-lerna-independent-packages-legacy +39 -0
  136. data/lib/tasks/cron.rake +11 -2
  137. data/test/controllers/api/ccmenu_controller_test.rb +1 -1
  138. data/test/controllers/api/deploys_controller_test.rb +17 -0
  139. data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +12 -12
  140. data/test/controllers/api/outputs_controller_test.rb +1 -0
  141. data/test/controllers/api/rollback_controller_test.rb +1 -1
  142. data/test/controllers/api/stacks_controller_test.rb +42 -8
  143. data/test/controllers/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +6 -6
  144. data/test/controllers/repositories_controller_test.rb +71 -0
  145. data/test/controllers/stacks_controller_test.rb +9 -1
  146. data/test/controllers/tasks_controller_test.rb +14 -2
  147. data/test/controllers/webhooks_controller_test.rb +27 -12
  148. data/test/dummy/app/assets/config/manifest.js +3 -0
  149. data/test/dummy/config/application.rb +7 -2
  150. data/test/dummy/config/database.yml +9 -0
  151. data/test/dummy/config/environments/development.rb +1 -4
  152. data/test/dummy/config/environments/test.rb +0 -5
  153. data/test/dummy/config/secrets_double_github_app.yml +79 -0
  154. data/test/dummy/db/schema.rb +56 -17
  155. data/test/dummy/db/seeds.rb +2 -1
  156. data/test/fixtures/payloads/check_suite_master.json +4 -32
  157. data/test/fixtures/payloads/invalid_pull_request.json +117 -0
  158. data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
  159. data/test/fixtures/payloads/pull_request_assigned.json +480 -0
  160. data/test/fixtures/payloads/pull_request_closed.json +454 -0
  161. data/test/fixtures/payloads/pull_request_labeled.json +461 -0
  162. data/test/fixtures/payloads/pull_request_opened.json +454 -0
  163. data/test/fixtures/payloads/pull_request_reopened.json +454 -0
  164. data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
  165. data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
  166. data/test/fixtures/payloads/push_master.json +1 -1
  167. data/test/fixtures/payloads/push_not_master.json +1 -1
  168. data/test/fixtures/shipit/commits.yml +17 -4
  169. data/test/fixtures/shipit/hooks.yml +1 -0
  170. data/test/fixtures/shipit/merge_requests.yml +141 -0
  171. data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
  172. data/test/fixtures/shipit/pull_requests.yml +10 -131
  173. data/test/fixtures/shipit/repositories.yml +1 -0
  174. data/test/fixtures/shipit/stacks.yml +145 -0
  175. data/test/fixtures/shipit/statuses.yml +9 -0
  176. data/test/fixtures/shipit/tasks.yml +4 -1
  177. data/test/fixtures/shipit/users.yml +7 -0
  178. data/test/helpers/json_helper.rb +5 -1
  179. data/test/helpers/payloads_helper.rb +4 -0
  180. data/test/jobs/chunk_rollup_job_test.rb +15 -1
  181. data/test/jobs/destroy_repository_job_test.rb +27 -0
  182. data/test/jobs/github_sync_job_test.rb +2 -1
  183. data/test/jobs/perform_task_job_test.rb +8 -8
  184. data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +18 -18
  185. data/test/lib/shipit/deploy_commands_test.rb +16 -0
  186. data/test/lib/shipit/task_commands_test.rb +17 -0
  187. data/test/models/commit_deployment_status_test.rb +3 -3
  188. data/test/models/commits_test.rb +24 -13
  189. data/test/models/deploy_spec_test.rb +64 -24
  190. data/test/models/deploys_test.rb +188 -14
  191. data/test/models/hook_test.rb +30 -1
  192. data/test/models/{pull_request_test.rb → merge_request_test.rb} +49 -34
  193. data/test/models/pull_request_assignment_test.rb +16 -0
  194. data/test/models/shipit/check_run_test.rb +124 -5
  195. data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
  196. data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
  197. data/test/models/shipit/provisioning_handler_test.rb +64 -0
  198. data/test/models/shipit/pull_request_test.rb +52 -0
  199. data/test/models/shipit/repository_test.rb +5 -1
  200. data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
  201. data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
  202. data/test/models/shipit/review_stack_test.rb +91 -0
  203. data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +52 -8
  204. data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
  205. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
  206. data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
  207. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
  208. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
  209. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
  210. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
  211. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +107 -0
  212. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
  213. data/test/models/shipit/{wehbooks → webhooks}/handlers_test.rb +0 -0
  214. data/test/models/tasks_test.rb +66 -3
  215. data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
  216. data/test/test_helper.rb +15 -0
  217. data/test/unit/anonymous_user_serializer_test.rb +1 -1
  218. data/test/unit/command_test.rb +8 -3
  219. data/test/unit/commit_serializer_test.rb +1 -1
  220. data/test/unit/deploy_commands_test.rb +73 -17
  221. data/test/unit/deploy_serializer_test.rb +1 -1
  222. data/test/unit/github_app_test.rb +2 -3
  223. data/test/unit/github_apps_test.rb +416 -0
  224. data/test/unit/github_url_helper_test.rb +5 -0
  225. data/test/unit/shipit_deployment_checks_test.rb +77 -0
  226. data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
  227. data/test/unit/shipit_test.rb +14 -0
  228. data/test/unit/user_serializer_test.rb +1 -1
  229. metadata +306 -188
  230. data/app/controllers/shipit/pull_requests_controller.rb +0 -31
  231. data/app/jobs/shipit/merge_pull_requests_job.rb +0 -32
  232. data/app/jobs/shipit/refresh_pull_request_job.rb +0 -11
  233. data/app/views/shipit/pull_requests/_pull_request.html.erb +0 -29
  234. data/test/fixtures/shipit/output_chunks.yml +0 -47
  235. data/test/models/output_chunk_test.rb +0 -21
@@ -134,3 +134,12 @@ canaries_fifth_success:
134
134
  created_at: <%= 7.days.ago.to_s(:db) %>
135
135
  state: success
136
136
  target_url: "http://www.example.com"
137
+
138
+ review_stack_commit_success:
139
+ stack: review_stack
140
+ commit_id: 801
141
+ description: lets go
142
+ context: ci/travis
143
+ created_at: <%= 10.days.ago.to_s(:db) %>
144
+ state: success
145
+ target_url: "http://www.example.com"
@@ -11,6 +11,7 @@ shipit:
11
11
  created_at: <%= (60 - 1).minutes.ago.to_s(:db) %>
12
12
  started_at: <%= (60 - 1).minutes.ago.to_s(:db) %>
13
13
  ended_at: <%= (60 - 6).minutes.ago.to_s(:db) %>
14
+ max_retries: 3
14
15
 
15
16
  shipit2:
16
17
  id: 2
@@ -28,7 +29,7 @@ shipit2:
28
29
 
29
30
  shipit_restart:
30
31
  id: 3
31
- user: walrus
32
+ user: ~
32
33
  type: Shipit::Task
33
34
  stack: shipit
34
35
  status: success
@@ -60,6 +61,8 @@ shipit_pending:
60
61
  deletions: 406
61
62
  created_at: <%= (60 - 4).minutes.ago.to_s(:db) %>
62
63
  allow_concurrency: true
64
+ max_retries: 1
65
+ retry_attempt: 0
63
66
 
64
67
  shipit_running:
65
68
  id: 5
@@ -5,6 +5,13 @@ walrus:
5
5
  encrypted_github_access_token: "ffHk4diyVKppJGfwfJefMizxF45H\n" # t0k3n
6
6
  encrypted_github_access_token_iv: "gRSldoTZ+fmrIDoY\n"
7
7
 
8
+ codertocat:
9
+ name: Coding Cat
10
+ email: coding@cat.com
11
+ login: Codertocat
12
+ encrypted_github_access_token: "ffHk4diyVKppJGfwfJefMizxF45H\n" # t0k3n
13
+ encrypted_github_access_token_iv: "gRSldoTZ+fmrIDoY\n"
14
+
8
15
  bob:
9
16
  name: Bob the Builder
10
17
  email: bob@bob.com
@@ -3,7 +3,11 @@ module JSONHelper
3
3
  UNDEFINED = Object.new.freeze
4
4
  private_constant :UNDEFINED
5
5
 
6
- def assert_json(path = nil, expected_value = UNDEFINED, document: response.body)
6
+ def assert_json(path = nil, expected_value = UNDEFINED, &block)
7
+ assert_json_document(response.body, path, expected_value, &block)
8
+ end
9
+
10
+ def assert_json_document(document, path, expected_value = UNDEFINED)
7
11
  value = follow_path(path.to_s.split('.'), document: document)
8
12
  if block_given?
9
13
  yield value
@@ -3,4 +3,8 @@ module PayloadsHelper
3
3
  def payload(name)
4
4
  Shipit::Engine.root.join('test/fixtures/payloads', "#{name}.json").read
5
5
  end
6
+
7
+ def payload_parsed(name)
8
+ JSON.parse(payload(name))
9
+ end
6
10
  end
@@ -5,6 +5,7 @@ module Shipit
5
5
  class ChunkRollupJobTest < ActiveSupport::TestCase
6
6
  setup do
7
7
  @task = shipit_tasks(:shipit)
8
+ @task.write("dummy output")
8
9
  @job = ChunkRollupJob.new
9
10
  end
10
11
 
@@ -15,10 +16,10 @@ module Shipit
15
16
  @job.perform(@task)
16
17
 
17
18
  @task.reload
18
- assert_equal 0, @task.chunks.count
19
19
  assert @task.output.present?
20
20
  assert_equal expected_output, @task.chunk_output
21
21
  assert @task.rolled_up
22
+ assert_nil Shipit.redis.get(@task.send(:output_key))
22
23
  end
23
24
 
24
25
  test "#peform ignores non-finished jobs" do
@@ -40,5 +41,18 @@ module Shipit
40
41
 
41
42
  @job.perform(@task)
42
43
  end
44
+
45
+ test "#perform takes into account data still in the DB" do
46
+ output_chunks = Shipit::OutputChunk.create(text: "DB output", task: @task)
47
+ expected_output = [output_chunks.text, @task.chunk_output].join("\n")
48
+
49
+ @job.perform(@task)
50
+
51
+ @task.reload
52
+ assert_equal expected_output, @task.chunk_output
53
+ assert @task.rolled_up
54
+ assert_empty Shipit::OutputChunk.where(task: @task)
55
+ assert_nil Shipit.redis.get(@task.send(:output_key))
56
+ end
43
57
  end
44
58
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class DestroyRepositoryJobTest < ActiveSupport::TestCase
6
+ setup do
7
+ @job = DestroyRepositoryJob.new
8
+ @repository = Repository.first
9
+ end
10
+
11
+ test "perform destroys the repository" do
12
+ assert_difference -> { Repository.count }, -1 do
13
+ @job.perform(@repository)
14
+ end
15
+ end
16
+
17
+ test "perform destroys the repository's stacks" do
18
+ stack = Stack.first
19
+ Shipit.github.api.expects(:remove_hook).times(stack.github_hooks.count)
20
+ @repository.stacks << stack
21
+
22
+ assert_difference -> { Stack.count }, -@repository.stacks.size do
23
+ @job.perform(@repository)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -91,7 +91,7 @@ module Shipit
91
91
  last = stub(sha: 123)
92
92
  first = stub(sha: 345)
93
93
  Shipit::FirstParentCommitsIterator.any_instance.stubs(:each).multiple_yields(last, first)
94
- @job.stubs(lookup_commit: nil)
94
+ @job.stubs(lookup_commit: nil, stack: @stack)
95
95
 
96
96
  commits, parent = @job.fetch_missing_commits { stub }
97
97
  assert_nil parent
@@ -104,6 +104,7 @@ module Shipit
104
104
  Shipit::FirstParentCommitsIterator.any_instance.stubs(:each).multiple_yields(last, first)
105
105
  @job.stubs(:lookup_commit).with(123).returns(nil)
106
106
  @job.stubs(:lookup_commit).with(345).returns(first)
107
+ @job.stubs(stack: @stack)
107
108
 
108
109
  commits, parent = @job.fetch_missing_commits { stub }
109
110
  assert_equal first, parent
@@ -19,8 +19,8 @@ module Shipit
19
19
  end
20
20
 
21
21
  test "#perform fetch commits from the API" do
22
- @job.stubs(:capture!)
23
- @job.stubs(:capture)
22
+ Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture!)
23
+ Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture)
24
24
  @commands = stub
25
25
  Commands.expects(:for).with(@deploy).returns(@commands)
26
26
 
@@ -39,7 +39,7 @@ module Shipit
39
39
  @deploy.stack.expects(:release_status?).at_least_once.returns(false)
40
40
  Dir.stubs(:chdir).yields
41
41
  DeployCommands.any_instance.expects(:perform).returns([])
42
- @job.stubs(:capture!)
42
+ Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture!)
43
43
 
44
44
  assert_enqueued_with(job: FetchDeployedRevisionJob, args: [@deploy.stack]) do
45
45
  @job.perform(@deploy)
@@ -50,7 +50,7 @@ module Shipit
50
50
  @deploy.stack.expects(:release_status?).at_least_once.returns(false)
51
51
  Dir.stubs(:chdir).yields
52
52
  DeployCommands.any_instance.expects(:perform).returns([])
53
- @job.stubs(:capture!)
53
+ Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture!)
54
54
 
55
55
  assert_equal 'pending', @deploy.status
56
56
  @job.perform(@deploy)
@@ -63,7 +63,7 @@ module Shipit
63
63
 
64
64
  Dir.stubs(:chdir).yields
65
65
  DeployCommands.any_instance.expects(:perform).returns([])
66
- @job.stubs(:capture!)
66
+ Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture!)
67
67
 
68
68
  assert_equal 'pending', @deploy.status
69
69
  @job.perform(@deploy)
@@ -77,7 +77,7 @@ module Shipit
77
77
 
78
78
  Dir.stubs(:chdir).yields
79
79
  DeployCommands.any_instance.expects(:perform).returns([])
80
- @job.stubs(:capture!)
80
+ Shipit::TaskExecutionStrategy::Default.any_instance.stubs(:capture!)
81
81
 
82
82
  assert_equal 'pending', @deploy.status
83
83
  @job.perform(@deploy)
@@ -85,7 +85,7 @@ module Shipit
85
85
  end
86
86
 
87
87
  test "marks deploy as `error` if any application error is raised" do
88
- @job.expects(:capture!).raises("some error")
88
+ Shipit::TaskExecutionStrategy::Default.any_instance.expects(:capture!).raises("some error")
89
89
  assert_nothing_raised do
90
90
  @job.perform(@deploy)
91
91
  end
@@ -94,7 +94,7 @@ module Shipit
94
94
  end
95
95
 
96
96
  test "marks deploy as `failed` if a command exit with an error code" do
97
- @job.expects(:capture!).at_least_once.raises(Command::Error.new('something'))
97
+ Shipit::TaskExecutionStrategy::Default.any_instance.expects(:capture!).at_least_once.raises(Command::Error.new('something'))
98
98
  @job.perform(@deploy)
99
99
  assert_equal 'failed', @deploy.reload.status
100
100
  end
@@ -2,22 +2,22 @@
2
2
  require 'test_helper'
3
3
 
4
4
  module Shipit
5
- class MergePullRequestsJobTest < ActiveSupport::TestCase
5
+ class ProcessMergeRequestsJobTest < ActiveSupport::TestCase
6
6
  setup do
7
7
  @stack = shipit_stacks(:shipit)
8
- @job = MergePullRequestsJob.new
8
+ @job = ProcessMergeRequestsJob.new
9
9
 
10
- @pending_pr = shipit_pull_requests(:shipit_pending)
11
- @unmergeable_pr = shipit_pull_requests(:shipit_pending_unmergeable)
12
- @not_ready_pr = shipit_pull_requests(:shipit_pending_not_mergeable_yet)
13
- @closed_pr = shipit_pull_requests(:shipit_pending_closed)
14
- @merged_pr = shipit_pull_requests(:shipit_pending_merged)
15
- @expired_pr = shipit_pull_requests(:shipit_pending_expired)
16
- @mergable_pending_ci = shipit_pull_requests(:shipit_mergeable_pending_ci)
10
+ @pending_pr = shipit_merge_requests(:shipit_pending)
11
+ @unmergeable_pr = shipit_merge_requests(:shipit_pending_unmergeable)
12
+ @not_ready_pr = shipit_merge_requests(:shipit_pending_not_mergeable_yet)
13
+ @closed_pr = shipit_merge_requests(:shipit_pending_closed)
14
+ @merged_pr = shipit_merge_requests(:shipit_pending_merged)
15
+ @expired_pr = shipit_merge_requests(:shipit_pending_expired)
16
+ @mergable_pending_ci = shipit_merge_requests(:shipit_mergeable_pending_ci)
17
17
  end
18
18
 
19
19
  test "#perform rejects unmergeable PRs and merge the others" do
20
- PullRequest.any_instance.stubs(:refresh!)
20
+ MergeRequest.any_instance.stubs(:refresh!)
21
21
  stub_request(:put, "#{@pending_pr.api_url}/merge").to_return(status: %w(200 OK), body: {
22
22
  sha: "6dcb09b5b57875f334f61aebed695e2e4193db5e",
23
23
  merged: true,
@@ -35,7 +35,7 @@ module Shipit
35
35
  end
36
36
 
37
37
  test "#perform rejects PRs if the merge attempt fails" do
38
- PullRequest.any_instance.stubs(:refresh!)
38
+ MergeRequest.any_instance.stubs(:refresh!)
39
39
  stub_request(:put, "#{@pending_pr.api_url}/merge").to_return(status: %w(405 Method not allowed), body: {
40
40
  message: "Pull Request is not mergeable",
41
41
  documentation_url: "https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button",
@@ -47,24 +47,24 @@ module Shipit
47
47
  end
48
48
 
49
49
  test "#perform rejects PRs but do not attempt to merge any if the stack doesn't allow merges" do
50
- PullRequest.any_instance.stubs(:refresh!)
50
+ MergeRequest.any_instance.stubs(:refresh!)
51
51
  @stack.update!(lock_reason: 'Maintenance')
52
52
  @job.perform(@stack)
53
53
  assert_predicate @pending_pr.reload, :pending?
54
54
  end
55
55
 
56
56
  test "#perform revalidate PRs but do not attempt to merge any if the stack doesn't allow merges" do
57
- PullRequest.any_instance.stubs(:refresh!)
57
+ MergeRequest.any_instance.stubs(:refresh!)
58
58
  @stack.update!(lock_reason: 'Maintenance')
59
59
  @job.perform(@stack)
60
60
  assert_predicate @expired_pr.reload, :revalidating?
61
61
  end
62
62
 
63
63
  test "#perform schedules a new job if the first PR in the queue is not mergeable yet" do
64
- PullRequest.any_instance.stubs(:refresh!)
64
+ MergeRequest.any_instance.stubs(:refresh!)
65
65
 
66
66
  @pending_pr.update!(mergeable: nil)
67
- assert_enqueued_with(job: MergePullRequestsJob) do
67
+ assert_enqueued_with(job: ProcessMergeRequestsJob) do
68
68
  @job.perform(@stack)
69
69
  end
70
70
  assert_predicate @pending_pr.reload, :pending?
@@ -72,21 +72,21 @@ module Shipit
72
72
 
73
73
  test "#perform cancels merge requests for closed PRs" do
74
74
  @pending_pr.cancel!
75
- PullRequest.any_instance.stubs(:refresh!)
75
+ MergeRequest.any_instance.stubs(:refresh!)
76
76
  @job.perform(@stack)
77
77
  assert_predicate @closed_pr.reload, :canceled?
78
78
  end
79
79
 
80
80
  test "#perform cancels merge requests for manually merged PRs" do
81
81
  @pending_pr.cancel!
82
- PullRequest.any_instance.stubs(:refresh!)
82
+ MergeRequest.any_instance.stubs(:refresh!)
83
83
  @job.perform(@stack)
84
84
  assert_predicate @merged_pr.reload, :canceled?
85
85
  end
86
86
 
87
87
  test "#perform does not reject pull requests with pending statuses" do
88
88
  @pending_pr.cancel!
89
- PullRequest.any_instance.stubs(:refresh!)
89
+ MergeRequest.any_instance.stubs(:refresh!)
90
90
  @job.perform(@stack)
91
91
  refute_predicate @mergable_pending_ci.reload, :rejected?
92
92
  refute_predicate @mergable_pending_ci.reload, :merged?
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class DeployCommandsTest < ActiveSupport::TestCase
6
+ test "#env includes the stack's pull request labels" do
7
+ stack = shipit_stacks(:review_stack)
8
+ deploy = stack.trigger_continuous_delivery
9
+ stack.pull_request.labels = ["wip", "bug"]
10
+
11
+ env = Shipit::DeployCommands.new(deploy).env
12
+
13
+ assert_equal env["WIP"], "true"
14
+ assert_equal env["BUG"], "true"
15
+ end
16
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "test_helper"
4
+
5
+ class TaskCommandsTest < ActiveSupport::TestCase
6
+ test "#env includes a ReviewStack's pull request labels" do
7
+ stack = shipit_stacks(:review_stack)
8
+ stack.pull_request.labels = ["wip", "bug"]
9
+ task = shipit_tasks(:shipit_restart)
10
+ task.stack = stack
11
+
12
+ env = Shipit::TaskCommands.new(task).env
13
+
14
+ assert_equal env["WIP"], "true"
15
+ assert_equal env["BUG"], "true"
16
+ end
17
+ end
@@ -12,7 +12,7 @@ module Shipit
12
12
 
13
13
  test 'creation on GitHub' do
14
14
  response = stub(id: 44, url: 'https://example.com')
15
- @author.github_api.expects(:create_deployment_status).with(
15
+ @author.github_api.class.any_instance.expects(:create_deployment_status).with(
16
16
  @deployment.api_url,
17
17
  'in_progress',
18
18
  accept: "application/vnd.github.flash-preview+json",
@@ -33,7 +33,7 @@ module Shipit
33
33
  status = deployment.statuses.create!(status: 'success')
34
34
  status.stubs(:description).returns('desc' * limit)
35
35
  create_status_response = stub(id: 'abcd', url: 'https://github.com/status/abcd')
36
- status.author.github_api.expects(:create_deployment_status).with do |*_args, **kwargs|
36
+ status.author.github_api.class.any_instance.expects(:create_deployment_status).with do |_url, _status, kwargs|
37
37
  kwargs[:description].size <= limit
38
38
  end.returns(create_status_response)
39
39
 
@@ -47,7 +47,7 @@ module Shipit
47
47
  stack = status.stack
48
48
  stack.deploy_url = "stack-deploy-url"
49
49
  create_status_response = stub(id: 'abcd', url: 'https://github.com/status/abcd')
50
- status.author.github_api.expects(:create_deployment_status).with do |*_args, **kwargs|
50
+ status.author.github_api.class.any_instance.expects(:create_deployment_status).with do |_url, _status, kwargs|
51
51
  kwargs[:environment_url] == 'stack-deploy-url'
52
52
  end.returns(create_status_response)
53
53
 
@@ -170,6 +170,15 @@ module Shipit
170
170
  assert_equal limit, @commit.message.bytesize
171
171
  end
172
172
 
173
+ test "#message= truncates multibyte messages" do
174
+ skip unless Shipit::Commit.columns_hash['message'].limit
175
+ limit = Shipit::Commit.columns_hash['message'].limit
176
+
177
+ @commit.update!(message: '国' * limit)
178
+ assert_operator @commit.message.length, :<=, limit
179
+ assert_operator @commit.message.bytesize, :<=, limit
180
+ end
181
+
173
182
  test "#pull_request? detect pull request based on message format" do
174
183
  assert @pr.pull_request?
175
184
  refute @commit.pull_request?
@@ -341,6 +350,8 @@ module Shipit
341
350
  output: mock(
342
351
  title: 'Tests build ran successfully',
343
352
  ),
353
+ completed_at: Time.now,
354
+ started_at: Time.now - 1.minute,
344
355
  )
345
356
  response = mock(
346
357
  check_runs: [check_run],
@@ -678,7 +689,7 @@ module Shipit
678
689
  end
679
690
  end
680
691
 
681
- test "#add_status schedule a MergePullRequests job if the commit transition to `pending` or `success`" do
692
+ test "#add_status schedule a MergeMergeRequests job if the commit transition to `pending` or `success`" do
682
693
  commit = shipit_commits(:second)
683
694
  github_status = OpenStruct.new(
684
695
  state: 'success',
@@ -688,7 +699,7 @@ module Shipit
688
699
  )
689
700
 
690
701
  assert_equal 'failure', commit.state
691
- assert_enqueued_with(job: MergePullRequestsJob, args: [@commit.stack]) do
702
+ assert_enqueued_with(job: ProcessMergeRequestsJob, args: [@commit.stack]) do
692
703
  commit.create_status_from_github!(github_status)
693
704
  assert_equal 'success', commit.state
694
705
  end
@@ -729,12 +740,12 @@ module Shipit
729
740
  sha: '5590fd8b5f2be05d1fedb763a3605ee461c39074',
730
741
  message: "Merge pull request #62 from shipit-engine/yoloshipit\n\nyoloshipit!",
731
742
  )
732
- pull_request = shipit_pull_requests(:shipit_pending)
743
+ merge_request = shipit_merge_requests(:shipit_pending)
733
744
 
734
745
  assert_predicate commit, :pull_request?
735
746
  assert_equal 62, commit.pull_request_number
736
- assert_equal pull_request.title, commit.pull_request_title
737
- assert_equal pull_request, commit.pull_request
747
+ assert_equal merge_request.title, commit.pull_request_title
748
+ assert_equal merge_request, commit.merge_request
738
749
  end
739
750
 
740
751
  test "merge commits infer pull request number and title from the message if it's not a known pull request" do
@@ -750,7 +761,7 @@ module Shipit
750
761
  assert_predicate commit, :pull_request?
751
762
  assert_equal 99, commit.pull_request_number
752
763
  assert_equal 'yoloshipit!', commit.pull_request_title
753
- assert_nil commit.pull_request
764
+ assert_nil commit.merge_request
754
765
  end
755
766
 
756
767
  test "the merge requester if known overrides the commit author" do
@@ -779,7 +790,7 @@ module Shipit
779
790
  refute_predicate commit, :pull_request?
780
791
  assert_nil commit.pull_request_number
781
792
  assert_nil commit.pull_request_title
782
- assert_nil commit.pull_request
793
+ assert_nil commit.merge_request
783
794
  end
784
795
 
785
796
  test "#revert? returns false if the message doesn't follow the revert convention" do
@@ -838,12 +849,12 @@ module Shipit
838
849
  test "when merged via the queue, deploy_requested_at is merge_requested_at" do
839
850
  commit = shipit_commits(:cyclimse_merged)
840
851
  assert_predicate commit, :pull_request?
841
- assert_equal commit.pull_request, shipit_pull_requests(:cyclimse_pending_merged)
842
- assert_equal commit.deploy_requested_at, commit.pull_request.merge_requested_at
852
+ assert_equal commit.merge_request, shipit_merge_requests(:cyclimse_pending_merged)
853
+ assert_equal commit.deploy_requested_at, commit.merge_request.merge_requested_at
843
854
  end
844
855
 
845
856
  test "when merged manually after being queued, deploy_requested_at is created_at" do
846
- pr = shipit_pull_requests(:cyclimse_pending_merged)
857
+ pr = shipit_merge_requests(:cyclimse_pending_merged)
847
858
  pr.cancel!
848
859
  commit = shipit_commits(:cyclimse_merged)
849
860
  assert_equal commit.deploy_requested_at, commit.created_at
@@ -870,9 +881,9 @@ module Shipit
870
881
 
871
882
  def expect_hook_emit(commit, event, status_attributes, &block)
872
883
  matches = lambda do |payload|
873
- assert_equal commit, payload[:commit]
874
- assert_equal commit.stack, payload[:stack]
875
- assert_equal status_attributes[:state], payload[:status]
884
+ assert_equal(commit, payload[:commit])
885
+ assert_equal(commit.stack, payload[:stack])
886
+ assert_equal(status_attributes[:state], payload[:status])
876
887
  end
877
888
  expect_hook(event, commit.stack, matches, &block)
878
889
  end