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 CommandLineUser
3
4
  def present?
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class Commit < ActiveRecord::Base
3
+ class Commit < Record
3
4
  include DeferredTouch
4
5
 
5
6
  RECENT_COMMIT_THRESHOLD = 10.seconds
@@ -92,7 +93,7 @@ module Shipit
92
93
  committer = User.find_or_create_committer_from_github_commit(commit)
93
94
  committer ||= Anonymous.new
94
95
 
95
- new(
96
+ record = new(
96
97
  sha: commit.sha,
97
98
  message: commit.commit.message,
98
99
  author: author,
@@ -102,12 +103,18 @@ module Shipit
102
103
  additions: commit.stats&.additions,
103
104
  deletions: commit.stats&.deletions,
104
105
  )
106
+
107
+ if record.pull_request?
108
+ record.pull_request_head_sha = commit.parents.last.sha
109
+ end
110
+
111
+ record
105
112
  end
106
113
 
107
114
  def message=(message)
108
115
  limit = self.class.columns_hash['message'].limit
109
116
  if limit && message && message.size > limit
110
- message = message.slice(0, limit)
117
+ message = message.truncate_bytes(limit)
111
118
  end
112
119
  super(message)
113
120
  end
@@ -338,7 +345,7 @@ module Shipit
338
345
  new_status = status
339
346
 
340
347
  unless already_deployed
341
- payload = {commit: self, stack: stack, status: new_status.state}
348
+ payload = { commit: self, stack: stack, status: new_status.state }
342
349
  if previous_status != new_status
343
350
  Hook.emit(:commit_status, stack, payload.merge(commit_status: new_status))
344
351
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class CommitChecks < EphemeralCommitChecks
3
4
  OUTPUT_TTL = 10.minutes.to_i
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class CommitDeployment < ActiveRecord::Base
3
+ class CommitDeployment < Record
3
4
  belongs_to :task
4
5
  has_many :statuses, dependent: :destroy, class_name: 'CommitDeploymentStatus'
5
6
 
@@ -56,7 +57,7 @@ module Shipit
56
57
  from_sha: task.since_commit.sha,
57
58
  to_sha: task.until_commit.sha,
58
59
  },
59
- },
60
+ }.to_json,
60
61
  )
61
62
  end
62
63
  end
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class CommitDeploymentStatus < ActiveRecord::Base
3
+ class CommitDeploymentStatus < Record
3
4
  DESCRIPTION_CHARACTER_LIMIT_ON_GITHUB = 140
4
5
 
5
6
  belongs_to :commit_deployment
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class CommitMessage
3
4
  GITHUB_MERGE_COMMIT_PATTERN = /\AMerge pull request #(?<pr_id>\d+) from \S+\n\n(?<pr_title>.*)/
@@ -1,11 +1,12 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class Delivery < ActiveRecord::Base
3
+ class Delivery < Record
3
4
  STATUSES = %w(pending scheduled sent).freeze
4
5
  enum status: STATUSES.zip(STATUSES).to_h
5
6
 
6
7
  belongs_to :hook
7
8
 
8
- validates :url, presence: true, url: {no_local: true, allow_blank: true}
9
+ validates :url, presence: true, url: { no_local: true, allow_blank: true }
9
10
  validates :content_type, presence: true
10
11
 
11
12
  serialize :response_headers, JSON
@@ -36,7 +37,7 @@ module Shipit
36
37
  def http
37
38
  Faraday::Connection.new do |connection|
38
39
  connection.headers = headers
39
- connection.adapter Faraday.default_adapter
40
+ connection.adapter(Faraday.default_adapter)
40
41
  end
41
42
  end
42
43
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'fileutils'
2
3
 
3
4
  module Shipit
@@ -108,8 +109,8 @@ module Shipit
108
109
  end
109
110
 
110
111
  # Rolls the stack back to the most recent **previous** successful deploy
111
- def trigger_revert(force: false)
112
- previous_successful_commit = commit_to_rollback_to
112
+ def trigger_revert(force: false, rollback_to: nil)
113
+ previous_successful_commit = rollback_to&.until_commit || commit_to_rollback_to
113
114
 
