shipit-engine 0.32.0 → 0.35.1

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 (235) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -2
  3. data/app/assets/images/magic-solid.svg +1 -0
  4. data/app/assets/javascripts/shipit/repositories_search.js.coffee +60 -0
  5. data/app/assets/javascripts/shipit/{search.js.coffee → stack_search.js.coffee} +0 -0
  6. data/app/assets/stylesheets/_pages/_deploy.scss +2 -3
  7. data/app/assets/stylesheets/_pages/_repositories.scss +148 -0
  8. data/app/assets/stylesheets/_pages/_stacks.scss +19 -0
  9. data/app/assets/stylesheets/shipit.scss +1 -0
  10. data/app/controllers/shipit/api/ccmenu_controller.rb +1 -1
  11. data/app/controllers/shipit/api/deploys_controller.rb +2 -0
  12. data/app/controllers/shipit/api/{pull_requests_controller.rb → merge_requests_controller.rb} +8 -8
  13. data/app/controllers/shipit/api/rollbacks_controller.rb +2 -1
  14. data/app/controllers/shipit/api/stacks_controller.rb +15 -1
  15. data/app/controllers/shipit/deploys_controller.rb +1 -1
  16. data/app/controllers/shipit/merge_requests_controller.rb +31 -0
  17. data/app/controllers/shipit/merge_status_controller.rb +15 -15
  18. data/app/controllers/shipit/repositories_controller.rb +74 -0
  19. data/app/controllers/shipit/stacks_controller.rb +2 -2
  20. data/app/controllers/shipit/tasks_controller.rb +2 -2
  21. data/app/controllers/shipit/webhooks_controller.rb +23 -4
  22. data/app/helpers/shipit/chunks_helper.rb +2 -2
  23. data/app/helpers/shipit/github_url_helper.rb +8 -0
  24. data/app/helpers/shipit/shipit_helper.rb +0 -1
  25. data/app/helpers/shipit/stacks_helper.rb +4 -0
  26. data/app/jobs/shipit/create_on_github_job.rb +1 -0
  27. data/app/jobs/shipit/deliver_hook_job.rb +1 -1
  28. data/app/jobs/shipit/destroy_repository_job.rb +24 -0
  29. data/app/jobs/shipit/destroy_stack_job.rb +2 -2
  30. data/app/jobs/shipit/github_sync_job.rb +13 -9
  31. data/app/jobs/shipit/perform_task_job.rb +4 -98
  32. data/app/jobs/shipit/process_merge_requests_job.rb +32 -0
  33. data/app/jobs/shipit/refresh_merge_request_job.rb +11 -0
  34. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +1 -1
  35. data/app/models/shipit/anonymous_user.rb +10 -2
  36. data/app/models/shipit/check_run.rb +38 -2
  37. data/app/models/shipit/command_line_user.rb +4 -0
  38. data/app/models/shipit/commit.rb +31 -20
  39. data/app/models/shipit/commit_checks.rb +14 -13
  40. data/app/models/shipit/commit_deployment.rb +3 -3
  41. data/app/models/shipit/commit_deployment_status.rb +3 -3
  42. data/app/models/shipit/deploy.rb +17 -11
  43. data/app/models/shipit/deploy_spec/file_system.rb +11 -5
  44. data/app/models/shipit/deploy_spec/lerna_discovery.rb +12 -4
  45. data/app/models/shipit/deploy_spec.rb +16 -4
  46. data/app/models/shipit/duration.rb +2 -0
  47. data/app/models/shipit/hook.rb +28 -2
  48. data/app/models/shipit/merge_request.rb +304 -0
  49. data/app/models/shipit/provisioning_handler/base.rb +30 -0
  50. data/app/models/shipit/provisioning_handler/unregistered_provisioning_handler.rb +35 -0
  51. data/app/models/shipit/provisioning_handler.rb +32 -0
  52. data/app/models/shipit/pull_request.rb +26 -265
  53. data/app/models/shipit/pull_request_assignment.rb +10 -0
  54. data/app/models/shipit/release_status.rb +1 -1
  55. data/app/models/shipit/repository.rb +63 -3
  56. data/app/models/shipit/review_stack.rb +130 -0
  57. data/app/models/shipit/review_stack_provisioning_queue.rb +39 -0
  58. data/app/models/shipit/rollback.rb +5 -0
  59. data/app/models/shipit/stack.rb +78 -30
  60. data/app/models/shipit/status/group.rb +1 -1
  61. data/app/models/shipit/task.rb +62 -9
  62. data/app/models/shipit/task_execution_strategy/base.rb +20 -0
  63. data/app/models/shipit/task_execution_strategy/default.rb +109 -0
  64. data/app/models/shipit/team.rb +4 -2
  65. data/app/models/shipit/user.rb +10 -1
  66. data/app/models/shipit/webhooks/handlers/pull_request/assigned_handler.rb +74 -0
  67. data/app/models/shipit/webhooks/handlers/pull_request/closed_handler.rb +68 -0
  68. data/app/models/shipit/webhooks/handlers/pull_request/edited_handler.rb +74 -0
  69. data/app/models/shipit/webhooks/handlers/pull_request/label_capturing_handler.rb +127 -0
  70. data/app/models/shipit/webhooks/handlers/pull_request/labeled_handler.rb +106 -0
  71. data/app/models/shipit/webhooks/handlers/pull_request/opened_handler.rb +83 -0
  72. data/app/models/shipit/webhooks/handlers/pull_request/reopened_handler.rb +88 -0
  73. data/app/models/shipit/webhooks/handlers/pull_request/review_stack_adapter.rb +103 -0
  74. data/app/models/shipit/webhooks/handlers/pull_request/unlabeled_handler.rb +107 -0
  75. data/app/models/shipit/webhooks/handlers/push_handler.rb +4 -1
  76. data/app/models/shipit/webhooks.rb +10 -0
  77. data/app/serializers/shipit/deploy_serializer.rb +6 -0
  78. data/app/serializers/shipit/merge_request_serializer.rb +21 -0
  79. data/app/serializers/shipit/pull_request_serializer.rb +5 -8
  80. data/app/serializers/shipit/review_stack_serializer.rb +7 -0
  81. data/app/serializers/shipit/stack_serializer.rb +7 -6
  82. data/app/serializers/shipit/tail_task_serializer.rb +10 -2
  83. data/app/serializers/shipit/task_serializer.rb +1 -1
  84. data/app/validators/subset_validator.rb +1 -1
  85. data/app/views/layouts/merge_status.html.erb +1 -1
  86. data/app/views/shipit/merge_requests/_merge_request.html.erb +29 -0
  87. data/app/views/shipit/{pull_requests → merge_requests}/index.html.erb +2 -2
  88. data/app/views/shipit/merge_requests/merge_requests/_pull_request.html.erb +29 -0
  89. data/app/views/shipit/merge_requests/merge_requests/index.html.erb +20 -0
  90. data/app/views/shipit/merge_status/_merge_queue_button.html.erb +3 -3
  91. data/app/views/shipit/merge_status/backlogged.html.erb +1 -1
  92. data/app/views/shipit/merge_status/failure.html.erb +1 -1
  93. data/app/views/shipit/merge_status/locked.html.erb +1 -1
  94. data/app/views/shipit/merge_status/success.html.erb +2 -2
  95. data/app/views/shipit/repositories/_header.html.erb +19 -0
  96. data/app/views/shipit/repositories/index.html.erb +31 -0
  97. data/app/views/shipit/repositories/new.html.erb +23 -0
  98. data/app/views/shipit/repositories/settings.html.erb +53 -0
  99. data/app/views/shipit/repositories/show.html.erb +30 -0
  100. data/app/views/shipit/stacks/_banners.html.erb +15 -1
  101. data/app/views/shipit/stacks/_header.html.erb +5 -2
  102. data/app/views/shipit/stacks/_stack.html.erb +8 -0
  103. data/app/views/shipit/stacks/index.html.erb +2 -1
  104. data/app/views/shipit/stacks/new.html.erb +1 -1
  105. data/app/views/shipit/stacks/settings.html.erb +5 -5
  106. data/app/views/shipit/stacks/show.html.erb +1 -1
  107. data/app/views/shipit/tasks/_task_output.html.erb +1 -1
  108. data/config/routes.rb +15 -5
  109. data/config/secrets.development.example.yml +24 -0
  110. data/config/secrets.development.shopify.yml +20 -9
  111. data/db/migrate/20200706145406_add_review_stacks.rb +12 -0
  112. data/db/migrate/20200804144639_rename_pull_request_to_merge_request.rb +7 -0
  113. data/db/migrate/20200804161512_rename_commits_pull_request_id_to_merge_request_id.rb +5 -0
  114. data/db/migrate/20200813134712_recreate_shipit_pull_requests.rb +22 -0
  115. data/db/migrate/20200813194056_create_pull_request_assignments.rb +8 -0
  116. data/db/migrate/20201001125502_add_provision_pr_stacks_flag_to_repositories.rb +7 -0
  117. data/db/migrate/20201008145809_add_retry_attempt_to_tasks.rb +5 -0
  118. data/db/migrate/20201008152744_add_max_retries_to_tasks.rb +5 -0
  119. data/db/migrate/20210325194053_remove_stacks_branch_default.rb +5 -0
  120. data/db/migrate/20210504200438_add_github_updated_at_to_check_runs.rb +5 -0
  121. data/db/migrate/20210823075617_change_check_runs_github_updated_at_default.rb +5 -0
  122. data/lib/shipit/command.rb +7 -6
  123. data/lib/shipit/commands.rb +18 -5
  124. data/lib/shipit/engine.rb +2 -0
  125. data/lib/shipit/flock.rb +8 -1
  126. data/lib/shipit/github_app.rb +8 -6
  127. data/lib/shipit/octokit_iterator.rb +3 -3
  128. data/lib/shipit/review_stack_commands.rb +8 -0
  129. data/lib/shipit/simple_message_verifier.rb +2 -2
  130. data/lib/shipit/stack_commands.rb +36 -7
  131. data/lib/shipit/task_commands.rb +8 -1
  132. data/lib/shipit/version.rb +1 -1
  133. data/lib/shipit.rb +50 -16
  134. data/lib/snippets/publish-lerna-independent-packages +35 -34
  135. data/lib/snippets/publish-lerna-independent-packages-legacy +39 -0
  136. data/lib/tasks/cron.rake +11 -2
  137. data/test/controllers/api/ccmenu_controller_test.rb +1 -1
  138. data/test/controllers/api/deploys_controller_test.rb +17 -0
  139. data/test/controllers/api/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +12 -12
  140. data/test/controllers/api/outputs_controller_test.rb +1 -0
  141. data/test/controllers/api/rollback_controller_test.rb +1 -1
  142. data/test/controllers/api/stacks_controller_test.rb +42 -8
  143. data/test/controllers/{pull_requests_controller_test.rb → merge_requests_controller_test.rb} +6 -6
  144. data/test/controllers/repositories_controller_test.rb +71 -0
  145. data/test/controllers/stacks_controller_test.rb +9 -1
  146. data/test/controllers/tasks_controller_test.rb +14 -2
  147. data/test/controllers/webhooks_controller_test.rb +27 -12
  148. data/test/dummy/app/assets/config/manifest.js +3 -0
  149. data/test/dummy/config/application.rb +7 -2
  150. data/test/dummy/config/database.yml +9 -0
  151. data/test/dummy/config/environments/development.rb +1 -4
  152. data/test/dummy/config/environments/test.rb +0 -5
  153. data/test/dummy/config/secrets_double_github_app.yml +79 -0
  154. data/test/dummy/db/schema.rb +56 -17
  155. data/test/dummy/db/seeds.rb +2 -1
  156. data/test/fixtures/payloads/check_suite_master.json +4 -32
  157. data/test/fixtures/payloads/invalid_pull_request.json +117 -0
  158. data/test/fixtures/payloads/provision_disabled_pull_request.json +454 -0
  159. data/test/fixtures/payloads/pull_request_assigned.json +480 -0
  160. data/test/fixtures/payloads/pull_request_closed.json +454 -0
  161. data/test/fixtures/payloads/pull_request_labeled.json +461 -0
  162. data/test/fixtures/payloads/pull_request_opened.json +454 -0
  163. data/test/fixtures/payloads/pull_request_reopened.json +454 -0
  164. data/test/fixtures/payloads/pull_request_unlabeled.json +454 -0
  165. data/test/fixtures/payloads/pull_request_with_no_repo.json +454 -0
  166. data/test/fixtures/payloads/push_master.json +1 -1
  167. data/test/fixtures/payloads/push_not_master.json +1 -1
  168. data/test/fixtures/shipit/commits.yml +17 -4
  169. data/test/fixtures/shipit/hooks.yml +1 -0
  170. data/test/fixtures/shipit/merge_requests.yml +141 -0
  171. data/test/fixtures/shipit/pull_request_assignments.yml +3 -0
  172. data/test/fixtures/shipit/pull_requests.yml +10 -131
  173. data/test/fixtures/shipit/repositories.yml +1 -0
  174. data/test/fixtures/shipit/stacks.yml +145 -0
  175. data/test/fixtures/shipit/statuses.yml +9 -0
  176. data/test/fixtures/shipit/tasks.yml +4 -1
  177. data/test/fixtures/shipit/users.yml +7 -0
  178. data/test/helpers/json_helper.rb +5 -1
  179. data/test/helpers/payloads_helper.rb +4 -0
  180. data/test/jobs/chunk_rollup_job_test.rb +15 -1
  181. data/test/jobs/destroy_repository_job_test.rb +27 -0
  182. data/test/jobs/github_sync_job_test.rb +2 -1
  183. data/test/jobs/perform_task_job_test.rb +8 -8
  184. data/test/jobs/{merge_pull_requests_job_test.rb → process_merge_requests_job_test.rb} +18 -18
  185. data/test/lib/shipit/deploy_commands_test.rb +16 -0
  186. data/test/lib/shipit/task_commands_test.rb +17 -0
  187. data/test/models/commit_deployment_status_test.rb +3 -3
  188. data/test/models/commits_test.rb +24 -13
  189. data/test/models/deploy_spec_test.rb +64 -24
  190. data/test/models/deploys_test.rb +188 -14
  191. data/test/models/hook_test.rb +30 -1
  192. data/test/models/{pull_request_test.rb → merge_request_test.rb} +49 -34
  193. data/test/models/pull_request_assignment_test.rb +16 -0
  194. data/test/models/shipit/check_run_test.rb +124 -5
  195. data/test/models/shipit/provisioning_handler/base_test.rb +33 -0
  196. data/test/models/shipit/provisioning_handler/unregistered_provisioning_handler_test.rb +49 -0
  197. data/test/models/shipit/provisioning_handler_test.rb +64 -0
  198. data/test/models/shipit/pull_request_test.rb +52 -0
  199. data/test/models/shipit/repository_test.rb +5 -1
  200. data/test/models/shipit/review_stack_provision_status_test.rb +77 -0
  201. data/test/models/shipit/review_stack_provisioning_queue_test.rb +63 -0
  202. data/test/models/shipit/review_stack_test.rb +91 -0
  203. data/test/models/{stacks_test.rb → shipit/stacks_test.rb} +52 -8
  204. data/test/models/shipit/webhooks/handlers/pull_request/assigned_handler_test.rb +45 -0
  205. data/test/models/shipit/webhooks/handlers/pull_request/closed_handler_test.rb +192 -0
  206. data/test/models/shipit/webhooks/handlers/pull_request/edited_handler_test.rb +47 -0
  207. data/test/models/shipit/webhooks/handlers/pull_request/label_capturing_handler_test.rb +209 -0
  208. data/test/models/shipit/webhooks/handlers/pull_request/labeled_handler_test.rb +332 -0
  209. data/test/models/shipit/webhooks/handlers/pull_request/opened_handler_test.rb +238 -0
  210. data/test/models/shipit/webhooks/handlers/pull_request/reopened_handler_test.rb +282 -0
  211. data/test/models/shipit/webhooks/handlers/pull_request/review_stack_adapter_test.rb +107 -0
  212. data/test/models/shipit/webhooks/handlers/pull_request/unlabeled_handler_test.rb +324 -0
  213. data/test/models/shipit/{wehbooks → webhooks}/handlers_test.rb +0 -0
  214. data/test/models/tasks_test.rb +66 -3
  215. data/test/serializers/shipit/pull_request_serializer_test.rb +29 -0
  216. data/test/test_helper.rb +15 -0
  217. data/test/unit/anonymous_user_serializer_test.rb +1 -1
  218. data/test/unit/command_test.rb +8 -3
  219. data/test/unit/commit_serializer_test.rb +1 -1
  220. data/test/unit/deploy_commands_test.rb +73 -17
  221. data/test/unit/deploy_serializer_test.rb +1 -1
  222. data/test/unit/github_app_test.rb +2 -3
  223. data/test/unit/github_apps_test.rb +416 -0
  224. data/test/unit/github_url_helper_test.rb +5 -0
  225. data/test/unit/shipit_deployment_checks_test.rb +77 -0
  226. data/test/unit/shipit_task_execution_strategy_test.rb +47 -0
  227. data/test/unit/shipit_test.rb +14 -0
  228. data/test/unit/user_serializer_test.rb +1 -1
  229. metadata +306 -188
  230. data/app/controllers/shipit/pull_requests_controller.rb +0 -31
  231. data/app/jobs/shipit/merge_pull_requests_job.rb +0 -32
  232. data/app/jobs/shipit/refresh_pull_request_job.rb +0 -11
  233. data/app/views/shipit/pull_requests/_pull_request.html.erb +0 -29
  234. data/test/fixtures/shipit/output_chunks.yml +0 -47
  235. data/test/models/output_chunk_test.rb +0 -21
