shipit-engine 0.31.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 (290) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +4 -2
  3. data/Rakefile +4 -2
  4. data/app/assets/stylesheets/_pages/_stacks.scss +0 -3
  5. data/app/assets/stylesheets/merge_status.scss +0 -3
  6. data/app/controllers/concerns/shipit/active_model_serializers_patch.rb +1 -0
  7. data/app/controllers/concerns/shipit/api/cacheable.rb +1 -0
  8. data/app/controllers/concerns/shipit/api/paginable.rb +3 -2
  9. data/app/controllers/concerns/shipit/api/rendering.rb +5 -4
  10. data/app/controllers/concerns/shipit/authentication.rb +3 -2
  11. data/app/controllers/concerns/shipit/pagination.rb +2 -1
  12. data/app/controllers/shipit/api/base_controller.rb +11 -6
  13. data/app/controllers/shipit/api/ccmenu_controller.rb +2 -1
  14. data/app/controllers/shipit/api/commits_controller.rb +2 -1
  15. data/app/controllers/shipit/api/deploys_controller.rb +4 -3
  16. data/app/controllers/shipit/api/hooks_controller.rb +6 -5
  17. data/app/controllers/shipit/api/locks_controller.rb +5 -4
  18. data/app/controllers/shipit/api/outputs_controller.rb +2 -1
  19. data/app/controllers/shipit/api/pull_requests_controller.rb +7 -6
  20. data/app/controllers/shipit/api/release_statuses_controller.rb +3 -2
  21. data/app/controllers/shipit/api/rollbacks_controller.rb +33 -0
  22. data/app/controllers/shipit/api/stacks_controller.rb +18 -5
  23. data/app/controllers/shipit/api/tasks_controller.rb +6 -5
  24. data/app/controllers/shipit/api_clients_controller.rb +4 -3
  25. data/app/controllers/shipit/ccmenu_url_controller.rb +4 -3
  26. data/app/controllers/shipit/commit_checks_controller.rb +2 -1
  27. data/app/controllers/shipit/commits_controller.rb +2 -1
  28. data/app/controllers/shipit/deploys_controller.rb +3 -2
  29. data/app/controllers/shipit/github_authentication_controller.rb +4 -3
  30. data/app/controllers/shipit/merge_status_controller.rb +17 -16
  31. data/app/controllers/shipit/pull_requests_controller.rb +3 -2
  32. data/app/controllers/shipit/release_statuses_controller.rb +3 -2
  33. data/app/controllers/shipit/rollbacks_controller.rb +3 -2
  34. data/app/controllers/shipit/shipit_controller.rb +2 -1
  35. data/app/controllers/shipit/stacks_controller.rb +22 -7
  36. data/app/controllers/shipit/status_controller.rb +2 -1
  37. data/app/controllers/shipit/tasks_controller.rb +6 -5
  38. data/app/controllers/shipit/webhooks_controller.rb +3 -2
  39. data/app/helpers/shipit/chunks_helper.rb +1 -0
  40. data/app/helpers/shipit/deploys_helper.rb +4 -3
  41. data/app/helpers/shipit/github_url_helper.rb +1 -0
  42. data/app/helpers/shipit/merge_status_helper.rb +1 -0
  43. data/app/helpers/shipit/shipit_helper.rb +1 -0
  44. data/app/helpers/shipit/stacks_helper.rb +1 -0
  45. data/app/helpers/shipit/tasks_helper.rb +1 -0
  46. data/app/jobs/shipit/background_job.rb +4 -0
  47. data/app/jobs/shipit/background_job/unique.rb +1 -0
  48. data/app/jobs/shipit/cache_deploy_spec_job.rb +1 -0
  49. data/app/jobs/shipit/chunk_rollup_job.rb +4 -0
  50. data/app/jobs/shipit/clear_git_cache_job.rb +1 -0
  51. data/app/jobs/shipit/continuous_delivery_job.rb +2 -1
  52. data/app/jobs/shipit/create_on_github_job.rb +6 -1
  53. data/app/jobs/shipit/create_release_statuses_job.rb +1 -0
  54. data/app/jobs/shipit/deferred_touch_job.rb +4 -0
  55. data/app/jobs/shipit/deliver_hook_job.rb +1 -0
  56. data/app/jobs/shipit/destroy_job.rb +1 -0
  57. data/app/jobs/shipit/destroy_stack_job.rb +1 -0
  58. data/app/jobs/shipit/emit_event_job.rb +2 -1
  59. data/app/jobs/shipit/fetch_commit_stats_job.rb +1 -0
  60. data/app/jobs/shipit/fetch_deployed_revision_job.rb +1 -0
  61. data/app/jobs/shipit/github_sync_job.rb +2 -1
  62. data/app/jobs/shipit/mark_deploy_healthy_job.rb +1 -0
  63. data/app/jobs/shipit/merge_pull_requests_job.rb +1 -0
  64. data/app/jobs/shipit/perform_commit_checks_job.rb +1 -0
  65. data/app/jobs/shipit/perform_task_job.rb +12 -5
  66. data/app/jobs/shipit/purge_old_deliveries_job.rb +1 -0
  67. data/app/jobs/shipit/reap_dead_tasks_job.rb +21 -0
  68. data/app/jobs/shipit/refresh_check_runs_job.rb +1 -0
  69. data/app/jobs/shipit/refresh_github_user_job.rb +1 -0
  70. data/app/jobs/shipit/refresh_pull_request_job.rb +1 -0
  71. data/app/jobs/shipit/refresh_statuses_job.rb +1 -0
  72. data/app/jobs/shipit/setup_github_hook_job.rb +1 -0
  73. data/app/jobs/shipit/update_estimated_deploy_duration_job.rb +1 -0
  74. data/app/jobs/shipit/update_github_last_deployed_ref_job.rb +4 -3
  75. data/app/models/concerns/shipit/deferred_touch.rb +4 -3
  76. data/app/models/shipit/anonymous_user.rb +5 -0
  77. data/app/models/shipit/api_client.rb +3 -2
  78. data/app/models/shipit/application_record.rb +2 -1
  79. data/app/models/shipit/check_run.rb +4 -3
  80. data/app/models/shipit/command_line_user.rb +1 -0
  81. data/app/models/shipit/commit.rb +11 -4
  82. data/app/models/shipit/commit_checks.rb +1 -0
  83. data/app/models/shipit/commit_deployment.rb +3 -2
  84. data/app/models/shipit/commit_deployment_status.rb +2 -1
  85. data/app/models/shipit/commit_message.rb +1 -0
  86. data/app/models/shipit/delivery.rb +4 -3
  87. data/app/models/shipit/deploy.rb +6 -17
  88. data/app/models/shipit/deploy_spec.rb +22 -3
  89. data/app/models/shipit/deploy_spec/bundler_discovery.rb +1 -0
  90. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +1 -0
  91. data/app/models/shipit/deploy_spec/file_system.rb +10 -3
  92. data/app/models/shipit/deploy_spec/kubernetes_discovery.rb +1 -0
  93. data/app/models/shipit/deploy_spec/lerna_discovery.rb +1 -0
  94. data/app/models/shipit/deploy_spec/npm_discovery.rb +5 -4
  95. data/app/models/shipit/deploy_spec/pypi_discovery.rb +1 -0
  96. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +1 -0
  97. data/app/models/shipit/deploy_stats.rb +2 -1
  98. data/app/models/shipit/duration.rb +3 -2
  99. data/app/models/shipit/ephemeral_commit_checks.rb +1 -0
  100. data/app/models/shipit/github_hook.rb +2 -1
  101. data/app/models/shipit/github_status.rb +2 -1
  102. data/app/models/shipit/hook.rb +6 -5
  103. data/app/models/shipit/membership.rb +3 -2
  104. data/app/models/shipit/output_chunk.rb +7 -2
  105. data/app/models/shipit/pull_request.rb +6 -5
  106. data/app/models/shipit/record.rb +18 -0
  107. data/app/models/shipit/release_status.rb +3 -2
  108. data/app/models/shipit/repository.rb +10 -5
  109. data/app/models/shipit/rollback.rb +1 -0
  110. data/app/models/shipit/stack.rb +50 -16
  111. data/app/models/shipit/status.rb +3 -2
  112. data/app/models/shipit/status/common.rb +7 -6
  113. data/app/models/shipit/status/group.rb +1 -0
  114. data/app/models/shipit/status/missing.rb +2 -1
  115. data/app/models/shipit/status/unknown.rb +2 -1
  116. data/app/models/shipit/task.rb +38 -5
  117. data/app/models/shipit/task_definition.rb +1 -0
  118. data/app/models/shipit/team.rb +2 -1
  119. data/app/models/shipit/undeployed_commit.rb +1 -0
  120. data/app/models/shipit/unlimited_api_client.rb +1 -0
  121. data/app/models/shipit/user.rb +10 -8
  122. data/app/models/shipit/variable_definition.rb +1 -0
  123. data/app/models/shipit/webhooks.rb +1 -0
  124. data/app/models/shipit/webhooks/handlers/check_suite_handler.rb +1 -0
  125. data/app/models/shipit/webhooks/handlers/handler.rb +1 -0
  126. data/app/models/shipit/webhooks/handlers/membership_handler.rb +1 -0
  127. data/app/models/shipit/webhooks/handlers/push_handler.rb +1 -0
  128. data/app/models/shipit/webhooks/handlers/status_handler.rb +1 -0
  129. data/app/serializers/concerns/shipit/conditional_attributes.rb +1 -0
  130. data/app/serializers/shipit/anonymous_user_serializer.rb +1 -0
  131. data/app/serializers/shipit/command_line_user_serializer.rb +1 -0
  132. data/app/serializers/shipit/commit_serializer.rb +1 -0
  133. data/app/serializers/shipit/deploy_serializer.rb +2 -1
  134. data/app/serializers/shipit/hook_serializer.rb +1 -0
  135. data/app/serializers/shipit/pull_request_serializer.rb +1 -0
  136. data/app/serializers/shipit/rollback_serializer.rb +1 -0
  137. data/app/serializers/shipit/short_commit_serializer.rb +1 -0
  138. data/app/serializers/shipit/stack_serializer.rb +1 -0
  139. data/app/serializers/shipit/tail_task_serializer.rb +1 -0
  140. data/app/serializers/shipit/task_serializer.rb +2 -17
  141. data/app/serializers/shipit/user_serializer.rb +6 -1
  142. data/app/validators/ascii_only_validator.rb +1 -0
  143. data/app/validators/subset_validator.rb +1 -0
  144. data/app/views/layouts/shipit.html.erb +1 -1
  145. data/app/views/shipit/_variables.html.erb +1 -1
  146. data/app/views/shipit/ccmenu/project.xml.builder +2 -1
  147. data/app/views/shipit/deploys/show.html.erb +2 -2
  148. data/app/views/shipit/stacks/_header.html.erb +3 -0
  149. data/app/views/shipit/stacks/all_tasks.html.erb +28 -0
  150. data/app/views/shipit/stacks/index.html.erb +1 -1
  151. data/app/views/shipit/tasks/show.html.erb +1 -1
  152. data/config/initializers/inflections.rb +2 -1
  153. data/config/locales/en.yml +3 -3
  154. data/config/routes.rb +10 -2
  155. data/db/migrate/20200226211925_add_index_to_tasks_status.rb +5 -0
  156. data/db/migrate/20200427135152_add_pull_request_head_sha_to_commit.rb +5 -0
  157. data/db/migrate/20200615181558_add_rollback_once_aborted_to.rb +5 -0
  158. data/lib/shipit.rb +12 -2
  159. data/lib/shipit/cast_value.rb +1 -0
  160. data/lib/shipit/command.rb +13 -12
  161. data/lib/shipit/commands.rb +5 -4
  162. data/lib/shipit/csv_serializer.rb +1 -0
  163. data/lib/shipit/deploy_commands.rb +1 -0
  164. data/lib/shipit/engine.rb +7 -2
  165. data/lib/shipit/environment_variables.rb +2 -1
  166. data/lib/shipit/first_parent_commits_iterator.rb +1 -0
  167. data/lib/shipit/flock.rb +1 -0
  168. data/lib/shipit/github_app.rb +7 -6
  169. data/lib/shipit/github_http_cache_middleware.rb +1 -0
  170. data/lib/shipit/null_serializer.rb +1 -0
  171. data/lib/shipit/octokit_check_runs.rb +3 -2
  172. data/lib/shipit/octokit_iterator.rb +3 -2
  173. data/lib/shipit/paginator.rb +3 -2
  174. data/lib/shipit/rollback_commands.rb +1 -0
  175. data/lib/shipit/same_site_cookie_middleware.rb +29 -0
  176. data/lib/shipit/simple_message_verifier.rb +1 -0
  177. data/lib/shipit/stack_commands.rb +3 -2
  178. data/lib/shipit/stat.rb +1 -0
  179. data/lib/shipit/task_commands.rb +2 -0
  180. data/lib/shipit/version.rb +2 -1
  181. data/lib/snippets/release-gem +5 -1
  182. data/lib/tasks/cron.rake +2 -0
  183. data/lib/tasks/dev.rake +3 -2
  184. data/lib/tasks/shipit.rake +15 -14
  185. data/lib/tasks/teams.rake +1 -0
  186. data/test/controllers/api/base_controller_test.rb +3 -2
  187. data/test/controllers/api/ccmenu_controller_test.rb +8 -7
  188. data/test/controllers/api/commits_controller_test.rb +3 -2
  189. data/test/controllers/api/deploys_controller_test.rb +15 -14
  190. data/test/controllers/api/hooks_controller_test.rb +8 -7
  191. data/test/controllers/api/locks_controller_test.rb +7 -6
  192. data/test/controllers/api/outputs_controller_test.rb +2 -1
  193. data/test/controllers/api/pull_requests_controller_test.rb +8 -7
  194. data/test/controllers/api/release_statuses_controller_test.rb +2 -1
  195. data/test/controllers/api/rollback_controller_test.rb +113 -0
  196. data/test/controllers/api/stacks_controller_test.rb +30 -9
  197. data/test/controllers/api/tasks_controller_test.rb +13 -12
  198. data/test/controllers/api_clients_controller_test.rb +5 -4
  199. data/test/controllers/ccmenu_controller_test.rb +4 -3
  200. data/test/controllers/commit_checks_controller_test.rb +4 -3
  201. data/test/controllers/commits_controller_test.rb +3 -2
  202. data/test/controllers/deploys_controller_test.rb +32 -21
  203. data/test/controllers/github_authentication_controller_test.rb +1 -0
  204. data/test/controllers/merge_status_controller_test.rb +7 -6
  205. data/test/controllers/pull_requests_controller_test.rb +4 -3
  206. data/test/controllers/release_statuses_controller_test.rb +3 -2
  207. data/test/controllers/rollbacks_controller_test.rb +9 -8
  208. data/test/controllers/stacks_controller_test.rb +33 -19
  209. data/test/controllers/status_controller_test.rb +1 -0
  210. data/test/controllers/tasks_controller_test.rb +19 -18
  211. data/test/controllers/webhooks_controller_test.rb +11 -10
  212. data/test/dummy/config/environments/development.rb +2 -0
  213. data/test/dummy/config/environments/test.rb +2 -0
  214. data/test/dummy/db/schema.rb +4 -1
  215. data/test/fixtures/shipit/commits.yml +15 -0
  216. data/test/fixtures/shipit/repositories.yml +4 -0
  217. data/test/fixtures/shipit/stacks.yml +90 -14
  218. data/test/fixtures/timeout +2 -1
  219. data/test/helpers/api_helper.rb +1 -0
  220. data/test/helpers/fixture_aliases_helper.rb +1 -0
  221. data/test/helpers/hooks_helper.rb +2 -1
  222. data/test/helpers/json_helper.rb +15 -11
  223. data/test/helpers/links_helper.rb +4 -3
  224. data/test/helpers/payloads_helper.rb +1 -0
  225. data/test/helpers/queries_helper.rb +3 -2
  226. data/test/jobs/cache_deploy_spec_job_test.rb +2 -1
  227. data/test/jobs/chunk_rollup_job_test.rb +1 -0
  228. data/test/jobs/deliver_hook_job_test.rb +1 -0
  229. data/test/jobs/destroy_stack_job_test.rb +1 -0
  230. data/test/jobs/emit_event_job_test.rb +2 -1
  231. data/test/jobs/fetch_commit_stats_job_test.rb +1 -0
  232. data/test/jobs/fetch_deployed_revision_job_test.rb +1 -0
  233. data/test/jobs/github_sync_job_test.rb +1 -0
  234. data/test/jobs/mark_deploy_healthy_job_test.rb +1 -0
  235. data/test/jobs/merge_pull_requests_job_test.rb +1 -0
  236. data/test/jobs/perform_task_job_test.rb +4 -3
  237. data/test/jobs/purge_old_deliveries_job_test.rb +1 -0
  238. data/test/jobs/reap_dead_tasks_job_test.rb +68 -0
  239. data/test/jobs/refresh_github_user_job_test.rb +1 -0
  240. data/test/jobs/refresh_status_job_test.rb +1 -0
  241. data/test/jobs/unique_job_test.rb +1 -0
  242. data/test/jobs/update_github_last_deployed_ref_job_test.rb +1 -0
  243. data/test/middleware/same_site_cookie_middleware_test.rb +52 -0
  244. data/test/models/api_client_test.rb +1 -0
  245. data/test/models/commit_checks_test.rb +1 -0
  246. data/test/models/commit_deployment_status_test.rb +1 -0
  247. data/test/models/commit_deployment_test.rb +2 -1
  248. data/test/models/commits_test.rb +72 -6
  249. data/test/models/delivery_test.rb +2 -1
  250. data/test/models/deploy_spec_test.rb +47 -42
  251. data/test/models/deploy_stats_test.rb +1 -0
  252. data/test/models/deploys_test.rb +31 -22
  253. data/test/models/duration_test.rb +1 -0
  254. data/test/models/github_hook_test.rb +1 -0
  255. data/test/models/hook_test.rb +18 -10
  256. data/test/models/membership_test.rb +1 -0
  257. data/test/models/output_chunk_test.rb +1 -0
  258. data/test/models/pull_request_test.rb +4 -3
  259. data/test/models/release_statuses_test.rb +1 -0
  260. data/test/models/rollbacks_test.rb +1 -0
  261. data/test/models/shipit/check_run_test.rb +1 -0
  262. data/test/models/shipit/repository_test.rb +1 -0
  263. data/test/models/shipit/wehbooks/handlers_test.rb +1 -0
  264. data/test/models/stacks_test.rb +30 -8
  265. data/test/models/status/group_test.rb +1 -0
  266. data/test/models/status/missing_test.rb +1 -0
  267. data/test/models/status_test.rb +1 -0
  268. data/test/models/task_definitions_test.rb +9 -8
  269. data/test/models/tasks_test.rb +18 -1
  270. data/test/models/team_test.rb +4 -2
  271. data/test/models/undeployed_commits_test.rb +1 -0
  272. data/test/models/users_test.rb +13 -5
  273. data/test/test_command_integration.rb +3 -2
  274. data/test/test_helper.rb +34 -31
  275. data/test/unit/anonymous_user_serializer_test.rb +14 -0
  276. data/test/unit/command_test.rb +8 -7
  277. data/test/unit/commands_test.rb +1 -0
  278. data/test/unit/commit_serializer_test.rb +16 -0
  279. data/test/unit/csv_serializer_test.rb +3 -2
  280. data/test/unit/deploy_commands_test.rb +5 -4
  281. data/test/unit/deploy_serializer_test.rb +17 -0
  282. data/test/unit/environment_variables_test.rb +5 -4
  283. data/test/unit/github_app_test.rb +1 -0
  284. data/test/unit/github_url_helper_test.rb +1 -0
  285. data/test/unit/rollback_commands_test.rb +2 -1
  286. data/test/unit/shipit_helper_test.rb +17 -0
  287. data/test/unit/shipit_test.rb +1 -0
  288. data/test/unit/user_serializer_test.rb +14 -0
  289. data/test/unit/variable_definition_test.rb +1 -0
  290. metadata +155 -130
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class UndeployedCommit < DelegateClass(Commit)
3
4
  attr_reader :index
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class UnlimitedApiClient
3
4
  def stack_id?
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class User < ActiveRecord::Base
3
+ class User < Record
3
4
  DEFAULT_AVATAR = URI.parse('https://avatars.githubusercontent.com/u/583231?')
