shipit-engine 0.28.0 → 0.32.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 (314) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +41 -2
  3. data/Rakefile +4 -2
  4. data/app/assets/images/archive-solid.svg +1 -0
  5. data/app/assets/stylesheets/_pages/_stacks.scss +76 -3
  6. data/app/assets/stylesheets/_structure/_main.scss +2 -1
  7. data/app/assets/stylesheets/merge_status.scss +0 -3
  8. data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +13 -0
  9. data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
  10. data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
  11. data/app/controllers/concerns/shipit/api/rendering.rb +5 -4
  12. data/app/controllers/concerns/shipit/authentication.rb +3 -2
  13. data/app/controllers/concerns/shipit/pagination.rb +2 -1
  14. data/app/controllers/shipit/api/base_controller.rb +11 -6
  15. data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
  16. data/app/controllers/shipit/api/commits_controller.rb +2 -1
  17. data/app/controllers/shipit/api/deploys_controller.rb +4 -3
  18. data/app/controllers/shipit/api/hooks_controller.rb +6 -5
  19. data/app/controllers/shipit/api/locks_controller.rb +5 -4
  20. data/app/controllers/shipit/api/outputs_controller.rb +2 -1
  21. data/app/controllers/shipit/api/pull_requests_controller.rb +7 -6
  22. data/app/controllers/shipit/api/release_statuses_controller.rb +3 -2
  23. data/app/controllers/shipit/api/rollbacks_controller.rb +33 -0
  24. data/app/controllers/shipit/api/stacks_controller.rb +37 -5
  25. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  26. data/app/controllers/shipit/api_clients_controller.rb +50 -0
  27. data/app/controllers/shipit/ccmenu_url_controller.rb +4 -3
  28. data/app/controllers/shipit/commit_checks_controller.rb +2 -1
  29. data/app/controllers/shipit/commits_controller.rb +2 -1
  30. data/app/controllers/shipit/deploys_controller.rb +3 -2
  31. data/app/controllers/shipit/github_authentication_controller.rb +4 -3
  32. data/app/controllers/shipit/merge_status_controller.rb +19 -14
  33. data/app/controllers/shipit/pull_requests_controller.rb +3 -2
  34. data/app/controllers/shipit/release_statuses_controller.rb +3 -2
  35. data/app/controllers/shipit/rollbacks_controller.rb +3 -2
  36. data/app/controllers/shipit/shipit_controller.rb +2 -1
  37. data/app/controllers/shipit/stacks_controller.rb +78 -14
  38. data/app/controllers/shipit/status_controller.rb +2 -1
  39. data/app/controllers/shipit/tasks_controller.rb +6 -5
  40. data/app/controllers/shipit/webhooks_controller.rb +5 -132
  41. data/app/helpers/shipit/chunks_helper.rb +1 -0
  42. data/app/helpers/shipit/deploys_helper.rb +4 -3
  43. data/app/helpers/shipit/github_url_helper.rb +1 -0
  44. data/app/helpers/shipit/merge_status_helper.rb +1 -0
  45. data/app/helpers/shipit/shipit_helper.rb +1 -0
  46. data/app/helpers/shipit/stacks_helper.rb +5 -0
  47. data/app/helpers/shipit/tasks_helper.rb +1 -0
  48. data/app/jobs/shipit/background_job.rb +4 -0
  49. data/app/jobs/shipit/background_job/unique.rb +4 -1
  50. data/app/jobs/shipit/cache_deploy_spec_job.rb +1 -0
  51. data/app/jobs/shipit/chunk_rollup_job.rb +4 -0
  52. data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
  53. data/app/jobs/shipit/continuous_delivery_job.rb +3 -1
  54. data/app/jobs/shipit/create_on_github_job.rb +6 -1
  55. data/app/jobs/shipit/create_release_statuses_job.rb +1 -0
  56. data/app/jobs/shipit/deferred_touch_job.rb +4 -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_stack_job.rb +3 -2
  60. data/app/jobs/shipit/emit_event_job.rb +2 -1
  61. data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
  62. data/app/jobs/shipit/fetch_deployed_revision_job.rb +2 -1
  63. data/app/jobs/shipit/github_sync_job.rb +3 -2
  64. data/app/jobs/shipit/{mark_deploy_healty_job.rb → mark_deploy_healthy_job.rb} +1 -0
  65. data/app/jobs/shipit/merge_pull_requests_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 +14 -5
  68. data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
  69. data/app/jobs/shipit/reap_dead_tasks_job.rb +21 -0
  70. data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
  71. data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
  72. data/app/jobs/shipit/refresh_pull_request_job.rb +1 -0
  73. data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
  74. data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
  75. data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
  76. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +6 -3
  77. data/app/models/concerns/shipit/deferred_touch.rb +4 -3
  78. data/app/models/shipit/anonymous_user.rb +5 -0
  79. data/app/models/shipit/api_client.rb +3 -2
  80. data/app/models/shipit/application_record.rb +2 -1
  81. data/app/models/shipit/check_run.rb +4 -3
  82. data/app/models/shipit/command_line_user.rb +1 -0
  83. data/app/models/shipit/commit.rb +31 -12
  84. data/app/models/shipit/commit_checks.rb +1 -0
  85. data/app/models/shipit/commit_deployment.rb +17 -12
  86. data/app/models/shipit/commit_deployment_status.rb +8 -3
  87. data/app/models/shipit/commit_message.rb +1 -0
  88. data/app/models/shipit/delivery.rb +4 -3
  89. data/app/models/shipit/deploy.rb +40 -10
  90. data/app/models/shipit/deploy_spec.rb +22 -3
  91. data/app/models/shipit/deploy_spec/bundler_discovery.rb +2 -1
  92. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
  93. data/app/models/shipit/deploy_spec/file_system.rb +10 -3
  94. data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +1 -0
  95. data/app/models/shipit/deploy_spec/lerna_discovery.rb +1 -0
  96. data/app/models/shipit/deploy_spec/npm_discovery.rb +5 -4
  97. data/app/models/shipit/deploy_spec/pypi_discovery.rb +1 -0
  98. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
  99. data/app/models/shipit/deploy_stats.rb +58 -0
  100. data/app/models/shipit/duration.rb +3 -2
  101. data/app/models/shipit/ephemeral_commit_checks.rb +1 -0
  102. data/app/models/shipit/github_hook.rb +2 -1
  103. data/app/models/shipit/github_status.rb +3 -2
  104. data/app/models/shipit/hook.rb +6 -5
  105. data/app/models/shipit/membership.rb +3 -2
  106. data/app/models/shipit/output_chunk.rb +7 -2
  107. data/app/models/shipit/pull_request.rb +13 -7
  108. data/app/models/shipit/record.rb +18 -0
  109. data/app/models/shipit/release_status.rb +3 -2
  110. data/app/models/shipit/repository.rb +43 -0
  111. data/app/models/shipit/rollback.rb +1 -0
  112. data/app/models/shipit/stack.rb +109 -50
  113. data/app/models/shipit/status.rb +3 -2
  114. data/app/models/shipit/status/common.rb +7 -6
  115. data/app/models/shipit/status/group.rb +1 -0
  116. data/app/models/shipit/status/missing.rb +2 -1
  117. data/app/models/shipit/status/unknown.rb +2 -1
  118. data/app/models/shipit/task.rb +64 -9
  119. data/app/models/shipit/task_definition.rb +1 -0
  120. data/app/models/shipit/team.rb +2 -1
  121. data/app/models/shipit/undeployed_commit.rb +1 -0
  122. data/app/models/shipit/unlimited_api_client.rb +1 -0
  123. data/app/models/shipit/user.rb +29 -5
  124. data/app/models/shipit/variable_definition.rb +1 -0
  125. data/app/models/shipit/webhooks.rb +33 -0
  126. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +20 -0
  127. data/app/models/shipit/webhooks/handlers/handler.rb +41 -0
  128. data/app/models/shipit/webhooks/handlers/membership_handler.rb +46 -0
  129. data/app/models/shipit/webhooks/handlers/push_handler.rb +21 -0
  130. data/app/models/shipit/webhooks/handlers/status_handler.rb +27 -0
  131. data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
  132. data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
  133. data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
  134. data/app/serializers/shipit/commit_serializer.rb +1 -0
  135. data/app/serializers/shipit/deploy_serializer.rb +2 -1
  136. data/app/serializers/shipit/hook_serializer.rb +1 -0
  137. data/app/serializers/shipit/pull_request_serializer.rb +1 -0
  138. data/app/serializers/shipit/rollback_serializer.rb +1 -0
  139. data/app/serializers/shipit/short_commit_serializer.rb +1 -0
  140. data/app/serializers/shipit/stack_serializer.rb +7 -1
  141. data/app/serializers/shipit/tail_task_serializer.rb +1 -0
  142. data/app/serializers/shipit/task_serializer.rb +2 -17
  143. data/app/serializers/shipit/user_serializer.rb +6 -1
  144. data/app/validators/ascii_only_validator.rb +4 -3
  145. data/app/validators/subset_validator.rb +1 -0
  146. data/app/views/layouts/_head.html.erb +0 -0
  147. data/app/views/layouts/shipit.html.erb +6 -4
  148. data/app/views/shipit/_variables.html.erb +1 -1
  149. data/app/views/shipit/api_clients/index.html.erb +36 -0
  150. data/app/views/shipit/api_clients/new.html.erb +33 -0
  151. data/app/views/shipit/api_clients/show.html.erb +35 -0
  152. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  153. data/app/views/shipit/deploys/new.html.erb +17 -12
  154. data/app/views/shipit/deploys/show.html.erb +2 -2
  155. data/app/views/shipit/merge_status/logged_out.erb +1 -1
  156. data/app/views/shipit/stacks/_header.html.erb +27 -12
  157. data/app/views/shipit/stacks/_links.html.erb +1 -0
  158. data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
  159. data/app/views/shipit/stacks/index.html.erb +7 -2
  160. data/app/views/shipit/stacks/settings.html.erb +19 -0
  161. data/app/views/shipit/stacks/statistics.html.erb +82 -0
  162. data/app/views/shipit/tasks/show.html.erb +1 -1
  163. data/config/initializers/inflections.rb +2 -1
  164. data/config/locales/en.yml +18 -5
  165. data/config/routes.rb +14 -2
  166. data/db/migrate/20191209231045_create_shipit_repositories.rb +12 -0
  167. data/db/migrate/20191209231307_add_repository_reference_to_stacks.rb +15 -0
  168. data/db/migrate/20191216162728_backfill_repository_data.rb +22 -0
  169. data/db/migrate/20191216163010_remove_repository_information_from_stacks.rb +20 -0
  170. data/db/migrate/20191219205202_add_archived_since_to_stacks.rb +6 -0
  171. data/db/migrate/20200102175621_optional_task_commits.rb +6 -0
  172. data/db/migrate/20200109132519_add_sha_to_commit_deployments.rb +5 -0
  173. data/db/migrate/20200226211925_add_index_to_tasks_status.rb +5 -0
  174. data/db/migrate/20200427135152_add_pull_request_head_sha_to_commit.rb +5 -0
  175. data/db/migrate/20200615181558_add_rollback_once_aborted_to.rb +5 -0
  176. data/lib/shipit.rb +18 -20
  177. data/lib/shipit/cast_value.rb +1 -0
  178. data/lib/shipit/command.rb +14 -18
  179. data/lib/shipit/commands.rb +5 -4
  180. data/lib/shipit/csv_serializer.rb +1 -0
  181. data/lib/shipit/deploy_commands.rb +1 -0
  182. data/lib/shipit/engine.rb +11 -2
  183. data/lib/shipit/environment_variables.rb +11 -1
  184. data/lib/shipit/first_parent_commits_iterator.rb +1 -0
  185. data/lib/shipit/flock.rb +1 -0
  186. data/lib/shipit/github_app.rb +60 -6
  187. data/lib/shipit/github_http_cache_middleware.rb +57 -0
  188. data/lib/shipit/null_serializer.rb +1 -0
  189. data/lib/shipit/octokit_check_runs.rb +3 -2
  190. data/lib/shipit/octokit_iterator.rb +3 -2
  191. data/lib/shipit/paginator.rb +3 -2
  192. data/lib/shipit/rollback_commands.rb +1 -0
  193. data/lib/shipit/same_site_cookie_middleware.rb +29 -0
  194. data/lib/shipit/simple_message_verifier.rb +1 -0
  195. data/lib/shipit/stack_commands.rb +6 -3
  196. data/lib/shipit/stat.rb +1 -0
  197. data/lib/shipit/task_commands.rb +22 -14
  198. data/lib/shipit/version.rb +2 -1
  199. data/lib/snippets/release-gem +5 -1
  200. data/lib/tasks/cron.rake +2 -0
  201. data/lib/tasks/dev.rake +3 -2
  202. data/lib/tasks/shipit.rake +16 -17
  203. data/lib/tasks/teams.rake +1 -0
  204. data/test/controllers/api/base_controller_test.rb +3 -2
  205. data/test/controllers/api/ccmenu_controller_test.rb +9 -8
  206. data/test/controllers/api/commits_controller_test.rb +3 -2
  207. data/test/controllers/api/deploys_controller_test.rb +15 -14
  208. data/test/controllers/api/hooks_controller_test.rb +8 -7
  209. data/test/controllers/api/locks_controller_test.rb +7 -6
  210. data/test/controllers/api/outputs_controller_test.rb +3 -2
  211. data/test/controllers/api/pull_requests_controller_test.rb +8 -7
  212. data/test/controllers/api/release_statuses_controller_test.rb +2 -1
  213. data/test/controllers/api/rollback_controller_test.rb +113 -0
  214. data/test/controllers/api/stacks_controller_test.rb +44 -15
  215. data/test/controllers/api/tasks_controller_test.rb +13 -12
  216. data/test/controllers/api_clients_controller_test.rb +104 -0
  217. data/test/controllers/ccmenu_controller_test.rb +4 -3
  218. data/test/controllers/commit_checks_controller_test.rb +4 -3
  219. data/test/controllers/commits_controller_test.rb +3 -2
  220. data/test/controllers/deploys_controller_test.rb +33 -22
  221. data/test/controllers/github_authentication_controller_test.rb +1 -0
  222. data/test/controllers/merge_status_controller_test.rb +27 -9
  223. data/test/controllers/pull_requests_controller_test.rb +4 -3
  224. data/test/controllers/release_statuses_controller_test.rb +3 -2
  225. data/test/controllers/rollbacks_controller_test.rb +9 -8
  226. data/test/controllers/stacks_controller_test.rb +64 -15
  227. data/test/controllers/status_controller_test.rb +1 -0
  228. data/test/controllers/tasks_controller_test.rb +20 -19
  229. data/test/controllers/webhooks_controller_test.rb +36 -9
  230. data/test/dummy/config/application.rb +1 -1
  231. data/test/dummy/config/environments/development.rb +24 -4
  232. data/test/dummy/config/environments/test.rb +2 -0
  233. data/test/dummy/db/schema.rb +25 -11
  234. data/test/dummy/db/seeds.rb +34 -17
  235. data/test/fixtures/shipit/commit_deployment_statuses.yml +4 -4
  236. data/test/fixtures/shipit/commit_deployments.yml +8 -8
  237. data/test/fixtures/shipit/commits.yml +38 -0
  238. data/test/fixtures/shipit/repositories.yml +27 -0
  239. data/test/fixtures/shipit/stacks.yml +190 -30
  240. data/test/fixtures/shipit/tasks.yml +66 -3
  241. data/test/fixtures/timeout +2 -1
  242. data/test/helpers/api_helper.rb +1 -0
  243. data/test/helpers/fixture_aliases_helper.rb +1 -0
  244. data/test/helpers/hooks_helper.rb +2 -1
  245. data/test/helpers/json_helper.rb +15 -11
  246. data/test/helpers/links_helper.rb +4 -3
  247. data/test/helpers/payloads_helper.rb +1 -0
  248. data/test/helpers/queries_helper.rb +3 -2
  249. data/test/jobs/cache_deploy_spec_job_test.rb +2 -1
  250. data/test/jobs/chunk_rollup_job_test.rb +1 -0
  251. data/test/jobs/deliver_hook_job_test.rb +2 -1
  252. data/test/jobs/destroy_stack_job_test.rb +10 -0
  253. data/test/jobs/emit_event_job_test.rb +2 -1
  254. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  255. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  256. data/test/jobs/github_sync_job_test.rb +1 -0
  257. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  258. data/test/jobs/merge_pull_requests_job_test.rb +5 -4
  259. data/test/jobs/perform_task_job_test.rb +4 -3
  260. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  261. data/test/jobs/reap_dead_tasks_job_test.rb +68 -0
  262. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  263. data/test/jobs/refresh_status_job_test.rb +1 -0
  264. data/test/jobs/unique_job_test.rb +1 -0
  265. data/test/jobs/update_github_last_deployed_ref_job_test.rb +13 -11
  266. data/test/middleware/same_site_cookie_middleware_test.rb +52 -0
  267. data/test/models/api_client_test.rb +1 -0
  268. data/test/models/commit_checks_test.rb +1 -0
  269. data/test/models/commit_deployment_status_test.rb +34 -4
  270. data/test/models/commit_deployment_test.rb +9 -11
  271. data/test/models/commits_test.rb +99 -7
  272. data/test/models/delivery_test.rb +3 -2
  273. data/test/models/deploy_spec_test.rb +47 -42
  274. data/test/models/deploy_stats_test.rb +113 -0
  275. data/test/models/deploys_test.rb +60 -13
  276. data/test/models/duration_test.rb +1 -0
  277. data/test/models/github_hook_test.rb +1 -0
  278. data/test/models/hook_test.rb +20 -16
  279. data/test/models/membership_test.rb +1 -0
  280. data/test/models/output_chunk_test.rb +1 -0
  281. data/test/models/pull_request_test.rb +18 -11
  282. data/test/models/release_statuses_test.rb +1 -0
  283. data/test/models/rollbacks_test.rb +1 -0
  284. data/test/models/shipit/check_run_test.rb +1 -0
  285. data/test/models/shipit/repository_test.rb +77 -0
  286. data/test/models/shipit/wehbooks/handlers_test.rb +27 -0
  287. data/test/models/stacks_test.rb +110 -56
  288. data/test/models/status/group_test.rb +1 -0
  289. data/test/models/status/missing_test.rb +1 -0
  290. data/test/models/status_test.rb +1 -0
  291. data/test/models/task_definitions_test.rb +9 -8
  292. data/test/models/tasks_test.rb +18 -1
  293. data/test/models/team_test.rb +4 -2
  294. data/test/models/undeployed_commits_test.rb +14 -0
  295. data/test/models/users_test.rb +109 -1
  296. data/test/test_command_integration.rb +3 -2
  297. data/test/test_helper.rb +38 -34
  298. data/test/unit/anonymous_user_serializer_test.rb +14 -0
  299. data/test/unit/command_test.rb +12 -7
  300. data/test/unit/commands_test.rb +1 -0
  301. data/test/unit/commit_serializer_test.rb +16 -0
  302. data/test/unit/csv_serializer_test.rb +3 -2
  303. data/test/unit/deploy_commands_test.rb +14 -4
  304. data/test/unit/deploy_serializer_test.rb +17 -0
  305. data/test/unit/environment_variables_test.rb +5 -4
  306. data/test/unit/github_app_test.rb +165 -0
  307. data/test/unit/github_url_helper_test.rb +1 -0
  308. data/test/unit/rollback_commands_test.rb +2 -1
  309. data/test/unit/shipit_helper_test.rb +17 -0
  310. data/test/unit/shipit_test.rb +1 -0
  311. data/test/unit/user_serializer_test.rb +14 -0
  312. data/test/unit/variable_definition_test.rb +1 -0
  313. metadata +215 -157
  314. data/lib/shipit/strip_cache_control.rb +0 -40