@@ -0,0 +1,29 @@
1
+ <li class="pr" id="pr-<%= merge_request.id %>">
2
+ <%= render 'shipit/shared/author', author: merge_request.merge_requested_by %>
3
+ <div class="pr-details">
4
+ <span class="pr-number">
5
+ <%= pull_request_link(merge_request) %>
6
+ </span>
7
+ <span class="pr-title">
8
+ <%= render_pull_request_title_with_link merge_request %>
9
+ </span>
10
+ <p class="pr-meta">
11
+ <span class="code-additions">+<%= merge_request.additions %></span>
12
+ <span class="code-deletions">-<%= merge_request.deletions %></span>
13
+ </p>
14
+ <p class="pr-meta">
15
+ Enqueued <%= timeago_tag(merge_request.merge_requested_at, force: true) %>
16
+ <% if merge_request.revalidating? %>
17
+ <em class="warning">Need revalidation.</em>
18
+ <% end %>
19
+ </p>
20
+ </div>
21
+ <% if merge_request.revalidating? %>
22
+ <div class="commit-actions">
23
+ <%= button_to 'Confirm', stack_merge_requests_path(merge_request.stack, number_or_url: merge_request.number), class: 'btn btn--warning', method: 'post' %>
24
+ </div>
25
+ <% end %>
26
+ <div class="commit-actions">
27
+ <%= button_to 'Cancel', stack_merge_request_path(merge_request.stack, merge_request), class: 'btn btn--warning', method: 'delete' %>
28
+ </div>
29
+ </li>
@@ -0,0 +1,20 @@
1
+ <% subscribe events_path(channels: ["stack.#{@stack.id}"]), '.pr-list', '.header' %>
2
+
3
+ <%= render partial: 'shipit/stacks/header', locals: { stack: @stack } %>
4
+
5
+ <div class="wrapper">
6
+ <section>
7
+ <header class="section-header">
8
+ <%= form_tag stack_merge_requests_path(@stack) do %>
9
+ <div class="field-wrapper inline">
10
+ <%= text_field_tag :number_or_url, '', placeholder: 'PR number or URL' %>
11
+ <%= submit_tag 'Request merge', class: 'btn' %>
12
+ </div>
13
+ <% end %>
14
+ </header>
15
+
16
+ <ul class="pr-list">
17
+ <%= render @merge_requests %>
18
+ </ul>
19
+ </section>
20
+ </div>
@@ -1,13 +1,13 @@
1
1
  <% classes = 'branch-action-btn float-right js-immediate-updates js-handle-pull-merging-errors' %>
