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,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class PullRequestsController < ShipitController
3
4
  def index
@@ -11,14 +12,14 @@ module Shipit
11
12
  else
12
13
  flash[:warning] = "Invalid or missing pull request number."
13
14
  end
14
- redirect_to stack_pull_requests_path
15
+ redirect_to(stack_pull_requests_path)
15
16
  end
16
17
 
17
18
  def destroy
18
19
  pull_request = stack.pull_requests.find(params[:id])
19
20
  pull_request.cancel!
20
21
  flash[:success] = 'Merge canceled'
21
- redirect_to stack_pull_requests_path
22
+ redirect_to(stack_pull_requests_path)
22
23
  end
23
24
 
24
25
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class ReleaseStatusesController < ShipitController
3
4
  before_action :load_stack
@@ -10,9 +11,9 @@ module Shipit
10
11
  when 'failure'
11
12
  @deploy.report_faulty!(user: current_user)
12
13
  else
13
- render status: :unprocessable_entity, json: {message: "Invalid `status` parameter"}
14
+ render(status: :unprocessable_entity, json: { message: "Invalid `status` parameter" })
14
15
  end
15
- render status: :created, json: @deploy.last_release_status
16
+ render(status: :created, json: @deploy.last_release_status)
16
17
  end
17
18
 
18
19
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class RollbacksController < ShipitController
3
4
  before_action :load_stack
@@ -5,9 +6,9 @@ module Shipit
5
6
 
6
7
  def create
7
8
  @rollback = @deploy.trigger_rollback(current_user, env: rollback_params[:env], force: params[:force].present?)
8
- redirect_to stack_deploy_path(@stack, @rollback)
9
+ redirect_to(stack_deploy_path(@stack, @rollback))
9
10
  rescue Task::ConcurrentTaskRunning
10
- redirect_to rollback_stack_deploy_path(@stack, @deploy)
11
+ redirect_to(rollback_stack_deploy_path(@stack, @deploy))
11
12
  end
12
13
 
13
14
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class ShipitController < ApplicationController
3
4
  layout 'shipit'
@@ -27,7 +28,7 @@ module Shipit
27
28
  def ensure_required_settings
28
29
  return if Shipit.all_settings_present?
29
30
 
30
- render 'shipit/missing_settings'
31
+ render('shipit/missing_settings')
31
32
  end
32
33
  end
33
34
  end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class StacksController < ShipitController
3
- before_action :load_stack, only: %i(update destroy settings clear_git_cache refresh)
4
+ before_action :load_stack, only: %i(update destroy settings statistics clear_git_cache refresh)
4
5
 
5
6
  def new
6
7
  @stack = Stack.new
@@ -9,7 +10,21 @@ module Shipit
9
10
  def index
10
11
  @user_stacks = current_user.stacks_contributed_to
11
12
 
12
- @stacks = Stack.order('(undeployed_commits_count > 0) desc', tasks_count: :desc).to_a
13
+ @stacks = Stack.all
14
+ if params[:repo]
15
+ @stacks = if (repository = Repository.from_github_repo_name(params[:repo]))
16
+ repository.stacks
17
+ else
18
+ Stack.none
19
+ end
20
+ end
21
+
22
+ @stacks = @stacks.order(Arel.sql('(undeployed_commits_count > 0) desc'), tasks_count: :desc)
23
+
24
+ @show_archived = params[:show_archived]
25
+ @stacks = @stacks.not_archived unless @show_archived
26
+
27
+ @stacks = @stacks.to_a
13
28
  end
14
29
 
15
30
  def show
@@ -43,11 +58,12 @@ module Shipit
43
58
 
44
59
  def lookup
45
60
  @stack = Stack.find(params[:id])
46
- redirect_to stack_url(@stack)
61
+ redirect_to(stack_url(@stack))
47
62
  end
48
63
 
49
64
  def create
50
65
  @stack = Stack.new(create_params)
66
+ @stack.repository = repository
51
67
  unless @stack.save
52
68
  flash[:warning] = @stack.errors.full_messages.to_sentence
53
69
  end
@@ -56,32 +72,43 @@ module Shipit
56
72
 
57
73
  def destroy
58
74
  @stack.schedule_for_destroy!
59
- redirect_to stacks_url
75
+ redirect_to(stacks_url)
60
76
  end
61
77
 
62
78
  def settings
63
79
  end
64
80
 
81
+ def all_tasks
82
+ @stack = Stack.from_param!(params[:id])
83
+ @tasks = @stack.tasks.where(type: nil).order(id: :desc).preload(:since_commit, :until_commit, :user).limit(10)
84
+ end
85
+
86
+ def statistics
87
+ previous_deploy_stats = Shipit::DeployStats.new(@stack.deploys.not_active.previous_seven_days)
88
+ @deploy_stats = Shipit::DeployStats.new(@stack.deploys.not_active.last_seven_days)
89
+ if @deploy_stats.empty?
90
+ flash[:warning] = 'Statistics not available without previous deploys'
91
+ return redirect_to(stack_path(@stack))
92
+ end
93
+ @diffs = @deploy_stats.compare(previous_deploy_stats)
94
+ end
95
+
65
96
  def refresh