114
115
  rollback = Rollback.create!(
115
116
  user_id: user_id,
@@ -248,24 +249,12 @@ module Shipit
248
249
 
249
250
  # Create one for each pull request in the batch, to give feedback on the PR timeline
250
251
  commits.select(&:pull_request?).each do |commit|
251
- if (pull_request_head = pull_request_head_for_commit(commit))
252
- commit_deployments.create!(sha: pull_request_head)
253
- end
252
+ next if commit.pull_request_head_sha.blank? # This attribute was not always populated
253
+ commit_deployments.create!(sha: commit.pull_request_head_sha)
254
254
  end
255
255
 
256
256
  # Immediately update to publish the status to the commit deployments
257
257
  update_commit_deployments
258
- rescue Octokit::ClientError => error
259
- Rails.logger.warn("Got #{error.class.name} (#{error.message}) when creating CommitDeployments for Deploy##{id}")
260
- end
261
-
262
- def pull_request_head_for_commit(commit)
263
- pull_request = Shipit.github.api.pull_request(commit.stack.github_repo_name, commit.pull_request_number)
264
- pull_request.head.sha
265
- rescue Octokit::ClientError => error
266
- pr_ref = "#{commit.stack.github_repo_name}##{commit.pull_request_number}"
267
- Rails.logger.warn("Got #{error.class.name} (#{error.message}) when loading pull request #{pr_ref}")
268
- nil
269
258
  end
270
259
 
271
260
  def update_release_status
@@ -293,7 +282,7 @@ module Shipit
293
282
  def trigger_revert_if_required
294
283
  return unless rollback_once_aborted?
295
284
  return unless supports_rollback?
296
- trigger_revert
285
+ trigger_revert(rollback_to: rollback_once_aborted_to)
297
286
  end
298
287
 
299
288
  def default_since_commit_id
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'pathname'
2
3
 
3
4
  module Shipit
@@ -5,20 +6,34 @@ module Shipit
5
6
  Error = Class.new(StandardError)
6
7
 
7
8
  class << self
9
+ attr_accessor :pretty_generate
10
+
8
11
  def load(json)
9
12
  config = json.blank? ? {} : JSON.parse(json)
10
13
  new(config)
11
14
  end
12
15
 
13
16
  def dump(spec)
14
- JSON.dump(spec.cacheable.config) if spec
17
+ return unless spec
18
+
19
+ if pretty_generate?
20
+ JSON.pretty_generate(spec.cacheable.config)
21
+ else
22
+ JSON.dump(spec.cacheable.config)
23
+ end
15
24
  end
16
25
 
17
26
  def bundle_path
18
27
  Rails.root.join('data', 'bundler')
19
28
  end
29
+
30
+ def pretty_generate?
31
+ @pretty_generate
32
+ end
20
33
  end
21
34
 
35
+ self.pretty_generate = false
36
+
22
37
  def initialize(config)
23
38
  @config = config
24
39
  end
@@ -40,6 +55,10 @@ module Shipit
40
55
  end
41
56
  end
42
57
 
58
+ def blank?
59
+ config.empty?
60
+ end
61
+
43
62
  def supports_fetch_deployed_revision?
44
63
  fetch_deployed_revision_steps.present?
45
64
  end
@@ -255,11 +274,11 @@ module Shipit
255
274
  end
256
275
 
257
276
  def task_not_found!(id)
258
- raise TaskDefinition::NotFound.new("No definition for task #{id.inspect}")
277
+ raise TaskDefinition::NotFound, "No definition for task #{id.inspect}"
259
278
  end
260
279
 
261
280
  def cant_detect!(type)
262
- raise DeploySpec::Error.new(I18n.t("deploy_spec.hint.#{type}"))
281
+ raise DeploySpec::Error, I18n.t("deploy_spec.hint.#{type}")
263
282
  end
264
283
  end
265
284
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class DeploySpec
3
4
  module BundlerDiscovery
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class DeploySpec
3
4
  module CapistranoDiscovery
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class DeploySpec
3
4
  class FileSystem < DeploySpec
@@ -61,14 +62,14 @@ module Shipit
61
62
  'context' => release_status_context,
62
63
  'delay' => release_status_delay,
63
64
  },
64
- 'dependencies' => {'override' => dependencies_steps},
65
+ 'dependencies' => { 'override' => dependencies_steps },
65
66
  'deploy' => {
66
67
  'override' => deploy_steps,
67
68
  'variables' => deploy_variables.map(&:to_h),
68
69
  'max_commits' => maximum_commits_per_deploy,
69
70
  'interval' => pause_between_deploys,
70
71
  },
71
- 'rollback' => {'override' => rollback_steps},
72
+ 'rollback' => { 'override' => rollback_steps },
72
73
  'fetch' => fetch_deployed_revision_steps,
73
74
  'tasks' => cacheable_tasks,
74
75
  )
@@ -84,10 +85,16 @@ module Shipit
84
85
  end
85
86
 
86
87
  def load_config
87
- read_config(file("shipit.#{@env}.yml", root: true)) ||
88
+ read_config(file("#{app_name}.#{@env}.yml", root: true)) ||
89
+ read_config(file("#{app_name}.yml", root: true)) ||
90
+ read_config(file("shipit.#{@env}.yml", root: true)) ||
88
91
  read_config(file('shipit.yml', root: true))
89
92
  end
90
93
 
94
+ def app_name
95
+ @app_name ||= Shipit.app_name.downcase
96
+ end
97
+
91
98
  def read_config(path)
92
99
  SafeYAML.load(path.read) if path.exist?
93
100
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class DeploySpec
3
4
  module KubernetesDiscovery
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'json'
2
3
 
3
4
  module Shipit
@@ -1,13 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  require 'json'
2
3
 
3
4
  module Shipit
4
5
  class DeploySpec
5
6
  module NpmDiscovery
6
7
  # https://docs.npmjs.com/cli/publish
