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,31 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
4
5
  class CommitDeploymentTest < ActiveSupport::TestCase
5
6
  setup do
6
7
  @deployment = shipit_commit_deployments(:shipit_pending_fourth)
7
- @commit = @deployment.commit
8
8
  @task = @deployment.task
9
9
  @stack = @task.stack
10
10
  @author = @deployment.author
11
11
  end
12
12
 
13
- test "there can only be one record per deploy and commit pair" do
14
- assert_raises ActiveRecord::RecordNotUnique do
15
- CommitDeployment.create!(task: @deployment.task, commit: @deployment.commit)
16
- end
17
- end
18
-
19
13
  test "creation on GitHub" do
20
- pull_request_response = stub(head: stub(sha: '6dcb09b5b57875f334f61aebed695e2e4193db5e'))
21
- @author.github_api.expects(:pull_request).with('shopify/shipit-engine', 7).returns(pull_request_response)
22
-
23
14
  deployment_response = stub(id: 42, url: 'https://example.com')
24
15
  @author.github_api.expects(:create_deployment).with(
25
16
  'shopify/shipit-engine',
26
- pull_request_response.head.sha,
17
+ @deployment.sha,
27
18
  auto_merge: false,
28
19
  required_contexts: [],
29
20
  description: "Via Shipit",
30
21
  environment: @stack.environment,
22
+ payload: {
23
+ shipit: {
24
+ task_id: 4,
25
+ from_sha: 'f890fd8b5f2be05d1fedb763a3605ee461c39074',
26
+ to_sha: '467578b362bf2b4df5903e1c7960929361c3435a',
27
+ },
28
+ }.to_json,
31
29
  ).returns(deployment_response)
32
30
 
33
31
  @deployment.create_on_github!
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -8,6 +9,12 @@ module Shipit
8
9
  @pr.message = "Merge pull request #31 from Shopify/improve-polling\n\nSeveral improvements to polling"
9
10
  @stack.reload
10
11
  @commit = shipit_commits(:first)
12
+
13
+ stub_request(:get, "https://api.github.com/user/emails").to_return(
14
+ status: %w(200 OK),
15
+ body: {}.to_json,
16
+ headers: { "Content-Type" => "application/json" },
17
+ )
11
18
  end
12
19
 
13
20
  test '.create_from_github handle unknown users' do
@@ -62,6 +69,39 @@ module Shipit
62
69
  refute_predicate commit, :revert?
63
70
  end
64
71
 
72
+ test '.create_from_github truncates long messages' do
73
+ message = 'ABCDEFGHIJ' * 7000
74
+
75
+ assert_difference -> { Commit.count }, +1 do
76
+ @stack.commits.create_from_github!(
77
+ resource(
78
+ sha: '2adaad1ad30c235d3a6e7981dfc1742f7ecb1e85',
79
+ author: {},
80
+ committer: {},
81
+ commit: {
82
+ author: {
83
+ name: 'Lando Walrussian',
84
+ email: 'walrus@shopify.com',
85
+ date: Time.now,
86
+ },
87
+ committer: {
88
+ name: 'Lando Walrussian',
89
+ email: 'walrus@shopify.com',
90
+ date: Time.now,
91
+ },
92
+ message: message,
93
+ },
94
+ ),
95
+ )
96
+ end
97
+
98
+ max_message_size = Shipit::Commit.columns_hash["message"].limit
99
+ commit = Commit.last
100
+
101
+ refute_predicate commit.message, :blank?
102
+ assert(commit.message.length <= Shipit::Commit.columns_hash["message"].limit) if max_message_size
103
+ end
104
+
65
105
  test '.create_from_github handle PRs merged by another Shipit stacks' do
66
106
  assert_difference -> { Commit.count }, +1 do
