shipit-engine 0.30.0 → 0.34.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 (410) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +19 -4
  3. data/Rakefile +4 -2
  4. data/app/assets/images/magic-solid.svg +1 -0
  5. data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
  6. data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
  7. data/app/assets/stylesheets/_pages/_deploy.scss +0 -2
  8. data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
  9. data/app/assets/stylesheets/_pages/_stacks.scss +19 -3
  10. data/app/assets/stylesheets/merge_status.scss +0 -3
  11. data/app/assets/stylesheets/shipit.scss +1 -0
  12. data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +1 -0
  13. data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
  14. data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
  15. data/app/controllers/concerns/shipit/api/rendering.rb +5 -4
  16. data/app/controllers/concerns/shipit/authentication.rb +3 -2
  17. data/app/controllers/concerns/shipit/pagination.rb +2 -1
  18. data/app/controllers/shipit/api/base_controller.rb +11 -6
  19. data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
  20. data/app/controllers/shipit/api/commits_controller.rb +2 -1
  21. data/app/controllers/shipit/api/deploys_controller.rb +6 -3
  22. data/app/controllers/shipit/api/hooks_controller.rb +6 -5
  23. data/app/controllers/shipit/api/locks_controller.rb +5 -4
  24. data/app/controllers/shipit/api/merge_requests_controller.rb +37 -0
  25. data/app/controllers/shipit/api/outputs_controller.rb +2 -1
  26. data/app/controllers/shipit/api/release_statuses_controller.rb +3 -2
  27. data/app/controllers/shipit/api/rollbacks_controller.rb +34 -0
  28. data/app/controllers/shipit/api/stacks_controller.rb +32 -5
  29. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  30. data/app/controllers/shipit/api_clients_controller.rb +4 -3
  31. data/app/controllers/shipit/ccmenu_url_controller.rb +4 -3
  32. data/app/controllers/shipit/commit_checks_controller.rb +2 -1
  33. data/app/controllers/shipit/commits_controller.rb +2 -1
  34. data/app/controllers/shipit/deploys_controller.rb +4 -3
  35. data/app/controllers/shipit/github_authentication_controller.rb +4 -3
  36. data/app/controllers/shipit/merge_requests_controller.rb +31 -0
  37. data/app/controllers/shipit/merge_status_controller.rb +31 -30
  38. data/app/controllers/shipit/release_statuses_controller.rb +3 -2
  39. data/app/controllers/shipit/repositories_controller.rb +74 -0
  40. data/app/controllers/shipit/rollbacks_controller.rb +3 -2
  41. data/app/controllers/shipit/shipit_controller.rb +2 -1
  42. data/app/controllers/shipit/stacks_controller.rb +24 -9
  43. data/app/controllers/shipit/status_controller.rb +2 -1
  44. data/app/controllers/shipit/tasks_controller.rb +7 -6
  45. data/app/controllers/shipit/webhooks_controller.rb +26 -6
  46. data/app/helpers/shipit/chunks_helper.rb +3 -2
  47. data/app/helpers/shipit/deploys_helper.rb +4 -3
  48. data/app/helpers/shipit/github_url_helper.rb +9 -0
  49. data/app/helpers/shipit/merge_status_helper.rb +1 -0
  50. data/app/helpers/shipit/shipit_helper.rb +1 -1
  51. data/app/helpers/shipit/stacks_helper.rb +5 -0
  52. data/app/helpers/shipit/tasks_helper.rb +1 -0
  53. data/app/jobs/shipit/background_job.rb +4 -0
  54. data/app/jobs/shipit/background_job/unique.rb +1 -0
  55. data/app/jobs/shipit/cache_deploy_spec_job.rb +1 -0
  56. data/app/jobs/shipit/chunk_rollup_job.rb +4 -0
  57. data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
  58. data/app/jobs/shipit/continuous_delivery_job.rb +2 -1
  59. data/app/jobs/shipit/create_on_github_job.rb +7 -1
  60. data/app/jobs/shipit/create_release_statuses_job.rb +1 -0
  61. data/app/jobs/shipit/deferred_touch_job.rb +4 -0
  62. data/app/jobs/shipit/deliver_hook_job.rb +2 -1
  63. data/app/jobs/shipit/destroy_job.rb +1 -0
  64. data/app/jobs/shipit/destroy_repository_job.rb +24 -0
  65. data/app/jobs/shipit/destroy_stack_job.rb +3 -2
  66. data/app/jobs/shipit/emit_event_job.rb +2 -1
  67. data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
  68. data/app/jobs/shipit/fetch_deployed_revision_job.rb +1 -0
  69. data/app/jobs/shipit/github_sync_job.rb +15 -10
  70. data/app/jobs/shipit/mark_deploy_healthy_job.rb +1 -0
  71. data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
  72. data/app/jobs/shipit/perform_task_job.rb +5 -92
  73. data/app/jobs/shipit/process_merge_requests_job.rb +32 -0
  74. data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
  75. data/app/jobs/shipit/reap_dead_tasks_job.rb +21 -0
  76. data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
  77. data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
  78. data/app/jobs/shipit/refresh_merge_request_job.rb +11 -0
  79. data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
  80. data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
  81. data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
  82. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +5 -4
  83. data/app/models/concerns/shipit/deferred_touch.rb +4 -3
  84. data/app/models/shipit/anonymous_user.rb +15 -2
  85. data/app/models/shipit/api_client.rb +3 -2
  86. data/app/models/shipit/application_record.rb +2 -1
  87. data/app/models/shipit/check_run.rb +41 -4
  88. data/app/models/shipit/command_line_user.rb +5 -0
  89. data/app/models/shipit/commit.rb +42 -24
  90. data/app/models/shipit/commit_checks.rb +15 -13
  91. data/app/models/shipit/commit_deployment.rb +6 -5
  92. data/app/models/shipit/commit_deployment_status.rb +5 -4
  93. data/app/models/shipit/commit_message.rb +1 -0
  94. data/app/models/shipit/delivery.rb +4 -3
  95. data/app/models/shipit/deploy.rb +23 -28
  96. data/app/models/shipit/deploy_spec.rb +38 -7
  97. data/app/models/shipit/deploy_spec/bundler_discovery.rb +1 -0
  98. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
  99. data/app/models/shipit/deploy_spec/file_system.rb +20 -7
  100. data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +1 -0
  101. data/app/models/shipit/deploy_spec/lerna_discovery.rb +13 -4
  102. data/app/models/shipit/deploy_spec/npm_discovery.rb +5 -4
  103. data/app/models/shipit/deploy_spec/pypi_discovery.rb +1 -0
  104. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
  105. data/app/models/shipit/deploy_stats.rb +2 -1
  106. data/app/models/shipit/duration.rb +5 -2
  107. data/app/models/shipit/ephemeral_commit_checks.rb +1 -0
  108. data/app/models/shipit/github_hook.rb +2 -1
  109. data/app/models/shipit/github_status.rb +2 -1
  110. data/app/models/shipit/hook.rb +34 -7
  111. data/app/models/shipit/membership.rb +3 -2
  112. data/app/models/shipit/merge_request.rb +304 -0
  113. data/app/models/shipit/output_chunk.rb +7 -2
  114. data/app/models/shipit/provisioning_handler.rb +32 -0
  115. data/app/models/shipit/provisioning_handler/base.rb +30 -0
  116. data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
  117. data/app/models/shipit/pull_request.rb +28 -266
  118. data/app/models/shipit/pull_request_assignment.rb +10 -0
  119. data/app/models/shipit/record.rb +18 -0
  120. data/app/models/shipit/release_status.rb +4 -3
  121. data/app/models/shipit/repository.rb +71 -6
  122. data/app/models/shipit/review_stack.rb +130 -0
  123. data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
  124. data/app/models/shipit/rollback.rb +1 -0
  125. data/app/models/shipit/stack.rb +144 -44
  126. data/app/models/shipit/status.rb +3 -2
  127. data/app/models/shipit/status/common.rb +7 -6
  128. data/app/models/shipit/status/group.rb +2 -1
  129. data/app/models/shipit/status/missing.rb +2 -1
  130. data/app/models/shipit/status/unknown.rb +2 -1
  131. data/app/models/shipit/task.rb +98 -12
  132. data/app/models/shipit/task_definition.rb +1 -0
  133. data/app/models/shipit/task_execution_strategy/base.rb +20 -0
  134. data/app/models/shipit/task_execution_strategy/default.rb +109 -0
  135. data/app/models/shipit/team.rb +6 -3
  136. data/app/models/shipit/undeployed_commit.rb +1 -0
  137. data/app/models/shipit/unlimited_api_client.rb +1 -0
  138. data/app/models/shipit/user.rb +19 -8
  139. data/app/models/shipit/variable_definition.rb +1 -0
  140. data/app/models/shipit/webhooks.rb +11 -0
  141. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +1 -0
  142. data/app/models/shipit/webhooks/handlers/handler.rb +1 -0
  143. data/app/models/shipit/webhooks/handlers/membership_handler.rb +1 -0
  144. data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +74 -0
  145. data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +68 -0
  146. data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +74 -0
  147. data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +127 -0
  148. data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +106 -0
  149. data/app/models/shipit/webhooks/handlers/pull_request/opened_handler.rb +83 -0
  150. data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +88 -0
  151. data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +103 -0
  152. data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +107 -0
  153. data/app/models/shipit/webhooks/handlers/push_handler.rb +5 -1
  154. data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -0
  155. data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
  156. data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
  157. data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
  158. data/app/serializers/shipit/commit_serializer.rb +1 -0
  159. data/app/serializers/shipit/deploy_serializer.rb +8 -1
  160. data/app/serializers/shipit/hook_serializer.rb +1 -0
  161. data/app/serializers/shipit/merge_request_serializer.rb +21 -0
  162. data/app/serializers/shipit/pull_request_serializer.rb +6 -8
  163. data/app/serializers/shipit/review_stack_serializer.rb +7 -0
  164. data/app/serializers/shipit/rollback_serializer.rb +1 -0
  165. data/app/serializers/shipit/short_commit_serializer.rb +1 -0
  166. data/app/serializers/shipit/stack_serializer.rb +8 -6
  167. data/app/serializers/shipit/tail_task_serializer.rb +11 -2
  168. data/app/serializers/shipit/task_serializer.rb +2 -17
  169. data/app/serializers/shipit/user_serializer.rb +6 -1
  170. data/app/validators/ascii_only_validator.rb +1 -0
  171. data/app/validators/subset_validator.rb +2 -1
  172. data/app/views/layouts/merge_status.html.erb +1 -1
  173. data/app/views/layouts/shipit.html.erb +1 -1
  174. data/app/views/shipit/_variables.html.erb +1 -1
  175. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  176. data/app/views/shipit/deploys/show.html.erb +2 -2
  177. data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
  178. data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
  179. data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
  180. data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
  181. data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
  182. data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
  183. data/app/views/shipit/merge_status/failure.html.erb +1 -1
  184. data/app/views/shipit/merge_status/locked.html.erb +1 -1
  185. data/app/views/shipit/merge_status/success.html.erb +2 -2
  186. data/app/views/shipit/repositories/_header.html.erb +19 -0
  187. data/app/views/shipit/repositories/index.html.erb +31 -0
  188. data/app/views/shipit/repositories/new.html.erb +23 -0
  189. data/app/views/shipit/repositories/settings.html.erb +53 -0
  190. data/app/views/shipit/repositories/show.html.erb +30 -0
  191. data/app/views/shipit/stacks/_banners.html.erb +15 -1
  192. data/app/views/shipit/stacks/_header.html.erb +20 -7
  193. data/app/views/shipit/stacks/_stack.html.erb +8 -0
  194. data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
  195. data/app/views/shipit/stacks/index.html.erb +3 -2
  196. data/app/views/shipit/stacks/new.html.erb +1 -1
  197. data/app/views/shipit/stacks/settings.html.erb +5 -5
  198. data/app/views/shipit/stacks/show.html.erb +1 -1
  199. data/app/views/shipit/tasks/_task_output.html.erb +1 -1
  200. data/app/views/shipit/tasks/show.html.erb +1 -1
  201. data/config/initializers/inflections.rb +2 -1
  202. data/config/locales/en.yml +4 -3
  203. data/config/routes.rb +25 -7
  204. data/config/secrets.development.example.yml +24 -0
  205. data/config/secrets.development.shopify.yml +20 -9
  206. data/db/migrate/20200226211925_add_index_to_tasks_status.rb +5 -0
  207. data/db/migrate/20200427135152_add_pull_request_head_sha_to_commit.rb +5 -0
  208. data/db/migrate/20200615181558_add_rollback_once_aborted_to.rb +5 -0
  209. data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
  210. data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
  211. data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
  212. data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
  213. data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
  214. data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
  215. data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
  216. data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
  217. data/db/migrate/20210325194053_remove_stacks_branch_default.rb +5 -0
  218. data/db/migrate/20210504200438_add_github_updated_at_to_check_runs.rb +5 -0
  219. data/lib/shipit.rb +61 -17
  220. data/lib/shipit/cast_value.rb +1 -0
  221. data/lib/shipit/command.rb +20 -21
  222. data/lib/shipit/commands.rb +14 -6
  223. data/lib/shipit/csv_serializer.rb +1 -0
  224. data/lib/shipit/deploy_commands.rb +1 -0
  225. data/lib/shipit/engine.rb +9 -2
  226. data/lib/shipit/environment_variables.rb +11 -1
  227. data/lib/shipit/first_parent_commits_iterator.rb +1 -0
  228. data/lib/shipit/flock.rb +9 -1
  229. data/lib/shipit/github_app.rb +15 -12
  230. data/lib/shipit/github_http_cache_middleware.rb +1 -0
  231. data/lib/shipit/null_serializer.rb +1 -0
  232. data/lib/shipit/octokit_check_runs.rb +3 -2
  233. data/lib/shipit/octokit_iterator.rb +4 -3
  234. data/lib/shipit/paginator.rb +3 -2
  235. data/lib/shipit/review_stack_commands.rb +8 -0
  236. data/lib/shipit/rollback_commands.rb +1 -0
  237. data/lib/shipit/same_site_cookie_middleware.rb +29 -0
  238. data/lib/shipit/simple_message_verifier.rb +3 -2
  239. data/lib/shipit/stack_commands.rb +37 -7
  240. data/lib/shipit/stat.rb +1 -0
  241. data/lib/shipit/task_commands.rb +23 -16
  242. data/lib/shipit/version.rb +2 -1
  243. data/lib/snippets/publish-lerna-independent-packages +35 -34
  244. data/lib/snippets/publish-lerna-independent-packages-legacy +39 -0
  245. data/lib/snippets/release-gem +5 -1
  246. data/lib/tasks/cron.rake +13 -2
  247. data/lib/tasks/dev.rake +3 -2
  248. data/lib/tasks/shipit.rake +15 -14
  249. data/lib/tasks/teams.rake +1 -0
  250. data/test/controllers/api/base_controller_test.rb +3 -2
  251. data/test/controllers/api/ccmenu_controller_test.rb +9 -8
  252. data/test/controllers/api/commits_controller_test.rb +3 -2
  253. data/test/controllers/api/deploys_controller_test.rb +32 -14
  254. data/test/controllers/api/hooks_controller_test.rb +8 -7
  255. data/test/controllers/api/locks_controller_test.rb +7 -6
  256. data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +17 -16
  257. data/test/controllers/api/outputs_controller_test.rb +3 -1
  258. data/test/controllers/api/release_statuses_controller_test.rb +2 -1
  259. data/test/controllers/api/rollback_controller_test.rb +113 -0
  260. data/test/controllers/api/stacks_controller_test.rb +71 -16
  261. data/test/controllers/api/tasks_controller_test.rb +13 -12
  262. data/test/controllers/api_clients_controller_test.rb +5 -4
  263. data/test/controllers/ccmenu_controller_test.rb +4 -3
  264. data/test/controllers/commit_checks_controller_test.rb +4 -3
  265. data/test/controllers/commits_controller_test.rb +3 -2
  266. data/test/controllers/deploys_controller_test.rb +32 -21
  267. data/test/controllers/github_authentication_controller_test.rb +1 -0
  268. data/test/controllers/merge_requests_controller_test.rb +32 -0
  269. data/test/controllers/merge_status_controller_test.rb +7 -6
  270. data/test/controllers/release_statuses_controller_test.rb +3 -2
  271. data/test/controllers/repositories_controller_test.rb +71 -0
  272. data/test/controllers/rollbacks_controller_test.rb +9 -8
  273. data/test/controllers/stacks_controller_test.rb +41 -19
  274. data/test/controllers/status_controller_test.rb +1 -0
  275. data/test/controllers/tasks_controller_test.rb +32 -19
  276. data/test/controllers/webhooks_controller_test.rb +33 -17
  277. data/test/dummy/app/assets/config/manifest.js +3 -0
  278. data/test/dummy/config/application.rb +7 -2
  279. data/test/dummy/config/database.yml +9 -0
  280. data/test/dummy/config/environments/development.rb +3 -4
  281. data/test/dummy/config/environments/test.rb +2 -5
  282. data/test/dummy/config/secrets_double_github_app.yml +79 -0
  283. data/test/dummy/db/schema.rb +59 -17
  284. data/test/dummy/db/seeds.rb +2 -1
  285. data/test/fixtures/payloads/check_suite_master.json +4 -32
  286. data/test/fixtures/payloads/invalid_pull_request.json +117 -0
  287. data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
  288. data/test/fixtures/payloads/pull_request_assigned.json +480 -0
  289. data/test/fixtures/payloads/pull_request_closed.json +454 -0
  290. data/test/fixtures/payloads/pull_request_labeled.json +461 -0
  291. data/test/fixtures/payloads/pull_request_opened.json +454 -0
  292. data/test/fixtures/payloads/pull_request_reopened.json +454 -0
  293. data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
  294. data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
  295. data/test/fixtures/payloads/push_master.json +1 -1
  296. data/test/fixtures/payloads/push_not_master.json +1 -1
  297. data/test/fixtures/shipit/commits.yml +31 -3
  298. data/test/fixtures/shipit/hooks.yml +1 -0
  299. data/test/fixtures/shipit/merge_requests.yml +141 -0
  300. data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
  301. data/test/fixtures/shipit/pull_requests.yml +10 -131
  302. data/test/fixtures/shipit/repositories.yml +5 -0
  303. data/test/fixtures/shipit/stacks.yml +235 -14
  304. data/test/fixtures/shipit/statuses.yml +9 -0
  305. data/test/fixtures/shipit/tasks.yml +4 -1
  306. data/test/fixtures/shipit/users.yml +7 -0
  307. data/test/fixtures/timeout +2 -1
  308. data/test/helpers/api_helper.rb +1 -0
  309. data/test/helpers/fixture_aliases_helper.rb +1 -0
  310. data/test/helpers/hooks_helper.rb +2 -1
  311. data/test/helpers/json_helper.rb +20 -12
  312. data/test/helpers/links_helper.rb +4 -3
  313. data/test/helpers/payloads_helper.rb +5 -0
  314. data/test/helpers/queries_helper.rb +3 -2
  315. data/test/jobs/cache_deploy_spec_job_test.rb +2 -1
  316. data/test/jobs/chunk_rollup_job_test.rb +16 -1
  317. data/test/jobs/deliver_hook_job_test.rb +1 -0
  318. data/test/jobs/destroy_repository_job_test.rb +27 -0
  319. data/test/jobs/destroy_stack_job_test.rb +1 -0
  320. data/test/jobs/emit_event_job_test.rb +2 -1
  321. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  322. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  323. data/test/jobs/github_sync_job_test.rb +3 -1
  324. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  325. data/test/jobs/perform_task_job_test.rb +12 -11
  326. data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +19 -18
  327. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  328. data/test/jobs/reap_dead_tasks_job_test.rb +68 -0
  329. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  330. data/test/jobs/refresh_status_job_test.rb +1 -0
  331. data/test/jobs/unique_job_test.rb +1 -0
  332. data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
  333. data/test/lib/shipit/deploy_commands_test.rb +16 -0
  334. data/test/lib/shipit/task_commands_test.rb +17 -0
  335. data/test/middleware/same_site_cookie_middleware_test.rb +52 -0
  336. data/test/models/api_client_test.rb +1 -0
  337. data/test/models/commit_checks_test.rb +1 -0
  338. data/test/models/commit_deployment_status_test.rb +4 -3
  339. data/test/models/commit_deployment_test.rb +2 -1
  340. data/test/models/commits_test.rb +96 -19
  341. data/test/models/delivery_test.rb +2 -1
  342. data/test/models/deploy_spec_test.rb +110 -65
  343. data/test/models/deploy_stats_test.rb +1 -0
  344. data/test/models/deploys_test.rb +197 -36
  345. data/test/models/duration_test.rb +1 -0
  346. data/test/models/github_hook_test.rb +1 -0
  347. data/test/models/hook_test.rb +47 -10
  348. data/test/models/membership_test.rb +1 -0
  349. data/test/models/{pull_request_test.rb → merge_request_test.rb} +53 -37
  350. data/test/models/pull_request_assignment_test.rb +16 -0
  351. data/test/models/release_statuses_test.rb +1 -0
  352. data/test/models/rollbacks_test.rb +1 -0
  353. data/test/models/shipit/check_run_test.rb +125 -5
  354. data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
  355. data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
  356. data/test/models/shipit/provisioning_handler_test.rb +64 -0
  357. data/test/models/shipit/pull_request_test.rb +52 -0
  358. data/test/models/shipit/repository_test.rb +6 -1
  359. data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
  360. data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
  361. data/test/models/shipit/review_stack_test.rb +91 -0
  362. data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +121 -16
  363. data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
  364. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
  365. data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
  366. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
  367. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
  368. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
  369. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
  370. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +107 -0
  371. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
  372. data/test/models/shipit/{wehbooks → webhooks}/handlers_test.rb +1 -0
  373. data/test/models/status/group_test.rb +1 -0
  374. data/test/models/status/missing_test.rb +1 -0
  375. data/test/models/status_test.rb +1 -0
  376. data/test/models/task_definitions_test.rb +9 -8
  377. data/test/models/tasks_test.rb +81 -1
  378. data/test/models/team_test.rb +4 -2
  379. data/test/models/undeployed_commits_test.rb +1 -0
  380. data/test/models/users_test.rb +13 -5
  381. data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
  382. data/test/test_command_integration.rb +3 -2
  383. data/test/test_helper.rb +49 -31
  384. data/test/unit/anonymous_user_serializer_test.rb +14 -0
  385. data/test/unit/command_test.rb +16 -10
  386. data/test/unit/commands_test.rb +1 -0
  387. data/test/unit/commit_serializer_test.rb +16 -0
  388. data/test/unit/csv_serializer_test.rb +3 -2
  389. data/test/unit/deploy_commands_test.rb +75 -18
  390. data/test/unit/deploy_serializer_test.rb +17 -0
  391. data/test/unit/environment_variables_test.rb +5 -4
  392. data/test/unit/github_app_test.rb +3 -3
  393. data/test/unit/github_apps_test.rb +416 -0
  394. data/test/unit/github_url_helper_test.rb +6 -0
  395. data/test/unit/rollback_commands_test.rb +2 -1
  396. data/test/unit/shipit_deployment_checks_test.rb +77 -0
  397. data/test/unit/shipit_helper_test.rb +17 -0
  398. data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
  399. data/test/unit/shipit_test.rb +15 -0
  400. data/test/unit/user_serializer_test.rb +14 -0
  401. data/test/unit/variable_definition_test.rb +1 -0
  402. metadata +320 -178
  403. data/app/controllers/shipit/api/pull_requests_controller.rb +0 -36
  404. data/app/controllers/shipit/pull_requests_controller.rb +0 -30
  405. data/app/jobs/shipit/merge_pull_requests_job.rb +0 -31
  406. data/app/jobs/shipit/refresh_pull_request_job.rb +0 -10
  407. data/app/views/shipit/pull_requests/_pull_request.html.erb +0 -29
  408. data/test/controllers/pull_requests_controller_test.rb +0 -31
  409. data/test/fixtures/shipit/output_chunks.yml +0 -47
  410. data/test/models/output_chunk_test.rb +0 -20
