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,13 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  module LinksHelper
2
3
  LINKS_PATTERN = /\<(.*?)\>; rel="(\w+)"/
3
4
 
4
5
  def assert_link(rel, url)
5
- assert_includes response_links, rel
6
- assert_equal url, response_links[rel], %(rel="#{rel}" is incorrect)
6
+ assert_includes(response_links, rel)
7
+ assert_equal(url, response_links[rel], %(rel="#{rel}" is incorrect))
7
8
  end
8
9
 
9
10
  def assert_no_link(rel)
10
- assert_nil response_links[rel], %(expected rel="#{rel}" to be nil)
11
+ assert_nil(response_links[rel], %(expected rel="#{rel}" to be nil))
11
12
  end
12
13
 
13
14
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module PayloadsHelper
2
3
  def payload(name)
3
4
  Shipit::Engine.root.join('test/fixtures/payloads', "#{name}.json").read
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module QueriesHelper
2
3
  def assert_no_queries(ignored_sql = nil, &block)
3
4
  assert_queries(0, ignored_sql, &block)
@@ -8,7 +9,7 @@ module QueriesHelper
8
9
  subscriber = ActiveSupport::Notifications.subscribe('sql.active_record', counter)
9
10
  yield counter
10
11
  queries = counter.log.empty? ? '' : "\nQueries:\n#{counter.log.join("\n")}"
11
- assert_equal num, counter.log.size, "#{counter.log.size} instead of #{num} queries were executed.#{queries}"
12
+ assert_equal(num, counter.log.size, "#{counter.log.size} instead of #{num} queries were executed.#{queries}")
12
13
  ensure
13
14
  ActiveSupport::Notifications.unsubscribe(subscriber)
14
15
  end
@@ -35,7 +36,7 @@ module QueriesHelper
35
36
 
36
37
  # FIXME: this needs to be refactored so specific database can add their own
37
38
  # ignored SQL. This ignored SQL is for Oracle.
38
- ignored_sql.concat [/^select .*nextval/i, /^SAVEPOINT/, /^ROLLBACK TO/, /^\s*select .* from all_triggers/im]
39
+ ignored_sql.concat([/^select .*nextval/i, /^SAVEPOINT/, /^ROLLBACK TO/, /^\s*select .* from all_triggers/im])
39
40
 
40
41
  attr_reader :ignore
41
42
  attr_reader :log
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -9,7 +10,7 @@ module Shipit
9
10
  end
10
11
 
11
12
  test "#perform checkout the repository to the last recorded commit and cache the deploy spec" do
12
- @stack.update!(cached_deploy_spec: DeploySpec.new('review' => {'checklist' => %w(foo bar)}))
13
+ @stack.update!(cached_deploy_spec: DeploySpec.new('review' => { 'checklist' => %w(foo bar) }))
13
14
 
14
15
  dir = Pathname(Dir.tmpdir)
15
16
  StackCommands.any_instance.expects(:with_temporary_working_directory).with(commit: @last_commit).yields(dir)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -8,7 +9,7 @@ module Shipit
8
9
  end
9
10
 
10
11
  test "#perform delivers a delivery" do
11
- FakeWeb.register_uri(:post, @delivery.url, body: 'OK')
12
+ stub_request(:post, @delivery.url).to_return(body: 'OK')
12
13
  @job.perform(@delivery)
13
14
  assert_equal 'sent', @delivery.reload.status
14
15
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -14,5 +15,14 @@ module Shipit
14
15
  @job.perform(@stack)
15
16
  end
16
17
  end
18
+
19
+ test "perform destroys the CommitDeployments of the received stack" do
20
+ stack = shipit_stacks(:shipit)
21
+ Shipit.legacy_github_api.stubs(:remove_hook)
22
+
23
+ assert_changes -> { CommitDeployment.count }, 'CommitDeployments not deleted' do
24
+ @job.perform(stack)
25
+ end
26
+ end
17
27
  end
