shipit-engine 0.39.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 (315) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -1
  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 +10 -8
  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 +2 -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 +4 -2
  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 -2
  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 +4 -3
  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 +35 -16
  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 +8 -6
  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 +1 -1
  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 +59 -56
  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 +33 -28
  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 +21 -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/ccmenu/project.xml.builder +2 -1
  162. data/app/views/shipit/continuous_delivery_schedules/show.html.erb +59 -0
  163. data/app/views/shipit/stacks/_settings_form.erb +1 -0
  164. data/config/initializers/inflections.rb +1 -0
  165. data/config/locales/en.yml +1 -0
  166. data/config/routes.rb +21 -18
  167. data/db/migrate/20240821003007_add_continuous_delivery_schedules.rb +13 -0
  168. data/db/migrate/20250207203053_embiggen_github_ids.rb +8 -0
  169. data/lib/shipit/cast_value.rb +1 -0
  170. data/lib/shipit/command.rb +29 -9
  171. data/lib/shipit/commands.rb +4 -2
  172. data/lib/shipit/csv_serializer.rb +3 -0
  173. data/lib/shipit/deploy_commands.rb +2 -1
  174. data/lib/shipit/engine.rb +5 -4
  175. data/lib/shipit/environment_variables.rb +2 -0
  176. data/lib/shipit/first_parent_commits_iterator.rb +2 -3
  177. data/lib/shipit/flock.rb +11 -9
  178. data/lib/shipit/github_app.rb +14 -15
  179. data/lib/shipit/github_http_cache_middleware.rb +1 -0
  180. data/lib/shipit/null_serializer.rb +1 -0
  181. data/lib/shipit/octokit_check_runs.rb +1 -0
  182. data/lib/shipit/octokit_iterator.rb +2 -0
  183. data/lib/shipit/paginator.rb +1 -0
  184. data/lib/shipit/rollback_commands.rb +2 -1
  185. data/lib/shipit/same_site_cookie_middleware.rb +1 -0
  186. data/lib/shipit/simple_message_verifier.rb +1 -0
  187. data/lib/shipit/stack_commands.rb +34 -26
  188. data/lib/shipit/stat.rb +1 -0
  189. data/lib/shipit/task_commands.rb +7 -6
  190. data/lib/shipit/version.rb +2 -1
  191. data/lib/shipit.rb +29 -16
  192. data/lib/tasks/cron.rake +2 -1
  193. data/lib/tasks/dev.rake +3 -2
  194. data/lib/tasks/shipit.rake +3 -2
  195. data/lib/tasks/teams.rake +3 -2
  196. data/test/controllers/api/base_controller_test.rb +1 -0
  197. data/test/controllers/api/ccmenu_controller_test.rb +4 -3
  198. data/test/controllers/api/commits_controller_test.rb +1 -0
  199. data/test/controllers/api/deploys_controller_test.rb +2 -1
  200. data/test/controllers/api/hooks_controller_test.rb +6 -5
  201. data/test/controllers/api/locks_controller_test.rb +1 -0
  202. data/test/controllers/api/merge_requests_controller_test.rb +1 -0
  203. data/test/controllers/api/outputs_controller_test.rb +1 -0
  204. data/test/controllers/api/release_statuses_controller_test.rb +4 -3
  205. data/test/controllers/api/rollback_controller_test.rb +3 -2
  206. data/test/controllers/api/stacks_controller_test.rb +13 -12
  207. data/test/controllers/api/tasks_controller_test.rb +7 -6
  208. data/test/controllers/api_clients_controller_test.rb +10 -10
  209. data/test/controllers/ccmenu_controller_test.rb +1 -0
  210. data/test/controllers/commit_checks_controller_test.rb +1 -0
  211. data/test/controllers/commits_controller_test.rb +9 -8
  212. data/test/controllers/continuous_delivery_schedules_controller_test.rb +66 -0
  213. data/test/controllers/deploys_controller_test.rb +4 -2
  214. data/test/controllers/github_authentication_controller_test.rb +6 -4
  215. data/test/controllers/merge_requests_controller_test.rb +1 -0
  216. data/test/controllers/merge_status_controller_test.rb +5 -4
  217. data/test/controllers/release_statuses_controller_test.rb +1 -0
  218. data/test/controllers/repositories_controller_test.rb +6 -5
  219. data/test/controllers/rollbacks_controller_test.rb +3 -2
  220. data/test/controllers/stacks_controller_test.rb +7 -5
  221. data/test/controllers/status_controller_test.rb +1 -0
  222. data/test/controllers/tasks_controller_test.rb +5 -4
  223. data/test/controllers/webhooks_controller_test.rb +10 -9
  224. data/test/dummy/config/application.rb +1 -1
  225. data/test/dummy/db/schema.rb +33 -6
  226. data/test/fixtures/shipit/commits.yml +7 -7
  227. data/test/fixtures/shipit/stacks.yml +4 -10
  228. data/test/fixtures/shipit/tasks.yml +3 -3
  229. data/test/helpers/api_helper.rb +2 -3
  230. data/test/helpers/fixture_aliases_helper.rb +1 -0
  231. data/test/helpers/hooks_helper.rb +1 -0
  232. data/test/helpers/json_helper.rb +4 -3
  233. data/test/helpers/links_helper.rb +2 -1
  234. data/test/helpers/payloads_helper.rb +1 -0
  235. data/test/helpers/queries_helper.rb +4 -3
  236. data/test/jobs/cache_deploy_spec_job_test.rb +3 -2
  237. data/test/jobs/chunk_rollup_job_test.rb +3 -2
  238. data/test/jobs/deliver_hook_job_test.rb +1 -0
  239. data/test/jobs/destroy_repository_job_test.rb +1 -0
  240. data/test/jobs/destroy_stack_job_test.rb +12 -0
  241. data/test/jobs/emit_event_job_test.rb +1 -0
  242. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  243. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  244. data/test/jobs/github_sync_job_test.rb +22 -21
  245. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  246. data/test/jobs/perform_task_job_test.rb +3 -3
  247. data/test/jobs/process_merge_requests_job_test.rb +7 -6
  248. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  249. data/test/jobs/reap_dead_tasks_job_test.rb +1 -0
  250. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  251. data/test/jobs/refresh_status_job_test.rb +1 -0
  252. data/test/jobs/shipit/background_job_test.rb +35 -0
  253. data/test/jobs/shipit/continuous_delivery_job_test.rb +31 -0
  254. data/test/jobs/unique_job_test.rb +3 -1
  255. data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
  256. data/test/middleware/same_site_cookie_middleware_test.rb +2 -2
  257. data/test/models/api_client_test.rb +1 -0
  258. data/test/models/commit_checks_test.rb +2 -1
  259. data/test/models/commit_deployment_status_test.rb +2 -1
  260. data/test/models/commit_deployment_test.rb +4 -3
  261. data/test/models/commits_test.rb +72 -70
  262. data/test/models/delivery_test.rb +3 -2
  263. data/test/models/deploy_spec_test.rb +113 -109
  264. data/test/models/deploy_stats_test.rb +1 -0
  265. data/test/models/deploys_test.rb +65 -56
  266. data/test/models/duration_test.rb +1 -1
  267. data/test/models/github_hook_test.rb +1 -0
  268. data/test/models/hook_test.rb +7 -4
  269. data/test/models/membership_test.rb +1 -0
  270. data/test/models/merge_request_test.rb +23 -20
  271. data/test/models/release_statuses_test.rb +2 -1
  272. data/test/models/rollbacks_test.rb +4 -3
  273. data/test/models/shipit/check_run_test.rb +16 -15
  274. data/test/models/shipit/continuous_delivery_schedule_test.rb +109 -0
  275. data/test/models/shipit/deploy_spec/file_system_test.rb +54 -10
  276. data/test/models/shipit/pull_request_test.rb +9 -9
  277. data/test/models/shipit/repository_test.rb +3 -2
  278. data/test/models/shipit/review_stack_provisioning_queue_test.rb +2 -2
  279. data/test/models/shipit/stack_test.rb +30 -29
  280. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +36 -34
  281. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +28 -28
  282. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +42 -42
  283. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +33 -33
  284. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +37 -37
  285. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +1 -1
  286. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +44 -42
  287. data/test/models/shipit/webhooks/handlers_test.rb +1 -0
  288. data/test/models/status/group_test.rb +3 -2
  289. data/test/models/status/missing_test.rb +1 -0
  290. data/test/models/status_test.rb +2 -1
  291. data/test/models/task_definitions_test.rb +7 -6
  292. data/test/models/tasks_test.rb +5 -4
  293. data/test/models/team_test.rb +5 -4
  294. data/test/models/undeployed_commits_test.rb +10 -9
  295. data/test/models/users_test.rb +21 -20
  296. data/test/test_command_integration.rb +1 -1
  297. data/test/test_helper.rb +11 -9
  298. data/test/unit/anonymous_user_serializer_test.rb +1 -0
  299. data/test/unit/command_test.rb +10 -1
  300. data/test/unit/commands_test.rb +1 -0
  301. data/test/unit/commit_serializer_test.rb +1 -0
  302. data/test/unit/csv_serializer_test.rb +3 -2
  303. data/test/unit/deploy_commands_test.rb +33 -23
  304. data/test/unit/deploy_serializer_test.rb +1 -0
  305. data/test/unit/environment_variables_test.rb +2 -1
  306. data/test/unit/github_app_test.rb +10 -9
  307. data/test/unit/github_apps_test.rb +19 -18
  308. data/test/unit/github_url_helper_test.rb +1 -0
  309. data/test/unit/line_buffer_test.rb +1 -1
  310. data/test/unit/rollback_commands_test.rb +2 -1
  311. data/test/unit/shipit_helper_test.rb +1 -0
  312. data/test/unit/shipit_test.rb +47 -1
  313. data/test/unit/user_serializer_test.rb +1 -0
  314. data/test/unit/variable_definition_test.rb +4 -3
  315. metadata +53 -43
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  namespace :shipit do
3
4
  desc "Deploy from a running instance. "