67
107
  @stack.commits.create_from_github!(
@@ -90,6 +130,46 @@ module Shipit
90
130
  assert_equal shipit_users(:walrus), commit.author
91
131
  end
92
132
 
133
+ test '.create_from_github stores pull_request_head_sha' do
134
+ assert_difference -> { Commit.count }, +1 do
135
+ @stack.commits.create_from_github!(
136
+ resource(
137
+ sha: '2adaad1ad30c235d3a6e7981dfc1742f7ecb1e85',
138
+ author: {},
139
+ committer: {},
140
+ commit: {
141
+ author: {
142
+ name: 'Shipit',
143
+ email: '',
144
+ date: Time.now,
145
+ },
146
+ committer: {
147
+ name: 'Shipit',
148
+ email: '',
149
+ date: Time.now,
150
+ },
151
+ message: "Merge pull request #62 from shipit-engine/yoloshipit\n\nyoloshipit!",
152
+ },
153
+ parents: [
154
+ { sha: "1864542e3d2f8a41916a2dec0f2b4d3c1bf4899b", url: '', html_url: '' },
155
+ { sha: "63d7e03e517fd2ae1caeb1b7a9f21767f84d671a", url: '', html_url: '' },
156
+ ],
157
+ ),
158
+ )
159
+ end
160
+
161
+ commit = Commit.last
162
+ assert_equal '63d7e03e517fd2ae1caeb1b7a9f21767f84d671a', commit.pull_request_head_sha
163
+ end
164
+
165
+ test "#message= truncates the message" do
166
+ skip unless Shipit::Commit.columns_hash['message'].limit
167
+ limit = Shipit::Commit.columns_hash['message'].limit
168
+
169
+ @commit.update!(message: 'a' * limit * 2)
170
+ assert_equal limit, @commit.message.bytesize
171
+ end
172
+
93
173
  test "#pull_request? detect pull request based on message format" do
94
174
  assert @pr.pull_request?
95
175
  refute @commit.pull_request?
@@ -137,7 +217,7 @@ module Shipit
137
217
 
138
218
  test "updating broadcasts an update event" do
139
219
  expect_event(@stack)
140
- @commit.update_attributes(message: "toto")
220
+ @commit.update(message: "toto")
141
221
  end
142
222
 
143
223
  test "updating state to success triggers new deploy when stack has continuous deployment" do
@@ -184,12 +264,14 @@ module Shipit
184
264
  committed_at: Time.now,
185
265
  )
186
266
 
187
- @stack.deploys.create!(
267
+ deploy = @stack.deploys.build(
188
268
  user_id: walrus.id,
189
269
  since_commit: @stack.commits.first,
190
270
  until_commit: new_commit,
191
271
  status: 'success',
192
272
  )
273
+ deploy.stubs(:pull_request_head_for_commit).returns(nil)
274
+ deploy.save!
193
275
 
194
276
  assert_no_difference "Deploy.count" do
195
277
  @commit.statuses.create!(stack_id: @stack.id, state: 'success')
@@ -242,7 +324,7 @@ module Shipit
242
324
  target_url: 'http://example.com',
243
325
  created_at: 1.day.ago,
244
326
  )
245
- Shipit.github.api.expects(:statuses).with(@stack.github_repo_name, @commit.sha).returns([status])
327
+ Shipit.github.api.expects(:statuses).with(@stack.github_repo_name, @commit.sha, per_page: 100).returns([status])
246
328
  assert_difference '@commit.statuses.count', 1 do
247
329
  @commit.refresh_statuses!
248
330
  end
@@ -379,10 +461,10 @@ module Shipit
379
461
  commit = shipit_commits(:second)
380
462
  assert_predicate commit.status, :group?
381
463
  assert_equal 3, commit.status.size
382
- commit.stack.update!(cached_deploy_spec: DeploySpec.new('ci' => {'hide' => [
464
+ commit.stack.update!(cached_deploy_spec: DeploySpec.new('ci' => { 'hide' => [
383
465
  'Travis CI',
384
466
  'metrics/coveralls',
385
- ]}))
467
+ ] }))
386
468
  commit.reload
