Commit ca936d2784773652530e7b02af40b925ca45a4d6

Authored by Dmitriy Zaporozhets
1 parent c92726e6

Improve CI integration for merge requests

app/assets/javascripts/merge_requests.js
@@ -26,6 +26,12 @@ var MergeRequest = { @@ -26,6 +26,12 @@ var MergeRequest = {
26 self.showState(data.state); 26 self.showState(data.state);
27 }, "json"); 27 }, "json");
28 } 28 }
  29 +
  30 + if(self.opts.ci_enable){
  31 + $.get(self.opts.url_to_ci_check, function(data){
  32 + self.showCiState(data.status);
  33 + }, "json");
  34 + }
29 }, 35 },
30 36
31 initTabs: 37 initTabs:
@@ -79,6 +85,11 @@ var MergeRequest = { @@ -79,6 +85,11 @@ var MergeRequest = {
79 $(".automerge_widget." + state).show(); 85 $(".automerge_widget." + state).show();
80 }, 86 },
81 87
  88 + showCiState:
  89 + function(state){
  90 + $(".ci_widget").hide();
  91 + $(".ci_widget.ci-" + state).show();
  92 + },
82 93
83 loadDiff: 94 loadDiff:
84 function() { 95 function() {
app/assets/stylesheets/sections/merge_requests.scss
@@ -136,9 +136,3 @@ li.merge_request { @@ -136,9 +136,3 @@ li.merge_request {
136 } 136 }
137 } 137 }
138 } 138 }
139 -  
140 -.status-badge {  
141 - height: 32px;  
142 - width: 100%;  
143 - @include border-radius(5px);  
144 -}  
app/controllers/merge_requests_controller.rb
1 class MergeRequestsController < ProjectResourceController 1 class MergeRequestsController < ProjectResourceController
2 before_filter :module_enabled 2 before_filter :module_enabled
3 - before_filter :merge_request, only: [:edit, :update, :destroy, :show, :commits, :diffs, :automerge, :automerge_check] 3 + before_filter :merge_request, only: [:edit, :update, :destroy, :show, :commits, :diffs, :automerge, :automerge_check, :ci_status]
4 before_filter :validates_merge_request, only: [:show, :diffs] 4 before_filter :validates_merge_request, only: [:show, :diffs]
5 before_filter :define_show_vars, only: [:show, :diffs] 5 before_filter :define_show_vars, only: [:show, :diffs]
6 6
@@ -103,6 +103,13 @@ class MergeRequestsController &lt; ProjectResourceController @@ -103,6 +103,13 @@ class MergeRequestsController &lt; ProjectResourceController
103 @commit = CommitDecorator.decorate(@commit) 103 @commit = CommitDecorator.decorate(@commit)
104 end 104 end
105 105
  106 + def ci_status
  107 + status = project.gitlab_ci_service.commit_status(merge_request.last_commit.sha)
  108 + response = { status: status }
  109 +
  110 + render json: response
  111 + end
  112 +
106 protected 113 protected
107 114
108 def merge_request 115 def merge_request
app/helpers/merge_requests_helper.rb
@@ -39,7 +39,7 @@ module MergeRequestsHelper @@ -39,7 +39,7 @@ module MergeRequestsHelper
39 classes 39 classes
40 end 40 end
41 41
42 - def ci_status_path  
43 - @project.gitlab_ci_service.commit_badge_path(@merge_request.last_commit.sha) 42 + def ci_build_details_path merge_request
  43 + merge_request.project.gitlab_ci_service.build_page(merge_request.last_commit.sha)
44 end 44 end
45 end 45 end
app/models/gitlab_ci_service.rb
@@ -36,4 +36,22 @@ class GitlabCiService &lt; Service @@ -36,4 +36,22 @@ class GitlabCiService &lt; Service
36 def commit_badge_path sha 36 def commit_badge_path sha
37 project_url + "/status?sha=#{sha}" 37 project_url + "/status?sha=#{sha}"
38 end 38 end
  39 +
  40 + def commit_status_path sha
  41 + project_url + "/builds/#{sha}/status.json?token=#{token}"
  42 + end
  43 +
  44 + def commit_status sha
  45 + response = HTTParty.get(commit_status_path(sha))
  46 +
  47 + if response.code == 200 and response["status"]
  48 + response["status"]
  49 + else
  50 + :error
  51 + end
  52 + end
  53 +
  54 + def build_page sha
  55 + project_url + "/builds/#{sha}"
  56 + end