4
5
  task deploy: :environment do
@@ -12,12 +13,12 @@ namespace :shipit do
12
13
  class Task
13
14
  def write(text)
14
15
  p(text)
15
- chunks.create!(text: text)
16
+ chunks.create!(text:)
16
17
  end
17
18
  end
18
19
  end
19
20
 
20
- Shipit::Stack.run_deploy_in_foreground(stack: stack, revision: revision)
21
+ Shipit::Stack.run_deploy_in_foreground(stack:, revision:)
21
22
  rescue ArgumentError
22
23
  p("Use this command as follows:")
23
24
  p("bundle exec rake shipit:deploy stack='shopify/shipit/production' revision='$SHA'")
data/lib/tasks/teams.rake CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  namespace :teams do
3
4
  desc "Import the members of each team configured through the github.oauth.teams config"
4
5
  task fetch: :environment do
@@ -6,9 +7,9 @@ namespace :teams do
6
7
  puts "Fetching @#{team.handle} members"
7
8
  begin
8
9
  team.refresh_members!
9
- rescue Octokit::Unauthorized, Octokit::NotFound => error
10
+ rescue Octokit::Unauthorized, Octokit::NotFound => e
10
11
  puts "Failed to fetch @#{team.handle} members. Do you have enough permissions?"
11
- puts "#{error.class}: #{error.message}"
12
+ puts "#{e.class}: #{e.message}"
12
13
  end
