shipit-engine 0.38.0 → 0.40.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 (323) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +48 -4
  3. data/Rakefile +2 -1
  4. data/app/assets/javascripts/shipit/continuous_delivery_schedule.js.coffee +15 -0
  5. data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +1 -0
  6. data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
  7. data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
  8. data/app/controllers/concerns/shipit/api/rendering.rb +1 -0
  9. data/app/controllers/concerns/shipit/authentication.rb +1 -0
  10. data/app/controllers/concerns/shipit/pagination.rb +3 -2
  11. data/app/controllers/shipit/api/base_controller.rb +12 -10
  12. data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
  13. data/app/controllers/shipit/api/commits_controller.rb +2 -3
  14. data/app/controllers/shipit/api/deploys_controller.rb +6 -1
  15. data/app/controllers/shipit/api/hooks_controller.rb +4 -3
  16. data/app/controllers/shipit/api/locks_controller.rb +1 -0
  17. data/app/controllers/shipit/api/merge_requests_controller.rb +6 -5
  18. data/app/controllers/shipit/api/outputs_controller.rb +1 -0
  19. data/app/controllers/shipit/api/release_statuses_controller.rb +2 -1
  20. data/app/controllers/shipit/api/rollbacks_controller.rb +1 -0
  21. data/app/controllers/shipit/api/stacks_controller.rb +15 -14
  22. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  23. data/app/controllers/shipit/api_clients_controller.rb +6 -7
  24. data/app/controllers/shipit/ccmenu_url_controller.rb +3 -2
  25. data/app/controllers/shipit/commit_checks_controller.rb +2 -1
  26. data/app/controllers/shipit/commits_controller.rb +1 -0
  27. data/app/controllers/shipit/continuous_delivery_schedules_controller.rb +42 -0
  28. data/app/controllers/shipit/deploys_controller.rb +6 -5
  29. data/app/controllers/shipit/github_authentication_controller.rb +6 -0
  30. data/app/controllers/shipit/merge_requests_controller.rb +1 -0
  31. data/app/controllers/shipit/merge_status_controller.rb +30 -26
  32. data/app/controllers/shipit/release_statuses_controller.rb +1 -0
  33. data/app/controllers/shipit/repositories_controller.rb +4 -7
  34. data/app/controllers/shipit/rollbacks_controller.rb +2 -1
  35. data/app/controllers/shipit/shipit_controller.rb +1 -0
  36. data/app/controllers/shipit/stacks_controller.rb +27 -31
  37. data/app/controllers/shipit/status_controller.rb +1 -0
  38. data/app/controllers/shipit/tasks_controller.rb +3 -1
  39. data/app/controllers/shipit/webhooks_controller.rb +2 -1
  40. data/app/helpers/shipit/api_clients_helper.rb +1 -0
  41. data/app/helpers/shipit/chunks_helper.rb +3 -1
  42. data/app/helpers/shipit/deploys_helper.rb +7 -3
  43. data/app/helpers/shipit/github_url_helper.rb +5 -4
  44. data/app/helpers/shipit/merge_status_helper.rb +1 -0
  45. data/app/helpers/shipit/shipit_helper.rb +11 -10
  46. data/app/helpers/shipit/stacks_helper.rb +10 -11
  47. data/app/helpers/shipit/tasks_helper.rb +2 -1
  48. data/app/jobs/shipit/background_job/unique.rb +3 -2
  49. data/app/jobs/shipit/background_job.rb +9 -1
  50. data/app/jobs/shipit/cache_deploy_spec_job.rb +2 -1
  51. data/app/jobs/shipit/chunk_rollup_job.rb +1 -0
  52. data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
  53. data/app/jobs/shipit/continuous_delivery_job.rb +5 -0
  54. data/app/jobs/shipit/create_on_github_job.rb +1 -0
  55. data/app/jobs/shipit/create_release_statuses_job.rb +2 -0
  56. data/app/jobs/shipit/deferred_touch_job.rb +1 -0
  57. data/app/jobs/shipit/deliver_hook_job.rb +1 -0
  58. data/app/jobs/shipit/destroy_job.rb +1 -0
  59. data/app/jobs/shipit/destroy_repository_job.rb +1 -0
  60. data/app/jobs/shipit/destroy_stack_job.rb +36 -15
  61. data/app/jobs/shipit/emit_event_job.rb +1 -0
  62. data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
  63. data/app/jobs/shipit/fetch_deployed_revision_job.rb +1 -0
  64. data/app/jobs/shipit/github_sync_job.rb +4 -2
  65. data/app/jobs/shipit/mark_deploy_healthy_job.rb +1 -0
  66. data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
  67. data/app/jobs/shipit/perform_task_job.rb +1 -0
  68. data/app/jobs/shipit/process_merge_requests_job.rb +2 -0
  69. data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
  70. data/app/jobs/shipit/reap_dead_tasks_job.rb +1 -0
  71. data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
  72. data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
  73. data/app/jobs/shipit/refresh_merge_request_job.rb +1 -0
  74. data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
  75. data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
  76. data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
  77. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +6 -7
  78. data/app/models/concerns/shipit/deferred_touch.rb +5 -2
  79. data/app/models/shipit/anonymous_user.rb +4 -5
  80. data/app/models/shipit/api_client.rb +5 -3
  81. data/app/models/shipit/application_record.rb +1 -0
  82. data/app/models/shipit/check_run.rb +7 -6
  83. data/app/models/shipit/command_line_user.rb +4 -5
  84. data/app/models/shipit/commit.rb +46 -32
  85. data/app/models/shipit/commit_checks.rb +4 -2
  86. data/app/models/shipit/commit_deployment.rb +7 -5
  87. data/app/models/shipit/commit_deployment_status.rb +5 -3
  88. data/app/models/shipit/commit_message.rb +2 -0
  89. data/app/models/shipit/continuous_delivery_schedule.rb +84 -0
  90. data/app/models/shipit/delivery.rb +5 -4
  91. data/app/models/shipit/deploy.rb +46 -26
  92. data/app/models/shipit/deploy_spec/bundler_discovery.rb +3 -1
  93. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
  94. data/app/models/shipit/deploy_spec/file_system.rb +48 -17
  95. data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +4 -3
  96. data/app/models/shipit/deploy_spec/lerna_discovery.rb +32 -31
  97. data/app/models/shipit/deploy_spec/npm_discovery.rb +18 -13
  98. data/app/models/shipit/deploy_spec/pypi_discovery.rb +5 -4
  99. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
  100. data/app/models/shipit/deploy_spec.rb +25 -30
  101. data/app/models/shipit/deploy_stats.rb +6 -1
  102. data/app/models/shipit/duration.rb +5 -3
  103. data/app/models/shipit/ephemeral_commit_checks.rb +8 -7
  104. data/app/models/shipit/github_hook.rb +1 -0
  105. data/app/models/shipit/github_status.rb +1 -0
  106. data/app/models/shipit/hook.rb +9 -7
  107. data/app/models/shipit/membership.rb +1 -0
  108. data/app/models/shipit/merge_request.rb +26 -16
  109. data/app/models/shipit/output_chunk.rb +1 -0
  110. data/app/models/shipit/provisioning_handler.rb +1 -0
  111. data/app/models/shipit/pull_request.rb +2 -2
  112. data/app/models/shipit/record.rb +1 -0
  113. data/app/models/shipit/release_status.rb +4 -3
  114. data/app/models/shipit/repository.rb +12 -11
  115. data/app/models/shipit/review_stack.rb +3 -1
  116. data/app/models/shipit/review_stack_provisioning_queue.rb +2 -2
  117. data/app/models/shipit/rollback.rb +2 -0
  118. data/app/models/shipit/stack.rb +71 -60
  119. data/app/models/shipit/status/common.rb +1 -0
  120. data/app/models/shipit/status/group.rb +5 -3
  121. data/app/models/shipit/status/missing.rb +2 -1
  122. data/app/models/shipit/status/unknown.rb +1 -0
  123. data/app/models/shipit/status.rb +5 -4
  124. data/app/models/shipit/task.rb +40 -31
  125. data/app/models/shipit/task_definition.rb +10 -7
  126. data/app/models/shipit/task_execution_strategy/default.rb +13 -13
  127. data/app/models/shipit/team.rb +13 -12
  128. data/app/models/shipit/undeployed_commit.rb +8 -3
  129. data/app/models/shipit/unlimited_api_client.rb +2 -2
  130. data/app/models/shipit/user.rb +23 -16
  131. data/app/models/shipit/variable_definition.rb +2 -1
  132. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +1 -0
  133. data/app/models/shipit/webhooks/handlers/handler.rb +1 -0
  134. data/app/models/shipit/webhooks/handlers/membership_handler.rb +1 -0
  135. data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +10 -10
  136. data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +1 -1
  137. data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +10 -10
  138. data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +2 -2
  139. data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +2 -2
  140. data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +1 -1
  141. data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +3 -3
  142. data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +1 -1
  143. data/app/models/shipit/webhooks/handlers/push_handler.rb +2 -1
  144. data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -0
  145. data/app/models/shipit/webhooks.rb +3 -2
  146. data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
  147. data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
  148. data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
  149. data/app/serializers/shipit/commit_serializer.rb +2 -1
  150. data/app/serializers/shipit/deploy_serializer.rb +1 -0
  151. data/app/serializers/shipit/hook_serializer.rb +1 -0
  152. data/app/serializers/shipit/merge_request_serializer.rb +2 -1
  153. data/app/serializers/shipit/rollback_serializer.rb +1 -0
  154. data/app/serializers/shipit/short_commit_serializer.rb +1 -0
  155. data/app/serializers/shipit/stack_serializer.rb +4 -3
  156. data/app/serializers/shipit/tail_task_serializer.rb +4 -1
  157. data/app/serializers/shipit/task_serializer.rb +1 -0
  158. data/app/serializers/shipit/user_serializer.rb +1 -0
  159. data/app/validators/ascii_only_validator.rb +4 -3
  160. data/app/validators/subset_validator.rb +1 -0
  161. data/app/views/shipit/_variables.html.erb +1 -1
  162. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  163. data/app/views/shipit/continuous_delivery_schedules/show.html.erb +59 -0
  164. data/app/views/shipit/merge_status/failure.html.erb +1 -1
  165. data/app/views/shipit/missing_settings.html.erb +1 -1
  166. data/app/views/shipit/stacks/_settings_form.erb +1 -0
  167. data/config/initializers/inflections.rb +1 -0
  168. data/config/locales/en.yml +1 -0
  169. data/config/routes.rb +21 -18
  170. data/config/secrets.development.example.yml +1 -1
  171. data/config/secrets.development.shopify.yml +1 -1
  172. data/db/migrate/20240821003007_add_continuous_delivery_schedules.rb +13 -0
  173. data/db/migrate/20250207203053_embiggen_github_ids.rb +8 -0
  174. data/lib/shipit/cast_value.rb +1 -0
  175. data/lib/shipit/command.rb +29 -9
  176. data/lib/shipit/commands.rb +4 -2
  177. data/lib/shipit/csv_serializer.rb +3 -0
  178. data/lib/shipit/deploy_commands.rb +2 -1
  179. data/lib/shipit/engine.rb +6 -5
  180. data/lib/shipit/environment_variables.rb +2 -0
  181. data/lib/shipit/first_parent_commits_iterator.rb +2 -3
  182. data/lib/shipit/flock.rb +11 -9
  183. data/lib/shipit/github_app.rb +14 -16
  184. data/lib/shipit/github_http_cache_middleware.rb +1 -0
  185. data/lib/shipit/null_serializer.rb +1 -0
  186. data/lib/shipit/octokit_check_runs.rb +2 -3
  187. data/lib/shipit/octokit_iterator.rb +2 -0
  188. data/lib/shipit/paginator.rb +1 -0
  189. data/lib/shipit/rollback_commands.rb +2 -1
  190. data/lib/shipit/same_site_cookie_middleware.rb +1 -0
  191. data/lib/shipit/simple_message_verifier.rb +1 -0
  192. data/lib/shipit/stack_commands.rb +35 -27
  193. data/lib/shipit/stat.rb +1 -0
  194. data/lib/shipit/task_commands.rb +7 -6
  195. data/lib/shipit/version.rb +2 -1
  196. data/lib/shipit.rb +30 -17
  197. data/lib/tasks/cron.rake +2 -1
  198. data/lib/tasks/dev.rake +3 -2
  199. data/lib/tasks/shipit.rake +3 -2
  200. data/lib/tasks/teams.rake +3 -2
  201. data/test/controllers/api/base_controller_test.rb +1 -0
  202. data/test/controllers/api/ccmenu_controller_test.rb +4 -3
  203. data/test/controllers/api/commits_controller_test.rb +1 -0
  204. data/test/controllers/api/deploys_controller_test.rb +26 -1
  205. data/test/controllers/api/hooks_controller_test.rb +6 -5
  206. data/test/controllers/api/locks_controller_test.rb +1 -0
  207. data/test/controllers/api/merge_requests_controller_test.rb +1 -0
  208. data/test/controllers/api/outputs_controller_test.rb +1 -0
  209. data/test/controllers/api/release_statuses_controller_test.rb +4 -3
  210. data/test/controllers/api/rollback_controller_test.rb +3 -2
  211. data/test/controllers/api/stacks_controller_test.rb +13 -12
  212. data/test/controllers/api/tasks_controller_test.rb +7 -6
  213. data/test/controllers/api_clients_controller_test.rb +10 -10
  214. data/test/controllers/ccmenu_controller_test.rb +1 -0
  215. data/test/controllers/commit_checks_controller_test.rb +1 -0
  216. data/test/controllers/commits_controller_test.rb +9 -8
  217. data/test/controllers/continuous_delivery_schedules_controller_test.rb +66 -0
  218. data/test/controllers/deploys_controller_test.rb +4 -2
  219. data/test/controllers/github_authentication_controller_test.rb +6 -4
  220. data/test/controllers/merge_requests_controller_test.rb +1 -0
  221. data/test/controllers/merge_status_controller_test.rb +5 -4
  222. data/test/controllers/release_statuses_controller_test.rb +1 -0
  223. data/test/controllers/repositories_controller_test.rb +6 -5
  224. data/test/controllers/rollbacks_controller_test.rb +3 -2
  225. data/test/controllers/stacks_controller_test.rb +8 -6
  226. data/test/controllers/status_controller_test.rb +1 -0
  227. data/test/controllers/tasks_controller_test.rb +13 -5
  228. data/test/controllers/webhooks_controller_test.rb +10 -9
  229. data/test/dummy/config/application.rb +2 -1
  230. data/test/dummy/config/initializers/0_load_development_secrets.rb +2 -2
  231. data/test/dummy/config/secrets.development.json +3 -0
  232. data/test/dummy/config/secrets.test.json +21 -0
  233. data/test/dummy/db/schema.rb +33 -6
  234. data/test/fixtures/shipit/commits.yml +7 -7
  235. data/test/fixtures/shipit/stacks.yml +4 -10
  236. data/test/fixtures/shipit/tasks.yml +3 -3
  237. data/test/helpers/api_helper.rb +2 -3
  238. data/test/helpers/fixture_aliases_helper.rb +1 -0
  239. data/test/helpers/hooks_helper.rb +1 -0
  240. data/test/helpers/json_helper.rb +4 -3
  241. data/test/helpers/links_helper.rb +2 -1
  242. data/test/helpers/payloads_helper.rb +1 -0
  243. data/test/helpers/queries_helper.rb +4 -3
  244. data/test/jobs/cache_deploy_spec_job_test.rb +3 -2
  245. data/test/jobs/chunk_rollup_job_test.rb +3 -2
  246. data/test/jobs/deliver_hook_job_test.rb +1 -0
  247. data/test/jobs/destroy_repository_job_test.rb +1 -0
  248. data/test/jobs/destroy_stack_job_test.rb +12 -0
  249. data/test/jobs/emit_event_job_test.rb +1 -0
  250. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  251. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  252. data/test/jobs/github_sync_job_test.rb +22 -21
  253. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  254. data/test/jobs/perform_task_job_test.rb +3 -3
  255. data/test/jobs/process_merge_requests_job_test.rb +7 -6
  256. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  257. data/test/jobs/reap_dead_tasks_job_test.rb +1 -0
  258. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  259. data/test/jobs/refresh_status_job_test.rb +1 -0
  260. data/test/jobs/shipit/background_job_test.rb +35 -0
  261. data/test/jobs/shipit/continuous_delivery_job_test.rb +31 -0
  262. data/test/jobs/unique_job_test.rb +3 -1
  263. data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
  264. data/test/middleware/same_site_cookie_middleware_test.rb +2 -2
  265. data/test/models/api_client_test.rb +1 -0
  266. data/test/models/commit_checks_test.rb +2 -1
  267. data/test/models/commit_deployment_status_test.rb +2 -2
  268. data/test/models/commit_deployment_test.rb +4 -3
  269. data/test/models/commits_test.rb +72 -70
  270. data/test/models/delivery_test.rb +3 -2
  271. data/test/models/deploy_spec_test.rb +113 -109
  272. data/test/models/deploy_stats_test.rb +1 -0
  273. data/test/models/deploys_test.rb +65 -56
  274. data/test/models/duration_test.rb +1 -1
  275. data/test/models/github_hook_test.rb +1 -0
  276. data/test/models/hook_test.rb +7 -4
  277. data/test/models/membership_test.rb +1 -0
  278. data/test/models/merge_request_test.rb +26 -20
  279. data/test/models/release_statuses_test.rb +2 -1
  280. data/test/models/rollbacks_test.rb +4 -3
  281. data/test/models/shipit/check_run_test.rb +16 -15
  282. data/test/models/shipit/continuous_delivery_schedule_test.rb +109 -0
  283. data/test/models/shipit/deploy_spec/file_system_test.rb +54 -10
  284. data/test/models/shipit/pull_request_test.rb +9 -9
  285. data/test/models/shipit/repository_test.rb +3 -2
  286. data/test/models/shipit/review_stack_provisioning_queue_test.rb +2 -2
  287. data/test/models/shipit/{stacks_test.rb → stack_test.rb} +48 -34
  288. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +36 -34
  289. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +28 -28
  290. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +42 -42
  291. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +33 -33
  292. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +37 -37
  293. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +1 -1
  294. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +44 -42
  295. data/test/models/shipit/webhooks/handlers_test.rb +1 -0
  296. data/test/models/status/group_test.rb +3 -2
  297. data/test/models/status/missing_test.rb +1 -0
  298. data/test/models/status_test.rb +2 -1
  299. data/test/models/task_definitions_test.rb +7 -6
  300. data/test/models/tasks_test.rb +5 -4
  301. data/test/models/team_test.rb +5 -4
  302. data/test/models/undeployed_commits_test.rb +10 -9
  303. data/test/models/users_test.rb +29 -20
  304. data/test/test_command_integration.rb +1 -1
  305. data/test/test_helper.rb +12 -10
  306. data/test/unit/anonymous_user_serializer_test.rb +1 -0
  307. data/test/unit/command_test.rb +10 -1
  308. data/test/unit/commands_test.rb +1 -0
  309. data/test/unit/commit_serializer_test.rb +1 -0
  310. data/test/unit/csv_serializer_test.rb +3 -2
  311. data/test/unit/deploy_commands_test.rb +33 -23
  312. data/test/unit/deploy_serializer_test.rb +1 -0
  313. data/test/unit/environment_variables_test.rb +2 -1
  314. data/test/unit/github_app_test.rb +11 -10
  315. data/test/unit/github_apps_test.rb +19 -18
  316. data/test/unit/github_url_helper_test.rb +1 -0
  317. data/test/unit/line_buffer_test.rb +1 -1
  318. data/test/unit/rollback_commands_test.rb +2 -1
  319. data/test/unit/shipit_helper_test.rb +1 -0
  320. data/test/unit/shipit_test.rb +47 -1
  321. data/test/unit/user_serializer_test.rb +1 -0
  322. data/test/unit/variable_definition_test.rb +4 -3
  323. metadata +61 -47
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class Hook < Record
4
5
  class DeliverySigner