@@ -1,18 +1,19 @@
1
+ # frozen_string_literal: true
1
2
  require 'uri'
2
3
 
3
4
  module Shipit
4
5
  class CCMenuUrlController < ShipitController
5
6
  def fetch
6
7
  uri = URI(api_stack_ccmenu_url(stack_id: stack.to_param))
7
- uri.query = {'token' => client.authentication_token}.to_query
8
- render json: {ccmenu_url: uri.to_s}
8
+ uri.query = { 'token' => client.authentication_token }.to_query
9
+ render(json: { ccmenu_url: uri.to_s })
9
10
  end
10
11
 
11
12
  private
12
13
 
13
14
  def client
14
15
  @client ||= ApiClient.create_with(permissions: %w(read:stack))
15
- .find_or_create_by!(creator: current_user, name: 'CCMenu Client')
16
+ .find_or_create_by!(creator: current_user, name: 'CCMenu Client')
16
17
  end
17
18
 
18
19
  def stack
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class CommitChecksController < ShipitController
3
4
  def show
@@ -15,7 +16,7 @@ module Shipit
15
16
  url = stack_tail_commit_checks_path(stack, sha: commit.sha, since: next_offset)
16
17
  end
17
18
 
18
- render json: {url: url, output: output, status: checks.status}
19
+ render(json: { url: url, output: output, status: checks.status })
19
20
  end