2
- <% if pull_request.try!(&:waiting?) %>
3
- <%= form_tag dequeue_pull_request_path(stack, pull_request_number), method: 'delete', class: classes, data: {remote: true} do %>
2
+ <% if merge_request.try!(&:waiting?) %>
3
+ <%= form_tag dequeue_merge_request_path(stack, pull_request_number), method: 'delete', class: classes, data: {remote: true} do %>
4
4
  <%= hidden_field_tag 'referrer', params[:referrer] %>
5
5
  <button type="submit" data-disable-with="Removing from merge queue…" class="btn">
6
6
  Remove from merge queue
7
7
  </button>
8
8
  <% end %>
9
9
  <% else %>
10
- <%= form_tag enqueue_pull_request_path(stack, pull_request_number), method: 'put', class: classes, data: {remote: true} do %>
10
+ <%= form_tag enqueue_merge_request_path(stack, pull_request_number), method: 'put', class: classes, data: {remote: true} do %>
11
11
  <%= hidden_field_tag 'referrer', params[:referrer] %>
12
12
  <button type="submit" data-disable-with="Adding to merge queue…" class="btn btn-primary">
13
13
  Add to merge queue
@@ -4,7 +4,7 @@
4
4
  <%= render 'anchor', color: '#cea61b' %>