13
14
  end
14
15
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -32,7 +33,7 @@ module Shipit
32
33
  test "xml contains required attributes" do
33
34
  get :show, params: { stack_id: @stack.to_param }
34
35
  project = get_project_from_xml(response.body)
35
- %w(name activity lastBuildStatus lastBuildLabel lastBuildTime webUrl).each do |attribute|
36
+ %w[name activity lastBuildStatus lastBuildLabel lastBuildTime webUrl].each do |attribute|
36
37
  assert_includes project, attribute, "Response missing required attribute: #{attribute}"
37
38
  end
38
39
  end
@@ -55,9 +56,9 @@ module Shipit
55
56
  Hash.from_xml(xml)['Projects']['Project']
56
57
  end
57
58
 
58
- def assert_payload(k, v)
59
+ def assert_payload(key, value)
59
60
  @project ||= get_project_from_xml(response.body)
60
- assert_equal(v, @project[k])
61
+ assert_equal(value, @project[key])
61
62
  end
62
63
  end
63
64
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -49,7 +50,7 @@ module Shipit
49
50
  request.headers['X-Shipit-User'] = @user.login
50
51
  post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
51
52
  deploy = Deploy.last
52
- deploy.user == @user
53
+ assert_equal @user, deploy.user
53
54
  end
54
55
 
55
56
  test "#create normalises the claimed user" do
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -49,7 +50,7 @@ module Shipit
49
50
 
