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