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,31 @@
1
+ # frozen_string_literal: true
2
+ module Shipit
3
+ class MergeRequestsController < ShipitController
4
+ def index
5
+ @merge_requests = stack.merge_requests.queued
6
+ end
7
+
8
+ def create
9
+ if pr_number = MergeRequest.extract_number(stack, params[:number_or_url])
10
+ merge_request = MergeRequest.request_merge!(stack, pr_number, current_user)
11
+ flash[:success] = "Pull request ##{merge_request.number} added to the queue."
12
+ else
13
+ flash[:warning] = "Invalid or missing pull request number."
14
+ end
15
+ redirect_to(stack_merge_requests_path)
16
+ end
17
+
18
+ def destroy
19
+ merge_request = stack.merge_requests.find(params[:id])
20
+ merge_request.cancel!
21
+ flash[:success] = 'Merge canceled'
22
+ redirect_to(stack_merge_requests_path)
23
+ end
24
+
25
+ private
26
+
27
+ def stack
28
+ @stack ||= Stack.from_param!(params[:stack_id])
29
+ end
30
+ end
31
+ end
@@ -12,7 +12,7 @@ module Shipit
12
12
 
13
13
  if stack
14
14
  return render('logged_out') unless current_user.logged_in?
15
- if stale?(last_modified: [stack.updated_at, pull_request.updated_at].max, template: false)
15
+ if stale?(last_modified: [stack.updated_at, merge_request.updated_at].max, template: false)
16
16
  render(stack_status, layout: !request.xhr?)
17
17
  end
18
18
  else
@@ -23,13 +23,13 @@ module Shipit
23
23
  end
24
24
 
25
25
  def enqueue
26
- PullRequest.request_merge!(stack, params[:number], current_user)
26
+ MergeRequest.request_merge!(stack, params[:number], current_user)
27
27
  render(stack_status, layout: !request.xhr?)
28
28
  end
29
29
 
30
30
  def dequeue
31
- if pull_request = stack.pull_requests.find_by_number(params[:number])
32
- pull_request.cancel! if pull_request.waiting?
31
+ if merge_request = stack.merge_requests.find_by_number(params[:number])
32
+ merge_request.cancel! if merge_request.waiting?
33
33
  end
34
34
  render(stack_status, layout: !request.xhr?)
35
35
  end
@@ -38,12 +38,12 @@ module Shipit
38
38
  respond_to do |format|
39
39
  format.html do
40
40
  if stack_status == 'success'
41
- render plain: 'ok'
41
+ render(plain: 'ok')
42
42
  else
43
- render plain: stack_status, status: 503
43
+ render(plain: stack_status, status: 503)
44
44
  end
45
45
  end
46
- format.json { render json: { stack_status: stack_status } }
46
+ format.json { render(json: { stack_status: stack_status }) }
47
47
  end
48
48
  end
49
49
 
@@ -82,10 +82,10 @@ module Shipit
82
82
  @referrer_parser ||= ReferrerParser.new(params[:referrer])
83
83
  end
84
84
 
85
- def pull_request
86
- return @pull_request if defined?(@pull_request)
87
- @pull_request = pull_request_number && stack.pull_requests.find_by_number(pull_request_number)
88
- @pull_request ||= UnknownPullRequest.new
85
+ def merge_request
86
+ return @merge_request if defined?(@merge_request)
87
+ @merge_request = pull_request_number && stack.merge_requests.find_by_number(pull_request_number)
88
+ @merge_request ||= UnknownMergeRequest.new
89
89
  end
90
90
 
91
91
  def pull_request_number
@@ -98,14 +98,14 @@ module Shipit
98
98
  end
99
99
 
100
100
  helper_method :pull_request_number
101
- helper_method :pull_request
101
+ helper_method :merge_request
102
102
  helper_method :queue_enabled?
103
103
  helper_method :stack
104
104
  helper_method :stack_status
105
105
 
106
106
  # FIXME: for some reason if invoked in the view, those path helpers will link to /events?...
107
- helper_method :enqueue_pull_request_path
108
- helper_method :dequeue_pull_request_path
107
+ helper_method :enqueue_merge_request_path
108
+ helper_method :dequeue_merge_request_path
109
109
 