20
21
 
21
22
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class CommitsController < ShipitController
3
4
  def update
@@ -9,7 +10,7 @@ module Shipit
9
10
  end
10
11
  end
11
12
 
12
- head :ok
13
+ head(:ok)
13
14
  end
14
15
 
15
16
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class DeploysController < ShipitController
3
4
  include ChunksHelper
@@ -16,7 +17,7 @@ module Shipit
16
17
  def show
17
18
  respond_to do |format|
18
19
  format.html
19
- format.text { render plain: @deploy.chunk_output }
20
+ format.text { render(plain: @deploy.chunk_output) }
20
21
  end
21
22
  end
22
23
 
@@ -29,7 +30,7 @@ module Shipit
29
30
  )
30
31
  respond_with(@deploy.stack, @deploy)
31
32
  rescue Task::ConcurrentTaskRunning
32
- redirect_to new_stack_deploy_path(@stack, sha: @until_commit.sha)
33
+ redirect_to(new_stack_deploy_path(@stack, sha: @until_commit.sha))
33
34
  end
34
35
 
35
36
  def rollback
@@ -38,7 +39,7 @@ module Shipit
38
39
 
39
40
  def revert
40
41
  previous_deploy = @stack.deploys.success.where(until_commit_id: @deploy.since_commit_id).order(id: :desc).first!
