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 ContinuousDeliveryJob < BackgroundJob
4
5
  include BackgroundJob::Unique
@@ -9,6 +10,10 @@ module Shipit
9
10
  def perform(stack)
10
11
  return unless stack.continuous_deployment?
11
12
 
13
+ # If there is a schedule defined for this stack, make sure we are within a
14
+ # deployment window before proceeding.
15
+ return if stack.continuous_delivery_schedule && !stack.continuous_delivery_schedule.can_deploy?
16
+
12
17
  # checks if there are any tasks running, including concurrent tasks
13
18
  return if stack.occupied?
14
19
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class CreateOnGithubJob < BackgroundJob
4
5
  include BackgroundJob::Unique
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class CreateReleaseStatusesJob < BackgroundJob
4
5
  include BackgroundJob::Unique
5
6
 
6
7
  queue_as :default
8
+ on_duplicate :drop
7
9
 
8
10
  def perform(commit)
9
11
  commit.release_statuses.to_be_created.each(&:create_status_on_github!)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class DeferredTouchJob < BackgroundJob
4
5
  include BackgroundJob::Unique
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class DeliverHookJob < BackgroundJob
4
5
  queue_as :hooks
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class DestroyJob < BackgroundJob
4
5
  queue_as :default
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class DestroyRepositoryJob < BackgroundJob
4
5
  queue_as :default
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class DestroyStackJob < BackgroundJob
4
5
  queue_as :default
@@ -16,22 +17,42 @@ module Shipit
16
17
  # +-- chunks
17
18
 
18
19
  def perform(stack)
19
- Shipit::ApiClient.where(stack_id: stack.id).delete_all
20
- commits_ids = Shipit::Commit.where(stack_id: stack.id).pluck(:id)
21
- tasks_ids = Shipit::Task.where(stack_id: stack.id).pluck(:id)
22
- commit_deployments_ids = Shipit::CommitDeployment.where(task_id: tasks_ids).pluck(:id)
23
- Shipit::CommitDeploymentStatus.where(commit_deployment_id: commit_deployments_ids).delete_all
24
- Shipit::CommitDeployment.where(id: commit_deployments_ids).delete_all
25
- Shipit::Status.where(commit_id: commits_ids).delete_all
26
- Shipit::Commit.where(id: commits_ids).delete_all
27
- Shipit::GithubHook.where(stack_id: stack.id).destroy_all
28
- Shipit::Hook.where(stack_id: stack.id).delete_all
29
- Shipit::MergeRequest.where(stack_id: stack.id).delete_all
30
- tasks_ids.each_slice(100) do |ids|
31
- Shipit::OutputChunk.where(task_id: ids).delete_all
32
- Shipit::Task.where(id: ids).delete_all
33
- end
20
+ delete(Shipit::ApiClient.where(stack_id: stack.id))
21
+
22
+ delete(
23
+ Shipit::CommitDeploymentStatus
24
+ .joins(commit_deployment: [:task])
25
+ .where(commit_deployment: { tasks: { stack_id: stack.id } })
26
+ )
27
+
28
+ delete(Shipit::CommitDeployment.joins(:task).where(task: { stack_id: stack.id }))
29
+ delete(Shipit::Status.joins(:commit).where(commit: { stack_id: stack.id }))
30
+ delete(Shipit::GithubHook.where(stack_id: stack.id))
31
+ delete(Shipit::Hook.where(stack_id: stack.id))
32
+ delete(Shipit::MergeRequest.where(stack_id: stack.id))
33
+
34
+ delete(Shipit::OutputChunk.joins(:task).where(task: { stack_id: stack.id }))
35
+ delete(Shipit::Task.where(stack_id: stack.id))
36
+
37
+ delete(Shipit::Commit.where(stack_id: stack.id))
38
+
34
39
  stack.destroy!
35
40
  end
41
+
42
+ private
43
+
44
+ BATCH_SIZE = 1000
45
+
46
+ def delete(relation)
47
+ if relation.connection.adapter_name.match?(/(mysql|trilogy)/i)
48
+ while relation.limit(BATCH_SIZE).delete_all == BATCH_SIZE
49
+ true # loop
50
+ end
51
+ else
52
+ while relation.model.where(id: relation.select(:id).limit(BATCH_SIZE)).delete_all == BATCH_SIZE
53
+ true # loop
54
+ end
55
+ end
56
+ end
36
57
  end
37
58
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class EmitEventJob < BackgroundJob
4
5
  queue_as :hooks
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class FetchCommitStatsJob < BackgroundJob
4
5
  queue_as :default
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class FetchDeployedRevisionJob < BackgroundJob
4
5
  queue_as :deploys
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class GithubSyncJob < BackgroundJob
4
5
  include BackgroundJob::Unique