66
97
  RefreshStatusesJob.perform_later(stack_id: @stack.id)
67
98
  RefreshCheckRunsJob.perform_later(stack_id: @stack.id)
68
99
  GithubSyncJob.perform_later(stack_id: @stack.id)
69
100
  flash[:success] = 'Refresh scheduled'
70
- redirect_to request.referer.presence || stack_path(@stack)
101
+ redirect_to(request.referer.presence || stack_path(@stack))
71
102
  end
72
103
 
73
104
  def update
74
105
  options = {}
75
106
  unless @stack.update(update_params)
76
- options = {flash: {warning: @stack.errors.full_messages.to_sentence}}
107
+ options = { flash: { warning: @stack.errors.full_messages.to_sentence } }
77
108
  end
78
109
 
79
- reason = params[:stack][:lock_reason]
80
- if reason.present?
81
- @stack.lock(reason, current_user)
82
- elsif @stack.locked?
83
- @stack.unlock
84
- end
110
+ update_lock
111
+ update_archived
85
112
 
86
113
  redirect_to(params[:return_to].presence || stack_settings_path(@stack), options)
87
114
  end
@@ -89,11 +116,32 @@ module Shipit
89
116
  def clear_git_cache
90
117
  ClearGitCacheJob.perform_later(@stack)
91
118
  flash[:success] = 'Git Cache clearing scheduled'
92
- redirect_to stack_settings_path(@stack)
119
+ redirect_to(stack_settings_path(@stack))
93
120
  end
94
121
 
95
122
  private
96
123
 
124
+ def update_lock
125
+ if params[:stack].key?(:lock_reason)
126
+ reason = params[:stack][:lock_reason]
127
+ if reason.present?
128
+ @stack.lock(reason, current_user)
129
+ elsif @stack.locked?
130
+ @stack.unlock
131
+ end
132
+ end
133
+ end
134
+
135
+ def update_archived
136
+ if params[:stack][:archived].present?
137
+ if params[:stack][:archived] == "true"
138
+ @stack.archive!(current_user)
139
+ elsif @stack.archived?
140
+ @stack.unarchive!
141
+ end
142
+ end
143
+ end
144
+
97
145
  def map_to_undeployed_commit(commits, next_expected_commit_to_deploy:)
98
146
  commits.map.with_index do |c, i|
99
147
  index = commits.size - i - 1
@@ -106,7 +154,7 @@ module Shipit
106
154
  end
107
155
 
108
156
  def create_params
109
- params.require(:stack).permit(:repo_name, :repo_owner, :environment, :branch, :deploy_url, :ignore_ci)
157
+ params.require(:stack).permit(:environment, :branch, :deploy_url, :ignore_ci)
110
158
  end
111
159
 
112
160
  def update_params
@@ -118,5 +166,21 @@ module Shipit
118
166
  :merge_queue_enabled,
119
167
  )
120
168
  end
169
+
170
+ def repository
171
+ @repository ||= Repository.find_or_create_by(owner: repo_owner, name: repo_name)
172
+ end
173
+
174
+ def repo_owner
175
+ repository_params[:repo_owner]
176
+ end
177
+
178
+ def repo_name
179
+ repository_params[:repo_name]
180
+ end
181
+
182
+ def repository_params
183
+ params.require(:stack).permit(:repo_owner, :repo_name)
184
+ end
121
185
  end
122
186
  end
@@ -1,7 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class StatusController < ActionController::Base
3
4
  def version
4
- render plain: Shipit.revision
5
+ render(plain: Shipit.revision)
5
6
  end
6
7
  end
7
8
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class TasksController < ShipitController
3
4
  include Pagination
@@ -35,25 +36,25 @@ module Shipit
35
36
  env: task_params[:env],
36
37
  force: params[:force].present?,
37
38
  )
38
- redirect_to [stack, @task]
39
+ redirect_to([stack, @task])
39
40
  rescue Task::ConcurrentTaskRunning
40
- redirect_to new_stack_tasks_path(stack, @definition)
41
+ redirect_to(new_stack_tasks_path(stack, @definition))
41
42
  end
42
43
  end
43
44
 
44
45
  def abort
45
46
  task.abort!(rollback_once_aborted: params[:rollback].present?, aborted_by: current_user)
46
- head :ok
47
+ head(:ok)
47
48
  end
48
49
 
49
50
  def tail
50
- render json: TailTaskSerializer.new(task, context: params)
51
+ render(json: TailTaskSerializer.new(task, context: params))
51
52
  end
52
53
 
53
54
  def lookup
54
55
  @task = Task.find(params[:id])
55
56
 
56
- redirect_to url_for_task
57
+ redirect_to(url_for_task)
57
58
  end
58
59
 