50
51
  test "#create adds a new hook" do
51
52
  assert_difference -> { Hook.count }, 1 do
52
- post :create, params: { delivery_url: 'https://example.com/hook', events: %w(deploy rollback) }
53
+ post :create, params: { delivery_url: 'https://example.com/hook', events: %w[deploy rollback] }
53
54
  end
54
55
  hook = Hook.last
55
56
  assert_json 'delivery_url', 'https://example.com/hook'
@@ -60,14 +61,14 @@ module Shipit
60
61
  test "#create do not allow to set protected attributes" do
61
62
  post :create, params: {
62
63
  delivery_url: 'https://example.com/hook',
63
- events: %w(deploy rollback),
64
- created_at: 2.months.ago.to_formatted_s(:db),
64
+ events: %w[deploy rollback],
65
+ created_at: 2.months.ago.to_formatted_s(:db)
65
66
  }
66
- Hook.last.created_at > 2.seconds.ago
67
+ assert_operator Hook.last.created_at, :>, 2.seconds.ago
67
68
  end
68
69
 
69
70
  test "#create returns validation errors" do
70
- post :create, params: { delivery_url: '../etc/passwd', events: %w(deploy) }
71
+ post :create, params: { delivery_url: '../etc/passwd', events: %w[deploy] }
71
72
  assert_response :unprocessable_entity
72
73
  assert_json 'errors', 'delivery_url' => ['is not a valid URL']
73
74
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -21,7 +22,7 @@ module Shipit
21
22
  post :create, params: {
22
23
  stack_id: @stack.to_param,
23
24
  deploy_id: @deploy.id,
24
- status: 'foo',
25
+ status: 'foo'
25
26
  }
26
27
  end
27
28
 
@@ -34,7 +35,7 @@ module Shipit
34
35
  post :create, params: {
35
36
  stack_id: @stack.to_param,
36
37
  deploy_id: @deploy.id,
37
- status: 'success',
38
+ status: 'success'
38
39
  }
39
40
  assert_response :created
40
41
  end
@@ -51,7 +52,7 @@ module Shipit
51
52
  post :create, params: {
52
53
  stack_id: @stack.to_param,
53
54
  deploy_id: @deploy.id,
54
- status: 'failure',
55
+ status: 'failure'
55
56
  }
56
57
  assert_response :created
57
58
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -38,14 +39,14 @@ module Shipit
38
39
  request.headers['X-Shipit-User'] = @user.login
39
40
  post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
40
41
  rollback = Rollback.last
41
- rollback.user == @user
42
+ assert_equal @user, rollback.user
42
43
  end
43
44
 
44
45
  test "#create normalises the claimed user" do
45
46
  request.headers['X-Shipit-User'] = @user.login.swapcase
46
47
  post :create, params: { stack_id: @stack.to_param, sha: @commit.sha }
47
48
  rollback = Rollback.last
48
- rollback.user == @user
49
+ assert_equal @user, rollback.user
49
50
  end
50
51
 
51
52
  test "#create renders a 422 if the sha isn't found" do
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -41,24 +42,24 @@ module Shipit
41
42
  test "#create fails to create stack if it already exists" do
42
43
  repository = shipit_repositories(:rails)
43
44
  existing_stack = Stack.create!(
44
- repository: repository,
45
+ repository:,
45
46
  environment: 'staging',
46
- branch: 'staging',
47
+ branch: 'staging'
47
48
  )
48
49
 
49
50
  assert_no_difference -> { Stack.count } do
50
51
  post :create,
51
- params: {
52
- repo_name: existing_stack.repo_name,
53
- repo_owner: existing_stack.repo_owner,
54
- environment: existing_stack.environment,
55
- branch: existing_stack.branch,
56
- }
52
+ params: {
53
+ repo_name: existing_stack.repo_name,
54
+ repo_owner: existing_stack.repo_owner,
55
+ environment: existing_stack.environment,
56
+ branch: existing_stack.branch
57
+ }
57
58
  end
58
59
 
59
60
  assert_response :unprocessable_entity
60
61
  assert_json 'errors', 'repository' => [
61
- 'cannot be used more than once with this environment. Check archived stacks.',
62
+ 'cannot be used more than once with this environment. Check archived stacks.'
62
63
  ]
63
64
  end
64
65
 
@@ -71,7 +72,7 @@ module Shipit
71
72
  id: @stack.to_param,