@@ -1,33 +1,76 @@
1
1
  shipit:
2
- repo_owner: "shopify"
3
- repo_name: "shipit-engine"
2
+ repository: shipit
4
3
  environment: "production"
5
4
  branch: master
5
+ deploy_url: https://shipit.shopify.com
6
6
  ignore_ci: false
7
7
  merge_queue_enabled: true
8
8
  tasks_count: 8
9
9
  undeployed_commits_count: 2
10
- cached_deploy_spec: >
10
+ cached_deploy_spec: |-
11
11
  {
12
- "machine": {"environment": {}},
12
+ "machine": {
13
+ "environment": {
14
+ }
15
+ },
13
16
  "review": {
14
- "checklist": ["foo", "bar", "baz"],
17
+ "checklist": [
18
+ "foo",
19
+ "bar",
20
+ "baz"
21
+ ],
15
22
  "monitoring": [
16
- {"image": "https://example.com/monitor.png", "width": 200, "height": 300}
23
+ {
24
+ "image": "https://example.com/monitor.png",
25
+ "width": 200,
26
+ "height": 300
27
+ }
17
28
  ]
18
29
  },
19
- "dependencies": {"override": []},
20
- "deploy": {"override": null, "interval": 60, "max_commits": 3, "variables": [{"name": "SAFETY_DISABLED", "title": "Set to 1 to do dangerous things", "default": 0}]},
21
- "rollback": {"override": ["echo 'Rollback!'"]},
22
- "fetch": ["echo '42'"],
30
+ "dependencies": {
31
+ "override": [
32
+
33
+ ]
34
+ },
35
+ "deploy": {
36
+ "override": null,
37
+ "interval": 60,
38
+ "max_commits": 3,
39
+ "variables": [
40
+ {
41
+ "name": "SAFETY_DISABLED",
42
+ "title": "Set to 1 to do dangerous things",
43
+ "default": 0
44
+ }
45
+ ]
46
+ },
47
+ "rollback": {
48
+ "override": [
49
+ "echo 'Rollback!'"
50
+ ]
51
+ },
52
+ "fetch": [
53
+ "echo '42'"
54
+ ],
23
55
  "tasks": {
24
56
  "restart": {
25
57
  "action": "Restart application",
26
58
  "description": "Restart app and job servers",
27
59
  "variables": [
28
- {"name": "FOO", "title": "Set to 0 to foo", "default": 1},
29
- {"name": "BAR", "title": "Set to 1 to bar", "default": 0},
30
- {"name": "WALRUS", "title": "Walrus without a default value"}
60
+ {
61
+ "name": "FOO",
62
+ "title": "Set to 0 to foo",
63
+ "default": 1
64
+ },
65
+ {
66
+ "name": "BAR",
67
+ "title": "Set to 1 to bar",
68
+ "default": 0
69
+ },
70
+ {
71
+ "name": "WALRUS",
72
+ "title": "Walrus without a default value"
73
+ }
31
74
  ],
32
75
  "steps": [
33
76
  "cap $ENVIRONMENT deploy:restart"
@@ -46,16 +89,19 @@ shipit:
46
89
  "revalidate_after": 900
47
90
  },
48
91
  "ci": {
49
- "hide": ["ci/hidden"],
50
- "allow_failures": ["ci/ok_to_fail"]
92
+ "hide": [
93
+ "ci/hidden"
94
+ ],
95
+ "allow_failures": [
96
+ "ci/ok_to_fail"
97
+ ]
51
98
  }
52
99
  }
53
100
  last_deployed_at: <%= 8.days.ago.to_s(:db) %>
54
101
  updated_at: <%= 8.days.ago.to_s(:db) %>
55
102
 
56
103
  shipit_canaries:
57
- repo_owner: "shopify"
58
- repo_name: "shipit-engine"
104
+ repository: shipit
59
105
  environment: "canaries"
60
106
  branch: master
61
107
  ignore_ci: false
@@ -114,8 +160,7 @@ shipit_canaries:
114
160
  updated_at: <%= 8.days.ago.to_s(:db) %>
115
161
 
116
162
  cyclimse:
117
- repo_owner: george
118
- repo_name: cyclimse
163
+ repository: cyclimse
119
164
  environment: production
120
165
  branch: master
121
166
  ignore_ci: false
@@ -148,8 +193,7 @@ cyclimse:
148
193
  updated_at: <%= 8.days.ago.to_s(:db) %>
149
194
 
150
195
  undeployed_stack:
151
- repo_owner: "shopify"
152
- repo_name: "foo-bar"
196
+ repository: foo-bar
153
197
  environment: "production"
154
198
  branch: master
155
199
  ignore_ci: true
@@ -185,8 +229,7 @@ undeployed_stack:
185
229
  updated_at: <%= 8.days.ago.to_s(:db) %>
186
230
 
187
231
  soc:
188
- repo_owner: "shopify"
189
- repo_name: "soc"
232
+ repository: soc
190
233
  environment: "production"
191
234
  branch: master
192
235
  tasks_count: 0
@@ -220,16 +263,14 @@ soc:
220
263
  updated_at: <%= 8.days.ago.to_s(:db) %>
221
264
 
222
265
  check_runs:
223
- repo_owner: shopify
224
- repo_name: check_runs
266
+ repository: check_runs
225
267
  environment: production
226
268
  branch: master
227
269
  tasks_count: 0
228
270
  undeployed_commits_count: 1
229
271
 
230
272
  shipit_undeployed:
231
- repo_owner: "shopify"
232
- repo_name: "shipit-engine"
273
+ repository: shipit
233
274
  environment: "undeployed"
234
275
  branch: master
235
276
  ignore_ci: true
@@ -247,7 +288,23 @@ shipit_undeployed:
247
288
  ]
248
289
  },