41
- redirect_to rollback_stack_deploy_path(@stack, previous_deploy)
42
+ redirect_to(rollback_stack_deploy_path(@stack, previous_deploy))
42
43
  end
43
44
 
44
45
  def short_commit_sha(task)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class GithubAuthenticationController < ActionController::Base
3
4
  include Shipit::Engine.routes.url_helpers
@@ -6,16 +7,16 @@ module Shipit
6
7
  return_url = request.env['omniauth.origin'] || root_path
7
8
  auth = request.env['omniauth.auth']
8
9
 
9
- return render 'failed', layout: false if auth.blank?
10
+ return render('failed', layout: false) if auth.blank?
10
11
 
11
12
  session[:user_id] = sign_in_github(auth)
12
13
 
13
- redirect_to return_url
14
+ redirect_to(return_url)
14
15
  end
15
16
 
16
17
  def logout
17
18
  reset_session
18
- redirect_to root_path
19
+ redirect_to(root_path)
19
20
  end
20
21
 
21
22
  private
@@ -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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class MergeStatusController < ShipitController
3
4
  skip_authentication only: %i(check show)
@@ -11,38 +12,38 @@ module Shipit
11
12
 
12
13
  if stack
13
14
  return render('logged_out') unless current_user.logged_in?
14
- if stale?(last_modified: [stack.updated_at, pull_request.updated_at].max, template: false)
15
- render stack_status, layout: !request.xhr?
15
+ if stale?(last_modified: [stack.updated_at, merge_request.updated_at].max, template: false)
16
+ render(stack_status, layout: !request.xhr?)
16
17
  end
