Commit 5580dc999b50165de6cc62711e179c9dc7852472

Authored by Dmitriy Zaporozhets
2 parents 666260bf a3db7631

Merge branch 'backport-ci-service' into 'master'

Backport CI service refactoring from EE

It allows easier contribution of different CI services.
Fixes #1280
app/controllers/projects/merge_requests_controller.rb
@@ -160,7 +160,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController @@ -160,7 +160,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
160 end 160 end
161 161
162 def ci_status 162 def ci_status
163 - status = @merge_request.source_project.gitlab_ci_service.commit_status(merge_request.last_commit.sha) 163 + status = @merge_request.source_project.ci_service.commit_status(merge_request.last_commit.sha)
164 response = {status: status} 164 response = {status: status}
165 165
166 render json: response 166 render json: response
app/helpers/merge_requests_helper.rb
@@ -32,7 +32,7 @@ module MergeRequestsHelper @@ -32,7 +32,7 @@ module MergeRequestsHelper
32 end 32 end
33 33
34 def ci_build_details_path merge_request 34 def ci_build_details_path merge_request
35 - merge_request.source_project.gitlab_ci_service.build_page(merge_request.last_commit.sha) 35 + merge_request.source_project.ci_service.build_page(merge_request.last_commit.sha)
36 end 36 end
37 37
38 def merge_path_description(merge_request, separator) 38 def merge_path_description(merge_request, separator)
app/models/project.rb
@@ -54,6 +54,9 @@ class Project < ActiveRecord::Base @@ -54,6 +54,9 @@ class Project < ActiveRecord::Base
54 belongs_to :namespace 54 belongs_to :namespace
55 55
56 has_one :last_event, -> {order 'events.created_at DESC'}, class_name: 'Event', foreign_key: 'project_id' 56 has_one :last_event, -> {order 'events.created_at DESC'}, class_name: 'Event', foreign_key: 'project_id'
  57 +
  58 + # Project services
  59 + has_many :services
57 has_one :gitlab_ci_service, dependent: :destroy 60 has_one :gitlab_ci_service, dependent: :destroy
58 has_one :campfire_service, dependent: :destroy 61 has_one :campfire_service, dependent: :destroy
59 has_one :emails_on_push_service, dependent: :destroy 62 has_one :emails_on_push_service, dependent: :destroy
@@ -322,6 +325,14 @@ class Project < ActiveRecord::Base @@ -322,6 +325,14 @@ class Project < ActiveRecord::Base
322 gitlab_ci_service && gitlab_ci_service.active 325 gitlab_ci_service && gitlab_ci_service.active
323 end 326 end
324 327
  328 + def ci_services
  329 + services.select { |service| service.category == :ci }
  330 + end
  331 +
  332 + def ci_service
  333 + @ci_service ||= services.select(&:activated?).first
  334 + end
  335 +
325 # For compatibility with old code 336 # For compatibility with old code
326 def code 337 def code
327 path 338 path
app/models/project_services/ci_service.rb 0 → 100644
@@ -0,0 +1,34 @@ @@ -0,0 +1,34 @@
  1 +# Base class for CI services
  2 +# List methods you need to implement to get your CI service
  3 +# working with GitLab Merge Requests
  4 +class CiService < Service
  5 + def category
  6 + :ci
  7 + end
  8 +
  9 + # Return complete url to build page
  10 + #
  11 + # Ex.
  12 + # http://jenkins.example.com:8888/job/test1/scm/bySHA1/12d65c
  13 + #
  14 + def build_page(sha)
  15 + # implement inside child
  16 + end
  17 +
  18 + # Return string with build status or :error symbol
  19 + #
  20 + # Allowed states: 'success', 'failed', 'running', 'pending'
  21 + #
  22 + #
  23 + # Ex.
  24 + # @service.commit_status('13be4ac')
  25 + # # => 'success'
  26 + #
  27 + # @service.commit_status('2abe4ac')
  28 + # # => 'running'
  29 + #
  30 + #
  31 + def commit_status(sha)
  32 + # implement inside child
  33 + end
  34 +end
app/models/project_services/gitlab_ci_service.rb
@@ -17,7 +17,7 @@ @@ -17,7 +17,7 @@
17 # api_key :string(255) 17 # api_key :string(255)
18 # 18 #
19 19
20 -class GitlabCiService < Service 20 +class GitlabCiService < CiService
21 attr_accessible :project_url 21 attr_accessible :project_url
22 22
23 validates :project_url, presence: true, if: :activated? 23 validates :project_url, presence: true, if: :activated?
app/models/service.rb
@@ -33,6 +33,10 @@ class Service &lt; ActiveRecord::Base @@ -33,6 +33,10 @@ class Service &lt; ActiveRecord::Base
33 active 33 active
34 end 34 end
35 35
  36 + def category
  37 + :common
  38 + end
  39 +
36 def title 40 def title
37 # implement inside child 41 # implement inside child
38 end 42 end
@@ -41,6 +45,10 @@ class Service &lt; ActiveRecord::Base @@ -41,6 +45,10 @@ class Service &lt; ActiveRecord::Base
41 # implement inside child 45 # implement inside child
42 end 46 end
43 47
  48 + def help
  49 + # implement inside child
  50 + end
  51 +
44 def to_param 52 def to_param
45 # implement inside child 53 # implement inside child
46 end 54 end
app/views/projects/merge_requests/_show.html.haml
@@ -40,7 +40,7 @@ @@ -40,7 +40,7 @@
40 url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}", 40 url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}",
41 check_enable: #{@merge_request.unchecked? ? "true" : "false"}, 41 check_enable: #{@merge_request.unchecked? ? "true" : "false"},
42 url_to_ci_check: "#{ci_status_project_merge_request_path(@project, @merge_request)}", 42 url_to_ci_check: "#{ci_status_project_merge_request_path(@project, @merge_request)}",
43 - ci_enable: #{@project.gitlab_ci? ? "true" : "false"}, 43 + ci_enable: #{@project.ci_service ? "true" : "false"},
44 current_status: "#{@merge_request.merge_status_name}", 44 current_status: "#{@merge_request.merge_status_name}",
45 action: "#{controller.action_name}" 45 action: "#{controller.action_name}"
46 }); 46 });
app/views/projects/merge_requests/show/_state_widget.html.haml
1 .panel.mr-state-widget.panel-default 1 .panel.mr-state-widget.panel-default
2 - - if @merge_request.source_project.gitlab_ci? && @commits.any? 2 + - if @merge_request.source_project.ci_service && @commits.any?
3 .panel-heading 3 .panel-heading
4 = render "projects/merge_requests/show/mr_ci" 4 = render "projects/merge_requests/show/mr_ci"
5 .panel-body 5 .panel-body
app/views/projects/services/_form.html.haml
@@ -17,6 +17,9 @@ @@ -17,6 +17,9 @@
17 - @service.errors.full_messages.each do |msg| 17 - @service.errors.full_messages.each do |msg|
18 %li= msg 18 %li= msg
19 19
  20 + - if @service.help.present?
  21 + .bs-callout
  22 + = @service.help
20 23
21 .form-group 24 .form-group
22 = f.label :active, "Active", class: "control-label" 25 = f.label :active, "Active", class: "control-label"