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,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class Commit < ActiveRecord::Base
3
+ class Commit < Record
3
4
  include DeferredTouch
4
5
 
5
6
  RECENT_COMMIT_THRESHOLD = 10.seconds
@@ -7,42 +8,53 @@ module Shipit
7
8
  AmbiguousRevision = Class.new(StandardError)
8
9
 
9
10
  belongs_to :stack
10
- has_many :deploys
11
11
  has_many :statuses, -> { order(created_at: :desc) }, dependent: :destroy, inverse_of: :commit
12
12
  has_many :check_runs, -> { order(created_at: :desc) }, dependent: :destroy, inverse_of: :commit
13
13
  has_many :commit_deployments, dependent: :destroy
14
14
  has_many :release_statuses, dependent: :destroy
15
- belongs_to :pull_request, inverse_of: :merge_commit, optional: true
15
+ belongs_to :merge_request, inverse_of: :merge_commit, optional: true
16
16
 
17
17
  deferred_touch stack: :updated_at
18
18
 
19
- before_create :identify_pull_request
19
+ before_create :identify_merge_request
20
20
  after_commit { broadcast_update }
21
21
  after_create { stack.update_undeployed_commits_count }
22
22
 
23
23
  after_commit :schedule_refresh_statuses!, :schedule_refresh_check_runs!, :schedule_fetch_stats!,
24
- :schedule_continuous_delivery, on: :create
24
+ :schedule_continuous_delivery, on: :create
25
25
 
26
- belongs_to :author, class_name: 'User', inverse_of: :authored_commits
27
- belongs_to :committer, class_name: 'User', inverse_of: :commits
28
- belongs_to :lock_author, class_name: :User, optional: true, inverse_of: false
26
+ belongs_to :author, class_name: 'User', optional: true, inverse_of: :authored_commits
27
+ belongs_to :committer, class_name: 'User', optional: true, inverse_of: :commits
28
+ belongs_to :lock_author, class_name: 'User', optional: true, inverse_of: false
29
29
 
30
30
  def author
31
31
  super || AnonymousUser.new
32
32
  end
33
33
 
34
+ def author=(user)
35
+ super(user.presence)
36
+ end
37
+
34
38
  def committer
35
39
  super || AnonymousUser.new
36
40
  end
37
41
 
42
+ def committer=(user)
43
+ super(user.presence)
44
+ end
45
+
38
46
  def lock_author
39
47
  super || AnonymousUser.new
40
48
  end
41
49
 
50
+ def lock_author=(user)
51
+ super(user.presence)
52
+ end
53
+
42
54
  scope :reachable, -> { where(detached: false) }
43
55
 
44
56
  delegate :broadcast_update, :github_repo_name, :hidden_statuses, :required_statuses, :blocking_statuses,
45
- :soft_failing_statuses, to: :stack
57
+ :soft_failing_statuses, to: :stack
46
58
 
47
59
  def self.newer_than(commit)
48
60
  return all unless commit
@@ -92,7 +104,7 @@ module Shipit
92
104
  committer = User.find_or_create_committer_from_github_commit(commit)
93
105
  committer ||= Anonymous.new
94
106
 