17
18
  else
18
- render html: ''
19
+ render(html: '')
19
20
  end
20
21
  rescue ArgumentError
21
- render html: ''
22
+ render(html: '')
22
23
  end
23
24
 
24
25
  def enqueue
25
- PullRequest.request_merge!(stack, params[:number], current_user)
26
- render stack_status, layout: !request.xhr?
26
+ MergeRequest.request_merge!(stack, params[:number], current_user)
27
+ render(stack_status, layout: !request.xhr?)
27
28
  end
28
29
 
29
30
  def dequeue
30
- if pull_request = stack.pull_requests.find_by_number(params[:number])
31
- 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?
32
33
  end
33
- render stack_status, layout: !request.xhr?
34
+ render(stack_status, layout: !request.xhr?)
34
35
  end
35
36
 
36
37
  def check
37
38
  respond_to do |format|
38
39
  format.html do
39
40
  if stack_status == 'success'
40
- render plain: 'ok'
41
+ render(plain: 'ok')
41
42
  else
42
- render plain: stack_status, status: 503
43
+ render(plain: stack_status, status: 503)
43
44
  end
44
45
  end
45
- format.json { render json: {stack_status: stack_status} }
46
+ format.json { render(json: { stack_status: stack_status }) }
46
47
  end
47
48
  end