5
5
  </div>
6
6
  <h4 class="status-heading text-pending">
7
- <% if pull_request.waiting? %>
7
+ <% if merge_request.waiting? %>
8
8
  Will be merged shortly after the backlog is shipped!
9
9
  <% else %>
10
10
  Please hold off merging!
@@ -4,7 +4,7 @@
4
4
  <%= render 'anchor', color: '#d73a49' %>
5
5
  </div>
6
6
  <h4 class="status-heading text-red">
7
- <% if pull_request.waiting? %>
7
+ <% if merge_request.waiting? %>
8
8
  Will be merged shortly after the CI is fixed!
9
9
  <% else %>
10
10
  Please hold off merging!
@@ -4,7 +4,7 @@
4
4
  <%= render 'anchor', color: '#bd2c00' %>
5
5
  </div>
6
6
  <h4 class="status-heading text-red">
7
- <% if pull_request.waiting? %>
7
+ <% if merge_request.waiting? %>
8
8
  Will be merged shortly after the lock is removed!
9
9
  <% else %>
10
10
  Please hold off merging!
@@ -5,8 +5,8 @@
5
5
  </div>
6
6
 
7
7
  <h4 class="status-heading">
8
- <% if pull_request.waiting? %>
9
- <% if pull_request.all_status_checks_passed? %>
8
+ <% if merge_request.waiting? %>
9
+ <% if merge_request.all_status_checks_passed? %>
10
10
  Will be merged shortly!