39 end 57 end
app/models/merge_request.rb
@@ -220,4 +220,8 @@ class MergeRequest &lt; ActiveRecord::Base @@ -220,4 +220,8 @@ class MergeRequest &lt; ActiveRecord::Base
220 def to_patch 220 def to_patch
221 project.repo.git.format_patch({timeout: 30, raise: true, stdout: true}, "#{target_branch}..#{source_branch}") 221 project.repo.git.format_patch({timeout: 30, raise: true, stdout: true}, "#{target_branch}..#{source_branch}")
222 end 222 end
  223 +
  224 + def last_commit_short_sha
  225 + @last_commit_short_sha ||= last_commit.sha[0..10]
  226 + end
223 end 227 end
app/views/merge_requests/_show.html.haml
@@ -2,6 +2,8 @@ @@ -2,6 +2,8 @@
2 = render "merge_requests/show/how_to_merge" 2 = render "merge_requests/show/how_to_merge"
3 = render "merge_requests/show/mr_box" 3 = render "merge_requests/show/mr_box"
4 = render "merge_requests/show/mr_accept" 4 = render "merge_requests/show/mr_accept"
  5 +- if @project.gitlab_ci?
  6 + = render "merge_requests/show/mr_ci"
5 = render "merge_requests/show/commits" 7 = render "merge_requests/show/commits"
6 8
7 - if @commits.present? 9 - if @commits.present?
@@ -28,6 +30,8 @@ @@ -28,6 +30,8 @@
28 MergeRequest.init({ 30 MergeRequest.init({
29 url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}", 31 url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}",
30 check_enable: #{@merge_request.state == MergeRequest::UNCHECKED ? "true" : "false"}, 32 check_enable: #{@merge_request.state == MergeRequest::UNCHECKED ? "true" : "false"},
  33 + url_to_ci_check: "#{ci_status_project_merge_request_path(@project, @merge_request)}",
  34 + ci_enable: #{@project.gitlab_ci? ? "true" : "false"},
31 current_state: "#{@merge_request.human_state}", 35 current_state: "#{@merge_request.human_state}",
32 action: "#{controller.action_name}" 36 action: "#{controller.action_name}"
33 }); 37 });
app/views/merge_requests/show/_mr_box.html.haml
@@ -6,9 +6,6 @@ @@ -6,9 +6,6 @@
6 - else 6 - else
7 .alert-message.success.status_info Open 7 .alert-message.success.status_info Open
8 = gfm escape_once(@merge_request.title) 8 = gfm escape_once(@merge_request.title)
9 - - if @project.gitlab_ci?  
10 - .right  
11 - = image_tag ci_status_path, class: 'status-badge'  
12 9
13 .middle_box_content 10 .middle_box_content
14 %div 11 %div
app/views/merge_requests/show/_mr_ci.html.haml 0 → 100644
@@ -0,0 +1,35 @@ @@ -0,0 +1,35 @@
  1 +- if @merge_request.open? && @commits.any?
  2 + .ci_widget.ci-success{style: "display:none"}
  3 + .alert.alert-success
  4 + %i.icon-ok
  5 + %strong CI build passed
  6 + for #{@merge_request.last_commit_short_sha}.
  7 + = link_to "Build page", ci_build_details_path(@merge_request)
  8 +
  9 +
  10 + .ci_widget.ci-failed{style: "display:none"}
  11 + .alert.alert-error
  12 + %i.icon-remove
  13 + %strong CI build failed
  14 + for #{@merge_request.last_commit_short_sha}.
  15 + = link_to "Build page", ci_build_details_path(@merge_request)
  16 +
  17 + - [:running, :pending].each do |status|
  18 + .ci_widget{class: "ci-#{status}", style: "display:none"}
  19 + .alert
  20 + %i.icon-time
  21 + %strong CI build #{status}
  22 + for #{@merge_request.last_commit_short_sha}.
  23 + = link_to "Build page", ci_build_details_path(@merge_request)
  24 +
  25 + .ci_widget
  26 + .alert-message
  27 + %strong
  28 + %i.icon-refresh
  29 + Checking for CI status for #{@merge_request.last_commit_short_sha}
  30 +
  31 + .ci_widget.ci-error{style: "display:none"}
  32 + .alert.alert-error
  33 + %i.icon-remove
  34 + %strong Cannot connect to CI server. Please check your setting
  35 +
config/routes.rb
@@ -169,6 +169,7 @@ Gitlab::Application.routes.draw do @@ -169,6 +169,7 @@ Gitlab::Application.routes.draw do
169 get :diffs 169 get :diffs
170 get :automerge 170 get :automerge
171 get :automerge_check 171 get :automerge_check
  172 + get :ci_status
172 end 173 end
173 174
174 collection do 175 collection do