shipit-engine 0.5.2 → 0.6.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 (274) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/shipit/api/cacheable.rb +13 -0
  3. data/app/controllers/concerns/shipit/api/paginable.rb +37 -0
  4. data/app/controllers/concerns/shipit/api/rendering.rb +25 -0
  5. data/app/controllers/concerns/{api/paginable.rb → shipit/pagination.rb} +5 -13
  6. data/app/controllers/shipit/api/base_controller.rb +68 -0
  7. data/app/controllers/shipit/api/deploys_controller.rb +17 -0
  8. data/app/controllers/shipit/api/hooks_controller.rb +53 -0
  9. data/app/controllers/shipit/api/locks_controller.rb +32 -0
  10. data/app/controllers/shipit/api/outputs_controller.rb +17 -0
  11. data/app/controllers/shipit/api/stacks_controller.rb +21 -0
  12. data/app/controllers/shipit/api/tasks_controller.rb +20 -0
  13. data/app/controllers/shipit/commit_checks_controller.rb +26 -0
  14. data/app/controllers/shipit/deploys_controller.rb +47 -0
  15. data/app/controllers/shipit/github_authentication_controller.rb +27 -0
  16. data/app/controllers/shipit/rollbacks_controller.rb +26 -0
  17. data/app/controllers/shipit/shipit_controller.rb +62 -0
  18. data/app/controllers/shipit/stacks_controller.rb +81 -0
  19. data/app/controllers/shipit/status_controller.rb +7 -0
  20. data/app/controllers/shipit/tasks_controller.rb +48 -0
  21. data/app/controllers/shipit/webhooks_controller.rb +101 -0
  22. data/app/helpers/shipit/chunks_helper.rb +8 -0
  23. data/app/helpers/shipit/deploys_helper.rb +28 -0
  24. data/app/helpers/shipit/github_url_helper.rb +48 -0
  25. data/app/helpers/shipit/shipit_helper.rb +64 -0
  26. data/app/helpers/shipit/stacks_helper.rb +78 -0
  27. data/app/helpers/shipit/tasks_helper.rb +11 -0
  28. data/app/jobs/shipit/background_job.rb +24 -0
  29. data/app/jobs/shipit/background_job/unique.rb +28 -0
  30. data/app/jobs/shipit/cache_deploy_spec_job.rb +12 -0
  31. data/app/jobs/shipit/chunk_rollup_job.rb +21 -0
  32. data/app/jobs/shipit/clear_git_cache_job.rb +9 -0
  33. data/app/jobs/shipit/deliver_hook_job.rb +9 -0
  34. data/app/jobs/shipit/destroy_stack_job.rb +9 -0
  35. data/app/jobs/shipit/emit_event_job.rb +10 -0
  36. data/app/jobs/shipit/fetch_commit_stats_job.rb +9 -0
  37. data/app/jobs/shipit/fetch_deployed_revision_job.rb +23 -0
  38. data/app/jobs/shipit/git_mirror_update_job.rb +12 -0
  39. data/app/jobs/shipit/github_sync_job.rb +55 -0
  40. data/app/jobs/shipit/perform_commit_checks_job.rb +7 -0
  41. data/app/jobs/shipit/perform_task_job.rb +57 -0
  42. data/app/jobs/shipit/refresh_github_user_job.rb +9 -0
  43. data/app/jobs/shipit/refresh_statuses_job.rb +14 -0
  44. data/app/jobs/shipit/setup_github_hook_job.rb +11 -0
  45. data/app/models/shipit/anonymous_user.rb +43 -0
  46. data/app/models/shipit/api_client.rb +44 -0
  47. data/app/models/shipit/commit.rb +209 -0
  48. data/app/models/shipit/commit_checks.rb +90 -0
  49. data/app/models/shipit/delivery.rb +47 -0
  50. data/app/models/shipit/deploy.rb +153 -0
  51. data/app/models/shipit/deploy_spec.rb +150 -0
  52. data/app/models/shipit/deploy_spec/bundler_discovery.rb +61 -0
  53. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +29 -0
  54. data/app/models/shipit/deploy_spec/file_system.rb +64 -0
  55. data/app/models/shipit/deploy_spec/pypi_discovery.rb +34 -0
  56. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +34 -0
  57. data/app/models/shipit/github_hook.rb +148 -0
  58. data/app/models/shipit/hook.rb +86 -0
  59. data/app/models/shipit/membership.rb +8 -0
  60. data/app/models/shipit/missing_status.rb +21 -0
  61. data/app/models/shipit/output_chunk.rb +11 -0
  62. data/app/models/shipit/rollback.rb +31 -0
  63. data/app/models/shipit/stack.rb +308 -0
  64. data/app/models/shipit/status.rb +44 -0
  65. data/app/models/shipit/status_group.rb +35 -0
  66. data/app/models/shipit/task.rb +201 -0
  67. data/app/models/shipit/task_definition.rb +38 -0
  68. data/app/models/shipit/team.rb +69 -0
  69. data/app/models/shipit/unknown_status.rb +43 -0
  70. data/app/models/shipit/user.rb +83 -0
  71. data/app/models/shipit/variable_definition.rb +21 -0
  72. data/app/serializers/concerns/shipit/conditional_attributes.rb +22 -0
  73. data/app/serializers/shipit/anonymous_user_serializer.rb +4 -0
  74. data/app/serializers/shipit/commit_serializer.rb +8 -0
  75. data/app/serializers/shipit/deploy_serializer.rb +15 -0
  76. data/app/serializers/shipit/hook_serializer.rb +12 -0
  77. data/app/serializers/shipit/rollback_serializer.rb +7 -0
  78. data/app/serializers/shipit/short_commit_serializer.rb +9 -0
  79. data/app/serializers/shipit/stack_serializer.rb +33 -0
  80. data/app/serializers/shipit/tail_task_serializer.rb +39 -0
  81. data/app/serializers/shipit/task_serializer.rb +30 -0
  82. data/app/serializers/shipit/user_serializer.rb +5 -0
  83. data/app/views/{commits → shipit/commits}/_commit.html.erb +1 -1
  84. data/app/views/{commits → shipit/commits}/_commit_author.html.erb +0 -0
  85. data/app/views/{deploys → shipit/deploys}/_checklist.html.erb +0 -0
  86. data/app/views/{deploys → shipit/deploys}/_checks.html.erb +0 -0
  87. data/app/views/{deploys → shipit/deploys}/_concurrent_deploy_warning.html.erb +0 -0
  88. data/app/views/{deploys → shipit/deploys}/_deploy.html.erb +1 -1
  89. data/app/views/{deploys → shipit/deploys}/_monitoring.html.erb +0 -0
  90. data/app/views/{deploys → shipit/deploys}/_summary.html.erb +0 -0
  91. data/app/views/{deploys → shipit/deploys}/new.html.erb +3 -3
  92. data/app/views/{deploys → shipit/deploys}/rollback.html.erb +2 -2
  93. data/app/views/{deploys → shipit/deploys}/show.html.erb +1 -1
  94. data/app/views/{github_authentication → shipit/github_authentication}/failed.html.erb +0 -0
  95. data/app/views/{stacks → shipit/stacks}/_header.html.erb +0 -0
  96. data/app/views/{stacks → shipit/stacks}/index.html.erb +0 -0
  97. data/app/views/{stacks → shipit/stacks}/new.html.erb +0 -0
  98. data/app/views/{stacks → shipit/stacks}/settings.html.erb +1 -1
  99. data/app/views/{stacks → shipit/stacks}/show.html.erb +2 -2
  100. data/app/views/{statuses → shipit/statuses}/_group.html.erb +1 -1
  101. data/app/views/{statuses → shipit/statuses}/_status.html.erb +0 -0
  102. data/app/views/{tasks → shipit/tasks}/_task.html.erb +1 -1
  103. data/app/views/{tasks → shipit/tasks}/_task_output.html.erb +1 -1
  104. data/app/views/{tasks → shipit/tasks}/index.html.erb +1 -1
  105. data/app/views/{tasks → shipit/tasks}/new.html.erb +1 -1
  106. data/app/views/{tasks → shipit/tasks}/show.html.erb +1 -1
  107. data/db/migrate/20160104151742_increase_tasks_type_size_back.rb +5 -0
  108. data/db/migrate/20160104151833_convert_sti_columns.rb +10 -0
  109. data/lib/shipit.rb +11 -10
  110. data/lib/shipit/command.rb +171 -0
  111. data/lib/shipit/commands.rb +25 -0
  112. data/lib/shipit/deploy_commands.rb +21 -0
  113. data/lib/shipit/engine.rb +3 -0
  114. data/lib/shipit/rollback_commands.rb +7 -0
  115. data/lib/shipit/stack_commands.rb +60 -0
  116. data/lib/shipit/task_commands.rb +68 -0
  117. data/lib/shipit/version.rb +1 -1
  118. data/lib/tasks/cron.rake +3 -3
  119. data/test/controllers/api/base_controller_test.rb +18 -14
  120. data/test/controllers/api/deploys_controller_test.rb +56 -52
  121. data/test/controllers/api/hooks_controller_test.rb +62 -58
  122. data/test/controllers/api/locks_controller_test.rb +38 -34
  123. data/test/controllers/api/outputs_controller_test.rb +15 -11
  124. data/test/controllers/api/stacks_controller_test.rb +56 -52
  125. data/test/controllers/api/tasks_controller_test.rb +30 -26
  126. data/test/controllers/commit_checks_controller_test.rb +29 -27
  127. data/test/controllers/deploys_controller_test.rb +68 -66
  128. data/test/controllers/github_authentication_controller_test.rb +9 -7
  129. data/test/controllers/rollbacks_controller_test.rb +43 -41
  130. data/test/controllers/stacks_controller_test.rb +131 -128
  131. data/test/controllers/status_controller_test.rb +8 -6
  132. data/test/controllers/tasks_controller_test.rb +70 -68
  133. data/test/controllers/webhooks_controller_test.rb +127 -125
  134. data/test/dummy/db/development.sqlite3 +0 -0
  135. data/test/dummy/db/schema.rb +2 -2
  136. data/test/dummy/db/seeds.rb +133 -131
  137. data/test/dummy/db/test.sqlite3 +0 -0
  138. data/test/fixtures/{api_clients.yml → shipit/api_clients.yml} +0 -0
  139. data/test/fixtures/{commits.yml → shipit/commits.yml} +0 -0
  140. data/test/fixtures/{deliveries.yml → shipit/deliveries.yml} +0 -0
  141. data/test/fixtures/{github_hooks.yml → shipit/github_hooks.yml} +4 -4
  142. data/test/fixtures/{hooks.yml → shipit/hooks.yml} +0 -0
  143. data/test/fixtures/{memberships.yml → shipit/memberships.yml} +0 -0
  144. data/test/fixtures/{output_chunks.yml → shipit/output_chunks.yml} +0 -0
  145. data/test/fixtures/{stacks.yml → shipit/stacks.yml} +0 -0
  146. data/test/fixtures/{statuses.yml → shipit/statuses.yml} +0 -0
  147. data/test/fixtures/{tasks.yml → shipit/tasks.yml} +8 -8
  148. data/test/fixtures/{teams.yml → shipit/teams.yml} +0 -0
  149. data/test/fixtures/{users.yml → shipit/users.yml} +0 -0
  150. data/test/helpers/api_helper.rb +1 -1
  151. data/test/helpers/fixture_aliases_helper.rb +4 -4
  152. data/test/jobs/cache_deploy_spec_job_test.rb +15 -13
  153. data/test/jobs/chunk_rollup_job_test.rb +30 -28
  154. data/test/jobs/deliver_hook_job_test.rb +11 -9
  155. data/test/jobs/destroy_stack_job_test.rb +11 -9
  156. data/test/jobs/emit_event_job_test.rb +10 -8
  157. data/test/jobs/fetch_commit_stats_job_test.rb +10 -8
  158. data/test/jobs/fetch_deployed_revision_job_test.rb +24 -22
  159. data/test/jobs/github_sync_job_test.rb +51 -49
  160. data/test/jobs/perform_task_job_test.rb +78 -76
  161. data/test/jobs/refresh_github_user_job_test.rb +10 -8
  162. data/test/jobs/refresh_status_job_test.rb +14 -12
  163. data/test/jobs/unique_job_test.rb +18 -15
  164. data/test/models/api_client_test.rb +20 -18
  165. data/test/models/commit_checks_test.rb +63 -61
  166. data/test/models/commits_test.rb +317 -314
  167. data/test/models/delivery_test.rb +29 -27
  168. data/test/models/deploys_test.rb +289 -287
  169. data/test/models/github_hook_test.rb +45 -43
  170. data/test/models/hook_test.rb +44 -42
  171. data/test/models/membership_test.rb +9 -7
  172. data/test/models/missing_status_test.rb +16 -14
  173. data/test/models/output_chunk_test.rb +14 -12
  174. data/test/models/rollbacks_test.rb +14 -12
  175. data/test/models/stacks_test.rb +272 -270
  176. data/test/models/status_group_test.rb +18 -16
  177. data/test/models/status_test.rb +42 -40
  178. data/test/models/task_definitions_test.rb +27 -25
  179. data/test/models/team_test.rb +39 -37
  180. data/test/models/users_test.rb +61 -59
  181. data/test/unit/command_test.rb +43 -41
  182. data/test/unit/commands_test.rb +8 -6
  183. data/test/unit/csv_serializer_test.rb +28 -26
  184. data/test/unit/deploy_commands_test.rb +179 -176
  185. data/test/unit/deploy_spec_test.rb +237 -235
  186. data/test/unit/github_url_helper_test.rb +19 -17
  187. data/test/unit/shipit_test.rb +44 -42
  188. metadata +139 -137
  189. data/app/controllers/api/base_controller.rb +0 -66
  190. data/app/controllers/api/deploys_controller.rb +0 -15
  191. data/app/controllers/api/hooks_controller.rb +0 -51
  192. data/app/controllers/api/locks_controller.rb +0 -30
  193. data/app/controllers/api/outputs_controller.rb +0 -15
  194. data/app/controllers/api/stacks_controller.rb +0 -19
  195. data/app/controllers/api/tasks_controller.rb +0 -18
  196. data/app/controllers/commit_checks_controller.rb +0 -24
  197. data/app/controllers/concerns/api/cacheable.rb +0 -11
  198. data/app/controllers/concerns/api/rendering.rb +0 -23
  199. data/app/controllers/concerns/pagination.rb +0 -25
  200. data/app/controllers/deploys_controller.rb +0 -45
  201. data/app/controllers/github_authentication_controller.rb +0 -25
  202. data/app/controllers/rollbacks_controller.rb +0 -24
  203. data/app/controllers/shipit_controller.rb +0 -54
  204. data/app/controllers/stacks_controller.rb +0 -79
  205. data/app/controllers/status_controller.rb +0 -5
  206. data/app/controllers/tasks_controller.rb +0 -46
  207. data/app/controllers/webhooks_controller.rb +0 -99
  208. data/app/helpers/chunks_helper.rb +0 -6
  209. data/app/helpers/deploys_helper.rb +0 -26
  210. data/app/helpers/github_url_helper.rb +0 -46
  211. data/app/helpers/shipit_helper.rb +0 -62
  212. data/app/helpers/stacks_helper.rb +0 -76
  213. data/app/helpers/tasks_helper.rb +0 -9
  214. data/app/jobs/background_job.rb +0 -22
  215. data/app/jobs/background_job/unique.rb +0 -26
  216. data/app/jobs/cache_deploy_spec_job.rb +0 -10
  217. data/app/jobs/chunk_rollup_job.rb +0 -19
  218. data/app/jobs/clear_git_cache_job.rb +0 -7
  219. data/app/jobs/deliver_hook_job.rb +0 -7
  220. data/app/jobs/destroy_stack_job.rb +0 -7
  221. data/app/jobs/emit_event_job.rb +0 -8
  222. data/app/jobs/fetch_commit_stats_job.rb +0 -7
  223. data/app/jobs/fetch_deployed_revision_job.rb +0 -21
  224. data/app/jobs/git_mirror_update_job.rb +0 -10
  225. data/app/jobs/github_sync_job.rb +0 -53
  226. data/app/jobs/perform_commit_checks_job.rb +0 -5
  227. data/app/jobs/perform_task_job.rb +0 -55
  228. data/app/jobs/refresh_github_user_job.rb +0 -7
  229. data/app/jobs/refresh_statuses_job.rb +0 -12
  230. data/app/jobs/setup_github_hook_job.rb +0 -9
  231. data/app/models/anonymous_user.rb +0 -41
  232. data/app/models/api_client.rb +0 -42
  233. data/app/models/commit.rb +0 -207
  234. data/app/models/commit_checks.rb +0 -88
  235. data/app/models/delivery.rb +0 -45
  236. data/app/models/deploy.rb +0 -151
  237. data/app/models/deploy_spec.rb +0 -148
  238. data/app/models/deploy_spec/bundler_discovery.rb +0 -59
  239. data/app/models/deploy_spec/capistrano_discovery.rb +0 -27
  240. data/app/models/deploy_spec/file_system.rb +0 -62
  241. data/app/models/deploy_spec/pypi_discovery.rb +0 -32
  242. data/app/models/deploy_spec/rubygems_discovery.rb +0 -32
  243. data/app/models/github_hook.rb +0 -144
  244. data/app/models/hook.rb +0 -84
  245. data/app/models/membership.rb +0 -6
  246. data/app/models/missing_status.rb +0 -18
  247. data/app/models/output_chunk.rb +0 -9
  248. data/app/models/rollback.rb +0 -29
  249. data/app/models/stack.rb +0 -306
  250. data/app/models/status.rb +0 -42
  251. data/app/models/status_group.rb +0 -33
  252. data/app/models/task.rb +0 -197
  253. data/app/models/task_definition.rb +0 -36
  254. data/app/models/team.rb +0 -67
  255. data/app/models/unknown_status.rb +0 -41
  256. data/app/models/user.rb +0 -81
  257. data/app/models/variable_definition.rb +0 -19
  258. data/app/serializers/anonymous_user_serializer.rb +0 -2
  259. data/app/serializers/commit_serializer.rb +0 -6
  260. data/app/serializers/concerns/conditional_attributes.rb +0 -20
  261. data/app/serializers/deploy_serializer.rb +0 -13
  262. data/app/serializers/hook_serializer.rb +0 -10
  263. data/app/serializers/rollback_serializer.rb +0 -5
  264. data/app/serializers/short_commit_serializer.rb +0 -7
  265. data/app/serializers/stack_serializer.rb +0 -31
  266. data/app/serializers/tail_task_serializer.rb +0 -37
  267. data/app/serializers/task_serializer.rb +0 -28
  268. data/app/serializers/user_serializer.rb +0 -3
  269. data/lib/command.rb +0 -169
  270. data/lib/commands.rb +0 -23
  271. data/lib/deploy_commands.rb +0 -19
  272. data/lib/rollback_commands.rb +0 -5
  273. data/lib/stack_commands.rb +0 -58
  274. data/lib/task_commands.rb +0 -66