387
469
  refute_predicate commit.status, :group?
388
470
  end
@@ -512,7 +594,7 @@ module Shipit
512
594
  'error' => %w(success),
513
595
  }
514
596
  expected_webhook_transitions.each do |initial_state, firing_states|
515
- initial_status_attributes = {state: initial_state, description: 'abc', context: 'ci/travis'}
597
+ initial_status_attributes = { state: initial_state, description: 'abc', context: 'ci/travis' }
516
598
  (expected_webhook_transitions.keys - %w(unknown)).each do |new_state|
517
599
  should_fire = firing_states.include?(new_state)
518
600
  action = should_fire ? 'fires' : 'does not fire'
@@ -531,7 +613,7 @@ module Shipit
531
613
  end
532
614
  assert_equal initial_state, commit.state
533
615
 
534
- expected_status_attributes = {state: new_state, description: initial_state, context: 'ci/travis'}
616
+ expected_status_attributes = { state: new_state, description: initial_state, context: 'ci/travis' }
535
617
  add_status = lambda do
536
618
  attrs = expected_status_attributes.merge(created_at: 1.day.ago.to_s(:db))
537
619
  commit.create_status_from_github!(OpenStruct.new(attrs))
@@ -767,6 +849,16 @@ module Shipit
767
849
  assert_equal commit.deploy_requested_at, commit.created_at
768
850
  end
769
851
 
852
+ test "#recently_pushed?" do
853
+ freeze_time do
854
+ commit = Commit.new(message: "abcd", created_at: Time.now.utc)
855
+ assert_predicate commit, :recently_pushed?
856
+
857
+ commit = Commit.new(message: "abcd", created_at: 10.minutes.ago)
858
+ refute_predicate commit, :recently_pushed?
859
+ end
860
+ end
861
+
770
862
  private
771
863
 
772
864
  def expect_event(stack)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -23,8 +24,8 @@ module Shipit
23
24
  end
24
25
 
25
26
  test "#send! post the payload and update the status to `sent`" do
26
- headers = {'content-type' => 'text/plain', 'content-length' => '2'}
27
- FakeWeb.register_uri(:post, @delivery.url, headers.merge(body: 'OK'))
27
+ headers = { 'content-type' => 'text/plain', 'content-length' => '2' }
28
+ stub_request(:post, @delivery.url).to_return(headers: headers, body: 'OK')
28
29
 
29
30
  assert_equal 'scheduled', @delivery.status
30
31
  @delivery.send!
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -22,7 +23,7 @@ module Shipit
22
23
  end
23
24
 
24
25
  test '#supports_rollback? returns true if steps are defined' do
25
- @spec.stubs(:load_config).returns('rollback' => {'override' => ['rm -rf /usr /lib/nvidia-current/xorg/xorg']})
26
+ @spec.stubs(:load_config).returns('rollback' => { 'override' => ['rm -rf /usr /lib/nvidia-current/xorg/xorg'] })
26
27
  assert @spec.supports_rollback?
27
28
  end
28
29
 
@@ -32,7 +33,7 @@ module Shipit
32
33
  end
33
34
 
34
35
  test '#dependencies_steps returns `dependencies.override` if present' do
35
- @spec.stubs(:load_config).returns('dependencies' => {'override' => %w(foo bar baz)})
36
+ @spec.stubs(:load_config).returns('dependencies' => { 'override' => %w(foo bar baz) })
36
37
  assert_equal %w(foo bar baz), @spec.dependencies_steps
37
38
  end
38
39
 
@@ -43,7 +44,7 @@ module Shipit
43
44
  end
44
45
 
45
46
  test "#dependencies_steps prepend and append pre and post steps" do
46
- @spec.stubs(:load_config).returns('dependencies' => {'pre' => ['before'], 'post' => ['after']})
47
+ @spec.stubs(:load_config).returns('dependencies' => { 'pre' => ['before'], 'post' => ['after'] })
47
48
  @spec.expects(:bundler?).returns(true).at_least_once
