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
@@ -0,0 +1 @@
1
+ <%# Placeholder to be used by the host application %>
@@ -0,0 +1,28 @@
1
+ <% subscribe events_path(channels: ["stack.#{@stack.id}"]), '#layout-content' %>
2
+
3
+ <%= render partial: 'shipit/stacks/header', locals: {stack: @stack} %>
4
+ <%= render partial: 'shipit/stacks/banners', locals: {stack: @stack} %>
5
+
6
+ <div class="wrapper">
7
+ <section>
8
+ <header class="section-header">
9
+ <h2>Available tasks</h2>
10
+ </header>
11
+ <ul class="task-list">
12
+ <% @stack.task_definitions.each do |definition| %>
13
+ <li class="task" id="task-<%= definition.id %>">
14
+ <%= link_to "#{definition.action}", new_stack_tasks_path(@stack, definition_id: definition.id), class: "trigger-deploy" %>
15
+ </li>
16
+ <% end %>
17
+ </ul>
18
+ </section>
19
+
20
+ <section>
21
+ <header class="section-header">
22
+ <h2>Previous Tasks</h2>
23
+ </header>
24
+ <ul class="commit-list">
25
+ <%= render @tasks %>
26
+ </ul>
27
+ </section>
28
+ </div>
@@ -1,5 +1,5 @@
1
1
  <% content_for :page_title do %>
2
- <h1>Shipit</h1>
2
+ <h1><%= Shipit.app_name %></h1>
3
3
  <% end %>
4
4
  <% content_for :primary_navigation do %>
5
5
  <%= link_to 'Add a stack', new_stack_path, class: 'btn secondary' %>
@@ -18,7 +18,7 @@
18
18
  </ul>
19
19
  <ul class="stack-lst">
20
20
  <% @stacks.each do |stack| %>
21
- <li class="search-item <%= stack.undeployed_commits? ? 'undeployed' : '' %> <%= @user_stacks.include?(stack.id) ? 'contributor' : 'not-matching' %>" data-search="<%= stack.repo_name %> <%= stack.environment %> <%= stack.deploy_url %>" data-stack-id="<%= stack.id %>">
21
+ <li class="stack search-item <%= stack.archived? ? 'archived' : '' %> <%= stack.undeployed_commits? ? 'undeployed' : '' %> <%= @user_stacks.include?(stack.id) ? 'contributor' : 'not-matching' %>" data-search="<%= stack.repo_name %> <%= stack.environment %> <%= stack.deploy_url %>" data-stack-id="<%= stack.id %>">
22
22
  <%= link_to stack_path(stack), class: 'commits-path' do %>
23
23
  <span class="col"><%= stack.repo_name %></span>
24
24
  <small class="col"><%= stack.environment.capitalize %></small>
@@ -30,6 +30,11 @@
30
30
  </ul>
31
31
 
32
32
  <%= link_to 'show all stacks', '#', class: 'btn secondary show-all-stacks' %></p>
33
+ <% if @show_archived %>
34
+ <%= link_to 'hide archived stacks', '?', class: 'btn secondary' %></p>
35
+ <% else %>
36
+ <%= link_to 'show archived stacks', '?show_archived=1', class: 'btn secondary' %></p>
37
+ <% end %>
33
38
  </section>
34
39
 
35
40
  </div>
@@ -61,6 +61,7 @@
61
61
  <%- end -%>
62
62
  <% end %>
63
63
  </div>
64
+
64
65
  <div class="setting-section">
65
66
  <h5>Resynchronize this stack</h5>
66
67
  <table>
@@ -80,6 +81,24 @@
80
81
  <%= button_to "Fetch URL", "", class: 'btn', data: {remote: ccmenu_url_url(stack_id: @stack.to_param)} %>
81
82
  </div>
82
83
 
84
+ <div class="setting-section">
85
+ <% if @stack.archived? %>
86
+ <h5>Restore Stack</h5>
87
+ <p>This action will de-archive the Stack, restoring it in the stack list and unlocking it.</p>
88
+ <%= form_for @stack do |f| %>
89
+ <%= f.hidden_field :archived, value: false %>
90
+ <%= f.submit class: "btn", value: "Restore" %>
91
+ <% end %>
92
+ <% else %>
93
+ <h5>Archive Stack</h5>
94
+ <p>This action will archive the Stack, hiding it from the stack list and locking it. It can still be found if you know the URL and de-archived.</p>
95
+ <%= form_for @stack do |f| %>
96
+ <%= f.hidden_field :archived, value: true %>
97
+ <%= f.submit class: "btn", value: "Archive" %>
98
+ <% end %>
99
+ <% end %>
100
+ </div>
101
+
83
102
  <div class="setting-section">