249
290
  "dependencies": {"override": []},
250
- "deploy": {"override": null, "interval": 60, "max_commits": 3, "variables": [{"name": "SAFETY_DISABLED", "title": "Set to 1 to do dangerous things", "default": 0}]},
291
+ "deploy": {
292
+ "override": null,
293
+ "interval": 60,
294
+ "max_commits": 3,
295
+ "variables": [
296
+ {"name": "SAFETY_DISABLED", "title": "Set to 1 to do dangerous things", "default": 0},
297
+ {
298
+ "name": "DEPLOY_REGION",
299
+ "title": "Region to deploy to",
300
+ "default": "us-central",
301
+ "select": [
302
+ "us-central",
303
+ "us-east"
304
+ ]
305
+ }
306
+ ]
307
+ },
251
308
  "rollback": {"override": ["echo 'Rollback!'"]},
252
309
  "fetch": ["echo '42'"],
253
310
  "tasks": {
@@ -284,8 +341,7 @@ shipit_undeployed:
284
341
  updated_at: <%= 8.days.ago.to_s(:db) %>
285
342
 
286
343
  shipit_single:
287
- repo_owner: "shopify"
288
- repo_name: "shipit-engine"
344
+ repository: shipit
289
345
  environment: "single"
290
346
  branch: master
291
347
  ignore_ci: false
@@ -320,3 +376,107 @@ shipit_single:
320
376
  }