11
11
  <% else %>
12
12
  Will be merged when required checks are passing.
@@ -0,0 +1,19 @@
1
+ <% content_for :page_title do %>
2
+ <span><%= repository.owner %></span>
3
+ <h1><%= repository.name %></h1>
4
+ <% end %>
5
+
6
+ <% content_for :primary_navigation do %>
7
+ <%= link_to 'Add a stack', repository_stacks_new_path(repository), class: 'btn secondary' %>
8
+ <% end %>
9
+
10
+ <% content_for :secondary_navigation do %>
11
+ <ul class="nav__list nav__list--primary">
12
+ <li class="nav__list__item">
13
+ <%= link_to 'Stacks', repository_path(repository) %>
14
+ </li>
15
+ <li class="nav__list__item">
16
+ <%= link_to 'Settings', repository_settings_path(repository) %>
17
+ </li>
18
+ </ul>
19
+ <% end %>
@@ -0,0 +1,31 @@
1
+ <% content_for :page_title do %>
2
+ <h1>Repositories</h1>
3
+ <% end %>
4
+ <% content_for :primary_navigation do %>
5
+ <%= link_to 'Add a repository', new_repository_path, class: 'btn secondary' %>
6
+ <% end %>
7
+
8
+ <div class="wrapper <%= 'filtering-enabled' if @repositories.size > 10 %>">
9
+ <section>
10
+ <header class="section-header repository-search-header">
11
+ <input class="repository-search" placeholder="Search <%= @repositories.size %> repositories" />
12
+ </header>
13
+ <ul class="repository-table-header">
14
+ <li class="col">Owner<li>
15
+ <li class="col">Name</li>
16
+ </ul>
17
+ <ul class="repository-lst">
18
+ <% @repositories.each do |repository| %>
19
+ <li class="search-item <%= contributor_class(current_user.repositories_contributed_to, repository.id) %>" data-search="<%= repository.github_repo_name %>" data-repository-id="<%= repository.id %>">
20
+ <%= link_to repository_path(repository), class: 'commits-path' do %>
21
+ <span class="col"><%= repository.owner %></span>
22
+ <span class="col"><%= repository.name %></span>
23
+ <% end %>
24
+ </li>
25
+ <% end %>
26
+ </ul>
27
+
28
+ <%= link_to 'show all repositories', '#', class: 'btn secondary show-all-repositories' %></p>
29
+ </section>
30
+
31
+ </div>
@@ -0,0 +1,23 @@
1
+ <% content_for :page_title do %>
2
+ <h1>Create a repository</h1>
3
+ <% end %>
4
+
5
+ <div class="wrapper">
6
+ <section>
7
+ <div class="setting-section">
8
+ <%= form_for @repository do |f| %>
9
+ <div class="field-wrapper">
10
+ <%= label_tag "Repo" %>
11
+ <br>
12
+ <%= Shipit.github.url %>
13
+ /
14
+ <%= f.text_field :owner, placeholder: 'e.g. Shopify', required: true, class: "repo" %>
15
+ /
16
+ <%= f.text_field :name, required: true, pattern: "^[a-zA-Z0-9\-_\.]+$", class: "repo" %>
17
+ </div>
18
+
19
+ <div class="field-wrapper"><%= f.submit class: 'btn' %></div>
20
+ <% end %>
21
+ </div>
22
+ </section>
23
+ </div>
@@ -0,0 +1,53 @@
1
+ <%= render partial: 'shipit/repositories/header', locals: { repository: @repository } %>
2
+
3
+ <div class="wrapper">
4
+ <section>
5
+ <header class="section-header">
6
+ <h2>Settings (Repository <%= @repository.github_repo_name %>)</h2>
7
+ </header>
8
+
9
+ <div class="setting-section">
10
+ <%= form_for @repository do |f| %>
11
+ <div class="field-wrapper">
12
+ <%= f.check_box :review_stacks_enabled %>
13
+ <%= f.label :review_stacks_enabled, "Dynamically provision stacks for Pull Requests?" %>
14
+ </div>
15
+
16
+ <div class="field-wrapper">
17
+ <p>
18
+ <%= f.label :provisioning_behavior, "Provisioning behavior", aria: { describedby: 'provisioningBehaviorHelp' } %>
19
+ <%= f.select :provisioning_behavior, Shipit::Repository.provisioning_behaviors.map { |key, value| [ key.titleize, key] } %>
20
+ </p>
21
+ <p>
22
+ <small class="form-text text-muted" id="provisioningBehaviorHelp">
23
+ When "Allow All", the provisioning label has no effect on dynamic stack provisioning - ALL Pull Requests dynamically provision stacks.
24
+ </small>
25
+ </p>
26
+ <p>
27
+ <small class="form-text text-muted">
28
+ When "Allow With Label", dynamic provisioning occurs ONLY for Pull Requests whose labels include the 'Provisioning Label'.
29
+ </small>
30
+ </p>
31
+ <p>
32
+ <small class="form-text text-muted">
33
+ When "Prevent With Label", dynamic provisioning will occur for every Pull Request EXCEPT those whose labels include the 'Provisioning Label'.
34
+ </small>
35
+ </p>
36
+ </div>
37
+
38
+ <div class="field-wrapper">
39
+ <%= f.label :provisioning_label_name, "Provisioning label" %>
40
+ <%= f.text_field :provisioning_label_name %>
41
+ </div>
42
+
43
+ <%= f.submit class: "btn", value: "Save" %>
44
+ <% end %>
45
+ </div>
46
+
47
+ <div class="setting-section">
48
+ <h5>Delete this repository</h5>
49
+ <p>This action will delete the repository and its stacks from Ship it permanently. Be careful.</p>
50
+ <%= button_to "Delete…", repository_path(@repository), class: 'btn btn--delete', data: {confirm: 'Are you sure?'}, method: :delete %>
51
+ </div>
52
+ </section>
53
+ </div>
@@ -0,0 +1,30 @@
1
+ <% subscribe events_path(channels: ["repository.#{@repository.id}"]), '#layout-content' %>
2
+
3
+ <%= render partial: 'shipit/repositories/header', locals: {repository: @repository} %>
4
+
5
+ <div class="wrapper">
6
+ <section>
7
+ <% cache [@repository, params[:show_archived]] do %>
8
+ <section>
9
+ <header class="section-header">
10
+ <h2>Stacks</h2>
11
+ </header>
12
+ <ul class="repository-table-header">
13
+ <li class="col">Name</li>
14
+ <li class="col">Environment</li>
15
+ <li class="col">Branch</li>
16
+ <li class="col">Deploy URL</li>
17
+ </ul>
18
+ <ul class="repository-lst">
19
+ <%= render @stacks %>
20
+ </ul>
21
+
22
+ <%= link_to 'show all stacks', '#', class: 'btn secondary show-all-stacks' %></p>
23
+ <% if @show_archived %>
24
+ <%= link_to 'hide archived stacks', '?', class: 'btn secondary' %></p>
25
+ <% else %>
26
+ <%= link_to 'show archived stacks', '?show_archived=1', class: 'btn secondary' %></p>
27
+ <% end %>
28
+ </section>
29
+ <% end %>
30
+ </div>
@@ -49,6 +49,19 @@
49
49
  </div>