95
- new(
107
+ record = new(
96
108
  sha: commit.sha,
97
109
  message: commit.commit.message,
98
110
  author: author,
@@ -102,12 +114,18 @@ module Shipit
102
114
  additions: commit.stats&.additions,
103
115
  deletions: commit.stats&.deletions,
104
116
  )
117
+
118
+ if record.pull_request?
119
+ record.pull_request_head_sha = commit.parents.last.sha
120
+ end
121
+
122
+ record
105
123
  end
106
124
 
107
125
  def message=(message)
108
126
  limit = self.class.columns_hash['message'].limit
109
- if limit && message && message.size > limit
110
- message = message.slice(0, limit)
127
+ if limit && message && message.bytesize > limit
128
+ message = message.truncate_bytes(limit)
111
129
  end
112
130
  super(message)
113
131
  end
@@ -137,7 +155,7 @@ module Shipit
137
155
 
138
156
  def refresh_statuses!
139
157
  github_statuses = stack.handle_github_redirections do
140
- Shipit.github.api.statuses(github_repo_name, sha, per_page: 100)
158
+ stack.github_api.statuses(github_repo_name, sha, per_page: 100)
141
159
  end
142
160
  github_statuses.each do |status|
143
161
  create_status_from_github!(status)
@@ -152,7 +170,7 @@ module Shipit
152
170
 
153
171
  def refresh_check_runs!
154
172
  response = stack.handle_github_redirections do
155
- Shipit.github.api.check_runs(github_repo_name, sha)
173
+ stack.github_api.check_runs(github_repo_name, sha)
156
174
  end
157
175
  response.check_runs.each do |check_run|
158
176
  create_or_update_check_run_from_github!(check_run)
@@ -254,7 +272,7 @@ module Shipit
254
272
  end
255
273
 
256
274
  def github_commit
257
- @github_commit ||= Shipit.github.api.commit(github_repo_name, sha)
275
+ @github_commit ||= stack.github_api.commit(github_repo_name, sha)
258
276
  end
259
277
 
260
278
  def schedule_fetch_stats!
@@ -280,13 +298,13 @@ module Shipit
280
298
  stack.deploys.unsuccessful.where(until_commit_id: id).any?
281
299
  end
282
300
 
283
- def identify_pull_request
301
+ def identify_merge_request
284
302
  return unless message_parser.pull_request?
285
- if pull_request = stack.pull_requests.find_by(number: message_parser.pull_request_number)
286
- self.pull_request = pull_request
287
- self.pull_request_number = pull_request.number
288
- self.pull_request_title = pull_request.title
289
- self.author = pull_request.merge_requested_by if pull_request.merge_requested_by
303
+ if merge_request = stack.merge_requests.find_by(number: message_parser.pull_request_number)
304
+ self.merge_request = merge_request
305
+ self.pull_request_number = merge_request.number
306
+ self.pull_request_title = merge_request.title
307
+ self.author = merge_request.merge_requested_by if merge_request.merge_requested_by
290
308
  end
291
309
 
292
310
  self.pull_request_number = message_parser.pull_request_number unless self[:pull_request_number]
@@ -294,8 +312,8 @@ module Shipit
294
312
  end
295
313
 
296
314
  def deploy_requested_at
297
- if pull_request&.merged?
298
- pull_request.merge_requested_at
315
+ if merge_request&.merged?
316
+ merge_request.merge_requested_at
299
317
  else
300
318
  created_at
301
319
  end
@@ -338,7 +356,7 @@ module Shipit
338
356
  new_status = status
339
357
 
340
358
  unless already_deployed
341
- payload = {commit: self, stack: stack, status: new_status.state}
359
+ payload = { commit: self, stack: stack, status: new_status.state }
342
360
  if previous_status != new_status
343
361
  Hook.emit(:commit_status, stack, payload.merge(commit_status: new_status))
344
362
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class CommitChecks < EphemeralCommitChecks
3
4
  OUTPUT_TTL = 10.minutes.to_i
@@ -5,17 +6,18 @@ module Shipit
5
6
 
6
7
  def initialize(commit)
7
8
  @commit = commit
9
+ super(commit)
8
10
  end
9
11
 
10
12
  def synchronize(&block)
11
- @lock ||= Redis::Lock.new('lock', redis, expiration: 1, timeout: 2)
13
+ @lock ||= Redis::Lock.new(key('lock'), Shipit.redis, expiration: 1, timeout: 2)
12
14
  @lock.lock(&block)
13
15
  end
14
16
 
15
17
  def schedule
16
- return false if redis.get('status').present?
18
+ return false if Shipit.redis.get(key('status')).present?
17
19
  synchronize do
18
- return false if redis.get('status').present?
20
+ return false if Shipit.redis.get(key('status')).present?
19
21
 
20
22
  initialize_redis_state
21
23
  end
@@ -24,34 +26,34 @@ module Shipit
24
26
  end
25
27
 
26
28
  def initialize_redis_state
27
- redis.pipelined do
28
- redis.set('output', '', ex: OUTPUT_TTL)
29
- redis.set('status', 'scheduled', ex: OUTPUT_TTL)
30
- end
29
+ Shipit.redis.set(key('status'), 'scheduled', ex: OUTPUT_TTL)
31
30
  @status = 'scheduled'
32
31
  end
33
32
 
34
33
  def status
35
- @status ||= redis.get('status')
34
+ @status ||= Shipit.redis.get(key('status'))
36
35
  end
37
36
 
38
37
  def status=(status)
39
- redis.set('status', status)
38
+ Shipit.redis.set(key('status'), status)
40
39
  @status = status
41
40
  end
42
41
 
43
42
  def output(since: 0)
44
- redis.getrange('output', since, -1)
43
+ Shipit.redis.getrange(key('output'), since, -1)
45
44
  end
46
45
 
47
46
  def write(output)
48
- redis.append('output', output)
47
+ Shipit.redis.pipelined do
48
+ Shipit.redis.append(key('output'), output)
49
+ Shipit.redis.expire(key('output'), OUTPUT_TTL)
50
+ end
49
51
  end
50
52
 
51
53
  private
52
54
 
53
- def redis
54
- @redis ||= Shipit.redis("commit:#{commit.id}:checks")
55
+ def key(key)
56
+ "commit:#{commit.id}:checks:#{key}"
55
57
  end
56
58
  end
57
59
  end
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class CommitDeployment < ActiveRecord::Base
3
+ class CommitDeployment < Record
3
4
  belongs_to :task
4
5
  has_many :statuses, dependent: :destroy, class_name: 'CommitDeploymentStatus'
5
6
 
@@ -19,15 +20,15 @@ module Shipit
19
20
  return if github_id?
20
21
 
21
22
  response = begin
22
- create_deployment_on_github(author.github_api)
23
+ create_deployment_on_github(stack.github_api)
23
24
  rescue Octokit::ClientError
24
- raise if Shipit.github.api == author.github_api
25
+ raise if Shipit.github(organization: stack.repository.owner).api == stack.github_api
25
26
  # If the deploy author didn't gave us the permission to create the deployment we falback the the main shipit
26
27
  # user.
27
28
  #
28
29
  # Octokit currently raise NotFound, but I'm convinced it should be Forbidden if the user can see the repository.
29
30
  # So to be future proof I catch boths.
30
- create_deployment_on_github(Shipit.github.api)
31
+ create_deployment_on_github(stack.github_api)
31
32
  end
32
33
  update!(github_id: response.id, api_url: response.url)
33
34
  end
@@ -56,7 +57,7 @@ module Shipit
56
57
  from_sha: task.since_commit.sha,
57
58
  to_sha: task.until_commit.sha,
58
59
  },