7
- PUBLIC = 'public'.freeze
8
- PRIVATE = 'restricted'.freeze
8
+ PUBLIC = 'public'
9
+ PRIVATE = 'restricted'
9
10
  VALID_ACCESS = [PUBLIC, PRIVATE].freeze
10
- NPM_REGISTRY = "https://registry.npmjs.org/".freeze
11
+ NPM_REGISTRY = "https://registry.npmjs.org/"
11
12
 
12
13
  def discover_dependencies_steps
13
14
  discover_package_json || super
@@ -57,7 +58,7 @@ module Shipit
57
58
  # are treated as 'next' npm dist-tags.
58
59
  # An 1.0.0-beta.1 would be installable using both:
59
60
  # `yarn add package@1.0.0-beta.1` and `yarn add package@next`
60
- return 'next' if ['-beta', '-alpha', '-rc', '-next'].any? { |tag| version.include? tag }
61
+ return 'next' if ['-beta', '-alpha', '-rc', '-next'].any? { |tag| version.include?(tag) }
61
62
  'latest'
62
63
  end
63
64
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class DeploySpec
3
4
  module PypiDiscovery
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class DeploySpec
3
4
  module RubygemsDiscovery
@@ -1,10 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class DeployStats
3
4
  delegate :empty?, to: :@deploys
4
5
 
5
6
  def initialize(deploys)
6
7
  @deploys = deploys
7
- @durations = @deploys.map { |d| d.duration.value }.compact
8
+ @durations = @deploys.map { |d| d.duration&.value }.compact
8
9
  end
9
10
 
10
11
  def count
@@ -1,15 +1,16 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class Duration < ActiveSupport::Duration
3
4
  ParseError = Class.new(ArgumentError)
4
5
 
5
- FORMAT = /
6
+ FORMAT = %r{
6
7
  \A
7
8
  (?<days>\d+d)?
8
9
  (?<hours>\d+h)?
9
10
  (?<minutes>\d+m)?
10
11
  (?<seconds>\d+s?)?
11
12
  \z
12
- /x
13
+ }x
13
14
  UNITS = {
14
15
  's' => :seconds,
15
16
  'm' => :minutes,
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  class EphemeralCommitChecks
3
4
  FINAL_STATUSES = %w(failed error success).freeze
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class GithubHook < ActiveRecord::Base
3
+ class GithubHook < Record
3
4
  # TODO: app-migration, delete class
4
5
  belongs_to :stack, required: false # Required for fixtures
5
6
 
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
3
  module GithubStatus
3
- CACHE_KEY = 'github::status'.freeze
4
+ CACHE_KEY = 'github::status'
4
5
 
5
6
  class << self
6
7
  def status
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class Hook < ActiveRecord::Base
3
+ class Hook < Record
3
4
  class DeliverySpec
4
5
  def initialize(event:, url:, content_type:, payload:)
5
6
  @event = event
@@ -19,7 +20,7 @@ module Shipit
19
20
  def http
20
21
  Faraday::Connection.new do |connection|
21
22
  connection.headers = headers
22
- connection.adapter Faraday.default_adapter
23
+ connection.adapter(Faraday.default_adapter)
23
24
  end
24
25
  end
25
26
 
@@ -57,9 +58,9 @@ module Shipit
57
58
  belongs_to :stack, required: false
58
59
  has_many :deliveries
59
60
 
60
- validates :delivery_url, presence: true, url: {no_local: true, allow_blank: true}
61
- validates :content_type, presence: true, inclusion: {in: CONTENT_TYPES.keys}
62
- validates :events, presence: true, subset: {of: EVENTS}
61
+ validates :delivery_url, presence: true, url: { no_local: true, allow_blank: true }
62
+ validates :content_type, presence: true, inclusion: { in: CONTENT_TYPES.keys }
63
+ validates :events, presence: true, subset: { of: EVENTS }
63
64
 
64
65
  serialize :events, Shipit::CSVSerializer
65
66
 
@@ -1,8 +1,9 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class Membership < ActiveRecord::Base
3
+ class Membership < Record
3
4
  belongs_to :team, required: true
4
5
  belongs_to :user, required: true
5
6
 
6
- validates :user_id, uniqueness: {scope: :team_id}
7
+ validates :user_id, uniqueness: { scope: :team_id }
7
8
  end
8
9
  end
@@ -1,11 +1,16 @@
1
+ # frozen_string_literal: true
1
2
  module Shipit
2
- class OutputChunk < ActiveRecord::Base
3
+ class OutputChunk < Record
3
4
  belongs_to :task
4
5
 
5
6
  scope :tail, ->(start) { order(id: :asc).where('id > ?', start || 0) }
6
7
 
7
8
  def text=(string)
8
- super(string.force_encoding(Encoding::UTF_8).scrub)
9
+ if string.frozen?
10
+ super(string)
11
+ else
12
+ super(string.force_encoding(Encoding::UTF_8).scrub)
13
+ end
9
14
  end
10
15
  end
11
16
  end