50
50
  <% end %>
51
51
 
52
+ <% if stack.awaiting_provision? %>
53
+ <div class="banner banner--orange">
54
+ <div class="banner__inner wrapper">
55
+ <div class="banner__content">
56
+ <h2 class="banner__title">
57
+ <i class="icon icon--list"></i>
58
+ This stack is in a queue waiting on provisioning. This may be because too many review stacks exist for this repository.
59
+ </h2>
60
+ </div>
61
+ </div>
62
+ </div>
63
+ <% end %>
64
+
52
65
  <% if stack.continuous_delivery_delayed? %>
53
66
  <div class="banner">
54
67
  <div class="banner__inner wrapper">
@@ -56,7 +69,8 @@
56
69
  <h2 class="banner__title">Continuous Delivery Delayed!</h2>
57
70
  <p class="banner__text">
58
71
  Continuous Delivery for this stack is currently paused because
59
- <%= link_to 'the pre-deploy checks failed', stack_commit_checks_path(stack, sha: stack.next_commit_to_deploy.sha) %>.
72
+
73
+ <%= link_to_if stack.deployment_checks_passed?, 'the pre-deploy checks failed', stack_commit_checks_path(stack, sha: stack.next_commit_to_deploy.sha) %>.
60
74
  You can either wait for them to pass, or trigger a deploy manually.