@@ -46,7 +47,7 @@ module Shipit
46
47
  'Content-Type' => content_type,
47
48
  'X-Shipit-Event' => event,
48
49
  'X-Shipit-Signature' => signature,
49
- 'Accept' => '*/*',
50
+ 'Accept' => '*/*'
50
51
  }
51
52
  end
52
53
 
@@ -63,10 +64,10 @@ module Shipit
63
64
 
64
65
  CONTENT_TYPES = {
65
66
  'json' => 'application/json',
66
- 'form' => 'application/x-www-form-urlencoded',
67
+ 'form' => 'application/x-www-form-urlencoded'
67
68
  }.freeze
68
69
 
69
- EVENTS = %w(
70
+ EVENTS = %w[
70
71
  stack
71
72
  review_stack
72
73
  task
@@ -78,7 +79,7 @@ module Shipit
78
79
  merge_status
79
80
  merge
80
81
  pull_request
81
- ).freeze
82
+ ].freeze
82
83
 
83
84
  belongs_to :stack, required: false
84
85
  has_many :deliveries
@@ -87,7 +88,7 @@ module Shipit
87
88
  validates :content_type, presence: true, inclusion: { in: CONTENT_TYPES.keys }
88
89
  validates :events, presence: true, subset: { of: EVENTS }