72
73
  merge_queue_enabled: false,
73
74
  ignore_ci: true,
74
- continuous_deployment: true,
75
+ continuous_deployment: true
75
76
  }
76
77
 
77
78
  assert_response :ok
@@ -87,7 +88,7 @@ module Shipit
87
88
 
88
89
  patch :update, params: {
89
90
  id: @stack.to_param,
90
- branch: 'test',
91
+ branch: 'test'
91
92
  }
92
93
 
93
94
  assert_response :ok
@@ -104,7 +105,7 @@ module Shipit
104
105
 
105
106
  patch :update, params: {
106
107
  id: @stack.to_param,
107
- continuous_deployment: false,
108
+ continuous_deployment: false
108
109
  }
109
110
 
110
111
  assert_response :ok
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -39,42 +40,42 @@ module Shipit
39
40
 
40
41
  expected_env = {
41
42
  "FOO" => "1",
42
- "BAR" => "0",
43
+ "BAR" => "0"
43
44
  }
44
45
  assert_equal expected_env, Shipit::Task.last.env
45
46
  end
46
47
 
47
48
  test "#trigger refuses to trigger a task with tasks not whitelisted" do
48
49
  env = { 'DANGEROUS_VARIABLE' => 'bar' }
49
- post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
50
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: }
50
51
  assert_response :unprocessable_entity
51
52
  assert_json 'message', 'Variables DANGEROUS_VARIABLE have not been whitelisted'
52
53
  end
53
54
 
54
55
  test "#trigger triggers a task with only whitelisted env variables" do
55
56
  env = { 'FOO' => 'bar' }
56
- post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
57
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: }
57
58
  assert_response :accepted
58
59
  assert_json 'type', 'task'
59
60
  assert_json 'status', 'pending'
60
61
 
61
62
  expected_env = {
62
63
  "FOO" => "bar",
63
- "BAR" => "0",
64
+ "BAR" => "0"
64
65
  }
65
66
  assert_equal expected_env, Shipit::Task.last.env
66
67
  end
67
68
 
68
69
  test "#trigger triggers a task with explicitly passed and default variables" do
69
70
  env = { 'WALRUS' => 'overridden value' }
70
- post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: env }
71
+ post :trigger, params: { stack_id: @stack.to_param, task_name: 'restart', env: }
71
72
  assert_response :accepted
72
73
 
73
74
  # FOO and BAR are variables with a default value
74
75
  expected_env = {
75
76
  "FOO" => "1",
76
77
  "BAR" => "0",
77
- "WALRUS" => "overridden value",
78
+ "WALRUS" => "overridden value"
78
79
  }
79
80
  assert_equal expected_env, Shipit::Task.last.env
80
81
  end
@@ -23,7 +23,7 @@ module Shipit
23
23
  assert_response :forbidden
24
24
  assert_equal(
25
25
  'You must be a member of cyclimse/cooks or shopify/developers to access this application.',
26
- response.body,
26
+ response.body
27
27
  )
28
28
  end
29
29
 
@@ -44,9 +44,9 @@ module Shipit
44
44
  name: 'walrus_app',
45
45
  permissions: [
46
46
  'read:stack',
47
- 'lock:stack',
48
- ],
49
- },
47
+ 'lock:stack'
48
+ ]
49
+ }
50
50
  }
51
51
  end
52
52
 
@@ -59,9 +59,9 @@ module Shipit
59
59
  name: 'walrus_app',
60
60
  permissions: [
61
61
  'read:stack',
62
- 'lock:stack',
63
- ],
64
- },
62
+ 'lock:stack'
63
+ ]
64
+ }
65
65
  }
66
66
 
67
67
  assert_equal shipit_users(:walrus).id, ApiClient.last.creator.id
@@ -84,15 +84,15 @@ module Shipit
84
84
  test "#update updates an existing api_client" do
85
85
  new_permissions = [
86
86
  'read:stack',
87
- 'lock:stack',
87
+ 'lock:stack'
88
88
  ]
89
89
 
90
90
  assert_difference "ApiClient.count", 0 do
91
91
  patch :update, params: {
92
92
  id: @api_client.id,
93
93
  api_client: {
94
- permissions: new_permissions,
95
- },
94
+ permissions: new_permissions
95
+ }
96
96
  }
97
97
  end
98
98
  @api_client.reload
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'uri'
3
4
  require 'test_helper'