61
75
  </p>
62
76
  </div>
@@ -22,9 +22,12 @@
22
22
  <li class="nav__list__item">
23
23
  <%= link_to t('stack.nav.statistics'), stack_statistics_path(stack) %>
24
24
  </li>
25
+ <li class="nav__list__item">
26
+ <%= link_to 'Repository', repository_path(stack.repository) %>
27
+ </li>
25
28
  <% if stack.merge_queue_enabled? %>
26
29
  <li class="nav__list__item">
27
- <%= link_to t('stack.nav.merge_queue', count: stack.pull_requests.queued.count), stack_pull_requests_path(stack) %>
30
+ <%= link_to t('stack.nav.merge_queue', count: stack.merge_requests.queued.count), stack_merge_requests_path(stack) %>
28
31
  </li>
29
32
  <% end %>
30
33
 
@@ -64,7 +67,7 @@
64
67
  </li>
65
68
  <% end %>
66
69
  <li class="nav__list__item">
67
- <%= link_to t('stack.nav.view_on_github'), github_repo_url(stack.repo_owner, stack.repo_name) %>
70
+ <%= link_to t('stack.nav.view_on_github'), stack_github_url(stack) %>
68
71
  </li>
69
72
  <% if stack.deploy_url.present? %>
70
73
  <li class="nav__list__item">
@@ -0,0 +1,8 @@
1
+ <li class="search-item <%= stack.archived? ? 'archived' : '' %> <%= stack.undeployed_commits? ? 'undeployed' : '' %> <%= contributor_class(current_user.stacks_contributed_to, stack.id) %>" data-search="<%= stack.repo_name %> <%= stack.environment %> <%= stack.deploy_url %>" data-stack-id="<%= stack.id %>">
2
+ <%= link_to stack_path(stack), class: 'commits-path' do %>
3
+ <span class="col"><%= stack.repo_name %></span>
4
+ <small class="col"><%= stack.environment.capitalize %></small>
5
+ <small class="col"><%= stack.branch %></small>
6
+ <small class="col"><%= stack.deploy_url %></small>
7
+ <% end %>
8
+ </li>
@@ -2,6 +2,7 @@
2
2
  <h1><%= Shipit.app_name %></h1>
3
3
  <% end %>
4
4
  <% content_for :primary_navigation do %>
5
+ <%= link_to 'Repositories', repositories_path, class: 'btn secondary' %>
5
6
  <%= link_to 'Add a stack', new_stack_path, class: 'btn secondary' %>
6
7
  <% end %>
7
8
 
@@ -21,7 +22,7 @@
21
22
  <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
23
  <%= link_to stack_path(stack), class: 'commits-path' do %>
23
24
  <span class="col"><%= stack.repo_name %></span>
24
- <small class="col"><%= stack.environment.capitalize %></small>
25
+ <small class="col"><%= stack.environment %></small>
25
26
  <small class="col"><%= stack.branch %></small>
26
27
  <small class="col"><%= stack.deploy_url %></small>
27
28
  <% end %>
@@ -17,7 +17,7 @@
17
17
  </div>
18
18
  <div class="field-wrapper">
19
19
  <%= f.label :branch %>
20
- <%= f.text_field :branch, placeholder: 'master' %>
20
+ <%= f.text_field :branch, placeholder: '<default branch>' %>
21
21
  </div>
22
22
  <div class="field-wrapper">
23
23
  <%= f.label :environment %>
@@ -7,7 +7,7 @@
7
7
  </header>
8
8
 
9
9
  <div class="setting-section">
10
- <%= form_for @stack do |f| %>
10
+ <%= form_with scope: :stack, url: stack_path(@stack), method: :patch do |f| %>
11
11
  <div class="field-wrapper">
12
12
  <%= f.label :environment %>
13
13
  <%= f.text_field :environment, placeholder: 'production' %>
@@ -43,7 +43,7 @@
43
43
 
44
44
  <div class="setting-section">
45
45
  <h5>Lock deploys</h5>
46
- <%= form_for @stack do |f| %>
46
+ <%= form_with scope: :stack, url: stack_path(@stack), method: :patch do |f| %>
47
47
  <div class="field-wrapper">
48
48
  <%= f.label :lock_reason, 'Reason for lock' %>
49
49
  <%= f.text_area :lock_reason %>
@@ -55,7 +55,7 @@
55
55
  <% end %>
56
56
  <% end %>
57
57
  <% if @stack.locked? %>
58
- <%= form_for @stack do |f| %>
58
+ <%= form_with scope: :stack, url: stack_path(@stack), method: :patch do |f| %>
59
59
  <%= f.hidden_field :lock_reason, value: nil %>