110
110
  class ReferrerParser
111
111
  URL_PATTERN = %r{\Ahttps://github\.com/([^/]+)/([^/]+)/pull/(\d+)}
@@ -123,7 +123,7 @@ module Shipit
123
123
  end
124
124
  end
125
125
 
126
- class UnknownPullRequest
126
+ class UnknownMergeRequest
127
127
  attr_reader :updated_at
128
128
 
129
129
  def initialize
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Shipit
4
+ class RepositoriesController < ShipitController
5
+ before_action :load_repository, only: %i(destroy settings update new_stack)
6
+
7
+ def index
8
+ @user_repositories = current_user.repositories_contributed_to
9
+
10
+ @repositories = Repository.order(:owner, :name).to_a
11
+ end
12
+
13
+ def show
14
+ @repository = Repository.from_param!(params[:id])
15
+
16
+ @stacks = @repository.stacks
17
+
18
+ @show_archived = params[:show_archived]
19
+ @stacks = @stacks.not_archived unless @show_archived
20
+ end
21
+
22
+ def create
23
+ @repository = Repository.new(create_params)
24
+ unless @repository.save
25
+ flash[:warning] = @repository.errors.full_messages.to_sentence
26
+ end
27
+ respond_with(@repository)
28
+ end
29
+
30
+ def new
31
+ @repository = Repository.new
32
+ end
33
+
34
+ def destroy
35
+ @repository.schedule_for_destroy!
36
+ redirect_to(repositories_url)
37
+ end
38
+
39
+ def update
40
+ options = {}
41
+ unless @repository.update(update_params)
42
+ options = { flash: { warning: @repository.errors.full_messages.to_sentence } }
43
+ end
44
+
45
+ redirect_to(params[:return_to].presence || repository_settings_path(@repository), options)
46
+ end
47
+
48
+ def settings
49
+ end
50
+
51
+ def new_stack
52
+ @stack = @repository.stacks.new
53
+ render("shipit/stacks/new")
54
+ end
55
+
56
+ private
57
+
58
+ def create_params
59
+ params.require(:repository).permit(:owner, :name)
60
+ end
61
+
62
+ def update_params
63
+ params.require(:repository).permit(
64
+ :review_stacks_enabled,
65
+ :provisioning_behavior,
66
+ :provisioning_label_name,
67
+ )
68
+ end
69
+
70
+ def load_repository
71
+ @repository = Repository.from_param!(params[:id])
72
+ end
73
+ end
74
+ end
@@ -154,7 +154,7 @@ module Shipit
154
154
  end
155
155
 
156
156
  def create_params
157
- params.require(:stack).permit(:environment, :branch, :deploy_url, :ignore_ci)
157
+ params.require(:stack).permit(:repo_owner, :repo_name, :environment, :branch, :deploy_url, :ignore_ci)
158
158
  end
159
159
 
160
160
  def update_params
@@ -180,7 +180,7 @@ module Shipit
180
180
  end
181
181
 
182
182
  def repository_params
183
- params.require(:stack).permit(:repo_owner, :repo_name)
183
+ params.require(:stack).permit(:repo_owner, :repo_name, :branch, :environment, :deploy_url, :ignore_ci)
184
184
  end
185
185
  end
186
186
  end
@@ -22,7 +22,7 @@ module Shipit
22
22
  task
23
23
  respond_to do |format|
24
24
  format.html
25
- format.text { render plain: @task.chunk_output }
25
+ format.text { render(plain: @task.chunk_output) }
26
26
  end
27
27
  end
28
28
 
@@ -48,7 +48,7 @@ module Shipit
48
48
  end
49
49
 
50
50
  def tail
51
- render(json: TailTaskSerializer.new(task, context: params))
51
+ render(json: TailTaskSerializer.new(task, context: { last_byte: params[:last_byte].to_i }))
52
52
  end
53
53
 
54
54
  def lookup
@@ -2,7 +2,7 @@
2
2
  module Shipit
3
3
  class WebhooksController < ActionController::Base
4
4
  skip_before_action :verify_authenticity_token, raise: false
5
- before_action :check_if_ping, :verify_signature
5
+ before_action :check_if_ping, :drop_unhandled_event, :verify_signature
6
6
 
7
7
  respond_to :json
8
8
 
@@ -15,8 +15,26 @@ module Shipit
15
15
 
16
16
  private
17
17
 
18
+ def drop_unhandled_event
19
+ # Acknowledge, but do nothing
20
+ head(204) unless Shipit::Webhooks.for_event(event).present?
21
+ end
22
+
18
23
  def verify_signature
19
- head(422) unless Shipit.github.verify_webhook_signature(request.headers['X-Hub-Signature'], request.raw_post)
24
+ github_app = Shipit.github(organization: repository_owner)
25
+ verified = github_app.verify_webhook_signature(
26
+ request.headers['X-Hub-Signature'],
27
+ request.raw_post
28
+ )
29
+ head(422) unless verified
30
+
31
+ Rails.logger.info([
32
+ 'WebhookController#verify_signature',
33
+ "event=#{event}",
34
+ "repository_owner=#{repository_owner}",
35
+ "signature=#{request.headers['X-Hub-Signature']}",
36
+ "status=#{status}",
37
+ ].join(' '))
20
38
  end
21
39
 
22
40
  def check_if_ping
@@ -27,8 +45,9 @@ module Shipit
27
45
  request.headers.fetch('X-Github-Event')
28
46
  end
29
47
 
30
- def stack
31
- @stack ||= Stack.find(params[:stack_id])
48
+ def repository_owner
49
+ # Fallback to the organization sub-object if repository isn't included in the payload
50
+ params.dig('repository', 'owner', 'login') || params.dig('organization', 'login')
32
51
  end
33
52
  end
34
53
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  module Shipit
3
3
  module ChunksHelper
4
- def next_chunks_url(task)
4
+ def next_chunks_url(task, last_byte: 0)
5
5
  return if task.finished?
6
- tail_stack_task_path(task.stack, task, last_id: task.chunks.last)
6
+ tail_stack_task_path(task.stack, task, last_byte: last_byte)
7
7
  end
8
8
  end
9
9
  end
@@ -51,6 +51,14 @@ module Shipit
51
51
  github_repo_url(stack.repo_owner, stack.repo_name, 'pull', number)
52
52
  end
53
53
 
54
+ def stack_github_url(stack)
55
+ if stack.respond_to?(:pull_request) && stack.pull_request
56
+ github_pull_request_url(stack.pull_request)
57
+ else
58
+ github_repo_url(stack.repo_owner, stack.repo_name)
59
+ end
60
+ end
61
+
54
62
  def link_to_github_deploy(deploy)
55
63
  url = github_commit_range_url(deploy.stack, *deploy.commit_range)
56
64
  text = deploy.commit_range.map(&:short_sha).join('...')
@@ -43,7 +43,6 @@ module Shipit
43
43
  end
44
44
 
45
45
  def missing_github_app_message
46
- # TODO: Document how to create an app
47
46
  <<-MESSAGE.html_safe
48
47
  Shipit requires a GitHub App to authenticate users and perform API calls.
49
48
  MESSAGE
@@ -91,5 +91,9 @@ module Shipit
91
91
  def positive_negative_class(value)
92
92
  value.to_f >= 0 ? 'positive' : 'negative'
93
93
  end
94
+
95
+ def contributor_class(stacks_contributed_to, stack_id)
96
+ stacks_contributed_to.include?(stack_id) ? "contributor" : "not-matching"
97
+ end
94
98
  end
95
99
  end
@@ -4,6 +4,7 @@ module Shipit
4
4
  include BackgroundJob::Unique
5
5
 
6
6
  queue_as :default
7
+ on_duplicate :drop
7
8
 
8
9
  # We observe that some objects regularly take longer than the default 10 seconds to create, e.g. deployments
9
10
  self.timeout = 40
@@ -4,7 +4,7 @@ module Shipit
4
4
  queue_as :hooks
5
5
 
6
6
  def perform(delivery)
7
- delivery = Hook::DeliverySpec.new(delivery) if delivery.is_a?(Hash)
7
+ delivery = Hook::DeliverySpec.new(**delivery) if delivery.is_a?(Hash)
8
8
  delivery.send!
9
9
  end
10
10
  end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ module Shipit
3
+ class DestroyRepositoryJob < BackgroundJob
4
+ queue_as :default
5
+
6
+ # repository
7
+ # +-- stacks
8
+ # +-- api_clients
9
+ # +-- commits
10
+ # | +-- commit_deployments
11
+ # | | +-- statuses
12
+ # | +-- statuses
13
+ # +-- github_hooks
14
+ # +-- hooks
15
+ # +-- pull_requests
16
+ # +-- tasks
17
+ # +-- chunks
18
+
19
+ def perform(repository)
20
+ repository.stacks.each { |stack| DestroyStackJob.perform_now(stack) }
21
+ repository.destroy!
22
+ end
23
+ end
24
+ end
@@ -11,7 +11,7 @@ module Shipit
11
11
  # | +-- statuses
12
12
  # +-- github_hooks
13
13
  # +-- hooks
14
- # +-- pull_requests
14
+ # +-- merge_requests
15
15
  # +-- tasks
16
16
  # +-- chunks
17
17
 
@@ -26,7 +26,7 @@ module Shipit
26
26
  Shipit::Commit.where(id: commits_ids).delete_all
27
27
  Shipit::GithubHook.where(stack_id: stack.id).destroy_all
28
28
  Shipit::Hook.where(stack_id: stack.id).delete_all
29
- Shipit::PullRequest.where(stack_id: stack.id).delete_all
29
+ Shipit::MergeRequest.where(stack_id: stack.id).delete_all
30
30
  tasks_ids.each_slice(100) do |ids|
31
31
  Shipit::OutputChunk.where(task_id: ids).delete_all
32
32
  Shipit::Task.where(id: ids).delete_all
@@ -3,8 +3,11 @@ module Shipit
3
3
  class GithubSyncJob < BackgroundJob
4
4
  include BackgroundJob::Unique
5
5
 
6
+ attr_reader :stack
7
+
6
8
  MAX_FETCHED_COMMITS = 25
7
9
  queue_as :default
10
+ on_duplicate :drop
8
11
 
9
12
  self.timeout = 60
10
13
  self.lock_timeout = 20
@@ -13,26 +16,27 @@ module Shipit
13
16
  @stack = Stack.find(params[:stack_id])
14
17
 
15
18
  handle_github_errors do
16
- new_commits, shared_parent = fetch_missing_commits { @stack.github_commits }
19
+ new_commits, shared_parent = fetch_missing_commits { stack.github_commits }
17
20
 
18
- @stack.transaction do
21
+ stack.transaction do
19
22
  shared_parent&.detach_children!
20
23
  appended_commits = new_commits.map do |gh_commit|
21
24
  append_commit(gh_commit)
22
25
  end
23
- @stack.lock_reverted_commits! if appended_commits.any?(&:revert?)
26
+ stack.lock_reverted_commits! if appended_commits.any?(&:revert?)
24
27
  end
25
28
  end
26
- CacheDeploySpecJob.perform_later(@stack)
29
+ CacheDeploySpecJob.perform_later(stack)
27
30
  end
28
31
 
29
32
  def append_commit(gh_commit)
30
- @stack.commits.create_from_github!(gh_commit)
33
+ stack.commits.create_from_github!(gh_commit)
31
34
  end
32
35
 
33
36
  def fetch_missing_commits(&block)
34
37
  commits = []
35
- iterator = Shipit::FirstParentCommitsIterator.new(&block)
38
+ github_api = stack&.github_api
39
+ iterator = Shipit::FirstParentCommitsIterator.new(github_api: github_api, &block)
36
40
  iterator.each_with_index do |commit, index|
37
41
  break if index >= MAX_FETCHED_COMMITS
38
42
 
@@ -49,13 +53,13 @@ module Shipit
49
53
  def handle_github_errors
50
54
  yield
51
55
  rescue Octokit::NotFound
52
- @stack.mark_as_inaccessible!
56
+ stack.mark_as_inaccessible!
53
57
  else
54
- @stack.mark_as_accessible!
58
+ stack.mark_as_accessible!
55
59
  end
56
60
 
57
61
  def lookup_commit(sha)
58
- @stack.commits.find_by(sha: sha)
62
+ stack.commits.find_by(sha: sha)
59
63
  end
60
64
  end
61
65
  end