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
@@ -0,0 +1,27 @@
1
+ module Shipit
2
+ class GithubAuthenticationController < ActionController::Base
3
+ include Shipit::Engine.routes.url_helpers
4
+
5
+ def callback
6
+ return_url = request.env['omniauth.origin'] || root_path
7
+ auth = request.env['omniauth.auth']
8
+
9
+ return render 'failed', layout: false if auth.blank?
10
+
11
+ session[:user_id] = sign_in_github(auth)
12
+ redirect_to return_url
13
+ end
14
+
15
+ def logout
16
+ reset_session
17
+ redirect_to root_path
18
+ end
19
+
20
+ private
21
+
22
+ def sign_in_github(auth)
23
+ user = Shipit.github_api.user(auth[:info][:nickname])
24
+ User.find_or_create_from_github(user).id
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,26 @@
1
+ module Shipit
2
+ class RollbacksController < ShipitController
3
+ before_action :load_stack
4
+ before_action :load_deploy
5
+
6
+ def create
7
+ return redirect_to rollback_stack_deploy_path(@stack, @deploy) if !params[:force] && @stack.deploying?
8
+ @rollback = @deploy.trigger_rollback(current_user, env: rollback_params[:env])
9
+ redirect_to stack_deploy_path(@stack, @rollback)
10
+ end
11
+
12
+ private
13
+
14
+ def load_stack
15
+ @stack ||= Stack.from_param!(params[:stack_id])
16
+ end
17
+
18
+ def load_deploy
19
+ @deploy = @stack.deploys.find(rollback_params[:parent_id])
20
+ end
21
+
22
+ def rollback_params
23
+ params.require(:rollback).permit(:parent_id, env: @stack.deploy_variables.map(&:name))
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,62 @@
1
+ module Shipit
2
+ class ShipitController < ApplicationController
3
+ layout 'shipit'
4
+
5
+ helper GithubUrlHelper
6
+ helper StacksHelper
7
+ helper TasksHelper
8
+ helper DeploysHelper
9
+ helper ChunksHelper
10
+
11
+ helper Shipit::Engine.routes.url_helpers
12
+ include Shipit::Engine.routes.url_helpers
13
+
14
+ before_action :ensure_required_settings,
15
+ :force_github_authentication,
16
+ :set_variant
17
+
18
+ # Respond to HTML by default
19
+ respond_to :html
20
+
21
+ # Prevent CSRF attacks by raising an exception.
22
+ # For APIs, you may want to use :null_session instead.
23
+ protect_from_forgery with: :exception
24
+
25
+ private
26
+
27
+ def ensure_required_settings
28
+ return if Shipit.all_settings_present?
29
+
30
+ render 'shipit/missing_settings'
31
+ end
32
+
33
+ def force_github_authentication
34
+ if current_user.logged_in?
35
+ team = Shipit.github_team
36
+ if team && !current_user.in?(team.members)
37
+ render text: "You must be a member of #{team.handle} to access this application.", status: :forbidden
38
+ end
39
+ else
40
+ redirect_to Shipit::Engine.routes.url_helpers.github_authentication_path(origin: request.original_url)
41
+ end
42
+ end
43
+
44
+ def current_user
45
+ @current_user ||= find_current_user || AnonymousUser.new
46
+ end
47
+ helper_method :current_user
48
+
49
+ def find_current_user
50
+ return unless session[:user_id].present?
51
+ User.find(session[:user_id])
52
+ rescue ActiveRecord::RecordNotFound
53
+ end
54
+
55
+ def set_variant
56
+ return unless request.negotiate_mime('text/partial+html')
57
+
58
+ request.format = :html
59
+ request.variant = :partial
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,81 @@
1
+ module Shipit
2
+ class StacksController < ShipitController
3
+ before_action :load_stack, only: %i(update destroy settings sync_webhooks clear_git_cache refresh)
4
+
5
+ def new
6
+ @stack = Stack.new
7
+ end
8
+
9
+ def index
10
+ @user_stacks = current_user.stacks_contributed_to
11
+
12
+ @stacks = Stack.order('(undeployed_commits_count > 0) desc', tasks_count: :desc).to_a
13
+ end
14
+
15
+ def show
16
+ @stack = Stack.from_param!(params[:id])
17
+ return if flash.empty? && !stale?(last_modified: @stack.updated_at)
18
+
19
+ @tasks = @stack.tasks.order(id: :desc).preload(:since_commit, :until_commit, :user).limit(10)
20
+ @commits = @stack.commits.reachable.preload(:author, :statuses).order(id: :desc)
21
+ if deployed_commit = @stack.last_deployed_commit
22
+ @commits = @commits.where('id > ?', deployed_commit.id)
23
+ end
24
+ @commits = @commits.to_a
25
+ end
26
+
27
+ def create
28
+ @stack = Stack.create(create_params)
29
+ respond_with(@stack)
30
+ end
31
+
32
+ def destroy
33
+ @stack.schedule_for_destroy!
34
+ redirect_to stacks_url
35
+ end
36
+
37
+ def settings
38
+ end
39
+
40
+ def refresh
41
+ RefreshStatusesJob.perform_later(stack_id: @stack.id)
42
+ GithubSyncJob.perform_later(stack_id: @stack.id)
43
+ flash[:success] = 'Refresh scheduled'
44
+ redirect_to :back
45
+ end
46
+
47
+ def update
48
+ options = {}
49
+ unless @stack.update(update_params)
50
+ options = {flash: {warning: @stack.errors.full_messages.to_sentence}}
51
+ end
52
+ redirect_to(params[:return_to].presence || stack_settings_path(@stack), options)
53
+ end
54
+
55
+ def sync_webhooks
56
+ @stack.setup_hooks
57
+ redirect_to stack_settings_path(@stack)
58
+ end
59
+
60
+ def clear_git_cache
61
+ ClearGitCacheJob.perform_later(@stack)
62
+ redirect_to stack_settings_path(@stack)
63
+ end
64
+
65
+ private
66
+
67
+ def load_stack
68
+ @stack = Stack.from_param!(params[:id])
69
+ end
70
+
71
+ def create_params
72
+ params.require(:stack).permit(:repo_name, :repo_owner, :environment, :branch, :deploy_url, :ignore_ci)
73
+ end
74
+
75
+ def update_params
76
+ params.require(:stack).permit(:deploy_url, :lock_reason, :continuous_deployment, :ignore_ci).tap do |params|
77
+ params[:lock_author_id] = params[:lock_reason].present? ? current_user.id : nil
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,7 @@
1
+ module Shipit
2
+ class StatusController < ActionController::Base
3
+ def version
4
+ render text: Shipit.revision
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,48 @@
1
+ module Shipit
2
+ class TasksController < ShipitController
3
+ include Pagination
4
+
5
+ before_action :stack
6
+
7
+ self.default_page_size = 20
8
+
9
+ def index
10
+ paginator = paginate(stack.tasks)
11
+ @tasks = paginator.to_a
12
+ @links = paginator.links
13
+ end
14
+
15
+ def new
16
+ @definition = stack.find_task_definition(params[:definition_id])
17
+ @task = stack.tasks.build(definition: @definition)
18
+ end
19
+
20
+ def show
21
+ task
22
+ end
23
+
24
+ def create
25
+ @task = stack.trigger_task(params[:definition_id], current_user)
26
+ redirect_to [stack, @task]
27
+ end
28
+
29
+ def abort
30
+ task.abort!(rollback_once_aborted: params[:rollback].present?)
31
+ head :ok
32
+ end
33
+
34
+ def tail
35
+ render json: TailTaskSerializer.new(task, context: params)
36
+ end
37
+
38
+ private
39
+
40
+ def task
41
+ @task ||= stack.tasks.find(params[:id])
42
+ end
43
+
44
+ def stack
45
+ @stack ||= Stack.from_param!(params[:stack_id])
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,101 @@
1
+ module Shipit
2
+ class WebhooksController < ActionController::Base
3
+ before_action :check_if_ping, :verify_signature
4
+
5
+ respond_to :json
6
+
7
+ def push
8
+ branch = params['ref'].gsub('refs/heads/', '')
9
+
10
+ if branch == stack.branch
11
+ GithubSyncJob.perform_later(stack_id: stack.id)
12
+ GitMirrorUpdateJob.perform_later(stack)
13
+ end
14
+
15
+ head :ok
16
+ end
17
+
18
+ def state
19
+ branches = params[:branches] || []
20
+ if branches.find { |branch| branch[:name] == stack.branch }
21
+ commit = stack.commits.find_by_sha!(params[:sha])
22
+ commit.add_status(params.permit(:state, :description, :target_url, :context, :created_at))
23
+ end
24
+ head :ok
25
+ end
26
+
27
+ params do
28
+ requires :team do
29
+ requires :id, Integer
30
+ requires :name, String
31
+ requires :slug, String
32
+ requires :url, String
33
+ end
34
+ requires :organization do
35
+ requires :login, String
36
+ end
37
+ requires :member do
38
+ requires :login, String
39
+ end
40
+ end
41
+ def membership
42
+ team = find_or_create_team!
43
+ member = User.find_or_create_by_login!(params.member.login)
44
+
45
+ case membership_action
46
+ when 'added'
47
+ team.add_member(member)
48
+ when 'removed'
49
+ team.members.delete(member)
50
+ else
51
+ raise ArgumentError, "Don't know how to perform action: `#{params.action.inspect}`"
52
+ end
53
+ head :ok
54
+ end
55
+
56
+ def index
57
+ render text: "working"
58
+ end
59
+
60
+ private
61
+
62
+ def find_or_create_team!
63
+ Team.find_or_create_by!(github_id: params.team.id) do |team|
64
+ team.github_team = params.team
65
+ team.organization = params.organization.login
66
+ team.automatically_setup_hooks = true
67
+ end
68
+ end
69
+
70
+ def verify_signature
71
+ request.body.rewind
72
+ head(422) unless webhook.verify_signature(request.headers['X-Hub-Signature'], request.body.read)
73
+ end
74
+
75
+ def check_if_ping
76
+ head :ok if event == 'ping'
77
+ end
78
+
79
+ def webhook
80
+ @webhook ||= if params[:stack_id]
81
+ stack.github_hooks.find_by!(event: event)
82
+ else
83
+ GithubHook::Organization.find_by!(organization: params.organization.login, event: event)
84
+ end
85
+ end
86
+
87
+ def event
88
+ request.headers['X-Github-Event'] || action_name
89
+ end
90
+
91
+ def membership_action
92
+ # GitHub send an `action` parameter that is shadowed by Rails url parameters
93
+ # It's also impossible to pass an `action` parameters from a test case.
94
+ request.request_parameters['action'] || params[:_action]
95
+ end
96
+
97
+ def stack
98
+ @stack ||= Stack.find(params[:stack_id])
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,8 @@
1
+ module Shipit
2
+ module ChunksHelper
3
+ def next_chunks_url(task)
4
+ return if task.finished?
5
+ tail_stack_task_path(task.stack, task, last_id: task.chunks.last)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,28 @@
1
+ module Shipit
2
+ module DeploysHelper
3
+ def render_checklist(checklist)
4
+ return if checklist.blank?
5
+ render 'shipit/deploys/checklist', checklist: checklist
6
+ end
7
+
8
+ def render_monitoring(stack)
9
+ return unless stack.monitoring?
10
+ render 'shipit/deploys/monitoring', stack: stack
11
+ end
12
+
13
+ def render_checks(commit)
14
+ return unless commit.stack.checks?
15
+ render 'shipit/deploys/checks', commit: commit
16
+ end
17
+
18
+ def render_monitoring_panel(panel_spec)
19
+ if url = panel_spec['image']
20
+ image_tag(url, panel_spec.slice('height', 'width', 'alt'))
21
+ elsif url = panel_spec['iframe']
22
+ content_tag(:iframe, '', panel_spec.slice('height', 'width').merge('src' => url))
23
+ else
24
+ content_tag(:span, "#{panel_spec.inspect} is not a valid monitoring panel spec")
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,48 @@
1
+ module Shipit
2
+ module GithubUrlHelper
3
+ def github_avatar(user, options = {})
4
+ uri = user.avatar_uri
5
+ attributes = options.slice(:class).merge(alt: user.try!(:name))
6
+ if options[:size]
7
+ uri.query ||= ''
8
+ uri.query += "&s=#{options[:size]}"
9
+ attributes[:width] = options[:size]
10
+ attributes[:height] = options[:size]
11
+ end
12
+
13
+ image_tag(uri.to_s, attributes)
14
+ end
15
+
16
+ def github_commit_range_url(stack, since_commit, until_commit)
17
+ github_repo_url(stack.repo_owner, stack.repo_name, 'compare', "#{since_commit.sha}...#{until_commit.sha}")
18
+ end
19
+
20
+ def github_user_url(user, *args)
21
+ [Shipit.github_url, user, *args].join('/')
22
+ end
23
+
24
+ def render_github_user(user)
25
+ link_to(github_user_url(user.login), class: 'user main-user') do
26
+ github_avatar(user, size: 20) + user.name
27
+ end
28
+ end
29
+
30
+ def github_repo_url(owner, repo, *args)
31
+ github_user_url(owner, repo, *args)
32
+ end
33
+
34
+ def github_commit_url(commit)
35
+ github_repo_url(commit.stack.repo_owner, commit.stack.repo_name, 'commit', commit.sha)
36
+ end
37
+
38
+ def github_diff_url(owner, repo, from_sha, to_sha)
39
+ github_repo_url(owner, repo, 'compare', "#{from_sha}...#{to_sha}")
40
+ end
41
+
42
+ def link_to_github_deploy(deploy)
43
+ url = github_commit_range_url(deploy.stack, *deploy.commit_range)
44
+ text = deploy.commit_range.map(&:short_sha).join('...')
45
+ link_to(text, url, class: 'number')
46
+ end
47
+ end
48
+ end