48
49
  @spec.expects(:bundle_install).returns(['bundle install'])
49
50
  assert_equal ['before', 'bundle install', 'after'], @spec.dependencies_steps
@@ -75,7 +76,7 @@ module Shipit
75
76
 
76
77
  test '#bundle_install use `dependencies.bundler.without` if present to build the --without argument' do
77
78
  @spec.stubs(:gemfile_lock_exists?).returns(true)
78
- @spec.stubs(:load_config).returns('dependencies' => {'bundler' => {'without' => %w(some custom groups)}})
79
+ @spec.stubs(:load_config).returns('dependencies' => { 'bundler' => { 'without' => %w(some custom groups) } })
79
80
  command = %(
80
81
  bundle install
81
82
  --frozen
@@ -88,25 +89,25 @@ module Shipit
88
89
  end
89
90
 
90
91
  test '#bundle_install has --frozen option if Gemfile.lock is present' do
91
- @spec.stubs(:load_config).returns('dependencies' => {'bundler' => {'without' => %w(some custom groups)}})
92
+ @spec.stubs(:load_config).returns('dependencies' => { 'bundler' => { 'without' => %w(some custom groups) } })
92
93
  @spec.stubs(:gemfile_lock_exists?).returns(true)
93
94
  assert @spec.bundle_install.last.include?('--frozen')
94
95
  end
95
96
 
96
97
  test '#bundle_install does not have --frozen option if Gemfile.lock is not present' do
97
- @spec.stubs(:load_config).returns('dependencies' => {'bundler' => {'without' => %w(some custom groups)}})
98
+ @spec.stubs(:load_config).returns('dependencies' => { 'bundler' => { 'without' => %w(some custom groups) } })
98
99
  @spec.stubs(:gemfile_lock_exists?).returns(false)
99
100
  refute @spec.bundle_install.last.include?('--frozen')
100
101
  end
101
102
 
102
103
  test '#bundle_install does not have --frozen if overridden in shipit.yml' do
103
- @spec.stubs(:load_config).returns('dependencies' => {'bundler' => {'frozen' => false}})
104
+ @spec.stubs(:load_config).returns('dependencies' => { 'bundler' => { 'frozen' => false } })
104
105
  @spec.stubs(:gemfile_lock_exists?).returns(true)
105
106
  refute @spec.bundle_install.last.include?('--frozen')
106
107
  end
107
108
 
108
109
  test '#deploy_steps returns `deploy.override` if present' do
109
- @spec.stubs(:load_config).returns('deploy' => {'override' => %w(foo bar baz)})
110
+ @spec.stubs(:load_config).returns('deploy' => { 'override' => %w(foo bar baz) })
110
111
  assert_equal %w(foo bar baz), @spec.deploy_steps
111
112
  end
112
113
 
@@ -161,7 +162,7 @@ module Shipit
161
162
  end
162
163
 
163
164
  test "#deploy_steps prepend and append pre and post steps" do
164
- @spec.stubs(:load_config).returns('deploy' => {'pre' => ['before'], 'post' => ['after']})
165
+ @spec.stubs(:load_config).returns('deploy' => { 'pre' => ['before'], 'post' => ['after'] })
165
166
  @spec.expects(:bundler?).returns(true).at_least_once
166
167
  @spec.expects(:capistrano?).returns(true)
167
168
  assert_equal ['before', 'bundle exec cap $ENVIRONMENT deploy', 'after'], @spec.deploy_steps
@@ -175,7 +176,7 @@ module Shipit
175
176
  end
176
177
 
177
178
  test '#rollback_steps returns `rollback.override` if present' do
178
- @spec.stubs(:load_config).returns('rollback' => {'override' => %w(foo bar baz)})
179
+ @spec.stubs(:load_config).returns('rollback' => { 'override' => %w(foo bar baz) })
179
180
  assert_equal %w(foo bar baz), @spec.rollback_steps
180
181
  end
181
182
 
@@ -186,7 +187,7 @@ module Shipit
186
187
  end
187
188
 
188
189
  test "#rollback_steps prepend and append pre and post steps" do
189
- @spec.stubs(:load_config).returns('rollback' => {'pre' => ['before'], 'post' => ['after']})
190
+ @spec.stubs(:load_config).returns('rollback' => { 'pre' => ['before'], 'post' => ['after'] })
190
191
  @spec.expects(:bundler?).returns(true).at_least_once
191
192
  @spec.expects(:capistrano?).returns(true)
192
193
  assert_equal ['before', 'bundle exec cap $ENVIRONMENT deploy:rollback', 'after'], @spec.rollback_steps
@@ -255,14 +256,14 @@ module Shipit
255
256
  end
256
257
 
257
258
  test '#machine_env returns an environment hash' do
258
- @spec.stubs(:load_config).returns('machine' => {'environment' => {'GLOBAL' => '1'}})
259
- assert_equal({'GLOBAL' => '1'}, @spec.machine_env)
259
+ @spec.stubs(:load_config).returns('machine' => { 'environment' => { 'GLOBAL' => '1' } })
260
+ assert_equal({ 'GLOBAL' => '1' }, @spec.machine_env)
260
261
  end
261
262
 
262
263
  test '#load_config can grab the env-specific shipit.yml file' do
263
264
  config = {}
264
265
  config.expects(:exist?).returns(true)
265
- config.expects(:read).returns({'dependencies' => {'override' => %w(foo bar baz)}}.to_yaml)
266
+ config.expects(:read).returns({ 'dependencies' => { 'override' => %w(foo bar baz) } }.to_yaml)
266
267
  spec = DeploySpec::FileSystem.new('.', 'staging')
267
268
  spec.expects(:file).with('shipit.staging.yml', root: true).returns(config)
268
269
  assert_equal %w(foo bar baz), spec.dependencies_steps
@@ -274,7 +275,7 @@ module Shipit
274
275
 
275
276
  config = {}
276
277
  config.expects(:exist?).returns(true)
277
- config.expects(:read).returns({'dependencies' => {'override' => %w(foo bar baz)}}.to_yaml)
278
+ config.expects(:read).returns({ 'dependencies' => { 'override' => %w(foo bar baz) } }.to_yaml)
278
279
 
279
280
  spec = DeploySpec::FileSystem.new('.', 'staging')
280
281
  spec.expects(:file).with('shipit.staging.yml', root: true).returns(not_config)
@@ -352,16 +353,16 @@ module Shipit
352
353
  'blocking' => [],
353
354
  },
