Commit 6aaabf27 authored by Douwe Maan's avatar Douwe Maan

Merge branch 'revert-79a816f3' into '8-15-stable'

Revert "Merge branch '23638-remove-builds-tab' into 'master'"

See merge request !8315
parents 1119c1f6 40c9bec8
...@@ -138,6 +138,7 @@ ...@@ -138,6 +138,7 @@
new MergedButtons(); new MergedButtons();
break; break;
case 'projects:merge_requests:commits': case 'projects:merge_requests:commits':
case 'projects:merge_requests:builds':
new MergedButtons(); new MergedButtons();
break; break;
case "projects:merge_requests:diffs": case "projects:merge_requests:diffs":
...@@ -162,6 +163,9 @@ ...@@ -162,6 +163,9 @@
container: '.js-pipeline-table', container: '.js-pipeline-table',
}); });
break; break;
case 'projects:commit:builds':
new gl.Pipelines();
break;
case 'projects:commits:show': case 'projects:commits:show':
case 'projects:activity': case 'projects:activity':
shortcut_handler = new ShortcutsNavigation(); shortcut_handler = new ShortcutsNavigation();
......
...@@ -59,13 +59,16 @@ ...@@ -59,13 +59,16 @@
class MergeRequestTabs { class MergeRequestTabs {
constructor({ action, setUrl, stubLocation } = {}) { constructor({ action, setUrl, buildsLoaded, stubLocation } = {}) {
this.diffsLoaded = false; this.diffsLoaded = false;
this.buildsLoaded = false;
this.pipelinesLoaded = false; this.pipelinesLoaded = false;
this.commitsLoaded = false; this.commitsLoaded = false;
this.fixedLayoutPref = null; this.fixedLayoutPref = null;
this.setUrl = setUrl !== undefined ? setUrl : true; this.setUrl = setUrl !== undefined ? setUrl : true;
this.buildsLoaded = buildsLoaded || false;
this.setCurrentAction = this.setCurrentAction.bind(this); this.setCurrentAction = this.setCurrentAction.bind(this);
this.tabShown = this.tabShown.bind(this); this.tabShown = this.tabShown.bind(this);
this.showTab = this.showTab.bind(this); this.showTab = this.showTab.bind(this);
...@@ -116,6 +119,10 @@ ...@@ -116,6 +119,10 @@
$.scrollTo('.merge-request-details .merge-request-tabs', { $.scrollTo('.merge-request-details .merge-request-tabs', {
offset: -navBarHeight, offset: -navBarHeight,
}); });
} else if (action === 'builds') {
this.loadBuilds($target.attr('href'));
this.expandView();
this.resetViewContainer();
} else if (action === 'pipelines') { } else if (action === 'pipelines') {
this.loadPipelines($target.attr('href')); this.loadPipelines($target.attr('href'));
this.expandView(); this.expandView();
...@@ -173,8 +180,8 @@ ...@@ -173,8 +180,8 @@
setCurrentAction(action) { setCurrentAction(action) {
this.currentAction = action === 'show' ? 'notes' : action; this.currentAction = action === 'show' ? 'notes' : action;
// Remove a trailing '/commits' '/diffs' '/pipelines' '/new' '/new/diffs' // Remove a trailing '/commits' '/diffs' '/builds' '/pipelines' '/new' '/new/diffs'
let newState = location.pathname.replace(/\/(commits|diffs|pipelines|new|new\/diffs)(\.html)?\/?$/, ''); let newState = location.pathname.replace(/\/(commits|diffs|builds|pipelines|new|new\/diffs)(\.html)?\/?$/, '');
// Append the new action if we're on a tab other than 'notes' // Append the new action if we're on a tab other than 'notes'
if (this.currentAction !== 'notes') { if (this.currentAction !== 'notes') {
...@@ -248,6 +255,22 @@ ...@@ -248,6 +255,22 @@
}); });
} }
loadBuilds(source) {
if (this.buildsLoaded) {
return;
}
this.ajaxGet({
url: `${source}.json`,
success: (data) => {
document.querySelector('div#builds').innerHTML = data.html;
gl.utils.localTimeAgo($('.js-timeago', 'div#builds'));
this.buildsLoaded = true;
new gl.Pipelines();
this.scrollToElement('#builds');
},
});
}
loadPipelines(source) { loadPipelines(source) {
if (this.pipelinesLoaded) { if (this.pipelinesLoaded) {
return; return;
......
...@@ -74,7 +74,7 @@ ...@@ -74,7 +74,7 @@
MergeRequestWidget.prototype.addEventListeners = function() { MergeRequestWidget.prototype.addEventListeners = function() {
var allowedPages; var allowedPages;
allowedPages = ['show', 'commits', 'pipelines', 'changes']; allowedPages = ['show', 'commits', 'builds', 'pipelines', 'changes'];
$(document).on('page:change.merge_request', (function(_this) { $(document).on('page:change.merge_request', (function(_this) {
return function() { return function() {
var page; var page;
...@@ -173,6 +173,7 @@ ...@@ -173,6 +173,7 @@
message = message.replace('{{title}}', data.title); message = message.replace('{{title}}', data.title);
notify(title, message, _this.opts.gitlab_icon, function() { notify(title, message, _this.opts.gitlab_icon, function() {
this.close(); this.close();
return Turbolinks.visit(_this.opts.builds_path);
}); });
} }
} }
......
...@@ -8,11 +8,13 @@ class Projects::CommitController < Projects::ApplicationController ...@@ -8,11 +8,13 @@ class Projects::CommitController < Projects::ApplicationController
# Authorize # Authorize
before_action :require_non_empty_project before_action :require_non_empty_project
before_action :authorize_download_code! before_action :authorize_download_code!, except: [:cancel_builds, :retry_builds]
before_action :authorize_update_build!, only: [:cancel_builds, :retry_builds]
before_action :authorize_read_pipeline!, only: [:pipelines] before_action :authorize_read_pipeline!, only: [:pipelines]
before_action :authorize_read_commit_status!, only: [:builds]
before_action :commit before_action :commit
before_action :define_commit_vars, only: [:show, :diff_for_path, :pipelines] before_action :define_commit_vars, only: [:show, :diff_for_path, :builds, :pipelines]
before_action :define_status_vars, only: [:show, :pipelines] before_action :define_status_vars, only: [:show, :builds, :pipelines]
before_action :define_note_vars, only: [:show, :diff_for_path] before_action :define_note_vars, only: [:show, :diff_for_path]
before_action :authorize_edit_tree!, only: [:revert, :cherry_pick] before_action :authorize_edit_tree!, only: [:revert, :cherry_pick]
...@@ -33,6 +35,25 @@ class Projects::CommitController < Projects::ApplicationController ...@@ -33,6 +35,25 @@ class Projects::CommitController < Projects::ApplicationController
def pipelines def pipelines
end end
def builds
end
def cancel_builds
ci_builds.running_or_pending.each(&:cancel)
redirect_back_or_default default: builds_namespace_project_commit_path(project.namespace, project, commit.sha)
end
def retry_builds
ci_builds.latest.failed.each do |build|
if build.retryable?
Ci::Build.retry(build, current_user)
end
end
redirect_back_or_default default: builds_namespace_project_commit_path(project.namespace, project, commit.sha)
end
def branches def branches
@branches = @project.repository.branch_names_contains(commit.id) @branches = @project.repository.branch_names_contains(commit.id)
@tags = @project.repository.tag_names_contains(commit.id) @tags = @project.repository.tag_names_contains(commit.id)
...@@ -77,6 +98,10 @@ class Projects::CommitController < Projects::ApplicationController ...@@ -77,6 +98,10 @@ class Projects::CommitController < Projects::ApplicationController
@noteable = @commit ||= @project.commit(params[:id]) @noteable = @commit ||= @project.commit(params[:id])
end end
def ci_builds
@ci_builds ||= Ci::Build.where(pipeline: pipelines)
end
def define_commit_vars def define_commit_vars
return git_not_found! unless commit return git_not_found! unless commit
...@@ -108,6 +133,8 @@ class Projects::CommitController < Projects::ApplicationController ...@@ -108,6 +133,8 @@ class Projects::CommitController < Projects::ApplicationController
def define_status_vars def define_status_vars
@ci_pipelines = project.pipelines.where(sha: commit.sha) @ci_pipelines = project.pipelines.where(sha: commit.sha)
@statuses = CommitStatus.where(pipeline: @ci_pipelines).relevant
@builds = Ci::Build.where(pipeline: @ci_pipelines).relevant
end end
def assign_change_commit_vars(mr_source_branch) def assign_change_commit_vars(mr_source_branch)
......
...@@ -9,10 +9,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController ...@@ -9,10 +9,10 @@ class Projects::MergeRequestsController < Projects::ApplicationController
before_action :module_enabled before_action :module_enabled
before_action :merge_request, only: [ before_action :merge_request, only: [
:edit, :update, :show, :diffs, :commits, :conflicts, :conflict_for_path, :pipelines, :merge, :merge_check, :edit, :update, :show, :diffs, :commits, :conflicts, :conflict_for_path, :builds, :pipelines, :merge, :merge_check,
:ci_status, :ci_environments_status, :toggle_subscription, :cancel_merge_when_build_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues :ci_status, :ci_environments_status, :toggle_subscription, :cancel_merge_when_build_succeeds, :remove_wip, :resolve_conflicts, :assign_related_issues
] ]
before_action :validates_merge_request, only: [:show, :diffs, :commits, :pipelines] before_action :validates_merge_request, only: [:show, :diffs, :commits, :builds, :pipelines]
before_action :define_show_vars, only: [:show, :diffs, :commits, :conflicts, :conflict_for_path, :builds, :pipelines] before_action :define_show_vars, only: [:show, :diffs, :commits, :conflicts, :conflict_for_path, :builds, :pipelines]
before_action :define_widget_vars, only: [:merge, :cancel_merge_when_build_succeeds, :merge_check] before_action :define_widget_vars, only: [:merge, :cancel_merge_when_build_succeeds, :merge_check]
before_action :define_commit_vars, only: [:diffs] before_action :define_commit_vars, only: [:diffs]
...@@ -201,6 +201,17 @@ class Projects::MergeRequestsController < Projects::ApplicationController ...@@ -201,6 +201,17 @@ class Projects::MergeRequestsController < Projects::ApplicationController
end end
end end
def builds
respond_to do |format|
format.html do
define_discussion_vars
render 'show'
end
format.json { render json: { html: view_to_html_string('projects/merge_requests/show/_builds') } }
end
end
def pipelines def pipelines
@pipelines = @merge_request.all_pipelines @pipelines = @merge_request.all_pipelines
......
module CiStatusHelper module CiStatusHelper
def ci_status_path(pipeline) def ci_status_path(pipeline)
project = pipeline.project project = pipeline.project
namespace_project_pipeline_path(project.namespace, project, pipeline) builds_namespace_project_commit_path(project.namespace, project, pipeline.sha)
end end
# Is used by Commit and Merge Request Widget # Is used by Commit and Merge Request Widget
......
- ref = local_assigns.fetch(:ref) - ref = local_assigns.fetch(:ref)
- status = commit.status(ref) - status = commit.status(ref)
- if status - if status
= link_to pipelines_namespace_project_commit_path(commit.project.namespace, commit.project, commit), class: "ci-status ci-#{status}" do = link_to builds_namespace_project_commit_path(commit.project.namespace, commit.project, commit), class: "ci-status ci-#{status}" do
= ci_icon_for_status(status) = ci_icon_for_status(status)
= ci_label_for_status(status) = ci_label_for_status(status)
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
= link_to pipeline_path(@build.pipeline) do = link_to pipeline_path(@build.pipeline) do
%strong ##{@build.pipeline.id} %strong ##{@build.pipeline.id}
for commit for commit
= link_to namespace_project_commit_path(@project.namespace, @project, @build.pipeline.sha) do = link_to ci_status_path(@build.pipeline) do
%strong= @build.pipeline.short_sha %strong= @build.pipeline.short_sha
from from
= link_to namespace_project_commits_path(@project.namespace, @project, @build.ref) do = link_to namespace_project_commits_path(@project.namespace, @project, @build.ref) do
......
- @ci_pipelines.each do |pipeline|
= render "pipeline", pipeline: pipeline, pipeline_details: true
...@@ -8,3 +8,7 @@ ...@@ -8,3 +8,7 @@
= link_to pipelines_namespace_project_commit_path(@project.namespace, @project, @commit.id) do = link_to pipelines_namespace_project_commit_path(@project.namespace, @project, @commit.id) do
Pipelines Pipelines
%span.badge= @ci_pipelines.count %span.badge= @ci_pipelines.count
= nav_link(path: 'commit#builds') do
= link_to builds_namespace_project_commit_path(@project.namespace, @project, @commit.id) do
Builds
%span.badge= @statuses.count
- @no_container = true
- page_title "Builds", "#{@commit.title} (#{@commit.short_id})", "Commits"
= render "projects/commits/head"
%div{ class: container_class }
= render "commit_box"
= render "ci_menu"
= render "builds"
...@@ -34,6 +34,11 @@ ...@@ -34,6 +34,11 @@
= link_to url_for(params), data: {target: 'div#pipelines', action: 'pipelines', toggle: 'tab'} do = link_to url_for(params), data: {target: 'div#pipelines', action: 'pipelines', toggle: 'tab'} do
Pipelines Pipelines
%span.badge= @pipelines.size %span.badge= @pipelines.size
- if @pipeline.present?
%li.builds-tab
= link_to url_for(params), data: {target: 'div#builds', action: 'builds', toggle: 'tab'} do
Builds
%span.badge= @statuses_count
%li.diffs-tab %li.diffs-tab
= link_to url_for(params.merge(action: 'new_diffs')), data: {target: 'div#diffs', action: 'new/diffs', toggle: 'tab'} do = link_to url_for(params.merge(action: 'new_diffs')), data: {target: 'div#diffs', action: 'new/diffs', toggle: 'tab'} do
Changes Changes
...@@ -44,6 +49,9 @@ ...@@ -44,6 +49,9 @@
= render "projects/merge_requests/show/commits" = render "projects/merge_requests/show/commits"
#diffs.diffs.tab-pane #diffs.diffs.tab-pane
- # This tab is always loaded via AJAX - # This tab is always loaded via AJAX
- if @pipeline.present?
#builds.builds.tab-pane
= render "projects/merge_requests/show/builds"
- if @pipelines.any? - if @pipelines.any?
#pipelines.pipelines.tab-pane #pipelines.pipelines.tab-pane
= render "projects/merge_requests/show/pipelines" = render "projects/merge_requests/show/pipelines"
...@@ -58,5 +66,6 @@ ...@@ -58,5 +66,6 @@
}); });
:javascript :javascript
var merge_request = new MergeRequest({ var merge_request = new MergeRequest({
action: "#{(@show_changes_tab ? 'new/diffs' : 'new')}" action: "#{(@show_changes_tab ? 'new/diffs' : 'new')}",
buildsLoaded: "#{@pipeline.present? ? 'true' : 'false'}"
}); });
...@@ -65,6 +65,11 @@ ...@@ -65,6 +65,11 @@
= link_to pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: { target: '#pipelines', action: 'pipelines', toggle: 'tab' } do = link_to pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: { target: '#pipelines', action: 'pipelines', toggle: 'tab' } do
Pipelines Pipelines
%span.badge= @pipelines.size %span.badge= @pipelines.size
- if @pipeline.present?
%li.builds-tab
= link_to builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: { target: '#builds', action: 'builds', toggle: 'tab' } do
Builds
%span.badge= @statuses_count
%li.diffs-tab %li.diffs-tab
= link_to diffs_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: { target: 'div#diffs', action: 'diffs', toggle: 'tab' } do = link_to diffs_namespace_project_merge_request_path(@project.namespace, @project, @merge_request), data: { target: 'div#diffs', action: 'diffs', toggle: 'tab' } do
Changes Changes
...@@ -93,6 +98,8 @@ ...@@ -93,6 +98,8 @@
#commits.commits.tab-pane #commits.commits.tab-pane
- # This tab is always loaded via AJAX - # This tab is always loaded via AJAX
#builds.builds.tab-pane
- # This tab is always loaded via AJAX
#pipelines.pipelines.tab-pane #pipelines.pipelines.tab-pane
- # This tab is always loaded via AJAX - # This tab is always loaded via AJAX
#diffs.diffs.tab-pane #diffs.diffs.tab-pane
......
= render "projects/commit/pipeline", pipeline: @pipeline, link_to_commit: true
...@@ -24,10 +24,12 @@ ...@@ -24,10 +24,12 @@
preparing: "{{status}} build", preparing: "{{status}} build",
normal: "Build {{status}}" normal: "Build {{status}}"
}, },
builds_path: "#{builds_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}",
pipelines_path: "#{pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}" pipelines_path: "#{pipelines_namespace_project_merge_request_path(@project.namespace, @project, @merge_request)}"
}; };
if (typeof merge_request_widget !== 'undefined') { if (typeof merge_request_widget !== 'undefined') {
clearInterval(merge_request_widget.fetchBuildStatusInterval);
merge_request_widget.cancelPolling(); merge_request_widget.cancelPolling();
merge_request_widget.clearEventListeners(); merge_request_widget.clearEventListeners();
} }
......
...@@ -32,7 +32,10 @@ constraints(ProjectUrlConstrainer.new) do ...@@ -32,7 +32,10 @@ constraints(ProjectUrlConstrainer.new) do
resources :commit, only: [:show], constraints: { id: /\h{7,40}/ } do resources :commit, only: [:show], constraints: { id: /\h{7,40}/ } do
member do member do
get :branches get :branches
get :builds
get :pipelines get :pipelines
post :cancel_builds
post :retry_builds
post :revert post :revert
post :cherry_pick post :cherry_pick
get :diff_for_path get :diff_for_path
...@@ -91,6 +94,7 @@ constraints(ProjectUrlConstrainer.new) do ...@@ -91,6 +94,7 @@ constraints(ProjectUrlConstrainer.new) do
get :diffs get :diffs
get :conflicts get :conflicts
get :conflict_for_path get :conflict_for_path
get :builds
get :pipelines get :pipelines
get :merge_check get :merge_check
post :merge post :merge
......
...@@ -47,6 +47,8 @@ Feature: Project Commits ...@@ -47,6 +47,8 @@ Feature: Project Commits
And repository contains ".gitlab-ci.yml" file And repository contains ".gitlab-ci.yml" file
When I click on commit link When I click on commit link
Then I see commit ci info Then I see commit ci info
And I click status link
Then I see builds list
Scenario: I browse commit with side-by-side diff view Scenario: I browse commit with side-by-side diff view
Given I click on commit link Given I click on commit link
......
...@@ -166,6 +166,15 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps ...@@ -166,6 +166,15 @@ class Spinach::Features::ProjectCommits < Spinach::FeatureSteps
expect(page).to have_content "Pipeline #1 for 570e7b2a pending" expect(page).to have_content "Pipeline #1 for 570e7b2a pending"
end end
step 'I click status link' do
find('.commit-ci-menu').click_link "Builds"
end
step 'I see builds list' do
expect(page).to have_content "Pipeline #1 for 570e7b2a pending"
expect(page).to have_content "1 build"
end
step 'I search "submodules" commits' do step 'I search "submodules" commits' do
fill_in 'commits-search', with: 'submodules' fill_in 'commits-search', with: 'submodules'
end end
......
...@@ -649,6 +649,10 @@ describe Projects::MergeRequestsController do ...@@ -649,6 +649,10 @@ describe Projects::MergeRequestsController do
end end
end end
describe 'GET builds' do
it_behaves_like "loads labels", :builds
end
describe 'GET pipelines' do describe 'GET pipelines' do
it_behaves_like "loads labels", :pipelines it_behaves_like "loads labels", :pipelines
end end
......
...@@ -54,14 +54,14 @@ feature 'Merge request created from fork' do ...@@ -54,14 +54,14 @@ feature 'Merge request created from fork' do
scenario 'user visits a pipelines page', js: true do scenario 'user visits a pipelines page', js: true do
visit_merge_request(merge_request) visit_merge_request(merge_request)
page.within('.merge-request-tabs') { click_link 'Pipelines' } page.within('.merge-request-tabs') { click_link 'Builds' }
page.within('table.ci-table') do page.within('table.ci-table') do
expect(page).to have_content pipeline.status expect(page).to have_content 'rspec'
expect(page).to have_content pipeline.id expect(page).to have_content 'spinach'
end end
expect(page.find('a.btn-remove')[:href]) expect(find_link('Cancel running')[:href])
.to include fork_project.path_with_namespace .to include fork_project.path_with_namespace
end end
end end
......
require 'spec_helper' require 'spec_helper'
feature 'project commit pipelines' do feature 'project commit builds' do
given(:project) { create(:project) } given(:project) { create(:project) }
background do background do
...@@ -16,13 +16,11 @@ feature 'project commit pipelines' do ...@@ -16,13 +16,11 @@ feature 'project commit pipelines' do
ref: 'master') ref: 'master')
end end
scenario 'user views commit pipelines page' do scenario 'user views commit builds page' do
visit pipelines_namespace_project_commit_path(project.namespace, project, project.commit.sha) visit builds_namespace_project_commit_path(project.namespace,
project, project.commit.sha)
page.within('.table-holder') do expect(page).to have_content('Builds')
expect(page).to have_content project.pipelines[0].status # pipeline status
expect(page).to have_content project.pipelines[0].id # pipeline ids
end
end end
end end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment