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
@@ -0,0 +1,103 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shipit
4
+ module Webhooks
5
+ module Handlers
6
+ module PullRequest
7
+ class ReviewStackAdapter
8
+ delegate :archived?, to: :stack
9
+
10
+ def initialize(params, scope: Shipit::ReviewStack)
11
+ @params = params
12
+ @scope = scope
13
+ end
14
+
15
+ def stack
16
+ @stack ||= scope.find_by(environment: environment)
17
+ end
18
+
19
+ def find_or_create!
20
+ stack || create!
21
+ end
22
+
23
+ def archive!(*args, &block)
24
+ if stack.blank?
25
+ Rails.logger.info(
26
+ "Processing #{action} event for #{repo_name} PR #{pr_number} but no Stack exists. Ignoring."
27
+ )
28
+ return true
29
+ end
30
+ return if stack.archived?
31
+
32
+ stack.remove_from_provisioning_queue
33
+ stack.deprovision
34
+ stack.archive!(user, *args, &block)
35
+ end
36
+
37
+ def unarchive!(*args, &block)
38
+ if stack.blank?
39
+ Rails.logger.info(
40
+ "Processing #{action} event for #{repo_name} PR #{pr_number} but no ReviewStack exists. Creating."
41
+ )
42
+ return create!
43
+ end
44
+ return unless stack.archived?
45
+
46
+ stack.transaction do
47
+ Shipit::ReviewStackProvisioningQueue.add(stack)
48
+ stack.unarchive!(*args, &block)
49
+ end
50
+ end
51
+
52
+ def user
53
+ @user ||= Shipit::User.find_or_create_by_login!(params.sender["login"])
54
+ end
55
+
56
+ private
57
+
58
+ attr_reader :params, :scope
59
+
60
+ def action
61
+ params.action
62
+ end
63
+
64
+ def repo_name
65
+ params.repository["full_name"]
66
+ end
67
+
68
+ def pr_number
69
+ params.number
70
+ end
71
+
72
+ def create!
73
+ ReviewStack.transaction do
74
+ stack = scope.create!(stack_attributes)
75
+ stack
76
+ .build_pull_request
77
+ .update!(
78
+ github_pull_request: params.pull_request
79
+ )
80
+ end
81
+
82
+ Shipit::ReviewStackProvisioningQueue.add(stack)
83
+
84
+ @stack = stack
85
+ end
86
+
87
+ def stack_attributes
88
+ {
89
+ branch: params.pull_request.head.ref,
90
+ environment: environment,
91
+ ignore_ci: false,
92
+ continuous_deployment: false,
93
+ }
94
+ end
95
+
96
+ def environment
97
+ "pr#{params.number}"
98
+ end
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,107 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shipit
4
+ module Webhooks
5
+ module Handlers
6
+ module PullRequest
7
+ class UnlabeledHandler < Shipit::Webhooks::Handlers::Handler
8
+ params do
9
+ requires :action, String
10
+ requires :number, Integer
11
+ requires :pull_request do
12
+ requires :id, Integer
13
+ requires :number, Integer
14
+ requires :url, String
15
+ requires :title, String
16
+ requires :state, String
17
+ requires :additions, Integer
18
+ requires :deletions, Integer
19
+ requires :head do
20
+ requires :sha, String
21
+ requires :ref, String
22
+ end
23
+ requires :user do
24
+ requires :login, String
25
+ end
26
+ requires :assignees, Array do
27
+ requires :login, String
28
+ end
29
+ requires :labels, Array do
30
+ requires :name, String
31
+ end
32
+ end
33
+ requires :repository do
34
+ requires :full_name, String
35
+ end
36
+ requires :sender do
37
+ requires :login, String
38
+ end
39
+ end
40
+
41
+ def process
42
+ return unless respond_to_label_change?
43
+
44
+ handle
45
+ end
46
+
47
+ private
48
+
49
+ def handle
50
+ if archive?
51
+ stack.archive!
52
+ elsif unarchive?
53
+ stack.unarchive!
54
+ end
55
+
56
+ stack
57
+ end
58
+
59
+ def repository
60
+ @repository ||=
61
+ Shipit::Repository.from_github_repo_name(params.repository.full_name) ||
62
+ Shipit::NullRepository.new
63
+ end
64
+
65
+ def stack
66
+ @stack ||=
67
+ Shipit::Webhooks::Handlers::PullRequest::ReviewStackAdapter
68
+ .new(params, scope: repository.review_stacks)
69
+ end
70
+
71
+ def pull_request
72
+ params.pull_request
73
+ end
74
+
75
+ def pull_request_state
76
+ pull_request["state"]
77
+ end
78
+
79
+ def respond_to_label_change?
80
+ params.action == "unlabeled" &&
81
+ pull_request_state == "open" &&
82
+ repository.review_stacks_enabled &&
83
+ (archive? || unarchive?)
84
+ end
85
+
86
+ def archive?
87
+ (repository.provisioning_behavior_allow_with_label? && !pull_request_has_provisioning_label?) ||
88
+ (repository.provisioning_behavior_prevent_with_label? && pull_request_has_provisioning_label?)
89
+ end
90
+
91
+ def unarchive?
92
+ (repository.provisioning_behavior_allow_with_label? && pull_request_has_provisioning_label?) ||
93
+ (repository.provisioning_behavior_prevent_with_label? && !pull_request_has_provisioning_label?)
94
+ end
95
+
96
+ def pull_request_has_provisioning_label?
97
+ pull_request_label_names.include?(repository.provisioning_label_name)
98
+ end
99
+
100
+ def pull_request_label_names
101
+ Array.new(pull_request.labels).map(&:name)
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
@@ -7,7 +7,10 @@ module Shipit
7
7
  requires :ref
8
8
  end
9
9
  def process
10
- stacks.where(branch: branch).each(&:sync_github)
10
+ stacks
11
+ .not_archived
12
+ .where(branch: branch)
13
+ .find_each(&:sync_github)
11
14
  end
12
15
 
13
16
  private
@@ -5,6 +5,16 @@ module Shipit
5
5
  def default_handlers
6
6
  {
7
7
  'push' => [Handlers::PushHandler],
8
+ 'pull_request' => [
9
+ Handlers::PullRequest::OpenedHandler,
10
+ Handlers::PullRequest::ClosedHandler,
11
+ Handlers::PullRequest::ReopenedHandler,
12
+ Handlers::PullRequest::EditedHandler,
13
+ Handlers::PullRequest::AssignedHandler,
14
+ Handlers::PullRequest::LabeledHandler,
15
+ Handlers::PullRequest::UnlabeledHandler,
16
+ Handlers::PullRequest::LabelCapturingHandler,
17
+ ],
8
18
  'status' => [Handlers::StatusHandler],
9
19
  'membership' => [Handlers::MembershipHandler],
10
20
  'check_suite' => [Handlers::CheckSuiteHandler],
@@ -22,5 +22,11 @@ module Shipit
22
22
  def type
23
23
  :deploy
24
24
  end
25
+
26
+ def rollback_once_aborted_to
27
+ return nil unless object.rollback_once_aborted_to
28
+
29
+ DeploySerializer.new(object.rollback_once_aborted_to)
30
+ end
25
31
  end
26
32
  end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+ module Shipit
3
+ class MergeRequestSerializer < ActiveModel::Serializer
4
+ include GithubUrlHelper
5
+ include ConditionalAttributes
6
+
7
+ has_one :merge_requested_by
8
+ has_one :head, serializer: ShortCommitSerializer
9
+
10
+ attributes :id, :number, :title, :github_id, :additions, :deletions, :state, :merge_status, :mergeable,
11
+ :merge_requested_at, :rejection_reason, :html_url, :branch, :base_ref
12
+
13
+ def html_url
14
+ github_pull_request_url(object)
15
+ end
16
+
17
+ def include_rejection_reason?
18
+ object.rejection_reason?
19
+ end
20
+ end
21
+ end
@@ -1,21 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class PullRequestSerializer < ActiveModel::Serializer
4
5
  include GithubUrlHelper
5
6
  include ConditionalAttributes
6
7
 
7
- has_one :merge_requested_by
8
+ has_one :user
8
9
  has_one :head, serializer: ShortCommitSerializer
10
+ has_many :assignees, serializer: UserSerializer
9
11
 
10
- attributes :id, :number, :title, :github_id, :additions, :deletions, :state, :merge_status, :mergeable,
11
- :merge_requested_at, :rejection_reason, :html_url, :branch, :base_ref
12
+ attributes :id, :number, :title, :github_id, :additions, :deletions, :state, :html_url
12
13
 
13
14
  def html_url
14
- github_pull_request_url(object)
15
- end
16
-
17
- def include_rejection_reason?
18
- object.rejection_reason?
15
+ github_pull_request_url(object) if object.stack.present?
19
16
  end
20
17
  end
21
18
  end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shipit
4
+ class ReviewStackSerializer < Shipit::StackSerializer
5
+ has_one :pull_request
6
+ end
7
+ end
@@ -4,10 +4,11 @@ module Shipit
4
4
  include ConditionalAttributes
5
5
 
6
6
  has_one :lock_author
7
- attributes :id, :repo_owner, :repo_name, :environment, :html_url, :url, :tasks_url, :deploy_url, :pull_requests_url,
8
- :deploy_spec, :undeployed_commits_count, :is_locked, :lock_reason, :continuous_deployment, :created_at,
9
- :updated_at, :locked_since, :last_deployed_at, :branch, :merge_queue_enabled, :is_archived,
10
- :archived_since
7
+
8
+ attributes :id, :repo_owner, :repo_name, :environment, :html_url, :url, :tasks_url, :deploy_url,
9
+ :merge_requests_url, :deploy_spec, :undeployed_commits_count, :is_locked, :lock_reason, :continuous_deployment,
10
+ :created_at, :updated_at, :locked_since, :last_deployed_at, :branch, :merge_queue_enabled, :is_archived,
11
+ :archived_since
11
12
 
12
13
  def url
13
14
  api_stack_url(object)
@@ -21,8 +22,8 @@ module Shipit
21
22
  api_stack_tasks_url(object)
22
23
  end
23
24
 
24
- def pull_requests_url
25
- api_stack_pull_requests_url(object)
25
+ def merge_requests_url
26
+ api_stack_merge_requests_url(object)
26
27
  end
27
28
 
28
29
  def is_locked
@@ -8,7 +8,7 @@ module Shipit
8
8
 
9
9
  def url
10
10
  return @url if defined? @url
11
- @url = next_chunks_url(task)
11
+ @url = next_chunks_url(task, last_byte: next_offset)
12
12
  end
13
13
 
14
14
  def include_url?
@@ -16,7 +16,7 @@ module Shipit
16
16
  end
17
17
 
18
18
  def output
19
- task.chunks.tail(context[:last_id]).pluck(:text).join
19
+ @output ||= task.tail_output(last_byte)
20
20
  end
21
21
 
22
22
  def rollback_url
@@ -32,6 +32,14 @@ module Shipit
32
32
  alias_method :task, :object
33
33
  delegate :stack, to: :object
34
34
 
35
+ def next_offset
36
+ last_byte + output.bytesize
37
+ end
38
+
39
+ def last_byte
40
+ context[:last_byte].to_i
41
+ end
42
+
35
43
  def rollback
36
44
  return @rollback if defined? @rollback
37
45
  @rollback = stack.rollbacks.where(parent_id: task.id).last
@@ -6,7 +6,7 @@ module Shipit
6
6
  has_one :author
7
7
  has_one :revision, serializer: ShortCommitSerializer
8
8
 
9
- attributes(:id, :url, :html_url, :output_url, :type, :status, :action, :title, :description, :started_at, :ended_at, :updated_at, :created_at, :env, :ignored_safeties)
9
+ attributes(:id, :url, :html_url, :output_url, :type, :status, :action, :title, :description, :started_at, :ended_at, :updated_at, :created_at, :env, :ignored_safeties, :max_retries, :retry_attempt)
10
10
 
11
11
  def revision
12
12
  object.until_commit
@@ -3,6 +3,6 @@ class SubsetValidator < ActiveModel::EachValidator
3
3
  def validate_each(record, attribute, value)
4
4
  superset = options[:of]
5
5
  rest = value - superset
6
- record.errors.add(attribute, :subset, options) unless rest.empty?
6
+ record.errors.add(attribute, :subset, **options) unless rest.empty?
7
7
  end
8
8
  end
@@ -4,7 +4,7 @@
4
4
  <%= stylesheet_link_tag *(params[:stylesheets] || []).select { |url| url.start_with?('https://assets-cdn.github.com/', 'https://github.githubassets.com/') } %>
5
5
  <%= stylesheet_link_tag 'merge_status' %>
6
6
  </head>
7
- <body>
7
+ <body data-color-mode="<%= params[:mode] %>">
8
8
  <div class="merge-status-container" data-layout-content><%= yield %></div>
9
9
  <%= javascript_include_tag 'merge_status' %>
10
10
  </body>
@@ -0,0 +1,29 @@
1
+ <li class="pr" id="pr-<%= merge_request.id %>">
2
+ <%= render 'shipit/shared/author', author: merge_request.merge_requested_by %>
3
+ <div class="pr-details">
4
+ <span class="pr-number">
5
+ <%= pull_request_link(merge_request) %>
6
+ </span>
7
+ <span class="pr-title">
8
+ <%= render_pull_request_title_with_link merge_request %>
9
+ </span>
10
+ <p class="pr-meta">
11
+ <span class="code-additions">+<%= merge_request.additions %></span>
12
+ <span class="code-deletions">-<%= merge_request.deletions %></span>
13
+ </p>
14
+ <p class="pr-meta">
15
+ Enqueued <%= timeago_tag(merge_request.merge_requested_at, force: true) %>
16
+ <% if merge_request.revalidating? %>
17
+ <em class="warning">Need revalidation.</em>
18
+ <% end %>
19
+ </p>
20
+ </div>
21
+ <% if merge_request.revalidating? %>
22
+ <div class="commit-actions">
23
+ <%= button_to 'Confirm', stack_merge_requests_path(merge_request.stack, number_or_url: merge_request.number), class: 'btn btn--warning', method: 'post' %>
24
+ </div>
25
+ <% end %>
26
+ <div class="commit-actions">
27
+ <%= button_to 'Cancel', stack_merge_request_path(merge_request.stack, merge_request), class: 'btn btn--warning', method: 'delete' %>
28
+ </div>
29
+ </li>
@@ -5,7 +5,7 @@
5
5
  <div class="wrapper">
6
6
  <section>
7
7
  <header class="section-header">
8
- <%= form_tag stack_pull_requests_path(@stack) do %>
8
+ <%= form_tag stack_merge_requests_path(@stack) do %>
9
9
  <div class="field-wrapper inline">
10
10
  <%= text_field_tag :number_or_url, '', placeholder: 'PR number or URL' %>
11
11
  <%= submit_tag 'Request merge', class: 'btn' %>
@@ -14,7 +14,7 @@
14
14
  </header>
15
15
 
16
16
  <ul class="pr-list">
17
- <%= render @pull_requests %>
17
+ <%= render @merge_requests %>
18
18
  </ul>
19
19
  </section>
20
20
  </div>