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 26 self.showState(data.state);
27 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 37 initTabs:
... ... @@ -79,6 +85,11 @@ var MergeRequest = {
79 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 94 loadDiff:
84 95 function() {
... ...
app/assets/stylesheets/sections/merge_requests.scss
... ... @@ -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 1 class MergeRequestsController < ProjectResourceController
2 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 4 before_filter :validates_merge_request, only: [:show, :diffs]
5 5 before_filter :define_show_vars, only: [:show, :diffs]
6 6  
... ... @@ -103,6 +103,13 @@ class MergeRequestsController &lt; ProjectResourceController
103 103 @commit = CommitDecorator.decorate(@commit)
104 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 113 protected
107 114  
108 115 def merge_request
... ...
app/helpers/merge_requests_helper.rb
... ... @@ -39,7 +39,7 @@ module MergeRequestsHelper
39 39 classes
40 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 44 end
45 45 end
... ...
app/models/gitlab_ci_service.rb
... ... @@ -36,4 +36,22 @@ class GitlabCiService &lt; Service
36 36 def commit_badge_path sha
37 37 project_url + "/status?sha=#{sha}"
38 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 57 end
... ...
app/models/merge_request.rb
... ... @@ -220,4 +220,8 @@ class MergeRequest &lt; ActiveRecord::Base
220 220 def to_patch
221 221 project.repo.git.format_patch({timeout: 30, raise: true, stdout: true}, "#{target_branch}..#{source_branch}")
222 222 end
  223 +
  224 + def last_commit_short_sha
  225 + @last_commit_short_sha ||= last_commit.sha[0..10]
  226 + end
223 227 end
... ...
app/views/merge_requests/_show.html.haml
... ... @@ -2,6 +2,8 @@
2 2 = render "merge_requests/show/how_to_merge"
3 3 = render "merge_requests/show/mr_box"
4 4 = render "merge_requests/show/mr_accept"
  5 +- if @project.gitlab_ci?
  6 + = render "merge_requests/show/mr_ci"
5 7 = render "merge_requests/show/commits"
6 8  
7 9 - if @commits.present?
... ... @@ -28,6 +30,8 @@
28 30 MergeRequest.init({
29 31 url_to_automerge_check: "#{automerge_check_project_merge_request_path(@project, @merge_request)}",
30 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 35 current_state: "#{@merge_request.human_state}",
32 36 action: "#{controller.action_name}"
33 37 });
... ...
app/views/merge_requests/show/_mr_box.html.haml
... ... @@ -6,9 +6,6 @@
6 6 - else
7 7 .alert-message.success.status_info Open
8 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 10 .middle_box_content
14 11 %div
... ...
app/views/merge_requests/show/_mr_ci.html.haml 0 → 100644
... ... @@ -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 169 get :diffs
170 170 get :automerge
171 171 get :automerge_check
  172 + get :ci_status
172 173 end
173 174  
174 175 collection do
... ...