89
90
 
90
- serialize :events, Shipit::CSVSerializer
91
+ serialize :events, coder: Shipit::CSVSerializer
91
92
 
92
93
  scope :global, -> { where(stack_id: nil) }
93
94
  scope :scoped_to, ->(stack) { where(stack_id: stack.id) }
@@ -96,10 +97,11 @@ module Shipit
96
97
  class << self
97
98
  def emit(event, stack, payload)
98
99
  raise "#{event} is not declared in Shipit::Hook::EVENTS" unless EVENTS.include?(event.to_s)
100
+
99
101
  Shipit::EmitEventJob.perform_later(
100
102
  event: event.to_s,
101
103
  stack_id: stack&.id,
102
- payload: coerce_payload(payload),
104
+ payload: coerce_payload(payload)
103
105
  )
104
106
  deliver_internal_hooks(event, stack, payload)
105
107
  end
@@ -142,7 +144,7 @@ module Shipit
142
144
  url: delivery_url,
143
145
  content_type: CONTENT_TYPES[content_type],
144
146
  payload: serialize_payload(payload),
145
- secret: secret,
147
+ secret:
146
148
  )
147
149
  end
148
150
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class Membership < Record
4
5
  belongs_to :team, required: true
@@ -1,13 +1,14 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class MergeRequest < ApplicationRecord
4
5
  include DeferredTouch