18
28
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -9,7 +10,7 @@ module Shipit
9
10
 
10
11
  test "#perform schedule deliveries" do
11
12
  assert_enqueued_jobs(2, only: DeliverHookJob) do
12
- @job.perform(event: :deploy, stack_id: @stack.id, payload: {foo: 42}.to_json)
13
+ @job.perform(event: :deploy, stack_id: @stack.id, payload: { foo: 42 }.to_json)
13
14
  end
14
15
  end
15
16
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -17,15 +18,15 @@ module Shipit
17
18
 
18
19
  test "#perform rejects unmergeable PRs and merge the others" do
19
20
  PullRequest.any_instance.stubs(:refresh!)
20
- FakeWeb.register_uri(:put, "#{@pending_pr.api_url}/merge", status: %w(200 OK), body: {
21
+ stub_request(:put, "#{@pending_pr.api_url}/merge").to_return(status: %w(200 OK), body: {
21
22
  sha: "6dcb09b5b57875f334f61aebed695e2e4193db5e",
22
23
  merged: true,
23
24
  message: "Pull Request successfully merged",
24
25
  }.to_json)
25
26
  branch_url = "https://api.github.com/repos/shopify/shipit-engine/git/refs/heads/feature-62"
26
- FakeWeb.register_uri(:delete, branch_url, status: %w(204 No content))
27
+ stub_request(:delete, branch_url).to_return(status: %w(204 No content))
27
28
  pulls_url = "https://api.github.com/repos/shopify/shipit-engine/pulls?base=feature-62"
28
- FakeWeb.register_uri(:get, pulls_url, status: %w(200 OK), body: '[]')
29
+ stub_request(:get, pulls_url).to_return(status: %w(200 OK), body: '[]')
29
30
 
30
31
  @job.perform(@stack)
31
32
 
@@ -35,7 +36,7 @@ module Shipit
35
36
 
36
37
  test "#perform rejects PRs if the merge attempt fails" do
37
38
  PullRequest.any_instance.stubs(:refresh!)
38
- FakeWeb.register_uri(:put, "#{@pending_pr.api_url}/merge", status: %w(405 Method not allowed), body: {
39
+ stub_request(:put, "#{@pending_pr.api_url}/merge").to_return(status: %w(405 Method not allowed), body: {
39
40
  message: "Pull Request is not mergeable",
40
41
  documentation_url: "https://developer.github.com/v3/pulls/#merge-a-pull-request-merge-button",
41
42
  }.to_json)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -20,7 +21,7 @@ module Shipit
20
21
  test "#perform fetch commits from the API" do
21
22
  @job.stubs(:capture!)
22
23
  @job.stubs(:capture)
23
- @commands = stub(:commands)
24
+ @commands = stub
24
25
  Commands.expects(:for).with(@deploy).returns(@commands)
25
26
 
26
27
  @commands.expects(:fetched?).once.returns(FakeSuccessfulCommand.new)
@@ -132,7 +133,7 @@ module Shipit
132
133
 
133
134
  @job.perform(@deploy)
134
135
 
135
- assert_equal 'timedout', @deploy.reload.status
136
+ assert_equal('timedout', @deploy.reload.status)
136
137
  ensure
137
138
  Shipit.timeout_exit_codes = previous_exit_codes
138
139
  end
@@ -140,7 +141,7 @@ module Shipit
140
141
 
141
142
  test "records stack support for rollbacks and fetching deployed revision" do
142
143
  @job.stubs(:capture!)
143
- @commands = stub(:commands)
144
+ @commands = stub
144
145
  @commands.stubs(:fetched?).returns([])
145
146
  @commands.stubs(:fetch).returns([])
146
147
  @commands.stubs(:clone).returns([])
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -0,0 +1,68 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class ReapDeadTasksJobTest < ActiveSupport::TestCase
6
+ setup do
7
+ Task.where(status: Task::ACTIVE_STATUSES).update_all(status: 'success')
8
+
9
+ not_recently = Shipit::Task.recently_created_at - 1.minute
10
+ @deploy = shipit_deploys(:shipit)
11
+ @deploy.status = 'success'
12
+ @deploy.created_at = not_recently
13
+ @deploy.save!
14
+
15
+ @rollback = @deploy.build_rollback
16
+ @rollback.status = 'running'
17
+ @rollback.created_at = not_recently
18
+ @rollback.save!
19
+
20
+ @zombie_deploy = shipit_deploys(:shipit2)
21
+ @zombie_deploy.status = 'running'
22
+ @zombie_deploy.created_at = not_recently
23
+ @zombie_deploy.save!
24
+ end
25
+
26
+ test 'reaps only zombie tasks' do
27
+ refute_predicate @zombie_deploy, :error?
28
+
29
+ Shipit::Deploy.any_instance.expects(:alive?).returns(false)
30
+ Shipit::Rollback.any_instance.expects(:alive?).returns(true)
31
+ ReapDeadTasksJob.perform_now
32
+
33
+ @zombie_deploy.reload
34
+ assert_predicate @zombie_deploy, :error?
35
+
36
+ @deploy.reload
37
+ assert_predicate @deploy, :finished?
38
+
39
+ @rollback.reload
40
+ assert_predicate @rollback, :running?
41
+ end
42
+
43
+ test "does reap recently created tasks" do
44
+ Task.where(status: Task::ACTIVE_STATUSES).update_all(status: 'success')
45
+ recently = Time.current
46
+ @deploy = shipit_deploys(:shipit)
47
+ @deploy.created_at = recently
48
+ @deploy.status = 'running'
49
+ @deploy.save!
50
+ Shipit::Deploy.any_instance.expects(:alive?).never
51
+
52
+ ReapDeadTasksJob.perform_now
53
+
54
+ @deploy.reload
55
+ assert_predicate @deploy, :running?
56
+ end
57
+
58
+ test 'reaps zombie aborting tasks' do
59
+ deploy = shipit_deploys(:shipit2)
60
+ deploy.status = 'aborting'
61
+ deploy.save!
62
+
63
+ ReapDeadTasksJob.perform_now
64
+
65
+ assert_predicate deploy.reload, :error?
66
+ end
67
+ end
68
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -8,22 +9,23 @@ module Shipit
8
9
  @deploy = @stack.deploys.last
9
10
  @commit = @deploy.until_commit
10
11
  @api_client = Shipit.github.api
11
- @expected_ref_prefix = "shipit-deploy/#{@stack.environment}"
12
12
  @expected_name = @stack.github_repo_name
13
13
  @expected_sha = @commit.sha
14
14
 
15
- expected_ref = ["refs", @expected_ref_prefix].join('/')
16
- ref_url = "http://api.github.test.com/shopify/shipit-engine/git/#{expected_ref}"
15
+ expected_ref_suffix = "shipit-deploy/#{@stack.environment}"
16
+ @expected_ref = ["heads", expected_ref_suffix].join('/')
17
+
18
+ ref_url = "http://api.github.test.com/shopify/shipit-engine/git/#{@expected_ref}"
17
19
  commit_url = "https://api.github.test.com/repos/shopify/shipit-engine/git/commits/#{@commit.sha}"
18
20
  response_inner_obj = OpenStruct.new(sha: @commit.sha, type: "commit", url: commit_url)
19
- @response = OpenStruct.new(ref: expected_ref, node_id: "blah", url: ref_url, object: response_inner_obj)
21
+ @response = OpenStruct.new(ref: @expected_ref, node_id: "blah", url: ref_url, object: response_inner_obj)
20
22
  end
21
23
 
22
24
  test "#perform will create a ref when one is not present" do
23
25
  Octokit::UnprocessableEntity.any_instance.stubs(:build_error_message).returns("Reference does not exist")
24
26
 
25
- @api_client.expects(:update_ref).with(@expected_name, @expected_ref_prefix, @expected_sha).raises(Octokit::UnprocessableEntity)
26
- @api_client.expects(:create_ref).with(@expected_name, @expected_ref_prefix, @expected_sha).returns(@response)
27
+ @api_client.expects(:update_ref).with(@expected_name, @expected_ref, @expected_sha).raises(Octokit::UnprocessableEntity)
28
+ @api_client.expects(:create_ref).with(@expected_name, @expected_ref, @expected_sha).returns(@response)
27
29
 
28
30
  result = @job.perform(@stack)
29
31
 
@@ -38,7 +40,7 @@ module Shipit
38
40
  @commit.sha = new_sha
39
41
  @commit.save
40
42
 
41
- @api_client.expects(:update_ref).with(@expected_name, @expected_ref_prefix, new_sha).returns(@response)
43
+ @api_client.expects(:update_ref).with(@expected_name, @expected_ref, new_sha).returns(@response)
42
44
 
43
45
  result = @job.perform(@stack)
44
46
 
@@ -48,8 +50,8 @@ module Shipit
48
50
  test '#perform will raise an exception for non ref existence errors' do
49
51
  Octokit::UnprocessableEntity.any_instance.stubs(:build_error_message).returns("Some other error.")
50
52
 
51
- @api_client.expects(:update_ref).with(@expected_name, @expected_ref_prefix, @expected_sha).raises(Octokit::UnprocessableEntity)
52
- @api_client.expects(:create_ref).with(@expected_name, @expected_ref_prefix, @expected_sha).never
53
+ @api_client.expects(:update_ref).with(@expected_name, @expected_ref, @expected_sha).raises(Octokit::UnprocessableEntity)
54
+ @api_client.expects(:create_ref).with(@expected_name, @expected_ref, @expected_sha).never
53
55
 
54
56
  assert_raises Octokit::UnprocessableEntity do
55
57
  @job.perform(@stack)
@@ -72,7 +74,7 @@ module Shipit
72
74
  new_deploy.status = "faulty"
73
75
  new_deploy.save
74
76
 
75
- @api_client.expects(:update_ref).with(@expected_name, @expected_ref_prefix, new_sha).returns(@response)
77
+ @api_client.expects(:update_ref).with(@expected_name, @expected_ref, new_sha).returns(@response)
76
78
  result = @job.perform(@stack)
77
79
 
78
80
  assert_equal @response, result
@@ -81,7 +83,7 @@ module Shipit
81
83
  new_deploy.status = "success"
82
84
  new_deploy.save
83
85
 
84
- @api_client.expects(:update_ref).with(@expected_name, @expected_ref_prefix, new_commit.sha).returns(@response)
86
+ @api_client.expects(:update_ref).with(@expected_name, @expected_ref, new_commit.sha).returns(@response)
85
87
  @job.perform(@stack)
86
88
  end
87
89
  end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+ require 'test_helper'
3
+
4
+ module Shipit
5
+ class SameSiteCookieMiddlewareTest < ActiveSupport::TestCase
6
+ def app
7
+ Rack::Lint.new(lambda { |_env|
8
+ response = Rack::Response.new("", 200, "Content-Type" => "text/yaml")
9
+
10
+ response.set_cookie("session_test", value: "session_test", domain: ".test.com", path: "/")
11
+ response.set_cookie("another_cookie", value: "123abc", domain: ".test.com", path: "/")
12
+ response.finish
13
+ })
14
+ end
15
+
16
+ def env_for_url(url)
17
+ env = Rack::MockRequest.env_for(url)
18
+ env
19
+ end
20
+
21
+ def middleware
22
+ Shipit::SameSiteCookieMiddleware.new(app)
23
+ end
24
+
25
+ test 'SameSite cookie attributes should be added on SSL' do
26
+ env = env_for_url("https://test.com/")
27
+
28
+ _status, headers, _body = middleware.call(env)
29
+
30
+ assert_includes headers['Set-Cookie'], 'SameSite'
31
+ end
32
+
33
+ test 'SameSite cookie attributes should be added when multiple cookies are present' do
34
+ env = env_for_url("https://test.com/")
35
+
36
+ _status, headers, _body = middleware.call(env)
37
+
38
+ session_cookie, other_cookie = headers['Set-Cookie'].split("\n")
39
+
40
+ assert_includes session_cookie, 'SameSite'
41
+ assert_includes other_cookie, 'SameSite'
42
+ end
43
+
44
+ test 'SameSite cookie attributes should not be added on non SSL requests' do
45
+ env = env_for_url("http://test.com/")
46
+
47
+ _status, headers, _body = middleware.call(env)
48
+
49
+ assert_not_includes headers['Set-Cookie'], 'SameSite'
50
+ end
51
+ end
52
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
  require 'tmpdir'
3
4
 
@@ -1,12 +1,12 @@
1
+ # frozen_string_literal: true
1
2
  require 'test_helper'
2
3
 
3
4
  module Shipit
4
5
  class CommitDeploymentStatusTest < ActiveSupport::TestCase
5
6
  setup do
6
- @status = shipit_commit_deployment_statuses(:shipit2_deploy_third_pending)
7
+ @status = shipit_commit_deployment_statuses(:shipit2_deploy_third_in_progress)
7
8
  @deployment = @status.commit_deployment
8
9
  @task = @deployment.task
9
- @commit = @deployment.commit
10
10
  @author = @deployment.author
11
11
  end
12
12
 
@@ -14,14 +14,44 @@ module Shipit
14
14
  response = stub(id: 44, url: 'https://example.com')
15
15
  @author.github_api.expects(:create_deployment_status).with(
16
16
  @deployment.api_url,
17
- 'pending',
17
+ 'in_progress',
18
+ accept: "application/vnd.github.flash-preview+json",
18
19
  target_url: "http://shipit.com/shopify/shipit-engine/production/deploys/#{@task.id}",
19
- description: "walrus triggered the deploy of shopify/shipit-engine/production to #{@commit.sha}",
20
+ description: "walrus triggered the deploy of shopify/shipit-engine/production to #{@deployment.short_sha}",
21
+ environment_url: "https://shipit.shopify.com",
20
22
  ).returns(response)
21
23
 
22
24
  @status.create_on_github!
23
25
  assert_equal response.id, @status.github_id
24
26
  assert_equal response.url, @status.api_url
25
27
  end
28
+
29
+ test 'description is truncated to character limit' do
30
+ limit = CommitDeploymentStatus::DESCRIPTION_CHARACTER_LIMIT_ON_GITHUB
31
+ deployment = shipit_commit_deployments(:shipit_deploy_second)
32
+
33
+ status = deployment.statuses.create!(status: 'success')
34
+ status.stubs(:description).returns('desc' * limit)
35
+ create_status_response = stub(id: 'abcd', url: 'https://github.com/status/abcd')
36
+ status.author.github_api.expects(:create_deployment_status).with do |*_args, **kwargs|
37
+ kwargs[:description].size <= limit
38
+ end.returns(create_status_response)
39
+
40
+ status.create_on_github!
41
+ end
42
+
43
+ test 'includes deployment url when the deployment succeeds' do
44
+ deployment = shipit_commit_deployments(:shipit_deploy_second)
45
+
46
+ status = deployment.statuses.create!(status: 'success')
47
+ stack = status.stack
48
+ stack.deploy_url = "stack-deploy-url"
49
+ create_status_response = stub(id: 'abcd', url: 'https://github.com/status/abcd')
50
+ status.author.github_api.expects(:create_deployment_status).with do |*_args, **kwargs|
51
+ kwargs[:environment_url] == 'stack-deploy-url'
52
+ end.returns(create_status_response)
53
+
54
+ status.create_on_github!
55
+ end
26
56
  end
27
57
  end