59
- },
60
+ }.to_json,
60
61
  )
61
62
  end
62
63
  end
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class CommitDeploymentStatus < ActiveRecord::Base
3
+ class CommitDeploymentStatus < Record
3
4
  DESCRIPTION_CHARACTER_LIMIT_ON_GITHUB = 140
4
5
 
5
6
  belongs_to :commit_deployment
@@ -11,15 +12,15 @@ module Shipit
11
12
  def create_on_github!
12
13
  return if github_id?
13
14
  response = begin
14
- create_status_on_github(author.github_api)
15
+ create_status_on_github(stack.github_api)
15
16
  rescue Octokit::ClientError
16
- raise if Shipit.github.api == author.github_api
17
+ raise if Shipit.github(organization: stack.repository.owner).api == stack.github_api
17
18
  # If the deploy author didn't gave us the permission to create the deployment we falback the the main shipit
18
19
  # user.
19
20
  #
20
21
  # Octokit currently raise NotFound, but I'm convinced it should be Forbidden if the user can see the repository.
21
22
  # So to be future proof I catch boths.
22
- create_status_on_github(Shipit.github.api)
23
+ create_status_on_github(stack.github_api)
23
24
  end
24
25
  update!(github_id: response.id, api_url: response.url)
25
26
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class CommitMessage
3
4
  GITHUB_MERGE_COMMIT_PATTERN = /\AMerge pull request #(?<pr_id>\d+) from \S+\n\n(?<pr_title>.*)/