4
5
 
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -14,10 +15,10 @@ module Shipit
14
15
  refute_predicate(@commit, :locked?)
15
16
 
16
17
  patch(:update, params: {
17
- stack_id: @stack.to_param,
18
- id: @commit.id,
19
- commit: { locked: true },
20
- })
18
+ stack_id: @stack.to_param,
19
+ id: @commit.id,
20
+ commit: { locked: true }
21
+ })
21
22
 
22
23
  assert_response(:ok)
23
24
  @commit.reload
@@ -29,10 +30,10 @@ module Shipit
29
30
  @commit.lock(@user)
30
31
 
31
32
  patch(:update, params: {
32
- stack_id: @stack.to_param,
33
- id: @commit.id,
34
- commit: { locked: false },
35
- })
33
+ stack_id: @stack.to_param,
34
+ id: @commit.id,
35
+ commit: { locked: false }
36
+ })
36
37
 
37
38
  assert_response(:ok)
38
39
  @commit.reload
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ module Shipit
6
+ class ContinuousDeliverySchedulesControllerTest < ActionController::TestCase
7
+ setup do
8
+ @routes = Shipit::Engine.routes
9
+ @stack = shipit_stacks(:shipit)
10
+ session[:user_id] = shipit_users(:walrus).id
11
+ end
12
+
13
+ def valid_params
14
+ Shipit::ContinuousDeliverySchedule::DAYS.each_with_object({}) do |day, hash|
15
+ hash[:"#{day}_enabled"] = "0"
16
+ hash[:"#{day}_start"] = "09:00"
17
+ hash[:"#{day}_end"] = "17:00"
18
+ end
19
+ end
20
+
21
+ test "#show returns a 200 response" do
22
+ get(:show, params: { id: @stack.to_param })
23
+
24
+ assert(response.ok?)
25
+ end
26
+
27
+ test "#update" do
28
+ patch(:update, params: {
29
+ id: @stack.to_param,
30
+ continuous_delivery_schedule: {
31
+ **valid_params
32
+ }
33
+ })
34
+
35
+ assert_redirected_to(stack_continuous_delivery_schedule_path(@stack))
36
+ assert_equal("Successfully updated", flash[:success])
37
+
38
+ schedule = @stack.continuous_delivery_schedule
39
+
40
+ Shipit::ContinuousDeliverySchedule::DAYS.each do |day|
41
+ refute(schedule.read_attribute("#{day}_enabled"))
42
+
43
+ day_start = schedule.read_attribute("#{day}_start")
44
+ assert_equal("09:00:00 AM", day_start.strftime("%r"))
45
+
46
+ day_end = schedule.read_attribute("#{day}_end")
47
+ assert_equal("05:00:00 PM", day_end.strftime("%r"))
48
+ end
49
+ end
50
+
51
+ test "#update renders validation errors" do
52
+ patch(:update, params: {
53
+ id: @stack.to_param,
54
+ continuous_delivery_schedule: {
55
+ # Make Sunday end before it starts
56
+ **valid_params.merge(sunday_end: "08:00")
57
+ }
58
+ })
59
+
60
+ assert_response(:unprocessable_entity)
61
+ assert_equal("Check form for errors", flash[:warning])
62
+ elements = assert_select(".validation-errors")
63
+ assert_includes(elements.sole.inner_text, "Sunday end must be after start (09:00 AM)")
64
+ end
65
+ end
66
+ end
@@ -1,10 +1,11 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
5
6
  class DeploysControllerTest < ActionController::TestCase
6
7
  setup do
7
- Deploy.where(status: %w(running pending)).update_all(status: 'success')
8
+ Deploy.where(status: %w[running pending]).update_all(status: 'success')
8
9
  @stack = shipit_stacks(:shipit)
9
10
  @deploy = shipit_deploys(:shipit)
10
11
  @commit = shipit_commits(:second)
@@ -31,6 +32,7 @@ module Shipit
31
32
  test ":new works for not yet deployed stacks" do
32
33
  @stack = shipit_stacks(:undeployed_stack)
33
34
  get :new, params: { stack_id: @stack.to_param, sha: @stack.commits.last.sha }
35
+ assert_response :success
34
36
  end
35
37
 
36
38
  test ":new shows a warning if a deploy is already running" do
@@ -62,7 +64,7 @@ module Shipit
62
64
 