5
6
 
6
7
  MERGE_REQUEST_FIELD = 'Merge-Requested-By'
7
8
 
8
- WAITING_STATUSES = %w(fetching pending).freeze
9
- QUEUED_STATUSES = %w(pending revalidating).freeze
10
- REJECTION_REASONS = %w(ci_missing ci_failing merge_conflict requires_rebase).freeze
9
+ WAITING_STATUSES = %w[fetching pending].freeze
10
+ QUEUED_STATUSES = %w[pending revalidating].freeze
11
+ REJECTION_REASONS = %w[ci_missing ci_failing merge_conflict requires_rebase].freeze
11
12
  InvalidTransition = Class.new(StandardError)
12
13
  NotReady = Class.new(StandardError)
13
14
 
@@ -85,14 +86,14 @@ module Shipit
85
86
  end
86
87
 
87
88
  event :retry do
88
- transition %i(rejected canceled revalidating) => :pending
89
+ transition %i[rejected canceled revalidating] => :pending
89
90
  end
90
91
 
91
92
  before_transition rejected: any do |pr|
92
93
  pr.rejection_reason = nil
93
94
  end
94
95
 
95
- before_transition %i(fetching rejected canceled) => :pending do |pr|
96
+ before_transition %i[fetching rejected canceled] => :pending do |pr|
96
97
  pr.merge_requested_at = Time.now.utc