@@ -1,11 +1,12 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class Delivery < ActiveRecord::Base
3
+ class Delivery < Record
3
4
  STATUSES = %w(pending scheduled sent).freeze
4
5
  enum status: STATUSES.zip(STATUSES).to_h
5
6
 
6
7
  belongs_to :hook
7
8
 
8
- validates :url, presence: true, url: {no_local: true, allow_blank: true}
9
+ validates :url, presence: true, url: { no_local: true, allow_blank: true }
9
10
  validates :content_type, presence: true
10
11
 
11
12
  serialize :response_headers, JSON
@@ -36,7 +37,7 @@ module Shipit
36
37
  def http
37
38
  Faraday::Connection.new do |connection|
38
39
  connection.headers = headers
39
- connection.adapter Faraday.default_adapter
40
+ connection.adapter(Faraday.default_adapter)
40
41
  end
41
42
  end
42
43
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'fileutils'
2
3
 
3
4
  module Shipit
@@ -14,8 +15,8 @@ module Shipit
14
15
  after_transition any => any, do: :update_last_deploy_time
15
16
  end
16
17
 
17
- belongs_to :until_commit, class_name: 'Commit', required: true, inverse_of: :deploys
18
- belongs_to :since_commit, class_name: 'Commit', required: true, inverse_of: :deploys
18
+ belongs_to :until_commit, class_name: 'Commit', required: true
19
+ belongs_to :since_commit, class_name: 'Commit', required: true
19
20
  has_many :commit_deployments, dependent: :destroy, inverse_of: :task, foreign_key: :task_id do
20
21
  GITHUB_STATUSES = {
21
22
  'pending' => 'pending',
@@ -91,25 +92,28 @@ module Shipit
91
92
  env: env&.to_h || {},
92
93
  allow_concurrency: force,
93
94
  ignored_safeties: force,
95
+ max_retries: stack.retries_on_rollback,
94
96
  )
95
97
  end
96
98
 
97
99
  # Rolls the stack back to this deploy
98
- def trigger_rollback(user = AnonymousUser.new, env: nil, force: false)
100
+ def trigger_rollback(user = AnonymousUser.new, env: nil, force: false, lock: true)
99
101
  rollback = build_rollback(user, env: env, force: force)
100
102
  rollback.save!
101
103
  rollback.enqueue
102
104
 
103
- lock_reason = "A rollback for #{rollback.since_commit.sha} has been triggered. " \
104
- "Please make sure the reason for the rollback has been addressed before deploying again."
105
- stack.update!(lock_reason: lock_reason, lock_author_id: user.id)
105
+ if lock
106
+ lock_reason = "A rollback for #{rollback.since_commit.sha} has been triggered. " \
107
+ "Please make sure the reason for the rollback has been addressed before deploying again."
108
+ stack.update!(lock_reason: lock_reason, lock_author_id: user.id)
109
+ end
106
110
 
107
111
  rollback
108
112
  end
109
113
 
110
114
  # Rolls the stack back to the most recent **previous** successful deploy
111
- def trigger_revert(force: false)
112
- previous_successful_commit = commit_to_rollback_to
115
+ def trigger_revert(force: false, rollback_to: nil)
116
+ previous_successful_commit = rollback_to&.until_commit || commit_to_rollback_to
113
117
 