84
103
  <h5>Delete this stack</h5>
85
104
  <p>This action will delete the stack from Ship it permanently. Be careful.</p>
@@ -0,0 +1,82 @@
1
+ <%= render partial: 'shipit/stacks/header', locals: {stack: @stack} %>
2
+ <%= render partial: 'shipit/stacks/banners', locals: {stack: @stack} %>
3
+
4
+ <div class="wrapper">
5
+ <section>
6
+ <header class="section-header">
7
+ <h2>Statistics &ndash; Past 7 Days</h2>
8
+ </header>
9
+
10
+ <div class="row">
11
+ <div class="box">
12
+ <div class="box__body">
13
+ <div class="stats">
14
+ <div class="stats__amount"><%= @deploy_stats.count %></div>
15
+ <div class="stats__caption">Deploys</div>
16
+ <div class="stats__change">
17
+ <div class="stats__value stats__value--<%=positive_negative_class(@diffs[:count])%>"><%= number_to_percentage(@diffs[:count], precision: 1) %></div>
18
+ <div class="stats__period">this week</div>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </div>
23
+
24
+ <div class="box">
25
+ <div class="box__body">
26
+ <div class="stats">
27
+ <div class="stats__amount"><%= number_to_percentage(@deploy_stats.success_rate, precision: 1) %></div>
28
+ <div class="stats__caption">Deploys success rate</div>
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ <div class="box">
34
+ <div class="box__body">
35
+ <div class="stats">
36
+ <div class="stats__amount"><%= Shipit::Duration.new @deploy_stats.average_duration %></div>
37
+ <div class="stats__caption">Average deploy time</div>
38
+ <div class="stats__change">
39
+ <div class="stats__value stats__value--<%=positive_negative_class(@diffs[:average_duration])%>"><%= number_to_percentage(@diffs[:average_duration], precision: 1) %></div>
40
+ <div class="stats__period">this week</div>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </div>
45
+ </div>
46
+
47
+ <div class="row">
48
+ <div class="box">
49
+ <div class="box__body">
50
+ <div class="stats">
51
+ <div class="stats__amount"><%= Shipit::Duration.new @deploy_stats.min_duration %></div>
52
+ <div class="stats__caption">Min deploy time</div>
53
+ </div>
54
+ </div>
55
+ </div>
56
+
57
+ <div class="box">
58
+ <div class="box__body">
59
+ <div class="stats">
60
+ <div class="stats__amount"><%= Shipit::Duration.new @deploy_stats.median_duration %></div>
61
+ <div class="stats__caption">Median deploy time</div>
62
+ <div class="stats__change">
63
+ <div class="stats__value stats__value--<%=positive_negative_class(@diffs[:median_duration])%>"><%= number_to_percentage(@diffs[:median_duration], precision: 1) %></div>
64
+ <div class="stats__period">this week</div>
65
+ </div>
66
+ </div>
67
+ </div>
68
+ </div>
69
+
70
+ <div class="box">
71
+ <div class="box__body">
72
+ <div class="stats">
73
+ <div class="stats__amount"><%= Shipit::Duration.new @deploy_stats.max_duration %></div>
74
+ <div class="stats__caption">Max deploy time</div>
75
+ </div>
76
+ </div>
77
+ </div>
78
+ </div>
79
+
80
+ </section>
81
+
82
+ </div>
@@ -1,5 +1,5 @@
1
1
  <% content_for :task_title do %>
2
- executing <%= @task.definition.id %>
2
+ <%= @task.active? ? "executing" : "executed" %> <%= @task.definition.id %>
3
3
  <%= timeago_tag(@task.created_at, force: true) %>
4
4
  <% end %>
5
5
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  ActiveSupport::Inflector.inflections(:en) do |inflect|
2
- inflect.acronym 'CCMenu'
3
+ inflect.acronym('CCMenu')
3
4
  end