data/app/models/stack.rb DELETED
@@ -1,306 +0,0 @@
1
- require 'fileutils'
2
-
3
- class Stack < ActiveRecord::Base
4
- REPO_OWNER_MAX_SIZE = 39
5
- REPO_NAME_MAX_SIZE = 100
6
- ENVIRONMENT_MAX_SIZE = 50
7
- REQUIRED_HOOKS = %i(push status)
8
-
9
- has_many :commits, dependent: :destroy
10
- has_many :tasks, dependent: :destroy
11
- has_many :deploys
12
- has_many :rollbacks
13
- has_many :deploys_and_rollbacks, -> { where(type: %w(Deploy Rollback)) }, class_name: 'Task'
14
- has_many :github_hooks, dependent: :destroy, class_name: 'GithubHook::Repo'
15
- has_many :hooks, dependent: :destroy
16
- has_many :api_clients, dependent: :destroy
17
- belongs_to :lock_author, class_name: :User
18
-
19
- def lock_author(*)
20
- super || AnonymousUser.new
21
- end
22
-
23
- def lock_author=(user)
24
- super(user.try!(:logged_in?) ? user : nil)
25
- end
26
-
27
- before_validation :update_defaults
28
- before_destroy :clear_local_files
29
- after_commit :emit_hooks
30
- after_commit :broadcast_update, on: :update
31
- after_commit :setup_hooks, :sync_github, on: :create
32
- after_touch :clear_cache
33
-
34
- validates :repo_name, uniqueness: {scope: %i(repo_owner environment)}
35
- validates :repo_owner, :repo_name, :environment, presence: true, ascii_only: true
36
- validates :repo_owner, format: {with: /\A[a-z0-9_\-\.]+\z/}, length: {maximum: REPO_OWNER_MAX_SIZE}
37
- validates :repo_name, format: {with: /\A[a-z0-9_\-\.]+\z/}, length: {maximum: REPO_NAME_MAX_SIZE}
38
- validates :environment, format: {with: /\A[a-z0-9\-_\:]+\z/}, length: {maximum: ENVIRONMENT_MAX_SIZE}
39
-
40
- validates :lock_reason, length: {maximum: 4096}
41
-
42
- serialize :cached_deploy_spec, DeploySpec
43
- delegate :find_task_definition, :supports_rollback?,
44
- :supports_fetch_deployed_revision?, to: :cached_deploy_spec, allow_nil: true
45
-
46
- def self.refresh_deployed_revisions
47
- find_each.select(&:supports_fetch_deployed_revision?).each(&:async_refresh_deployed_revision)
48
- end
49
-
50
- def undeployed_commits?
51
- undeployed_commits_count > 0
52
- end
53
-
54
- def trigger_task(definition_id, user)
55
- commit = last_deployed_commit
56
- task = tasks.create(
57
- user_id: user.id,
58
- definition: find_task_definition(definition_id),
59
- until_commit_id: commit.id,
60
- since_commit_id: commit.id,
61
- )
62
- task.enqueue
63
- task
64
- end
65
-
66
- def trigger_deploy(until_commit, user, env: nil)
67
- since_commit = last_deployed_commit
68
-
69
- deploy = deploys.create(
70
- user_id: user.id,
71
- until_commit: until_commit,
72
- since_commit: since_commit,
73
- env: env || {},
74
- )
75
- deploy.enqueue
76
- deploy
77
- end
78
-
79
- def async_refresh_deployed_revision
80
- FetchDeployedRevisionJob.perform_later(self)
81
- end
82
-
83
- def update_deployed_revision(sha)
84
- return if deploying?
85
-
86
- last_deploy = deploys_and_rollbacks.last
87
- actual_deployed_commit = commits.reachable.by_sha!(sha)
88
-
89
- if last_deploy && actual_deployed_commit == last_deploy.until_commit
90
- last_deploy.accept!
91
- elsif last_deploy && actual_deployed_commit == last_deploy.since_commit
92
- last_deploy.reject!
93
- else
94
- deploys.create!(
95
- until_commit: actual_deployed_commit,
96
- since_commit: last_deployed_commit,
97
- status: 'success',
98
- )
99
- end
100
- end
101
-
102
- def head
103
- commits.reachable.first.try!(:sha)
104
- end
105
-
106
- def status
107
- return :deploying if deploying?
108
- :default
109
- end
110
-
111
- def last_successful_deploy
112
- deploys_and_rollbacks.success.order(created_at: :desc).first
113
- end
114
-
115
- def last_deployed_commit
116
- if deploy = last_successful_deploy
117
- deploy.until_commit
118
- else
119
- commits.first
120
- end
121
- end
122
-
123
- def filter_visible_statuses(statuses)
124
- statuses.reject { |s| hidden_statuses.include?(s.context) }
125
- end
126
-
127
- def filter_meaningful_statuses(statuses)
128
- filter_visible_statuses(statuses).reject { |s| soft_failing_statuses.include?(s.context) }
129
- end
130
-
131
- def deployable?
132
- !locked? && !deploying?
133
- end
134
-
135
- def repo_name=(name)
136
- super(name.try(:downcase))
137
- end
138
-
139
- def repo_owner=(name)
140
- super(name.try(:downcase))
141
- end
142
-
143
- def repo_http_url
144
- Shipit.github_url("#{repo_owner}/#{repo_name}")
145
- end
146
-
147
- def repo_git_url
148
- "git@#{Shipit.github_domain}:#{repo_owner}/#{repo_name}.git"
149
- end
150
-
151
- def base_path
152
- Rails.root.join('data/stacks', repo_owner, repo_name, environment)
153
- end
154
-
155
- def deploys_path
156
- File.join(base_path, "deploys")
157
- end
158
-
159
- def git_path
160
- File.join(base_path, "git")
161
- end
162
-
163
- def acquire_git_cache_lock(timeout: 15, &block)
164
- Redis::Lock.new(
165
- "stack:#{id}:git-cache-lock",
166
- Shipit.redis,
167
- timeout: timeout,
168
- expiration: 60,
169
- ).lock(&block)
170
- end
171
-
172
- def clear_git_cache!
173
- tmp_path = "#{git_path}-#{SecureRandom.hex}"
174
- acquire_git_cache_lock do
175
- return unless File.exist?(git_path)
176
- File.rename(git_path, tmp_path)
177
- end
178
- FileUtils.rm_rf(tmp_path)
179
- end
180
-
181
- def github_repo_name
182
- [repo_owner, repo_name].join('/')
183
- end
184
-
185
- def github_commits
186
- Shipit.github_api.commits(github_repo_name, sha: branch)
187
- end
188
-
189
- def deploying?
190
- !!active_deploy
191
- end
192
-
193
- def active_deploy
194
- return @active_deploy if defined?(@active_deploy)
195
- @active_deploy ||= deploys_and_rollbacks.active.last
196
- end
197
-
198
- def locked?
199
- lock_reason.present?
200
- end
201
-
202
- def to_param
203
- [repo_owner, repo_name, environment].join('/')
204
- end
205
-
206
- def self.from_param!(param)
207
- repo_owner, repo_name, environment = param.split('/')
208
- where(
209
- repo_owner: repo_owner.downcase,
210
- repo_name: repo_name.downcase,
211
- environment: environment,
212
- ).first!
213
- end
214
-
215
- delegate :plugins, :task_definitions, :hidden_statuses, :required_statuses, :soft_failing_statuses,
216
- :deploy_variables, to: :cached_deploy_spec
217
-
218
- def monitoring?
219
- monitoring.present?
220
- end
221
-
222
- def monitoring
223
- cached_deploy_spec.review_monitoring
224
- end
225
-
226
- def checklist
227
- cached_deploy_spec.review_checklist
228
- end
229
-
230
- def checks?
231
- cached_deploy_spec.review_checks.present?
232
- end
233
-
234
- def update_undeployed_commits_count(after_commit = nil)
235
- after_commit ||= last_deployed_commit
236
- undeployed_commits = commits.reachable.select('count(*) as count').where('id > ?', after_commit.id)
237
- self.class.where(id: id).update_all("undeployed_commits_count = (#{undeployed_commits.to_sql})")
238
- end
239
-
240
- def broadcast_update
241
- payload = {url: Shipit::Engine.routes.url_helpers.stack_path(self)}.to_json
242
- event = Pubsubstub::Event.new(payload, name: "stack.update")
243
- Pubsubstub::RedisPubSub.publish("stack.#{id}", event)
244
- end
245
-
246
- def setup_hooks
247
- REQUIRED_HOOKS.each do |event|
248
- hook = github_hooks.find_or_create_by!(event: event)
249
- hook.schedule_setup!
250
- end
251
- end
252
-
253
- def schedule_for_destroy!
254
- DestroyStackJob.perform_later(self)
255
- end
256
-
257
- def ci_enabled?
258
- Rails.cache.fetch(ci_enabled_cache_key) do
259
- commits.joins(:statuses).any?
260
- end
261
- end
262
-
263
- def enable_ci!
264
- Rails.cache.write(ci_enabled_cache_key, true)
265
- end
266
-
267
- def mark_as_accessible!
268
- update!(inaccessible_since: nil)
269
- end
270
-
271
- def mark_as_inaccessible!
272
- update!(inaccessible_since: Time.now) unless inaccessible?
273
- end
274
-
275
- def inaccessible?
276
- inaccessible_since?
277
- end
278
-
279
- private
280
-
281
- def clear_cache
282
- remove_instance_variable(:@active_deploy) if defined?(@active_deploy)
283
- end
284
-
285
- def sync_github
286
- GithubSyncJob.perform_later(stack_id: id)
287
- end
288
-
289
- def clear_local_files
290
- FileUtils.rm_rf(base_path.to_s)
291
- end
292
-
293
- def update_defaults
294
- self.environment = 'production' if environment.blank?
295
- self.branch = 'master' if branch.blank?
296
- end
297
-
298
- def emit_hooks
299
- return unless previous_changes.include?('lock_reason')
300
- Hook.emit(:lock, self, locked: locked?, stack: self)
301
- end
302
-
303
- def ci_enabled_cache_key
304
- "stacks:#{id}:ci_enabled"
305
- end
306
- end
data/app/models/status.rb DELETED
@@ -1,42 +0,0 @@
1
- class Status < ActiveRecord::Base
2
- STATES = %w(pending success failure error).freeze
3
- enum state: STATES.zip(STATES).to_h
4
-
5
- belongs_to :commit, touch: true
6
-
7
- validates :state, inclusion: {in: STATES, allow_blank: true}, presence: true
8
-
9
- after_create :enable_ci_on_stack
10
- after_commit :schedule_continuous_delivery, :broadcast_update, on: :create
11
- after_commit :touch_commit
12
-
13
- delegate :broadcast_update, to: :commit
14
-
15
- def self.replicate_from_github!(github_status)
16
- find_or_create_by!(
17
- state: github_status.state,
18
- description: github_status.description,
19
- target_url: github_status.rels.try(:[], :target).try(:href),
20
- context: github_status.context,
21
- created_at: github_status.created_at,
22
- )
23
- end
24
-
25
- def group?
26
- false
27
- end
28
-
29
- private
30
-
31
- def enable_ci_on_stack
32
- commit.stack.enable_ci!
33
- end
34
-
35
- def touch_commit
36
- commit.touch
37
- end
38
-
39
- def schedule_continuous_delivery
40
- commit.schedule_continuous_delivery
41
- end
42
- end
@@ -1,33 +0,0 @@
1
- class StatusGroup
2
- STATES_PRIORITY = %w(failure error pending success).freeze
3
-
4
- attr_reader :statuses, :significant_status
5
-
6
- def initialize(significant_status, visible_statuses)
7
- @significant_status = significant_status
8
- @statuses = visible_statuses
9
- end
10
-
11
- delegate :success?, :state, to: :significant_status
12
-
13
- def description
14
- "#{success_count} / #{statuses.count} checks OK"
15
- end
16
-
17
- def target_url
18
- end
19
-
20
- def to_partial_path
21
- 'statuses/group'
22
- end
23
-
24
- def group?
25
- true
26
- end
27
-
28
- private
29
-
30
- def success_count
31
- @statuses.count { |s| s.state == 'success'.freeze }
32
- end
33
- end
data/app/models/task.rb DELETED
@@ -1,197 +0,0 @@
1
- class Task < ActiveRecord::Base
2
- belongs_to :user
3
- belongs_to :stack, touch: true, counter_cache: true
4
- belongs_to :until_commit, class_name: 'Commit'
5
- belongs_to :since_commit, class_name: 'Commit'
6
-
7
- has_many :chunks, -> { order(:id) }, class_name: 'OutputChunk', dependent: :destroy
8
-
9
- serialize :definition, TaskDefinition
10
- serialize :env, Hash
11
-
12
- scope :success, -> { where(status: 'success') }
13
- scope :completed, -> { where(status: %w(success error failed flapping aborted)) }
14
- scope :active, -> { where(status: %w(pending running aborting)) }
15
-
16
- scope :due_for_rollup, -> { completed.where(rolled_up: false).where('created_at <= ?', 1.hour.ago) }
17
-
18
- after_save :record_status_change
19
- after_commit :emit_hooks
20
-
21
- state_machine :status, initial: :pending do
22
- after_transition any => %i(success failed error) do |task|
23
- task.async_refresh_deployed_revision
24
- end
25
-
26
- after_transition any => :flapping do |task|
27
- task.update!(confirmations: 0)
28
- end
29
-
30
- event :run do
31
- transition pending: :running
32
- end
33
-
34
- event :failure do
35
- transition %i(running flapping) => :failed
36
- end
37
-
38
- event :complete do
39
- transition %i(running flapping) => :success
40
- end
41
-
42
- event :error do
43
- transition all => :error
44
- end
45
-
46
- event :aborting do
47
- transition all - %i(aborted) => :aborting
48
- end
49
-
50
- event :aborted do
51
- transition aborting: :aborted
52
- end
53
-
54
- event :flap do
55
- transition %i(failed error success) => :flapping
56
- end
57
-
58
- state :pending
59
- state :running
60
- state :failed
61
- state :success
62
- state :error
63
- state :aborting
64
- state :aborted
65
- state :flapping
66
- end
67
-
68
- def report_failure!(_error)
69
- reload
70
- if aborting?
71
- aborted!
72
- else
73
- failure!
74
- end
75
- end
76
-
77
- def report_error!(error)
78
- write("#{error.class}: #{error.message}\n\t#{error.backtrace.join("\t")}\n")
79
- error!
80
- end
81
-
82
- delegate :acquire_git_cache_lock, :async_refresh_deployed_revision, to: :stack
83
-
84
- delegate :checklist, to: :definition
85
-
86
- def spec
87
- @spec ||= DeploySpec::FileSystem.new(working_directory, stack.environment)
88
- end
89
-
90
- def enqueue
91
- raise "only persisted jobs can be enqueued" unless persisted?
92
- PerformTaskJob.perform_later(self)
93
- end
94
-
95
- def write(text)
96
- chunks.create!(text: text)
97
- end
98
-
99
- def chunk_output
100
- if rolled_up?
101
- output
102
- else
103
- chunks.pluck(:text).join
104
- end
105
- end
106
-
107
- def schedule_rollup_chunks
108
- ChunkRollupJob.perform_later(self)
109
- end
110
-
111
- def rollup_chunks
112
- ActiveRecord::Base.transaction do
113
- self.output = chunk_output
114
- chunks.delete_all
115
- update_attribute(:rolled_up, true)
116
- end
117
- end
118
-
119
- def output
120
- gzip = self[:gzip_output]
121
-
122
- if gzip.nil? || gzip.empty?
123
- ''
124
- else
125
- ActiveSupport::Gzip.decompress(gzip)
126
- end
127
- end
128
-
129
- def output=(string)
130
- self[:gzip_output] = ActiveSupport::Gzip.compress(string)
131
- end
132
-
133
- def rollback?
134
- false
135
- end
136
-
137
- def rollbackable?
138
- false
139
- end
140
-
141
- def supports_rollback?
142
- false
143
- end
144
-
145
- def author
146
- user || AnonymousUser.new
147
- end
148
-
149
- def finished?
150
- !pending? && !running? && !aborting?
151
- end
152
-
153
- def pid
154
- pid = Shipit.redis.get("task:#{id}:pid")
155
- pid.presence && pid.to_i
156
- end
157
-
158
- def pid=(pid)
159
- Shipit.redis.set("task:#{id}:pid", pid, ex: 1.hour.to_i)
160
- end
161
-
162
- def abort!(rollback_once_aborted: false)
163
- target_pid = pid
164
- return write("\nAbort: failed, PID unknown\n") unless target_pid.present?
165
-
166
- update!(rollback_once_aborted: rollback_once_aborted)
167
- aborting!
168
- write("\nAbort: sending SIGTERM to pid #{target_pid}\n")
169
- Process.kill('TERM', target_pid)
170
- rescue Errno::ESRCH
171
- write("\nAbort: PID #{target_pid} ESRCH: No such process\n")
172
- aborted!
173
- true
174
- end
175
-
176
- def working_directory
177
- File.join(stack.deploys_path, id.to_s)
178
- end
179
-
180
- def clear_working_directory
181
- FileUtils.rm_rf(working_directory)
182
- end
183
-
184
- def record_status_change
185
- @status_changed ||= status_changed?
186
- end
187
-
188
- def emit_hooks
189
- return unless @status_changed
190
- @status_changed = nil
191
- Hook.emit(hook_event, stack, hook_event => self, status: status, stack: stack)
192
- end
193
-
194
- def hook_event
195
- self.class.name.underscore.to_sym
196
- end
197
- end