48
49
 
@@ -62,12 +63,12 @@ module Shipit
62
63
  else
63
64
  # Null ordering is inconsistent across DBMS's, this case statement is ugly but supported universally
64
65
  scope = Stack.order(Arel.sql('CASE WHEN locked_since IS NULL THEN 1 ELSE 0 END, locked_since'))
65
- .order(merge_queue_enabled: :desc, id: :asc).includes(:repository).where(
66
- repositories: {
67
- owner: referrer_parser.repo_owner,
68
- name: referrer_parser.repo_name,
69
- },
70
- )
66
+ .order(merge_queue_enabled: :desc, id: :asc).includes(:repository).where(
67
+ repositories: {
68
+ owner: referrer_parser.repo_owner,
69
+ name: referrer_parser.repo_name,
70
+ },
71
+ )
71
72
  scope = if params[:branch]
72
73
  scope.where(branch: params[:branch])
73
74
  else
@@ -81,10 +82,10 @@ module Shipit
81
82
  @referrer_parser ||= ReferrerParser.new(params[:referrer])
82
83
  end
83
84
 
84
- def pull_request
85
- return @pull_request if defined?(@pull_request)
86
- @pull_request = pull_request_number && stack.pull_requests.find_by_number(pull_request_number)
87
- @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
88
89
  end