97
98
  end
98
99
 
@@ -100,7 +101,7 @@ module Shipit
100
101
  pr.revalidated_at = Time.now.utc
101
102
  end
102
103
 
103
- before_transition %i(pending) => :merged do |pr|
104
+ before_transition %i[pending] => :merged do |pr|
104
105
  Stack.increment_counter(:undeployed_commits_count, pr.stack_id)
105
106
  end
106
107
  end
@@ -117,6 +118,7 @@ module Shipit
117
118
  when %r{\Ahttps://#{Regexp.escape(Shipit.github(organization: org).domain)}/([^/]+)/([^/]+)/pull/(\d+)}
118
119
  return unless $1.downcase == stack.repo_owner.downcase
119
120
  return unless $2.downcase == stack.repo_name.downcase
121
+
120
122
  $3.to_i
121
123
  end
122
124
  end
@@ -126,10 +128,10 @@ module Shipit
126
128
  merge_request = begin
127
129
  create_with(
128
130
  merge_requested_at: now,
129
- merge_requested_by: user.presence,
131
+ merge_requested_by: user.presence
130
132
  ).find_or_create_by!(
131
- stack: stack,
132
- number: number,
133
+ stack:,
134
+ number:
133
135
  )
134
136
  rescue ActiveRecord::RecordNotUnique
135
137
  retry
@@ -144,6 +146,7 @@ module Shipit
144
146
  unless REJECTION_REASONS.include?(reason)
145
147
  raise ArgumentError, "invalid reason: #{reason.inspect}, must be one of: #{REJECTION_REASONS.inspect}"
146
148
  end
149
+
147
150
  self.rejection_reason = reason.presence
148
151
  super()
149
152
  true
@@ -154,6 +157,7 @@ module Shipit
154
157
  return reject!('ci_missing') if any_status_checks_missing?
155
158
  return reject!('ci_failing') if any_status_checks_failed?
156
159
  return reject!('requires_rebase') if stale?
160
+
157
161
  false
158
162
  end
159
163
 
@@ -168,7 +172,7 @@ module Shipit
168
172
  merge_message,
169
173
  sha: head.sha,
170
174
  commit_message: 'Merged by Shipit',
171
- merge_method: stack.merge_method,
175
+ merge_method: stack.merge_method
172
176
  )