60
60
  <%= f.submit class: "btn btn--primary", value: "Unlock" %>
61
61
  <%- end -%>
@@ -85,14 +85,14 @@
85
85
  <% if @stack.archived? %>
86
86
  <h5>Restore Stack</h5>
87
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| %>
88
+ <%= form_with scope: :stack, url: stack_path(@stack), method: :patch do |f| %>
89
89
  <%= f.hidden_field :archived, value: false %>
90
90
  <%= f.submit class: "btn", value: "Restore" %>
91
91
  <% end %>
92
92
  <% else %>
93
93
  <h5>Archive Stack</h5>
94
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| %>
95
+ <%= form_with scope: :stack, url: stack_path(@stack), method: :patch do |f| %>
96
96
  <%= f.hidden_field :archived, value: true %>
97
97
  <%= f.submit class: "btn", value: "Archive" %>
98
98
  <% end %>
@@ -12,7 +12,7 @@
12
12
  <% if params[:force] %>
13
13
  <%= link_to t('emergency_mode.disable'), stack_path(@stack) %>
14
14
  <% else %>
15
- <%= link_to t('emergency_mode.enable'), stack_path(@stack, force: 1), title: t('emergency_mode.enable_description') %>
15
+ <%= link_to t('emergency_mode.enable'), stack_path(@stack, force: 1, noredirect: 1), title: t('emergency_mode.enable_description') %>
16
16
  <% end %>
17
17
  </div>
18
18
  </header>
@@ -43,6 +43,6 @@
43
43
  </div>
44
44
 
45
45
  <div class="clusterize-scroll task-output-container task-output-container-main-page">
46
- <pre class="nowrap" data-status="<%= task.status %>"><code class="clusterize-content" data-output="<%= task.chunk_output %>" data-next-chunks-url="<%= next_chunks_url(task) %>"></code></pre>
46
+ <pre class="nowrap" data-status="<%= task.status %>"><code class="clusterize-content" data-output="<%= task.chunk_output %>" data-next-chunks-url="<%= next_chunks_url(task, last_byte: task.chunk_output_size) %>"></code></pre>
47
47
  </div>
48
48
  </div>
data/config/routes.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  Shipit::Engine.routes.draw do
3
3
  stack_id_format = %r{[^/]+/[^/]+/[^/]+}
4
+ repository_id_format = %r{[^/]+/[^/]+}
4
5
  sha_format = /[\da-f]{6,40}/
5
6
  root to: 'stacks#index'
6
7
 
@@ -32,7 +33,7 @@ Shipit::Engine.routes.draw do
32
33
  end
33
34
  resources :rollbacks, only: %i(create)
34
35
  resources :commits, only: %i(index)
35
- resources :pull_requests, only: %i(index show update destroy)
36
+ resources :merge_requests, only: %i(index show update destroy)
36
37
  post '/task/:task_name' => 'tasks#trigger', as: :trigger_task
37
38
  resources :hooks, only: %i(index create show update destroy)
38
39
  end
@@ -46,12 +47,20 @@ Shipit::Engine.routes.draw do
46
47
 
47
48
  # Browser extension
48
49
  get '/merge_status', action: :show, controller: :merge_status, as: :merge_status
49
- put '/merge_status/*stack_id/pull/:number', action: :enqueue, controller: :merge_status, id: stack_id_format, as: :enqueue_pull_request
50
- delete '/merge_status/*stack_id/pull/:number', action: :dequeue, controller: :merge_status, id: stack_id_format, as: :dequeue_pull_request
50
+ put '/merge_status/*stack_id/pull/:number', action: :enqueue, controller: :merge_status, id: stack_id_format, as: :enqueue_merge_request
51
+ delete '/merge_status/*stack_id/pull/:number', action: :dequeue, controller: :merge_status, id: stack_id_format, as: :dequeue_merge_request
51
52
 
52
53
  # Humans
53
54
  resources :api_clients
54
- resources :stacks, only: %i(new create index)
55
+
56
+ resources :repositories, only: %i(new index create)
57
+ scope '/repositories/*id', id: repository_id_format, as: :repository do
58
+ get '/' => 'repositories#show'
59
+ patch '/' => 'repositories#update'
60
+ delete '/' => 'repositories#destroy'
61
+ get :settings, controller: :repositories
62
+ get 'stacks/new' => 'repositories#new_stack'
63
+ end
55
64
 
56
65
  scope '/github/auth/github', as: :github_authentication, controller: :github_authentication do
57
66
  get '/', action: :request
@@ -60,6 +69,7 @@ Shipit::Engine.routes.draw do
60
69
  get :logout
61
70
  end
62
71
 
72
+ resources :stacks, only: %i(new create index)
63
73
  scope '/*id', id: stack_id_format, as: :stack do
64
74
  get '/' => 'stacks#show'
65
75
  patch '/' => 'stacks#update'
@@ -107,7 +117,7 @@ Shipit::Engine.routes.draw do
107
117
  resources :release_statuses, only: %i(create)
108
118
  end
109
119
 
110
- resources :pull_requests, only: %i(index destroy create)
120
+ resources :merge_requests, only: %i(index destroy create)
111
121
  end
112
122
  get '/stacks/:id' => 'stacks#lookup'
113
123