321
377
  updated_at: <%= 8.days.ago.to_s(:db) %>
322
378
  last_deployed_at: <%= 8.days.ago.to_s(:db) %>
379
+
380
+ shipit_stats:
381
+ repository: shipit
382
+ environment: "stats"
383
+ branch: master
384
+ ignore_ci: false
385
+ merge_queue_enabled: true
386
+ tasks_count: 4
387
+ undeployed_commits_count: 1
388
+ cached_deploy_spec: >
389
+ {
390
+ "machine": {"environment": {}},
391
+ "review": {
392
+ "checklist": ["foo", "bar", "baz"],
393
+ "monitoring": [
394
+ {"image": "https://example.com/monitor.png", "width": 200, "height": 300}
395
+ ]
396
+ },
397
+ "dependencies": {"override": []},
398
+ "deploy": {"override": null},
399
+ "rollback": {"override": ["echo 'Rollback!'"]},
400
+ "fetch": ["echo '42'"],
401
+ "tasks": {
402
+ "restart": {
403
+ "action": "Restart application",
404
+ "description": "Restart app and job servers",
405
+ "steps": [
406
+ "cap $ENVIRONMENT deploy:restart"
407
+ ]
408
+ }
409
+ },
410
+ "ci": {
411
+ "blocking": ["soc/compliance"]
412
+ }
413
+ }
414
+ updated_at: <%= 8.days.ago.to_s(:db) %>
415
+ last_deployed_at: <%= 8.days.ago.to_s(:db) %>
416
+
417
+ shipit_task_no_commits:
418
+ repository: shipit
419
+ environment: "task_no_commits"
420
+ branch: master
421
+ ignore_ci: true
422
+ merge_queue_enabled: true
423
+ tasks_count: 1
424
+ undeployed_commits_count: 1
425
+ continuous_deployment: true
426
+ cached_deploy_spec: >
427
+ {
428
+ "machine": {"environment": {}},
429
+ "review": {
430
+ "checklist": ["foo", "bar", "baz"],
431
+ "monitoring": [
432
+ {"image": "https://example.com/monitor.png", "width": 200, "height": 300}
433
+ ]
434
+ },
435
+ "dependencies": {"override": []},
436
+ "deploy": {"override": null, "interval": 60, "max_commits": 3, "variables": [{"name": "SAFETY_DISABLED", "title": "Set to 1 to do dangerous things", "default": 0}]},
437
+ "rollback": {"override": ["echo 'Rollback!'"]},
438
+ "fetch": ["echo '42'"],
439
+ "tasks": {
440
+ "restart": {
441
+ "action": "Restart application",
442
+ "description": "Restart app and job servers",
443
+ "variables": [
444
+ {"name": "FOO", "title": "Set to 0 to foo", "default": 1},
445
+ {"name": "BAR", "title": "Set to 1 to bar", "default": 0},
446
+ {"name": "WALRUS", "title": "Walrus without a default value"}
447
+ ],
448
+ "steps": [
449
+ "cap $ENVIRONMENT deploy:restart"
450
+ ]
451
+ },
452
+ "flush_cache": {
453
+ "action": "Flush cache",
454
+ "description": "Flush the application cache",
455
+ "steps": [
456
+ "cap $ENVIRONMENT cache:flush"
457
+ ],
458
+ "allow_concurrency": true
459
+ }
460
+ },
461
+ "merge": {
462
+ "revalidate_after": 900
463
+ },
464
+ "ci": {
465
+ "hide": ["ci/hidden"],
466
+ "allow_failures": ["ci/ok_to_fail"]
467
+ }
468
+ }
469
+ updated_at: <%= 8.days.ago.to_s(:db) %>
470
+
471
+ check_deploy_spec:
472
+ repository: check_deploy_spec
473
+ environment: production
474
+ branch: master
475
+ ignore_ci: true
476
+ merge_queue_enabled: true
477
+ tasks_count: 0
478
+ undeployed_commits_count: 1
479
+ continuous_deployment: true
480
+ cached_deploy_spec: "{}"
481
+ last_deployed_at: <%= 8.days.ago.to_s(:db) %>
482
+ updated_at: <%= 8.days.ago.to_s(:db) %>
@@ -10,7 +10,7 @@ shipit:
10
10
  deletions: 1