173
177
  begin
174
178
  if stack.github_api.pull_requests(stack.github_repo_name, base: branch).empty?
@@ -188,6 +192,7 @@ module Shipit
188
192
 
189
193
  def all_status_checks_passed?
190
194
  return false unless head
195
+
191
196
  StatusChecker.new(head, head.statuses_and_check_runs, stack.cached_deploy_spec).success?
192
197
  end
193
198
 
@@ -207,6 +212,7 @@ module Shipit
207
212
  def need_revalidation?
208
213
  timeout = stack.cached_deploy_spec&.revalidate_merge_requests_after
209
214
  return false unless timeout
215
+
210
216
  (revalidated_at + timeout).past?
211
217
  end
212
218
 
@@ -255,18 +261,21 @@ module Shipit
255
261
 
256
262
  def merge_message
257
263
  return title unless merge_requested_by
264
+
258
265
  "#{title}\n\n#{MERGE_REQUEST_FIELD}: #{merge_requested_by.login}\n"
259
266
  end
260
267
 
261
268
  def stale?
262
269
  return false unless base_commit
270
+
263
271
  spec = stack.cached_deploy_spec
264
- if max_branch_age = spec.max_divergence_age
265
- return true if Time.now.utc - head.committed_at > max_branch_age
272
+ if (max_branch_age = spec.max_divergence_age) && (Time.now.utc - head.committed_at > max_branch_age)
273
+ return true
266
274
  end