354
355
  'machine' => {
355
- 'environment' => {'BUNDLE_PATH' => @spec.bundle_path.to_s},
356
+ 'environment' => { 'BUNDLE_PATH' => @spec.bundle_path.to_s },
356
357
  'directory' => nil,
357
358
  'cleanup' => true,
358
359
  },
359
- 'review' => {'checklist' => [], 'monitoring' => [], 'checks' => []},
360
+ 'review' => { 'checklist' => [], 'monitoring' => [], 'checks' => [] },
360
361
  'status' => {
361
362
  'context' => nil,
362
363
  'delay' => 0,
363
364
  },
364
- 'dependencies' => {'override' => []},
365
+ 'dependencies' => { 'override' => [] },
365
366
  'plugins' => {},
366
367
  'deploy' => {
367
368
  'override' => nil,
@@ -369,7 +370,7 @@ module Shipit
369
370
  'max_commits' => 8,
370
371
  'interval' => 0,
371
372
  },
372
- 'rollback' => {'override' => nil},
373
+ 'rollback' => { 'override' => nil },
373
374
  'fetch' => nil,
374
375
  'tasks' => {},
375
376
  }
@@ -381,11 +382,11 @@ module Shipit
381
382
  end
382
383
 
383
384
  test "#deploy_variables returns an array of VariableDefinition instances" do