@@ -20,10 +20,21 @@
20
20
  # available at http://guides.rubyonrails.org/i18n.html.
21
21
 
22
22
  en:
23
+ stack:
24
+ nav:
25
+ refresh: Refresh statuses & commits
26
+ commits: Commits & Deploys
27
+ settings: Settings
28
+ timeline: Timeline
29
+ statistics: Stats
30
+ merge_queue: "Merge Queue (%{count})"
31
+ view_on_github: View on GitHub
32
+ links: More
33
+ deploy_link: View website
23
34
  commit:
24
- lock: This commit is safe to deploy. Click to mark it as unsafe.
25
- unlock: This commit was marked as unsafe to deploy. Click to mark it as safe.
26
- unlock_with_author: "%{author} marked this commit as unsafe to deploy. Click to mark it as safe."
35
+ lock: Click to mark this commit as unsafe to deploy.
36
+ unlock: Click to mark this commit as safe to deploy.
37
+ unlock_with_author: "%{author} marked this commit as unsafe to deploy. Click to mark this commit as safe to deploy."
27
38
  confirm_unlock: Mark this commit as safe to deploy?
28
39
  release:
29
40
  validate: Mark the release as healthy
@@ -72,12 +83,14 @@ en:
72
83
  ascii: "contains non-ASCII characters"
73
84
  deployment_description:
74
85
  deploy:
75
- pending: "%{author} triggered the deploy of %{stack} to %{sha}"
86
+ in_progress: "%{author} triggered the deploy of %{stack} to %{sha}"
87
+ pending: "%{author} created the deploy of %{stack} to %{sha}"
76
88
  success: "%{author} deployed %{stack} to %{sha}"
77
89
  failure: "Deploy of %{stack} to %{sha} by %{author} failed"
78
90
  error: "Deploy of %{stack} to %{sha} by %{author} failed"
79
91
  rollback:
80
- pending: "%{author} triggered the rollback of %{stack} to %{sha}"
92
+ in_progress: "%{author} triggered the deploy of %{stack} to %{sha}"
93
+ pending: "%{author} created the rollback of %{stack} to %{sha}"
81
94
  success: "%{author} rolled back %{stack} to %{sha}"
82
95
  failure: "Rollback of %{stack} to %{sha} by %{author} failed"
83
96
  error: "Rollback of %{stack} to %{sha} by %{author} failed"
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  Shipit::Engine.routes.draw do
2
3
  stack_id_format = %r{[^/]+/[^/]+/[^/]+}
3
4
  sha_format = /[\da-f]{6,40}/
@@ -17,6 +18,7 @@ Shipit::Engine.routes.draw do
17
18
  scope '/stacks/*id', id: stack_id_format, as: :stack do
18
19
  get '/' => 'stacks#show'
19
20
  delete '/' => 'stacks#destroy'
21
+ patch '/' => 'stacks#update'
20
22
  end
21
23
 
22
24
  scope '/stacks/*stack_id', stack_id: stack_id_format, as: :stack do
@@ -28,6 +30,7 @@ Shipit::Engine.routes.draw do
28
30
  resources :deploys, only: %i(index create) do
29
31
  resources :release_statuses, only: %i(create)
30
32
  end
33
+ resources :rollbacks, only: %i(create)
31
34
  resources :commits, only: %i(index)
32
35
  resources :pull_requests, only: %i(index show update destroy)
33
36
  post '/task/:task_name' => 'tasks#trigger', as: :trigger_task
@@ -47,6 +50,7 @@ Shipit::Engine.routes.draw do
47
50
  delete '/merge_status/*stack_id/pull/:number', action: :dequeue, controller: :merge_status, id: stack_id_format, as: :dequeue_pull_request
48
51
 
49
52
  # Humans
53
+ resources :api_clients
50
54
  resources :stacks, only: %i(new create index)
51
55
 
52
56
  scope '/github/auth/github', as: :github_authentication, controller: :github_authentication do
@@ -61,6 +65,8 @@ Shipit::Engine.routes.draw do
61
65
  patch '/' => 'stacks#update'
62
66
  delete '/' => 'stacks#destroy'
63
67
  get :settings, controller: :stacks
68
+ get :all_tasks, controller: :stacks, as: :tasks_list
69
+ get :statistics, controller: :stacks
64
70
  post :refresh, controller: :stacks