267
- if commit_count_limit = spec.max_divergence_commits
268
- return true if comparison.behind_by > commit_count_limit
275
+ if (commit_count_limit = spec.max_divergence_commits) && (comparison.behind_by > commit_count_limit)
276
+ return true
269
277
  end
278
+
270
279
  false
271
280
  end
272
281
 
@@ -274,7 +283,7 @@ module Shipit
274
283
  @comparison ||= stack.github_api.compare(
275
284
  stack.github_repo_name,
276
285
  base_ref,
277
- head.sha,
286
+ head.sha
278
287
  )
279
288
  end
280
289
 
@@ -286,8 +295,9 @@ module Shipit
286
295
 
287
296
  def emit_hooks
288
297
  return unless @merge_status_changed
298
+
289
299
  @merge_status_changed = nil
290
- Hook.emit('merge', stack, merge_request: self, status: merge_status, stack: stack)
300
+ Hook.emit('merge', stack, merge_request: self, status: merge_status, stack:)
291
301
  end
292
302
 
293
303
  def find_or_create_commit_from_github_by_sha!(sha, attributes)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class OutputChunk < Record
4
5
  belongs_to :task
@@ -17,6 +17,7 @@ module Shipit
17
17
 
18
18
  def fetch(name)
19
19
  return default if name.blank?
20
+
20
21
  registry.fetch(name) { ProvisioningHandler::UnregisteredProvisioningHandler }
21
22
  end
22
23
 
@@ -11,7 +11,7 @@ module Shipit
11
11
  has_many :pull_request_assignments
12
12
  has_many :assignees, class_name: :User, through: :pull_request_assignments, source: :user
13
13
 
14
- serialize :labels, Shipit.serialized_column(:labels, type: Array)
14
+ serialize :labels, coder: Shipit.serialized_column(:labels, type: Array)
15
15
 
16
16
  after_create_commit :emit_create_hooks
17
17
  after_update_commit :emit_update_hooks
@@ -30,7 +30,7 @@ module Shipit
30
30
  end
31
31
 
32
32
  def emit_hooks(reason)
33
- Hook.emit('pull_request', stack, action: reason, pull_request: self, stack: stack)
33
+ Hook.emit('pull_request', stack, action: reason, pull_request: self, stack:)
34
34
  end
35
35
 
36
36
  def github_pull_request=(github_pull_request)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class Record < ActiveRecord::Base
4
5
  self.abstract_class = true
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class ReleaseStatus < Record
4
5
  MAX_DESCRIPTION_LENGTH = 140
@@ -13,7 +14,7 @@ module Shipit
13
14
 
14
15
  scope :to_be_created, -> { where(github_id: nil).order(id: :asc) }
15
16
 
16
- STATES = %w(pending success failure error).freeze
17
+ STATES = %w[pending success failure error].freeze
17
18
  validates :state, presence: true, inclusion: { in: STATES }
18
19
 
19
20
  def create_status_on_github!
@@ -30,8 +31,8 @@ module Shipit
30
31
  commit.sha,
31
32
  state,
32
33
  context: stack.release_status_context,
33
- target_url: target_url,
34
- description: description&.truncate(MAX_DESCRIPTION_LENGTH),
34
+ target_url:,
35
+ description: description&.truncate(MAX_DESCRIPTION_LENGTH)
35
36
  )
36
37
  end
37
38
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class NullRepository
4
5
  def id