114
118
  rollback = Rollback.create!(
115
119
  user_id: user_id,
@@ -207,7 +211,7 @@ module Shipit
207
211
  end
208
212
 
209
213
  def report_complete!
210
- if stack.release_status? && stack.release_status_delay.positive?
214
+ if stack.release_status? && !stack.release_status_delay.zero?
211
215
  enter_validation!
212
216
  else
213
217
  super
@@ -248,24 +252,12 @@ module Shipit
248
252
 
249
253
  # Create one for each pull request in the batch, to give feedback on the PR timeline
250
254
  commits.select(&:pull_request?).each do |commit|
251
- if (pull_request_head = pull_request_head_for_commit(commit))
252
- commit_deployments.create!(sha: pull_request_head)
253
- end
255
+ next if commit.pull_request_head_sha.blank? # This attribute was not always populated
256
+ commit_deployments.create!(sha: commit.pull_request_head_sha)
254
257
  end
255
258
 
256
259
  # Immediately update to publish the status to the commit deployments
257
260
  update_commit_deployments
258
- rescue Octokit::ClientError => error
259
- Rails.logger.warn("Got #{error.class.name} (#{error.message}) when creating CommitDeployments for Deploy##{id}")
260
- end
261
-
262
- def pull_request_head_for_commit(commit)
263
- pull_request = Shipit.github.api.pull_request(commit.stack.github_repo_name, commit.pull_request_number)
264
- pull_request.head.sha
265
- rescue Octokit::ClientError => error
266
- pr_ref = "#{commit.stack.github_repo_name}##{commit.pull_request_number}"
267
- Rails.logger.warn("Got #{error.class.name} (#{error.message}) when loading pull request #{pr_ref}")
268
- nil
269
261
  end
270
262
 
271
263
  def update_release_status
@@ -279,10 +271,13 @@ module Shipit
279
271
  when 'aborted', 'aborting'
280
272
  append_release_status('failure', "The deploy on #{stack.environment} was canceled")
281
273
  when 'validating'
282
- if stack.release_status_delay.positive?
283
- append_release_status('pending', "The deploy on #{stack.environment} succeeded")
284
- MarkDeployHealthyJob.set(wait: stack.release_status_delay).perform_later(self)
285
- end
274
+ append_release_status(
275
+ 'pending',
276
+ "The deploy on #{stack.environment} succeeded"
277
+ ) unless stack.release_status_delay.zero?
278
+
279
+ MarkDeployHealthyJob.set(wait: stack.release_status_delay)
280
+ .perform_later(self) if stack.release_status_delay.positive?
286
281
  when 'success'
287
282
  if stack.release_status_delay.zero?
288
283
  append_release_status('success', "The deploy on #{stack.environment} succeeded")
@@ -293,7 +288,7 @@ module Shipit
293
288
  def trigger_revert_if_required
294
289
  return unless rollback_once_aborted?
295
290
  return unless supports_rollback?
296
- trigger_revert
291
+ trigger_revert(rollback_to: rollback_once_aborted_to)
297
292
  end
298
293
 
299
294
  def default_since_commit_id
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'pathname'
2
3
 
3
4
  module Shipit
@@ -5,20 +6,34 @@ module Shipit
5
6
  Error = Class.new(StandardError)
6
7
 
7
8
  class << self
9
+ attr_accessor :pretty_generate
10
+
8
11
  def load(json)
9
12
  config = json.blank? ? {} : JSON.parse(json)
10
13
  new(config)
11
14
  end
12
15
 
13
16
  def dump(spec)
14
- JSON.dump(spec.cacheable.config) if spec
17
+ return unless spec
18
+
19
+ if pretty_generate?
20
+ JSON.pretty_generate(spec.cacheable.config)
21
+ else
22
+ JSON.dump(spec.cacheable.config)
23
+ end
15
24
  end
16
25
 
17
26
  def bundle_path
18
27
  Rails.root.join('data', 'bundler')
19
28
  end
29
+
30
+ def pretty_generate?
31
+ @pretty_generate
32
+ end
20
33
  end
21
34
 
35
+ self.pretty_generate = false
36
+
22
37
  def initialize(config)
23
38
  @config = config
24
39
  end
@@ -40,6 +55,10 @@ module Shipit
40
55
  end
41
56
  end
42
57
 
58
+ def blank?
59
+ config.empty?
60
+ end
61
+
43
62
  def supports_fetch_deployed_revision?
44
63
  fetch_deployed_revision_steps.present?
45
64
  end
@@ -85,6 +104,10 @@ module Shipit
85
104
  Duration.parse(config('deploy', 'interval') { 0 })
86
105
  end
87
106
 
107
+ def provisioning_handler_name
108
+ config('provision', 'handler_name')
109
+ end
110
+
88
111
  def deploy_steps
89
112
  around_steps('deploy') do
90
113
  config('deploy', 'override') { discover_deploy_steps }
@@ -103,6 +126,10 @@ module Shipit
103
126
  deploy_variables.map { |v| [v.name, v.default] }.to_h
104
127
  end
105
128
 
129
+ def retries_on_deploy
130
+ config('deploy', 'retries') { nil }
131
+ end
132
+
106
133
  def rollback_steps
107
134
  around_steps('rollback') do
108
135
  config('rollback', 'override') { discover_rollback_steps }
@@ -113,6 +140,10 @@ module Shipit
113
140
  rollback_steps || cant_detect!(:rollback)
114
141
  end
115
142
 
143
+ def retries_on_rollback
144
+ config('rollback', 'retries') { nil }
145
+ end
146
+
116
147
  def fetch_deployed_revision_steps
117
148
  config('fetch') || discover_fetch_deployed_revision_steps
118
149
  end
@@ -160,12 +191,12 @@ module Shipit
160
191
  Array.wrap(config('ci', 'blocking'))
161
192
  end
162
193
 
163
- def pull_request_merge_method
194
+ def merge_request_merge_method
164
195
  method = config('merge', 'method')
165
196
  method if %w(merge rebase squash).include?(method)
166
197
  end
167
198
 
168
- def pull_request_required_statuses
199
+ def merge_request_required_statuses
169
200
  if config('merge', 'require') || config('merge', 'ignore')
170
201
  Array.wrap(config('merge', 'require'))
171
202
  else
@@ -173,7 +204,7 @@ module Shipit
173
204
  end
174
205
  end
175
206
 
176
- def pull_request_ignored_statuses
207
+ def merge_request_ignored_statuses
177
208
  if config('merge', 'require') || config('merge', 'ignore')
178
209
  Array.wrap(config('merge', 'ignore')) + [release_status_context].compact
179
210
  else
@@ -181,7 +212,7 @@ module Shipit
181
212
  end
182
213
  end
183
214
 
184
- def revalidate_pull_requests_after
215
+ def revalidate_merge_requests_after
185
216
  if timeout = config('merge', 'revalidate_after')
186
217
  begin
187
218
  Duration.parse(timeout)
@@ -255,11 +286,11 @@ module Shipit
255
286
  end
256
287
 
257
288
  def task_not_found!(id)
258
- raise TaskDefinition::NotFound.new("No definition for task #{id.inspect}")
289
+ raise TaskDefinition::NotFound, "No definition for task #{id.inspect}"
259
290
  end
260
291
 
261
292
  def cant_detect!(type)
262
- raise DeploySpec::Error.new(I18n.t("deploy_spec.hint.#{type}"))
293
+ raise DeploySpec::Error, I18n.t("deploy_spec.hint.#{type}")
263
294
  end
264
295
  end
265
296
  end