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 160 end
161 161  
162 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 164 response = {status: status}
165 165  
166 166 render json: response
... ...
app/helpers/merge_requests_helper.rb
... ... @@ -32,7 +32,7 @@ module MergeRequestsHelper
32 32 end
33 33  
34 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 36 end
37 37  
38 38 def merge_path_description(merge_request, separator)
... ...
app/models/project.rb
... ... @@ -54,6 +54,9 @@ class Project < ActiveRecord::Base
54 54 belongs_to :namespace
55 55  
56 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 60 has_one :gitlab_ci_service, dependent: :destroy
58 61 has_one :campfire_service, dependent: :destroy
59 62 has_one :emails_on_push_service, dependent: :destroy
... ... @@ -322,6 +325,14 @@ class Project < ActiveRecord::Base
322 325 gitlab_ci_service && gitlab_ci_service.active
323 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 336 # For compatibility with old code
326 337 def code
327 338 path
... ...
app/models/project_services/ci_service.rb 0 → 100644
... ... @@ -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 17 # api_key :string(255)
18 18 #
19 19  
20   -class GitlabCiService < Service
  20 +class GitlabCiService < CiService
21 21 attr_accessible :project_url
22 22  
23 23 validates :project_url, presence: true, if: :activated?
... ...
app/models/service.rb
... ... @@ -33,6 +33,10 @@ class Service &lt; ActiveRecord::Base
33 33 active
34 34 end
35 35  
  36 + def category
  37 + :common
  38 + end
  39 +
36 40 def title
37 41 # implement inside child
38 42 end
... ... @@ -41,6 +45,10 @@ class Service &lt; ActiveRecord::Base
41 45 # implement inside child
42 46 end
43 47  
  48 + def help
  49 + # implement inside child
  50 + end
  51 +
44 52 def to_param
45 53 # implement inside child
46 54 end
... ...
app/views/projects/merge_requests/_show.html.haml
... ... @@ -40,7 +40,7 @@
40 40 url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}",
41 41 check_enable: #{@merge_request.unchecked? ? "true" : "false"},
42 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 44 current_status: "#{@merge_request.merge_status_name}",
45 45 action: "#{controller.action_name}"
46 46 });
... ...
app/views/projects/merge_requests/show/_state_widget.html.haml
1 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 3 .panel-heading
4 4 = render "projects/merge_requests/show/mr_ci"
5 5 .panel-body
... ...
app/views/projects/services/_form.html.haml
... ... @@ -17,6 +17,9 @@
17 17 - @service.errors.full_messages.each do |msg|
18 18 %li= msg
19 19  
  20 + - if @service.help.present?
  21 + .bs-callout
  22 + = @service.help
20 23  
21 24 .form-group
22 25 = f.label :active, "Active", class: "control-label"
... ...