63
65
  test ":create can receive an :env hash" do
64
66
  env = { 'SAFETY_DISABLED' => '1' }
65
- post :create, params: { stack_id: @stack.to_param, deploy: { until_commit_id: @commit.id, env: env } }
67
+ post :create, params: { stack_id: @stack.to_param, deploy: { until_commit_id: @commit.id, env: } }
66
68
  new_deploy = Deploy.last
67
69
  assert_equal env, new_deploy.env
68
70
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -6,7 +7,7 @@ module Shipit
6
7
  test ":callback can sign in to github" do
7
8
  auth = OmniAuth::AuthHash.new(
8
9
  credentials: OmniAuth::AuthHash.new(
9
- token: 's3cr3t',
10
+ token: 's3cr3t'
10
11
  ),
11
12
  extra: OmniAuth::AuthHash.new(
12
13
  raw_info: OmniAuth::AuthHash.new(
@@ -15,9 +16,9 @@ module Shipit
15
16
  email: 'shipit-user@example.com',
16
17
  login: 'shipit-user',
17
18
  avatar_url: 'https://example.com',
18
- api_url: 'https://github.com/api/v3/users/shipit-user',
19
- ),
20
- ),
19
+ api_url: 'https://github.com/api/v3/users/shipit-user'
20
+ )
21
+ )
21
22
  )
22
23
  @request.env['omniauth.auth'] = auth
23
24
 
@@ -28,6 +29,7 @@ module Shipit
28
29
  user = User.find_by(login: 'shipit-user')
29
30
  assert_equal 's3cr3t', user.github_access_token
30
31
  assert_equal 44, user.github_id
32
+ assert session[:authenticated], "Expected session[:authenticated] to be true"
31
33
  end
32
34
  end
33
35
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -38,14 +39,14 @@ module Shipit
38
39
  test "GET show prefers stacks with merge_queue_enabled" do
39
40
  existing = shipit_stacks(:shipit)
40
41
  Shipit::Stack.where(
41
- repository: existing.repository,
42
+ repository: existing.repository
42
43
  ).update_all(merge_queue_enabled: false)
43
44
 
44
45
  Shipit::Stack.create(
45
46
  repository: existing.repository,
46
47
  environment: 'foo',
47
48
  branch: existing.branch,
48
- merge_queue_enabled: true,
49
+ merge_queue_enabled: true
49
50
  )
50
51
 
51
52
  get :show, params: { referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master' }
@@ -56,7 +57,7 @@ module Shipit
56
57
  test "GET show prefers locked stacks above all else" do
57
58
  existing = shipit_stacks(:shipit)
58
59
  Shipit::Stack.where(
59
- repository: existing.repository,
60
+ repository: existing.repository
60
61
  ).update_all(lock_reason: 'testing', merge_queue_enabled: false, locked_since: Time.now.utc)
61
62
 
62
63
  # Shipit would otherwise prefer this, because it has the merge queue enabled
@@ -64,7 +65,7 @@ module Shipit
64
65
  repository: existing.repository,
65
66
  environment: 'foo',
66
67
  branch: existing.branch,
67
- merge_queue_enabled: true,
68
+ merge_queue_enabled: true
68
69
  )
69
70
 
70
71
  get :show, params: { referrer: 'https://github.com/Shopify/shipit-engine/pull/42', branch: 'master' }
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'test_helper'
3
4
 
4
5
  module Shipit
@@ -22,7 +23,7 @@ module Shipit
22
23
  assert_response :forbidden
23
24
  assert_equal(
24
25
  'You must be a member of cyclimse/cooks or shopify/developers to access this application.',
25
- response.body,
26
+ response.body
26
27
  )
27
28
  end
28
29
 
@@ -36,8 +37,8 @@ module Shipit
36
37
  post :create, params: {
37
38
  repository: {
38
39
  name: 'valid',
39
- owner: 'repository',
40
- },
40
+ owner: 'repository'
41
+ }
41
42
  }
42
43
  end
43
44
  assert_redirected_to repository_path(Repository.last)
@@ -48,8 +49,8 @@ module Shipit
48
49
  post :create, params: {
49
50
  repository: {
50
51
  owner: 'some',
51
- name: 'owner/path',
52
- },
52
+ name: 'owner/path'
53
+ }
53
54
  }
54
55
  end
55
56
  assert_response :success