65
71
  get :refresh, controller: :stacks # For easier design, sorry :/
66
72
  post :clear_git_cache, controller: :stacks
@@ -72,7 +78,9 @@ Shipit::Engine.routes.draw do
72
78
 
73
79
  scope '/*stack_id', stack_id: stack_id_format, as: :stack do
74
80
  get '/commit/:sha/checks' => 'commit_checks#show', as: :commit_checks
75
- get '/commit/:sha/checks/tail' => 'commit_checks#tail', as: :tail_commit_checks, defaults: {format: :json}
81
+ get '/commit/:sha/checks/tail' => 'commit_checks#tail', as: :tail_commit_checks, defaults: { format: :json }
82
+
83
+ get '/stats' => 'stats#show', as: :stats
76
84
 
77
85
  resources :rollbacks, only: %i(create)
78
86
  resources :commits, only: %i(update)
@@ -85,7 +93,7 @@ Shipit::Engine.routes.draw do
85
93
 
86
94
  member do
87
95
  post :abort
88
- get :tail, defaults: {format: :json}
96
+ get :tail, defaults: { format: :json }
89
97
  end
90
98
  end
91
99
 
@@ -102,4 +110,8 @@ Shipit::Engine.routes.draw do
102
110
  resources :pull_requests, only: %i(index destroy create)
103
111
  end
104
112
  get '/stacks/:id' => 'stacks#lookup'
113
+
114
+ scope '/*repo', repo: %r{[^/]+/[^/]+}, as: :stack_search do
115
+ get '/' => 'stacks#index'
116
+ end
105
117
  end
@@ -0,0 +1,12 @@
1
+ class CreateShipitRepositories < ActiveRecord::Migration[6.0]
2
+ def change
3
+ create_table :repositories do |t|
4
+ t.string :owner, limit: 39, null: false
5
+ t.string :name, limit: 100, null: false
6
+
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :repositories, ["owner", "name"], name: "repository_unicity", unique: true
11
+ end
12
+ end
@@ -0,0 +1,15 @@
1
+ class AddRepositoryReferenceToStacks < ActiveRecord::Migration[6.0]
2
+ def up
3
+ change_table(:stacks) do |t|
4
+ t.references :repository
5
+ end
6
+ end
7
+
8
+ def down
9
+ change_column :stacks, :repo_name, :string, null: false
10
+ change_column :stacks, :repo_owner, :string, null: false
11
+ change_table(:stacks) do |t|
12
+ t.remove_references :repository
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,22 @@
1
+ class BackfillRepositoryData < ActiveRecord::Migration[6.0]
2
+ def up
3
+ repositories = {}
4
+ Shipit::Stack.all.each do |stack|
5
+ repo_owner = stack[:repo_owner].downcase
6
+ repo_name = stack[:repo_name].downcase
7
+
8
+ repository = (repositories[[repo_owner, repo_name]] ||= Shipit::Repository.create_or_find_by!(
9
+ owner: repo_owner,
10
+ name: repo_name,
11
+ ))
12
+
13
+ stack.update_column(:repository_id, repository.id)
14
+ end
15
+ end
16
+
17
+ def down
18
+ Shipit::Repository.find_each do |repository|
19
+ repository.stacks.update_all(repo_owner: repository.owner, repo_name: repository.name)
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,20 @@
1
+ class RemoveRepositoryInformationFromStacks < ActiveRecord::Migration[6.0]
2
+ def up
3
+ change_column_null :stacks, :repository_id, false
4
+ change_table(:stacks) do |t|
5
+ t.remove_index ["repo_owner", "repo_name", "environment"]
6
+ t.remove :repo_owner
7
+ t.remove :repo_name
8
+ t.index ["repository_id", "environment"], name: "stack_unicity", unique: true
9
+ end
10
+ end
11
+
12
+ def down
13
+ change_table(:stacks) do |t|
14
+ t.column :repo_name, :string, limit: 100
15
+ t.column :repo_owner, :string, limit: 39
16
+ t.remove_index ["repository_id", "environment"]
17
+ t.index ["repo_owner", "repo_name", "environment"], name: "stack_unicity", unique: true
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,6 @@
1
+ class AddArchivedSinceToStacks < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :stacks, :archived_since, :datetime
4
+ add_index :stacks, :archived_since
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ class OptionalTaskCommits < ActiveRecord::Migration[6.0]
2
+ def change
3
+ change_column_null :tasks, :since_commit_id, true
4
+ change_column_null :tasks, :until_commit_id, true
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddShaToCommitDeployments < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :commit_deployments, :sha, :string, limit: 40
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddIndexToTasksStatus < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_index :tasks, :status
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddPullRequestHeadShaToCommit < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :commits, :pull_request_head_sha, :string, limit: 40
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddRollbackOnceAbortedTo < ActiveRecord::Migration[6.0]
2
+ def change
3
+ add_column :tasks, :rollback_once_aborted_to_id, :integer
4
+ end
5
+ end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'active_support/all'
2
3
  require 'active_model_serializers'