@@ -37,29 +38,29 @@ module Shipit
37
38
  NAME_MAX_SIZE = 100
38
39
  private_constant :NAME_MAX_SIZE
39
40
 
40
- validates :name, uniqueness: { scope: %i(owner), case_sensitive: false,
41
- message: 'cannot be used more than once', }
41
+ validates :name, uniqueness: { scope: %i[owner], case_sensitive: false,
42
+ message: 'cannot be used more than once' }
42
43
  validates :owner, :name, presence: true, ascii_only: true
43
- validates :owner, format: { with: /\A[a-z0-9_\-\.]+\z/ }, length: { maximum: OWNER_MAX_SIZE }
44
- validates :name, format: { with: /\A[a-z0-9_\-\.]+\z/ }, length: { maximum: NAME_MAX_SIZE }
44
+ validates :owner, format: { with: /\A[a-z0-9_\-.]+\z/ }, length: { maximum: OWNER_MAX_SIZE }
45
+ validates :name, format: { with: /\A[a-z0-9_\-.]+\z/ }, length: { maximum: NAME_MAX_SIZE }
45
46
 
46
47
  has_many :stacks, dependent: :destroy
47
48
  has_many :review_stacks, dependent: :destroy
48
49
 
49
- PROVISIONING_BEHAVIORS = %w(allow_all allow_with_label prevent_with_label).freeze
50
- enum provisioning_behavior: PROVISIONING_BEHAVIORS.zip(PROVISIONING_BEHAVIORS).to_h, _prefix: :provisioning_behavior
50
+ PROVISIONING_BEHAVIORS = %w[allow_all allow_with_label prevent_with_label].freeze
51
+ enum :provisioning_behavior, PROVISIONING_BEHAVIORS.zip(PROVISIONING_BEHAVIORS).to_h, prefix: :provisioning_behavior
51
52
 
52
53
  def self.from_github_repo_name(github_repo_name)
53
54
  repo_owner, repo_name = github_repo_name.downcase.split('/')
54
55
  find_by(owner: repo_owner, name: repo_name)
55
56
  end
56
57
 
57
- def name=(n)
58
- super(n&.downcase)
58
+ def name=(name_value)
59
+ super(name_value&.downcase)
59
60
  end
60
61
 
61
- def owner=(o)
62
- super(o&.downcase)
62
+ def owner=(owner_value)
63
+ super(owner_value&.downcase)
63
64
  end
64
65
 
65
66
  def github_repo_name
@@ -90,7 +91,7 @@ module Shipit
90
91
  repo_owner, repo_name = param.split('/')
91
92
  where(
92
93
  owner: repo_owner.downcase,
93
- name: repo_name.downcase,
94
+ name: repo_name.downcase
94
95
  ).first!
95
96
  end
96
97
 
@@ -102,11 +102,13 @@ module Shipit
102
102
 
103
103
  def enqueue_for_provisioning
104
104
  return if awaiting_provision
105
+
105
106
  update!(awaiting_provision: true)
106
107
  end
107
108
 
108
109
  def remove_from_provisioning_queue
109
110
  return unless awaiting_provision
111
+
110
112
  update!(awaiting_provision: false)
111
113
  end
112
114
 
@@ -119,7 +121,7 @@ module Shipit
119
121
  end
120
122
 
121
123
  def emit_updated_hooks
122
- changed = !(previous_changes.keys - %w(updated_at)).empty?
124
+ changed = !(previous_changes.keys - %w[updated_at]).empty?
123
125
  Hook.emit(:review_stack, self, action: :updated, review_stack: self) if changed
124
126
  end
125
127
 
@@ -20,8 +20,8 @@ module Shipit
20
20
 
21
21
  def queued_stacks
22
22
  @queued_stacks ||= Shipit::ReviewStack
23
- .with_provision_status(:deprovisioned)
24
- .where(awaiting_provision: true)
23
+ .with_provision_status(:deprovisioned)
24
+ .where(awaiting_provision: true)
25
25
  end
26
26
 
27
27
  private
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class Rollback < Deploy
4
5
  belongs_to :deploy, foreign_key: :parent_id, inverse_of: false
@@ -45,6 +46,7 @@ module Shipit
45
46
  # When we rollback to a certain revision, assume that all later deploys were faulty
46
47
  stack.deploys.newer_than(deploy.id).until(stack.last_completed_deploy.id).to_a.each do |deploy|
47
48
  next if deploy.id == id
49
+
48
50
  deploy.report_faulty!(description: "A rollback of #{stack.to_param} was triggered")
49
51
  end
50
52
  end