384
- @spec.stubs(:load_config).returns('deploy' => {'variables' => [{
385
+ @spec.stubs(:load_config).returns('deploy' => { 'variables' => [{
385
386
  'name' => 'SAFETY_DISABLED',
386
387
  'title' => 'Set to 1 to do dangerous things',
387
388
  'default' => 0,
388
- }]})
389
+ }] })
389
390
 
390
391
  assert_equal 1, @spec.deploy_variables.size
391
392
  variable_definition = @spec.deploy_variables.first
@@ -393,13 +394,13 @@ module Shipit
393
394
  end
394
395
 
395
396
  test "task definitions don't prepend bundle exec by default" do
396
- @spec.expects(:load_config).returns('tasks' => {'restart' => {'steps' => %w(foo)}})
397
+ @spec.expects(:load_config).returns('tasks' => { 'restart' => { 'steps' => %w(foo) } })
397
398
  definition = @spec.find_task_definition('restart')
398
399
  assert_equal ['foo'], definition.steps
399
400
  end
400
401
 
401
402
  test "task definitions don't bundle exec before serialization" do
402
- @spec.expects(:discover_task_definitions).returns('restart' => {'steps' => %w(foo)})
403
+ @spec.expects(:discover_task_definitions).returns('restart' => { 'steps' => %w(foo) })
403
404
  @spec.expects(:bundler?).returns(true).at_least_once
404
405
 
405
406
  cached_spec = DeploySpec.load(DeploySpec.dump(@spec))
@@ -418,18 +419,18 @@ module Shipit
418
419
  module TestTaskDiscovery
419
420
  def discover_task_definitions
420
421
  {
421
- 'config_task' => {'steps' => %w(bar)},
422
+ 'config_task' => { 'steps' => %w(bar) },
422
423
  }.merge!(super)
423
424
  end
424
425
  end
425
426
 
426
427
  # Include the module in our new test class
427
- DuplicateCustomizedDeploySpec.include TestTaskDiscovery
428
+ DuplicateCustomizedDeploySpec.include(TestTaskDiscovery)
428
429
 
429
430
  # Setup the spec as we would normally, but use the customized version
430
431
  @spec = DuplicateCustomizedDeploySpec.new(@app_dir, 'env')
431
432
  @spec.stubs(:load_config).returns(
432
- 'tasks' => {'config_task' => {'steps' => %w(foo)}},
433
+ 'tasks' => { 'config_task' => { 'steps' => %w(foo) } },
433
434
  )
434
435
  tasks = @spec.task_definitions
435
436
 
@@ -448,18 +449,18 @@ module Shipit
448
449
  module TestTaskDiscovery
449
450
  def discover_task_definitions
450
451
  {
451
- 'module_task' => {'steps' => %w(bar)},
452
+ 'module_task' => { 'steps' => %w(bar) },
452
453
  }.merge(super)
453
454
  end
454
455
  end
455
456
 
456
457
  # Include the module in our new test class
457
- CustomizedDeploySpec.include TestTaskDiscovery
458
+ CustomizedDeploySpec.include(TestTaskDiscovery)
458
459
 
459
460
  # Setup the spec as we would normally, but use the customized version
460
461
  @spec = CustomizedDeploySpec.new(@app_dir, 'env')
461
462
  @spec.stubs(:load_config).returns(
462
- 'tasks' => {'config_task' => {'steps' => %w(foo)}},
463
+ 'tasks' => { 'config_task' => { 'steps' => %w(foo) } },
463
464
  'kubernetes' => {
464
465
  'namespace' => 'foo',
465
466
  'context' => 'bar',
@@ -484,7 +485,7 @@ module Shipit
484
485
 
485
486
  test "task definitions returns an array of VariableDefinition instances" do
486
487
  @spec.expects(:load_config).returns('tasks' =>
487
- {'restart' =>
488
+ { 'restart' =>
488
489
  {
489
490
  'variables' => [
490
491
  {
@@ -499,8 +500,7 @@ module Shipit
499
500
  },
500
501
  ],
501
502
  'steps' => %w(foo),
502
- },
503
- })
503
+ } })
504
504
 