3
4
  require 'state_machines-activerecord'
@@ -47,7 +48,8 @@ require 'shipit/deploy_commands'
47
48
  require 'shipit/rollback_commands'
48
49
  require 'shipit/environment_variables'
49
50
  require 'shipit/stat'
50
- require 'shipit/strip_cache_control'
51
+ require 'shipit/github_http_cache_middleware'
52
+ require 'shipit/same_site_cookie_middleware'
51
53
  require 'shipit/cast_value'
52
54
  require 'shipit/line_buffer'
53
55
 
@@ -60,7 +62,7 @@ module Shipit
60
62
  delegate :table_name_prefix, to: :secrets
61
63
 
62
64
  attr_accessor :disable_api_authentication, :timeout_exit_codes
63
- attr_writer :internal_hook_receivers, :task_logger
65
+ attr_writer :internal_hook_receivers, :task_logger, :preferred_org_emails
64
66
 
65
67
  self.timeout_exit_codes = [].freeze
66
68
 
@@ -68,6 +70,10 @@ module Shipit
68
70
  ENV['SHIPIT_DISABLE_AUTH'].present?
69
71
  end
70
72
 
73
+ def enable_samesite_middleware?
74
+ ENV['SHIPIT_ENABLE_SAMESITE_NONE'].present?
75
+ end
76
+
71
77
  def app_name
72
78
  @app_name ||= secrets.app_name || Rails.application.class.name.split(':').first || 'Shipit'
73
79
  end
@@ -106,22 +112,6 @@ module Shipit
106
112
  end
107
113
  end
108
114
 
109
- def new_faraday_stack
110
- Faraday::RackBuilder.new do |builder|
111
- builder.use(
112
- Faraday::HttpCache,
113
- shared_cache: false,
114
- store: Rails.cache,
115
- logger: Rails.logger,
116
- serializer: NullSerializer,
117
- )
118
- builder.use StripCacheControl
119
- builder.use Octokit::Response::RaiseError
120
- builder.adapter Faraday.default_adapter
121
- yield builder if block_given?
122
- end
123
- end
124
-
125
115
  def api_clients_secret
126
116
  secrets.api_clients_secret.presence || secrets.secret_key_base
127
117
  end
@@ -138,6 +128,10 @@ module Shipit
138
128
  secrets.default_merge_method || 'merge'
139
129
  end
140
130
 
131
+ def update_latest_deployed_ref
132
+ secrets.update_latest_deployed_ref
133
+ end
134
+
141
135
  def enforce_publish_config
142
136
  secrets.enforce_publish_config.presence
143
137
  end
@@ -163,7 +157,7 @@ module Shipit
163
157
  end
164
158
 
165
159
  def env
166
- {'SHIPIT' => '1'}.merge(secrets.env || {})
160
+ { 'SHIPIT' => '1' }.merge(secrets.env || {})
167
161
  end
168
162
 
169
163
  def shell_paths
@@ -175,7 +169,7 @@ module Shipit
175
169
  if revision_file.exist?
176
170
  revision_file.read
177
171
  else
178
- `git rev-parse HEAD`
172
+ %x(git rev-parse HEAD)
179
173
  end.strip
180
174
  end
181
175
  end
@@ -196,6 +190,10 @@ module Shipit
196
190
  @internal_hook_receivers ||= []
197
191
  end
198
192
 
193
+ def preferred_org_emails
194
+ @preferred_org_emails ||= []
195
+ end
196
+
199
197
  def task_logger
200
198
  @task_logger ||= Logger.new(nil)
201
199
  end