11
11
  created_at: <%= (60 - 1).minutes.ago.to_s(:db) %>
12
12
  started_at: <%= (60 - 1).minutes.ago.to_s(:db) %>
13
- ended_at: <%= (60 - 3).minutes.ago.to_s(:db) %>
13
+ ended_at: <%= (60 - 6).minutes.ago.to_s(:db) %>
14
14
 
15
15
  shipit2:
16
16
  id: 2
@@ -29,8 +29,6 @@ shipit2:
29
29
  shipit_restart:
30
30
  id: 3
31
31
  user: walrus
32
- since_commit_id: 2 # second
33
- until_commit_id: 2 # second
34
32
  type: Shipit::Task
35
33
  stack: shipit
36
34
  status: success
@@ -278,3 +276,68 @@ shipit_single:
278
276
  created_at: <%= (60 - 2).minutes.ago.to_s(:db) %>
279
277
  started_at: <%= (60 - 2).minutes.ago.to_s(:db) %>
280
278
  ended_at: <%= (60 - 4).minutes.ago.to_s(:db) %>
279
+
280
+ shipit_stats:
281
+ id: 401
282
+ user: walrus
283
+ since_commit_id: 601
284
+ until_commit_id: 601
285
+ type: Shipit::Deploy
286
+ stack: shipit_stats
287
+ status: success
288
+ additions: 12
289
+ deletions: 64
290
+ created_at: <%= 60.minutes.ago.to_s(:db) %>
291
+ started_at: <%= 60.minutes.ago.to_s(:db) %>
292
+ ended_at: <%= (60 - 4).minutes.ago.to_s(:db) %>
293
+
294
+ shipit_stats_2:
295
+ id: 402
296
+ user: walrus
297
+ since_commit_id: 602
298
+ until_commit_id: 603
299
+ type: Shipit::Deploy
300
+ stack: shipit_stats
301
+ status: failed
302
+ additions: 12
303
+ deletions: 64
304
+ created_at: <%= (60 - 5).minutes.ago.to_s(:db) %>
305
+ started_at: <%= (60 - 5).minutes.ago.to_s(:db) %>
306
+ ended_at: <%= (60 - 11).minutes.ago.to_s(:db) %>
307
+
308
+ shipit_stats_3:
309
+ id: 403
310
+ user: walrus
311
+ since_commit_id: 604
312
+ until_commit_id: 605
313
+ type: Shipit::Deploy
314
+ stack: shipit_stats
315
+ status: success
316
+ additions: 12
317
+ deletions: 64
318
+ created_at: <%= (60 - 10).minutes.ago.to_s(:db) %>
319
+ started_at: <%= (60 - 12).minutes.ago.to_s(:db) %>
320
+ ended_at: <%= (60 - 15).minutes.ago.to_s(:db) %>
321
+
322
+ shipit_stats_4:
323
+ id: 404
324
+ user: walrus
325
+ since_commit_id: 606
326
+ until_commit_id: 608
327
+ type: Shipit::Deploy
328
+ stack: shipit_stats
329
+ status: success
330
+ additions: 12
331
+ deletions: 64
332
+ created_at: <%= (30 - 15).minutes.ago.to_s(:db) %>
333
+ started_at: <%= (30 - 15).minutes.ago.to_s(:db) %>
334
+ ended_at: <%= (30 - 17).minutes.ago.to_s(:db) %>
335
+
336
+ shipit_nocommit_task:
337
+ id: 501
338
+ user: walrus
339
+ type: Shipit::Task
340
+ stack: shipit_task_no_commits
341
+ status: pending
342
+ created_at: <%= (60 - 2).minutes.ago.to_s(:db) %>
343
+ started_at: <%= (60 - 2).minutes.ago.to_s(:db) %>
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  trap('INT') do
4
5
  puts "Recieved SIGINT, aborting."