505
505
  assert_equal 2, @spec.task_definitions.first.variables.size
506
506
  variable_definition = @spec.task_definitions.first.variables.first
@@ -512,7 +512,7 @@ module Shipit
512
512
  end
513
513
 
514
514
  test "#review_checklist returns an array" do
515
- @spec.expects(:load_config).returns('review' => {'checklist' => %w(foo bar)})
515
+ @spec.expects(:load_config).returns('review' => { 'checklist' => %w(foo bar) })
516
516
  assert_equal %w(foo bar), @spec.review_checklist
517
517
  end
518
518
 
@@ -521,13 +521,13 @@ module Shipit
521
521
  end
522
522
 
523
523
  test "#review_monitoring returns an array of hashes" do
524
- @spec.expects(:load_config).returns('review' => {'monitoring' => [
525
- {'image' => 'http://example.com/foo.png', 'width' => 200, 'height' => 400},
526
- {'iframe' => 'http://example.com/', 'width' => 200, 'height' => 400},
527
- ]})
524
+ @spec.expects(:load_config).returns('review' => { 'monitoring' => [
525
+ { 'image' => 'http://example.com/foo.png', 'width' => 200, 'height' => 400 },
526
+ { 'iframe' => 'http://example.com/', 'width' => 200, 'height' => 400 },
527
+ ] })
528
528
  assert_equal [
529
- {'image' => 'http://example.com/foo.png', 'width' => 200, 'height' => 400},
530
- {'iframe' => 'http://example.com/', 'width' => 200, 'height' => 400},
529
+ { 'image' => 'http://example.com/foo.png', 'width' => 200, 'height' => 400 },
530
+ { 'iframe' => 'http://example.com/', 'width' => 200, 'height' => 400 },
531
531
  ], @spec.review_monitoring
532
532
  end
533
533
 
@@ -540,12 +540,12 @@ module Shipit
540
540
  end
541
541
 
542
542
  test "#hidden_statuses is an array even if the value is a string" do
543
- @spec.expects(:load_config).returns('ci' => {'hide' => 'ci/circleci'})
543
+ @spec.expects(:load_config).returns('ci' => { 'hide' => 'ci/circleci' })
544
544
  assert_equal %w(ci/circleci), @spec.hidden_statuses
545
545
  end
546
546
 
547
547
  test "#hidden_statuses is an array even if the value is present" do
548
- @spec.expects(:load_config).returns('ci' => {'hide' => %w(ci/circleci ci/jenkins)})
548
+ @spec.expects(:load_config).returns('ci' => { 'hide' => %w(ci/circleci ci/jenkins) })
549
549
  assert_equal %w(ci/circleci ci/jenkins), @spec.hidden_statuses
550
550
  end
551
551
 
@@ -677,7 +677,7 @@ module Shipit
677
677
 
678
678
  test "#file is impacted by `machine.directory`" do
679
679
  subdir = '/foo/bar'
680
- @spec.stubs(:load_config).returns('machine' => {'directory' => subdir})
680
+ @spec.stubs(:load_config).returns('machine' => { 'directory' => subdir })
681
681
  assert_instance_of Pathname, @spec.file('baz')
682
682
  assert_equal File.join(@app_dir, subdir, 'baz'), @spec.file('baz').to_s
683
683
  end
@@ -1084,5 +1084,10 @@ module Shipit
1084
1084
  )
1085
1085
  assert_nil @spec.max_divergence_age
1086
1086
  end
1087
+
1088
+ test "serialised deploy specs are normalised" do
1089
+ stack = shipit_stacks(:shipit)
1090
+ assert_equal stack.cached_deploy_spec_before_type_cast, DeploySpec.dump(stack.cached_deploy_spec)
1091
+ end
1087
1092
  end
1088
1093
  end