@@ -36,13 +37,14 @@ module Shipit
36
37
  def fetch_missing_commits(&block)
37
38
  commits = []
38
39
  github_api = stack&.github_api
39
- iterator = Shipit::FirstParentCommitsIterator.new(github_api: github_api, &block)
40
+ iterator = Shipit::FirstParentCommitsIterator.new(github_api:, &block)
40
41
  iterator.each_with_index do |commit, index|
41
42
  break if index >= MAX_FETCHED_COMMITS
42
43
 
43
44
  if shared_parent = lookup_commit(commit.sha)
44
45
  return commits, shared_parent
45
46
  end
47
+
46
48
  commits.unshift(commit)
47
49
  end
48
50
  [commits, nil]
@@ -59,7 +61,7 @@ module Shipit
59
61
  end
60
62
 
61
63
  def lookup_commit(sha)
62
- stack.commits.find_by(sha: sha)
64
+ stack.commits.find_by(sha:)
63
65
  end
64
66
  end
65
67
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class MarkDeployHealthyJob < BackgroundJob
4
5
  include BackgroundJob::Unique
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class PerformCommitChecksJob < BackgroundJob
4
5
  include BackgroundJob::Unique
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class PerformTaskJob < BackgroundJob
4
5
  queue_as :deploys
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class ProcessMergeRequestsJob < BackgroundJob
4
5
  include BackgroundJob::Unique
@@ -20,6 +21,7 @@ module Shipit
20
21
  merge_requests.select(&:pending?).each do |merge_request|
21
22
  merge_request.refresh!
22
23
  next unless merge_request.all_status_checks_passed?
24
+
23
25
  begin
24
26
  merge_request.merge!
25
27
  rescue MergeRequest::NotReady
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class PurgeOldDeliveriesJob < BackgroundJob
4
5
  include BackgroundJob::Unique
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class ReapDeadTasksJob < BackgroundJob
4
5
  include BackgroundJob::Unique
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class RefreshCheckRunsJob < BackgroundJob
4
5
  queue_as :default
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class RefreshGithubUserJob < BackgroundJob
4
5
  queue_as :default
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class RefreshMergeRequestJob < BackgroundJob
4
5
  queue_as :default
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class RefreshStatusesJob < BackgroundJob
4
5
  queue_as :default
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class SetupGithubHookJob < BackgroundJob
4
5
  queue_as :default
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class UpdateEstimatedDeployDurationJob < BackgroundJob
4
5
  queue_as :default
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class UpdateGithubLastDeployedRefJob < BackgroundJob
4
5
  queue_as :default
5
6
 
6
7
  # We do not prefix 'refs/' because Octokit methods will do this automatically.
7
8
  BRANCH_REF_PREFIX = 'heads'
8
- DEPLOY_PREFIX = "#{Shipit.app_name.downcase}-deploy"
9
+ DEPLOY_PREFIX = "#{Shipit.app_name.downcase}-deploy".freeze
9
10
 
10
11
  def perform(stack)
11
12
  stack_sha = stack.last_successful_deploy_commit&.sha
@@ -17,7 +18,7 @@ module Shipit
17
18
 
18
19
  full_repo_name = stack.github_repo_name
19
20
 
20
- update_or_create_ref(client: client, repo_name: full_repo_name, ref: stack_ref, new_sha: stack_sha)
21
+ update_or_create_ref(client:, repo_name: full_repo_name, ref: stack_ref, new_sha: stack_sha)
21
22
  end
22
23
 
23
24
  private
@@ -34,11 +35,9 @@ module Shipit
34
35
  client.update_ref(repo_name, ref, new_sha)
35
36
  rescue Octokit::UnprocessableEntity => e
36
37
  error_msg = e.message
37
- if error_msg.include?("Reference does not exist")
38
- create_ref(client: client, repo_name: repo_name, ref: ref, sha: new_sha)
39
- else
40
- raise
41
- end
38
+ raise unless error_msg.include?("Reference does not exist")
39
+
40
+ create_ref(client:, repo_name:, ref:, sha: new_sha)
42
41
  end
43
42
  end
44
43
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  module DeferredTouch
4
5
  extend ActiveSupport::Concern
5
6
 
6
7
  SET_KEY = 'shipit:deferred_touches'
7
- TMP_KEY = "#{SET_KEY}:updating"
8
- CACHE_KEY = "#{SET_KEY}:scheduled"
8
+ TMP_KEY = "#{SET_KEY}:updating".freeze
9
+ CACHE_KEY = "#{SET_KEY}:scheduled".freeze
9
10
  THROTTLE_TTL = 1.second
10
11
 
11
12
  included do
@@ -39,6 +40,7 @@ module Shipit
39
40
  def fetch
40
41
  fetch_members do |records|