4
5
 
5
6
  has_many :memberships
@@ -23,9 +24,9 @@ module Shipit
23
24
  end
24
25
 
25
26
  def self.find_or_create_author_from_github_commit(github_commit)
26
- if github_commit.commit.message =~ /^#{PullRequest::MERGE_REQUEST_FIELD}: ([\w\-\.]+)$/
27
+ if (match_info = github_commit.commit.message.match(/^#{PullRequest::MERGE_REQUEST_FIELD}: ([\w\-\.]+)$/))
27
28
  begin
28
- return find_or_create_by_login!($1)
29
+ return find_or_create_by_login!(match_info[1])
29
30
  rescue Octokit::NotFound
30
31
  # Corner case where the merge-requested-by user cannot be found (renamed/deleted).
31
32
  # In this case we carry on and search for the commit author
@@ -68,7 +69,7 @@ module Shipit
68
69
  end
69
70
 
70
71
  def identifiers_for_ping
71
- {github_id: github_id, name: name, email: email, github_login: login}
72
+ { github_id: github_id, name: name, email: email, github_login: login }
72
73
  end
73
74
 
74
75
  def logged_in?
@@ -137,11 +138,12 @@ module Shipit
137
138
 
138
139
  begin
139
140
  github_api.emails
140
- .sort_by { |e| e.primary ? 0 : 1 }
141
- .map(&:email)
142
- .find { |e| email_valid_and_preferred?(e) }
143
- rescue Octokit::NotFound, Octokit::Forbidden
141
+ .sort_by { |e| e.primary ? 0 : 1 }
142
+ .map(&:email)
143
+ .find { |e| email_valid_and_preferred?(e) }
144
+ rescue Octokit::NotFound, Octokit::Forbidden, Octokit::Unauthorized
144
145
  # If the user hasn't agreed to the necessary permission, we can't access their private emails.
146
+ Rails.logger.warn("Failed to retrieve emails for user '#{github_user.name || github_user.login}'")
145
147
  nil
146
148
  end
147
149
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class VariableDefinition
3
4
  attr_reader :name, :title, :default, :select
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  module Webhooks
3
4
  class << self
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  module Webhooks
3
4
  module Handlers
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  module Webhooks
3
4
  module Handlers
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  module Webhooks
3
4
  module Handlers
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  module Webhooks
3
4
  module Handlers
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  module Webhooks
3
4
  module Handlers
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  module ConditionalAttributes
3
4
  extend ActiveSupport::Concern
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class AnonymousUserSerializer < UserSerializer
3
4
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class CommandLineUserSerializer < UserSerializer
3
4
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class CommitSerializer < ShortCommitSerializer
3
4
  include GithubUrlHelper
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class DeploySerializer < TaskSerializer
3
4
  include GithubUrlHelper
4
5
 
5
6
  has_many :commits
6
7
 
7
- attributes :compare_url, :rollback_url, :additions, :deletions
8
+ attributes :compare_url, :rollback_url, :additions, :deletions, :rollback_once_aborted_to
8
9
 
9
10
  def html_url
10
11
  stack_deploy_url(object.stack, object)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class HookSerializer < ActiveModel::Serializer
3
4
  include ConditionalAttributes
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class PullRequestSerializer < ActiveModel::Serializer
3
4
  include GithubUrlHelper
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class RollbackSerializer < DeploySerializer
3
4
  def type
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class ShortCommitSerializer < ActiveModel::Serializer
3
4
  attributes :sha, :message
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class StackSerializer < ActiveModel::Serializer
3
4
  include ConditionalAttributes
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class TailTaskSerializer < ActiveModel::Serializer
3
4
  include ChunksHelper
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class TaskSerializer < ActiveModel::Serializer
3
4
  include ConditionalAttributes
@@ -5,23 +6,7 @@ module Shipit
5
6
  has_one :author
6
7
  has_one :revision, serializer: ShortCommitSerializer
7
8
 
8
- attributes(*%i(
9
- id
10
- url
11
- html_url
12
- output_url
13
- type
14
- status
15
- action
16
- title
17
- description
18
- started_at
19
- ended_at
20
- updated_at
21
- created_at
22
- env
23
- ignored_safeties
24
- ))
9
+ attributes(:id, :url, :html_url, :output_url, :type, :status, :action, :title, :description, :started_at, :ended_at, :updated_at, :created_at, :env, :ignored_safeties)
25
10
 
26
11
  def revision
27
12
  object.until_commit
@@ -1,5 +1,10 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class UserSerializer < ActiveModel::Serializer
3
- attributes :id, :name, :email, :login, :avatar_url, :created_at, :updated_at, :github_id
4
+ attributes :id, :name, :email, :login, :avatar_url, :created_at, :updated_at, :github_id, :anonymous
5
+
6
+ def anonymous
7
+ !object.logged_in?
8
+ end
4
9
  end
5
10
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  class AsciiOnlyValidator < ActiveModel::EachValidator
2
3
  def validate_each(record, attribute, value)
3
4
  if value && !value.ascii_only?
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  class SubsetValidator < ActiveModel::EachValidator
2
3
  def validate_each(record, attribute, value)
3
4
  superset = options[:of]
@@ -2,7 +2,7 @@
2
2
  <html lang="<%= I18n.locale %>" data-controller="<%= controller_name %>" data-action="<%= action_name %>">
3
3
  <head>
4
4
  <% if @stack %>
5
- <title><%= Shipit.app_name %> - <%= @stack.repo_name %>/<%= @stack.environment %></title>
5
+ <title><%= @stack.repo_name %>/<%= @stack.environment %> - <%= Shipit.app_name %></title>
6
6
  <% else %>
7
7
  <title><%= Shipit.app_name %></title>
8
8
  <% end %>
@@ -7,7 +7,7 @@
7
7
  <% variables.each do |variable| %>
8
8
  <p class="variables-fields">
9
9
  <% if variable.select %>
10
- <%= field.select variable.name, options_for_select([["Please select...", { disabled: "disabled", selected: true }]] + variable.select) %>
10
+ <%= field.select variable.name, options_for_select([["Please select...", { disabled: "disabled" }]] + variable.select, variable.default || "Please select...") %>
11
11
  <% else %>
12
12
  <%= field.text_field variable.name, value: variable.default %>
13
13
  <% end %>
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  # Derived from http://timnew.me/blog/2013/04/07/multiple-project-summary-reporting-standard-cctray-xml-feed/
2
- status_map = {'backlogged' => 'failure', 'locked' => 'failure'}
3
+ status_map = { 'backlogged' => 'failure', 'locked' => 'failure' }
3
4
  xml.instruct!
4
5
  xml.Projects do
5
6
  xml.Project(
@@ -1,8 +1,8 @@
1
1
  <% content_for :task_title do %>
2
2
  <% if @deploy.rollback? %>
3
- rolling back to
3
+ <%= @deploy.active? ? "rolling back to" : "rolled back to" %>
4
4
  <% else %>
5
- deploying
5
+ <%= @deploy.active? ? "deploying" : "deployed" %>
6
6
  <% end %>
7
7
  <span class="short-sha"><%= link_to_github_deploy(@deploy) %></span>
8
8
  <%= timeago_tag(@deploy.created_at, force: true) %>
@@ -38,6 +38,9 @@
38
38
  <%= link_to "#{definition.action}…", new_stack_tasks_path(stack, definition_id: definition.id), class: "trigger-deploy" %>
39
39
  </li>
40
40
  <% end %>
41
+ <li class="nav__list__sub__item">
42
+ <%= link_to "All tasks", stack_tasks_list_path(stack), class: "trigger-deploy" %>
43
+ </li>
41
44
  </ul>
42
45
  </li>
43
46
  <% end %>
@@ -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>
@@ -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.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 %>">
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>
@@ -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
@@ -32,9 +32,9 @@ en:
32
32
  links: More
33
33
  deploy_link: View website
34
34
  commit:
35
- lock: This commit is safe to deploy. Click to mark it as unsafe.
36
- unlock: This commit was marked as unsafe to deploy. Click to mark it as safe.
37
- 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."
38
38
  confirm_unlock: Mark this commit as safe to deploy?
39
39
  release:
40
40
  validate: Mark the release as healthy
@@ -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
@@ -62,6 +65,7 @@ Shipit::Engine.routes.draw do
62
65
  patch '/' => 'stacks#update'
63
66
  delete '/' => 'stacks#destroy'
64
67
  get :settings, controller: :stacks
68
+ get :all_tasks, controller: :stacks, as: :tasks_list
65
69
  get :statistics, controller: :stacks
66
70
  post :refresh, controller: :stacks
67
71
  get :refresh, controller: :stacks # For easier design, sorry :/
@@ -74,7 +78,7 @@ Shipit::Engine.routes.draw do
74
78
 
75
79
  scope '/*stack_id', stack_id: stack_id_format, as: :stack do
76
80
  get '/commit/:sha/checks' => 'commit_checks#show', as: :commit_checks
77
- 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 }
78
82
 
79
83
  get '/stats' => 'stats#show', as: :stats
80
84
 
@@ -89,7 +93,7 @@ Shipit::Engine.routes.draw do
89
93
 
90
94
  member do
91
95
  post :abort
92
- get :tail, defaults: {format: :json}
96
+ get :tail, defaults: { format: :json }
93
97
  end
94
98
  end
95
99
 
@@ -106,4 +110,8 @@ Shipit::Engine.routes.draw do
106
110
  resources :pull_requests, only: %i(index destroy create)
107
111
  end
108
112
  get '/stacks/:id' => 'stacks#lookup'
113
+
114
+ scope '/*repo', repo: %r{[^/]+/[^/]+}, as: :stack_search do
115
+ get '/' => 'stacks#index'
116
+ end
109
117
  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'
@@ -48,6 +49,7 @@ require 'shipit/rollback_commands'
48
49
  require 'shipit/environment_variables'
49
50
  require 'shipit/stat'
50
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
 
@@ -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
@@ -122,6 +128,10 @@ module Shipit
122
128
  secrets.default_merge_method || 'merge'
123
129
  end
124
130
 
131
+ def update_latest_deployed_ref
132
+ secrets.update_latest_deployed_ref
133
+ end
134
+
125
135
  def enforce_publish_config
126
136
  secrets.enforce_publish_config.presence
127
137
  end
@@ -147,7 +157,7 @@ module Shipit
147
157
  end
148
158
 
149
159
  def env
150
- {'SHIPIT' => '1'}.merge(secrets.env || {})
160
+ { 'SHIPIT' => '1' }.merge(secrets.env || {})
151
161
  end
152
162
 
153
163
  def shell_paths
@@ -159,7 +169,7 @@ module Shipit
159
169
  if revision_file.exist?
160
170
  revision_file.read
161
171
  else
162
- `git rev-parse HEAD`
172
+ %x(git rev-parse HEAD)
163
173
  end.strip
164
174
  end
165
175
  end