59
60
  private
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class WebhooksController < ActionController::Base
3
4
  skip_before_action :verify_authenticity_token, raise: false
@@ -5,139 +6,11 @@ module Shipit
5
6
 
6
7
  respond_to :json
7
8
 
8
- class Handler
9
- class << self
10
- attr_reader :param_parser
11
-
12
- def params(&block)
13
- @param_parser = ExplicitParameters::Parameters.define(&block)
14
- end
15
- end
16
-
17
- attr_reader :params, :payload
18
-
19
- def initialize(payload)
20
- @payload = payload
21
- @params = self.class.param_parser.parse!(payload)
22
- end
23
-
24
- def process
25
- raise NotImplementedError
26
- end
27
-
28
- private
29
-
30
- def stacks
31
- @stacks ||= Stack.repo(repository_name)
32
- end
33
-
34
- def repository_name
35
- payload.dig('repository', 'full_name')
36
- end
37
- end
38
-
39
- class PushHandler < Handler
40
- params do
41
- requires :ref
42
- end
43
- def process
44
- stacks.where(branch: branch).each(&:sync_github)
45
- end
46
-
47
- private
48
-
49
- def branch
50
- params.ref.gsub('refs/heads/', '')
51
- end
52
- end
53
-
54
- class StatusHandler < Handler
55
- params do
56
- requires :sha, String
57
- requires :state, String
58
- accepts :description, String
59
- accepts :target_url, String
60
- accepts :context, String
61
- accepts :created_at, String
62
-
63
- accepts :branches, Array do
64
- requires :name, String
65
- end
66
- end
67
- def process
68
- Commit.where(sha: params.sha).each do |commit|
69
- commit.create_status_from_github!(params)
70
- end
71
- end
72
- end
73
-
74
- class CheckSuiteHandler < Handler
75
- params do
76
- requires :check_suite do
77
- requires :head_sha, String
78
- requires :head_branch, String
79
- end
80
- end
81
- def process
82
- stacks.where(branch: params.check_suite.head_branch).each do |stack|
83
- stack.commits.where(sha: params.check_suite.head_sha).each(&:schedule_refresh_check_runs!)
84
- end
85
- end
86
- end
87
-
88
- class MembershipHandler < Handler
89
- params do
90
- requires :action, String
91
- requires :team do
92
- requires :id, Integer
93
- requires :name, String
94
- requires :slug, String
95
- requires :url, String
96
- end
97
- requires :organization do
98
- requires :login, String
99
- end
100
- requires :member do
101
- requires :login, String
102
- end
103
- end
104
- def process
105
- team = find_or_create_team!
106
- member = User.find_or_create_by_login!(params.member.login)
107
-
108
- case params.action
109
- when 'added'
110
- team.add_member(member)
111
- when 'removed'
112
- team.members.delete(member)
113
- else
114
- raise ArgumentError, "Don't know how to perform action: `#{action.inspect}`"
115
- end
116
- end
117
-
118
- private
119
-
120
- def find_or_create_team!
121
- Team.find_or_create_by!(github_id: params.team.id) do |team|
122
- team.github_team = params.team
123
- team.organization = params.organization.login
124
- end
125
- end
126
- end
127
-
128
- HANDLERS = {
129
- 'push' => PushHandler,
130
- 'status' => StatusHandler,
131
- 'membership' => MembershipHandler,
132
- 'check_suite' => CheckSuiteHandler,
133
- }.freeze
134
-
135
9
  def create
136
- if handler = HANDLERS[event]
137
- handler.new(JSON.parse(request.raw_post)).process
138
- end
10
+ params = JSON.parse(request.raw_post)
11
+ Shipit::Webhooks.for_event(event).each { |handler| handler.call(params) }
139
12
 
140
- head :ok
13
+ head(:ok)
141
14
  end
142
15
 
143
16
  private
@@ -147,7 +20,7 @@ module Shipit
147
20
  end
148
21
 
149
22
  def check_if_ping
150
- head :ok if event == 'ping'
23
+ head(:ok) if event == 'ping'
151
24
  end
152
25
 
153
26
  def event
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  module ChunksHelper
3
4
  def next_chunks_url(task)
@@ -1,18 +1,19 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  module DeploysHelper
3
4
  def render_checklist(checklist)
4
5
  return if checklist.blank?
5
- render 'shipit/deploys/checklist', checklist: checklist
6
+ render('shipit/deploys/checklist', checklist: checklist)
6
7
  end
7
8
 
8
9
  def render_monitoring(stack)
9
10
  return unless stack.monitoring?
10
- render 'shipit/deploys/monitoring', stack: stack
11
+ render('shipit/deploys/monitoring', stack: stack)
11
12
  end
12
13
 
13
14
  def render_checks(commit)
14
15
  return unless commit.stack.checks?
15
- render 'shipit/commit_checks/checks', commit: commit
16
+ render('shipit/commit_checks/checks', commit: commit)
16
17
  end
17
18
 
18
19
  def render_monitoring_panel(panel_spec)