@@ -11,5 +12,5 @@ trap('TERM') do
11
12
  end
12
13
 
13
14
  puts "Sleeping for 10 seconds"
14
- sleep 10
15
+ sleep(10)
15
16
  puts "I wasn't killed? WTF"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module ApiHelper
2
3
  private
3
4
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module FixtureAliasesHelper
2
3
  def shipit_deploys(*args)
3
4
  shipit_tasks(*args)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module HooksHelper
2
3
  def expect_hook(event, stack = nil, payload = nil)
3
4
  spy_on_hook
@@ -24,7 +25,7 @@ module HooksHelper
24
25
  end
25
26
  matcher = args.map(&:inspect).join(', ')
26
27
  got = called&.args&.map(&:inspect)&.join(', ')
27
- refute called, "Expected no hook matching: (#{matcher})\n got: (#{got})"
28
+ refute(called, "Expected no hook matching: (#{matcher})\n got: (#{got})")
28
29
  end
29
30
 
30
31
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module JSONHelper
2
3
  UNDEFINED = Object.new.freeze
3
4
  private_constant :UNDEFINED
@@ -9,21 +10,24 @@ module JSONHelper
9
10
  elsif expected_value == UNDEFINED
10
11
  raise ArgumentError, "Missing either expected_value or a block"