89
90
 
90
91
  def pull_request_number
@@ -97,14 +98,14 @@ module Shipit
97
98
  end
98
99
 
99
100
  helper_method :pull_request_number
100
- helper_method :pull_request
101
+ helper_method :merge_request
101
102
  helper_method :queue_enabled?
102
103
  helper_method :stack
103
104
  helper_method :stack_status
104
105
 
105
106
  # FIXME: for some reason if invoked in the view, those path helpers will link to /events?...
106
- helper_method :enqueue_pull_request_path
107
- helper_method :dequeue_pull_request_path
107
+ helper_method :enqueue_merge_request_path
108
+ helper_method :dequeue_merge_request_path
108
109
 
109
110
  class ReferrerParser
110
111
  URL_PATTERN = %r{\Ahttps://github\.com/([^/]+)/([^/]+)/pull/(\d+)}
@@ -112,17 +113,17 @@ module Shipit
112
113
  attr_reader :repo_owner, :repo_name, :pull_request_number
113
114
 
114
115
  def initialize(referrer)
115
- if URL_PATTERN =~ referrer.to_s
116
- @repo_owner = $1.downcase
117
- @repo_name = $2.downcase
118
- @pull_request_number = $3.to_i
116
+ if (match_info = URL_PATTERN.match(referrer.to_s))
117
+ @repo_owner = match_info[1].downcase
118
+ @repo_name = match_info[2].downcase
119
+ @pull_request_number = match_info[3].to_i
119
120
  else
120
121
  raise ArgumentError, "Invalid referrer: #{referrer.inspect}"
121
122
  end
122
123
  end
123
124
  end
124
125
 
125
- class UnknownPullRequest
126
+ class UnknownMergeRequest
126
127
  attr_reader :updated_at
127
128
 
128
129
  def initialize
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class ReleaseStatusesController < ShipitController
3
4
  before_action :load_stack
@@ -10,9 +11,9 @@ module Shipit
10
11
  when 'failure'
11
12
  @deploy.report_faulty!(user: current_user)
12
13
  else
13
- render status: :unprocessable_entity, json: {message: "Invalid `status` parameter"}
14
+ render(status: :unprocessable_entity, json: { message: "Invalid `status` parameter" })
14
15
  end
15
- render status: :created, json: @deploy.last_release_status
16
+ render(status: :created, json: @deploy.last_release_status)
16
17
  end
17
18
 
18
19
  private
@@ -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
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class RollbacksController < ShipitController
3
4
  before_action :load_stack
@@ -5,9 +6,9 @@ module Shipit
5
6
 
6
7
  def create
7
8
  @rollback = @deploy.trigger_rollback(current_user, env: rollback_params[:env], force: params[:force].present?)
8
- redirect_to stack_deploy_path(@stack, @rollback)
9
+ redirect_to(stack_deploy_path(@stack, @rollback))
9
10
  rescue Task::ConcurrentTaskRunning
10
- redirect_to rollback_stack_deploy_path(@stack, @deploy)
11
+ redirect_to(rollback_stack_deploy_path(@stack, @deploy))
11
12
  end
12
13
 
13
14
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class ShipitController < ApplicationController
3
4
  layout 'shipit'
@@ -27,7 +28,7 @@ module Shipit
27
28
  def ensure_required_settings
28
29
  return if Shipit.all_settings_present?
29
30
 
30
- render 'shipit/missing_settings'
31
+ render('shipit/missing_settings')
31
32
  end
32
33
  end
33
34
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class StacksController < ShipitController
3
4
  before_action :load_stack, only: %i(update destroy settings statistics clear_git_cache refresh)
@@ -9,7 +10,16 @@ module Shipit
9
10
  def index
10
11
  @user_stacks = current_user.stacks_contributed_to
11
12
 
12
- @stacks = Stack.order(Arel.sql('(undeployed_commits_count > 0) desc'), tasks_count: :desc)
13
+ @stacks = Stack.all
14
+ if params[:repo]
15
+ @stacks = if (repository = Repository.from_github_repo_name(params[:repo]))
16
+ repository.stacks
17
+ else
18
+ Stack.none
19
+ end
20
+ end
21
+
22
+ @stacks = @stacks.order(Arel.sql('(undeployed_commits_count > 0) desc'), tasks_count: :desc)
13
23
 
14
24
  @show_archived = params[:show_archived]
15
25
  @stacks = @stacks.not_archived unless @show_archived
@@ -48,7 +58,7 @@ module Shipit
48
58
 
49
59
  def lookup
50
60
  @stack = Stack.find(params[:id])
51
- redirect_to stack_url(@stack)
61
+ redirect_to(stack_url(@stack))
52
62
  end
53
63
 
54
64
  def create
@@ -62,18 +72,23 @@ module Shipit
62
72
 
63
73
  def destroy
64
74
  @stack.schedule_for_destroy!
65
- redirect_to stacks_url
75
+ redirect_to(stacks_url)
66
76
  end
67
77
 
68
78
  def settings
69
79
  end
70
80
 
81
+ def all_tasks
82
+ @stack = Stack.from_param!(params[:id])
83
+ @tasks = @stack.tasks.where(type: nil).order(id: :desc).preload(:since_commit, :until_commit, :user).limit(10)
84
+ end
85
+
71
86
  def statistics
72
87
  previous_deploy_stats = Shipit::DeployStats.new(@stack.deploys.not_active.previous_seven_days)
73
88
  @deploy_stats = Shipit::DeployStats.new(@stack.deploys.not_active.last_seven_days)
74
89
  if @deploy_stats.empty?
75
90
  flash[:warning] = 'Statistics not available without previous deploys'
76
- return redirect_to stack_path(@stack)
91
+ return redirect_to(stack_path(@stack))
77
92
  end
78
93
  @diffs = @deploy_stats.compare(previous_deploy_stats)
79
94
  end
@@ -83,13 +98,13 @@ module Shipit
83
98
  RefreshCheckRunsJob.perform_later(stack_id: @stack.id)
84
99
  GithubSyncJob.perform_later(stack_id: @stack.id)
85
100
  flash[:success] = 'Refresh scheduled'
86
- redirect_to request.referer.presence || stack_path(@stack)
101
+ redirect_to(request.referer.presence || stack_path(@stack))
87
102
  end
88
103
 
89
104
  def update
90
105
  options = {}
91
106
  unless @stack.update(update_params)
92
- options = {flash: {warning: @stack.errors.full_messages.to_sentence}}
107
+ options = { flash: { warning: @stack.errors.full_messages.to_sentence } }
93
108
  end
94
109
 
95
110
  update_lock
@@ -101,7 +116,7 @@ module Shipit
101
116
  def clear_git_cache
102
117
  ClearGitCacheJob.perform_later(@stack)
103
118
  flash[:success] = 'Git Cache clearing scheduled'
104
- redirect_to stack_settings_path(@stack)
119
+ redirect_to(stack_settings_path(@stack))
105
120
  end
106
121
 
107
122
  private
@@ -139,7 +154,7 @@ module Shipit
139
154
  end
140
155
 
141
156
  def create_params
142
- 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)
143
158
  end
144
159
 
145
160
  def update_params
@@ -165,7 +180,7 @@ module Shipit
165
180
  end
166
181
 
167
182
  def repository_params
168
- params.require(:stack).permit(:repo_owner, :repo_name)
183
+ params.require(:stack).permit(:repo_owner, :repo_name, :branch, :environment, :deploy_url, :ignore_ci)
169
184
  end
170
185
  end
171
186
  end