41
42
  return if records.empty?
43
+
42
44
  records = records.each_with_object({}) do |(model, id, attribute), hash|
43
45
  attributes = (hash[model] ||= {})
44
46
  ids = (attributes[attribute] ||= [])
@@ -78,6 +80,7 @@ module Shipit
78
80
 
79
81
  def schedule_touches
80
82
  return unless self.class.deferred_touches
83
+
81
84
  deferred_touches = self.class.deferred_touches.reject do |m, _fk, _a|
82
85
  ActiveRecord::NoTouching.applied_to?(m.constantize)
83
86
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class AnonymousUser
4
5
  def blank?
@@ -21,11 +22,9 @@ module Shipit
21
22
  'https://github.com/images/error/octocat_happy.gif'
22
23
  end
23
24
 
24
- def id
25
- end
25
+ def id; end
26
26
 
27
- def github_id
28
- end
27
+ def github_id; end
29
28
 
30
29
  def logged_in?
31
30
  false
@@ -54,7 +53,7 @@ module Shipit
54
53
  def created_at
55
54
  Time.at(0).utc
56
55
  end
57
- alias_method :updated_at, :created_at
56
+ alias updated_at created_at
58
57
 
59
58
  def read_attribute_for_serialization(attr)
60
59
  public_send(attr)
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class ApiClient < Record
4
5
  InsufficientPermission = Class.new(StandardError)
@@ -8,15 +9,15 @@ module Shipit
8
9
 
9
10
  validates :creator, :name, presence: true
10
11
 
11
- serialize :permissions, Shipit.serialized_column(:permissions, type: Array)
12
- PERMISSIONS = %w(
12
+ serialize :permissions, coder: Shipit.serialized_column(:permissions, type: Array)
13
+ PERMISSIONS = %w[
13
14
  read:stack
14
15
  write:stack
15
16
  deploy:stack
16
17
  lock:stack
17
18
  read:hook
18
19
  write:hook
19
- ).freeze
20
+ ].freeze
20
21
  validates :permissions, subset: { of: PERMISSIONS }
21
22
 
22
23
  class << self
@@ -39,6 +40,7 @@ module Shipit
39
40
  unless permissions.include?(required_permission)
40
41
  raise InsufficientPermission, "This operation requires the `#{required_permission}` permission"
41
42
  end
43
+
42
44
  true
43
45
  end
44
46
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class ApplicationRecord < Record
4
5
  self.abstract_class = true
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class CheckRun < ApplicationRecord
4
- CONCLUSIONS = %w(success failure neutral cancelled timed_out action_required stale skipped).freeze
5
+ CONCLUSIONS = %w[success failure neutral cancelled timed_out action_required stale skipped].freeze
5
6
  include DeferredTouch
6
7
  include Status::Common
7
8
 
@@ -41,23 +42,23 @@ module Shipit
41
42
 
42
43
  unless checkrun_date
43
44
  Rails.logger.warn("No valid timestamp found in checkrun data. Checkrun id: #{github_check_run.id}.")
44
- RefreshCheckRunsJob.set(wait: CHECK_RUN_REFRESH_DELAY).perform_later(stack_id: stack_id)
45
+ RefreshCheckRunsJob.set(wait: CHECK_RUN_REFRESH_DELAY).perform_later(stack_id:)
45
46
  return
46
47
  end
47
48
 
48
49
  create_or_update_by!(
49
50
  selector: {
50
- github_id: github_check_run.id,
51
+ github_id: github_check_run.id
51
52
  },
52
53
  attributes: {
53
- stack_id: stack_id,
54
+ stack_id:,
54
55
  name: github_check_run.name,
55
56
  conclusion: github_check_run.conclusion,
56
57
  title: github_check_run.output.title.to_s.truncate(1_000),
57
58
  details_url: github_check_run.details_url,
58
59
  html_url: github_check_run.html_url,
59
- github_updated_at: checkrun_date,
60
- },
60
+ github_updated_at: checkrun_date
61
+ }
61
62
  )
62
63
  end
63
64
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Shipit
3
4
  class CommandLineUser
4
5
  def present?
@@ -21,11 +22,9 @@ module Shipit
21
22
  'https://github.com/images/error/octocat_happy.gif'
22
23
  end
23
24
 
24
- def id
25
- end
25
+ def id; end
26
26
 
27
- def github_id
28
- end
27
+ def github_id; end
29
28
 
30
29
  def logged_in?
31
30
  false
@@ -50,7 +49,7 @@ module Shipit
50
49
  def created_at
51
50
  Time.at(0).utc
52
51
  end
53
- alias_method :updated_at, :created_at
52
+ alias updated_at created_at
54
53
 
55
54
  def read_attribute_for_serialization(attr)
56
55
  public_send(attr)