11
12
  elsif expected_value.nil?
12
- assert_nil value
13
+ assert_nil(value)
13
14
  else
14
- assert_equal expected_value, value
15
+ assert_equal(expected_value, value)
15
16
  end
16
17
  end
17
18
 
18
19
  def assert_json_keys(path, keys = nil, document: response.body)
19
- keys, path = path, nil if keys.nil?
20
+ if keys.nil?
21
+ keys = path
22
+ path = nil
23
+ end
20
24
 
21
25
  value = follow_path(path.to_s.split('.'), document: document)
22
26
  case value
23
27
  when Hash
24
- assert_equal keys.sort, value.keys.sort
28
+ assert_equal(keys.sort, value.keys.sort)
25
29
  else
26
- assert false, "Expected #{path} to be a Hash, was: #{value.inspect}"
30
+ assert(false, "Expected #{path} to be a Hash, was: #{value.inspect}")
27
31
  end
28
32
  end
29
33
 
@@ -33,11 +37,11 @@ module JSONHelper
33
37
  leaf = follow_path(segments, document: document)
34
38
  case leaf
35
39
  when Hash
36
- refute leaf.key?(last_segment), "Expected #{leaf.inspect} not to include #{last_segment.inspect}"
40
+ refute(leaf.key?(last_segment), "Expected #{leaf.inspect} not to include #{last_segment.inspect}")
37
41
  when Array
38
- refute leaf.size > last_segment.to_i, "Expected #{leaf.inspect} to not have element at index #{last_segment.to_i}"
42
+ refute(leaf.size > last_segment.to_i, "Expected #{leaf.inspect} to not have element at index #{last_segment.to_i}")
39
43
  else
40
- assert false, "Expected #{leaf.inspect} to be a Hash or Array"
44
+ assert(false, "Expected #{leaf.inspect} to be a Hash or Array")
41
45
  end
42
46
  end
43
47
 
@@ -48,13 +52,13 @@ module JSONHelper
48
52
  segments.inject(parsed_json) do |object, key|
49
53
  case object
50
54
  when Hash
51
- assert_includes object, key
55
+ assert_includes(object, key)
52
56
  object[key]
53
57
  when Array
54
- assert object.size > key.to_i, "#{object.inspect} have no property #{key}"
58
+ assert(object.size > key.to_i, "#{object.inspect} have no property #{key}")
55
59
  object[key.to_i]
56
60
  else
57
- assert false, "Expected #{object.inspect} to be a Hash or Array"
61
+ assert(false, "Expected #{object.inspect} to be a Hash or Array")
58
62
  end
59
63
  end
60
64
  end