CI details cleanup
- Add page titles to CI settings. - Fix CI admin navigation. - Remove duplicated scope. - Use monospace font for commit sha. - Add page title and header title to build page. - Proper authorization for cancel/retry builds. - Use gitlab pagination theme for builds and group members. - Don't paginate builds widget on build page. - Add badges to commit page Changes/Builds tabs. - Add "Builds" to commit Builds tab page title. - Add and use Ci::Build#retryable? method. - Add CI::Build#retried? method. - Allow all failed commit builds to be retried. - Proper authorization for cancel/retry all builds. - Remove unused param. - Use time_ago_with_tooltip where appropriate. - Tweak builds index text - Remove duplication between builds/build and commit_statuses/commit_status. - Use POST rather than GET for canceling and retrying builds. - Remove redundant URL helpers. - Add build ID to build page. - Link branch name on build page. - Move commit/:sha/ci to commit/:sha/builds.
This commit is contained in:
parent
4f574388fc
commit
ba68facf8d
36 changed files with 160 additions and 184 deletions
|
@ -30,7 +30,7 @@ class Projects::BuildsController < Projects::ApplicationController
|
|||
|
||||
def show
|
||||
@builds = @ci_project.commits.find_by_sha(@build.sha).builds.order('id DESC')
|
||||
@builds = @builds.where("id not in (?)", @build.id).page(params[:page]).per(20)
|
||||
@builds = @builds.where("id not in (?)", @build.id)
|
||||
@commit = @build.commit
|
||||
|
||||
respond_to do |format|
|
||||
|
@ -42,17 +42,13 @@ class Projects::BuildsController < Projects::ApplicationController
|
|||
end
|
||||
|
||||
def retry
|
||||
if @build.commands.blank?
|
||||
unless @build.retryable?
|
||||
return page_404
|
||||
end
|
||||
|
||||
build = Ci::Build.retry(@build)
|
||||
|
||||
if params[:return_to]
|
||||
redirect_to URI.parse(params[:return_to]).path
|
||||
else
|
||||
redirect_to build_path(build)
|
||||
end
|
||||
redirect_to build_path(build)
|
||||
end
|
||||
|
||||
def status
|
||||
|
|
|
@ -7,14 +7,14 @@ class Projects::CommitController < Projects::ApplicationController
|
|||
before_action :authorize_download_code!, except: [:cancel_builds]
|
||||
before_action :authorize_manage_builds!, only: [:cancel_builds]
|
||||
before_action :commit
|
||||
before_action :authorize_manage_builds!, only: [:cancel_builds, :retry_builds]
|
||||
before_action :define_show_vars, only: [:show, :builds]
|
||||
|
||||
def show
|
||||
return git_not_found! unless @commit
|
||||
|
||||
@line_notes = commit.notes.inline
|
||||
@diffs = @commit.diffs
|
||||
@note = @project.build_commit_note(commit)
|
||||
@notes_count = commit.notes.count
|
||||
@notes = commit.notes.not_inline.fresh
|
||||
@noteable = @commit
|
||||
@comments_allowed = @reply_allowed = true
|
||||
|
@ -23,8 +23,6 @@ class Projects::CommitController < Projects::ApplicationController
|
|||
commit_id: @commit.id
|
||||
}
|
||||
|
||||
@ci_commit = project.ci_commit(commit.sha)
|
||||
|
||||
respond_to do |format|
|
||||
format.html
|
||||
format.diff { render text: @commit.to_diff }
|
||||
|
@ -32,20 +30,25 @@ class Projects::CommitController < Projects::ApplicationController
|
|||
end
|
||||
end
|
||||
|
||||
def ci
|
||||
@ci_commit = @project.ci_commit(@commit.sha)
|
||||
@builds = @ci_commit.builds if @ci_commit
|
||||
@notes_count = @commit.notes.count
|
||||
def builds
|
||||
@ci_project = @project.gitlab_ci_project
|
||||
end
|
||||
|
||||
def cancel_builds
|
||||
@ci_commit = @project.ci_commit(@commit.sha)
|
||||
@ci_commit.builds.running_or_pending.each(&:cancel)
|
||||
ci_commit.builds.running_or_pending.each(&:cancel)
|
||||
|
||||
redirect_to ci_namespace_project_commit_path(project.namespace, project, commit.sha)
|
||||
redirect_to builds_namespace_project_commit_path(project.namespace, project, commit.sha)
|
||||
end
|
||||
|
||||
def retry_builds
|
||||
ci_commit.builds.latest.failed.each do |build|
|
||||
if build.retryable?
|
||||
Ci::Build.retry(build)
|
||||
end
|
||||
end
|
||||
|
||||
redirect_to builds_namespace_project_commit_path(project.namespace, project, commit.sha)
|
||||
end
|
||||
|
||||
def branches
|
||||
@branches = @project.repository.branch_names_contains(commit.id)
|
||||
|
@ -53,11 +56,22 @@ class Projects::CommitController < Projects::ApplicationController
|
|||
render layout: false
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def commit
|
||||
@commit ||= @project.commit(params[:id])
|
||||
end
|
||||
|
||||
private
|
||||
def ci_commit
|
||||
@ci_commit ||= project.ci_commit(commit.sha)
|
||||
end
|
||||
|
||||
def define_show_vars
|
||||
@diffs = commit.diffs
|
||||
@notes_count = commit.notes.count
|
||||
|
||||
@builds = ci_commit.builds if ci_commit
|
||||
end
|
||||
|
||||
def authorize_manage_builds!
|
||||
unless can?(current_user, :manage_builds, project)
|
||||
|
|
|
@ -1,13 +0,0 @@
|
|||
module BuildsHelper
|
||||
def build_ref_link build
|
||||
gitlab_ref_link build.project, build.ref
|
||||
end
|
||||
|
||||
def build_commit_link build
|
||||
gitlab_commit_link build.project, build.short_sha
|
||||
end
|
||||
|
||||
def build_url(build)
|
||||
namespace_project_build_path(build.gl_project, build.project, build)
|
||||
end
|
||||
end
|
|
@ -4,25 +4,6 @@ module Ci
|
|||
{ :"data-no-turbolink" => "data-no-turbolink" }
|
||||
end
|
||||
|
||||
def gitlab_ref_link project, ref
|
||||
gitlab_url = project.gitlab_url.dup
|
||||
gitlab_url << "/commits/#{ref}"
|
||||
link_to ref, gitlab_url, no_turbolink
|
||||
end
|
||||
|
||||
def gitlab_compare_link project, before, after
|
||||
gitlab_url = project.gitlab_url.dup
|
||||
gitlab_url << "/compare/#{before}...#{after}"
|
||||
|
||||
link_to "#{before}...#{after}", gitlab_url, no_turbolink
|
||||
end
|
||||
|
||||
def gitlab_commit_link project, sha
|
||||
gitlab_url = project.gitlab_url.dup
|
||||
gitlab_url << "/commit/#{sha}"
|
||||
link_to Ci::Commit.truncate_sha(sha), gitlab_url, no_turbolink
|
||||
end
|
||||
|
||||
def yaml_web_editor_link(project)
|
||||
commits = project.commits
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
module CiStatusHelper
|
||||
def ci_status_path(ci_commit)
|
||||
project = ci_commit.gl_project
|
||||
ci_namespace_project_commit_path(project.namespace, project, ci_commit.sha)
|
||||
builds_namespace_project_commit_path(project.namespace, project, ci_commit.sha)
|
||||
end
|
||||
|
||||
def ci_status_icon(ci_commit)
|
||||
|
|
|
@ -106,6 +106,14 @@ module Ci
|
|||
failed? && allow_failure?
|
||||
end
|
||||
|
||||
def retryable?
|
||||
commands.present?
|
||||
end
|
||||
|
||||
def retried?
|
||||
!self.commit.latest_builds_for_ref(self.ref).include?(self)
|
||||
end
|
||||
|
||||
def trace_html
|
||||
html = Ci::Ansi2html::convert(trace) if trace.present?
|
||||
html || ''
|
||||
|
@ -222,7 +230,7 @@ module Ci
|
|||
end
|
||||
|
||||
def retry_url
|
||||
if commands.present?
|
||||
if retryable?
|
||||
Gitlab::Application.routes.url_helpers.
|
||||
retry_namespace_project_build_path(gl_project.namespace, gl_project, self)
|
||||
end
|
||||
|
|
|
@ -15,8 +15,8 @@ class CommitStatus < ActiveRecord::Base
|
|||
scope :pending, -> { where(status: 'pending') }
|
||||
scope :success, -> { where(status: 'success') }
|
||||
scope :failed, -> { where(status: 'failed') }
|
||||
scope :running_or_pending, -> { where(status:[:running, :pending]) }
|
||||
scope :finished, -> { where(status:[:success, :failed, :canceled]) }
|
||||
scope :running_or_pending, -> { where(status: [:running, :pending]) }
|
||||
scope :finished, -> { where(status: [:success, :failed, :canceled]) }
|
||||
scope :latest, -> { where(id: unscope(:select).select('max(id)').group(:name, :ref)) }
|
||||
scope :ordered, -> { order(:ref, :stage_idx, :name) }
|
||||
scope :for_ref, ->(ref) { where(ref: ref) }
|
||||
|
|
|
@ -11,7 +11,7 @@ module Ci
|
|||
def to_s
|
||||
lines = Array.new
|
||||
lines.push("<a href=\"#{ci_project_url(project)}\">#{project.name}</a> - ")
|
||||
lines.push("<a href=\"#{ci_namespace_project_commit_url(commit.gl_project.namespace, commit.gl_project, commit.sha)}\">Commit ##{commit.id}</a></br>")
|
||||
lines.push("<a href=\"#{builds_namespace_project_commit_url(commit.gl_project.namespace, commit.gl_project, commit.sha)}\">Commit ##{commit.id}</a></br>")
|
||||
lines.push("#{commit.short_sha} #{commit.git_author_name} - #{commit.git_commit_message}</br>")
|
||||
lines.push("#{humanized_status(commit_status)} in #{commit.duration} second(s).")
|
||||
lines.join('')
|
||||
|
|
|
@ -45,7 +45,7 @@ module Ci
|
|||
|
||||
def attachment_message
|
||||
out = "<#{ci_project_url(project)}|#{project_name}>: "
|
||||
out << "Commit <#{ci_namespace_project_commit_url(commit.gl_project.namespace, commit.gl_project, commit.sha)}|\##{commit.id}> "
|
||||
out << "Commit <#{builds_namespace_project_commit_url(commit.gl_project.namespace, commit.gl_project, commit.sha)}|\##{commit.id}> "
|
||||
out << "(<#{commit_sha_link}|#{commit.short_sha}>) "
|
||||
out << "of <#{commit_ref_link}|#{commit.ref}> "
|
||||
out << "by #{commit.git_author_name} " if commit.git_author_name
|
||||
|
|
|
@ -71,7 +71,7 @@ class GitlabCiService < CiService
|
|||
|
||||
def build_page(sha, ref)
|
||||
if project.gitlab_ci_project.present?
|
||||
ci_namespace_project_commit_url(project.namespace, project, sha)
|
||||
builds_namespace_project_commit_url(project.namespace, project, sha)
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
= @project.name
|
||||
|
||||
%p
|
||||
Commit link: #{gitlab_commit_link(@project, @build.commit.short_sha)}
|
||||
Commit: #{link_to @build.short_sha, namespace_project_commit_path(@build.gl_project.namespace, @build.gl_project, @build.sha)}
|
||||
%p
|
||||
Author: #{@build.commit.git_author_name}
|
||||
%p
|
||||
|
@ -16,4 +16,4 @@
|
|||
Message: #{@build.commit.git_commit_message}
|
||||
|
||||
%p
|
||||
Url: #{link_to @build.short_sha, namespace_project_build_url(@build.gl_project.namespace, @build.gl_project, @build)}
|
||||
Build details: #{link_to "Build #{@build.id}", namespace_project_build_url(@build.gl_project.namespace, @build.gl_project, @build)}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
= @project.name
|
||||
|
||||
%p
|
||||
Commit link: #{gitlab_commit_link(@project, @build.commit.short_sha)}
|
||||
Commit: #{link_to @build.short_sha, namespace_project_commit_path(@build.gl_project.namespace, @build.gl_project, @build.sha)}
|
||||
%p
|
||||
Author: #{@build.commit.git_author_name}
|
||||
%p
|
||||
|
@ -17,4 +17,4 @@
|
|||
Message: #{@build.commit.git_commit_message}
|
||||
|
||||
%p
|
||||
Url: #{link_to @build.short_sha, namespace_project_build_url(@build.gl_project.namespace, @build.gl_project, @build)}
|
||||
Build details: #{link_to "Build #{@build.id}", namespace_project_build_url(@build.gl_project.namespace, @build.gl_project, @build)}
|
||||
|
|
|
@ -16,4 +16,4 @@
|
|||
- group = group_member.group
|
||||
= render 'shared/groups/group', group: group, group_member: group_member
|
||||
|
||||
= paginate @group_members
|
||||
= paginate @group_members, theme: 'gitlab'
|
||||
|
|
|
@ -9,23 +9,25 @@
|
|||
= nav_link path: 'projects#index' do
|
||||
= link_to ci_admin_projects_path do
|
||||
= icon('list-alt fw')
|
||||
Projects
|
||||
%span
|
||||
Projects
|
||||
= nav_link path: 'events#index' do
|
||||
= link_to ci_admin_events_path do
|
||||
= icon('book fw')
|
||||
Events
|
||||
%span
|
||||
Events
|
||||
= nav_link path: ['runners#index', 'runners#show'] do
|
||||
= link_to ci_admin_runners_path do
|
||||
= icon('cog fw')
|
||||
Runners
|
||||
%small.pull-right
|
||||
= Ci::Runner.count(:all)
|
||||
%span
|
||||
Runners
|
||||
%span.count= Ci::Runner.count(:all)
|
||||
= nav_link path: 'builds#index' do
|
||||
= link_to ci_admin_builds_path do
|
||||
= icon('link fw')
|
||||
Builds
|
||||
%small.pull-right
|
||||
= Ci::Build.count(:all)
|
||||
%span
|
||||
Builds
|
||||
%span.count= Ci::Build.count(:all)
|
||||
= nav_link(controller: :application_settings, html_options: { class: 'separate-item'}) do
|
||||
= link_to ci_admin_application_settings_path do
|
||||
= icon('cogs fw')
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
= ci_commit.status
|
||||
|
||||
= link_to commit.short_id, namespace_project_commit_path(project.namespace, project, commit), class: "commit_short_id"
|
||||
= link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit.id), class: "commit-row-message"
|
||||
= link_to_gfm commit.title, namespace_project_commit_path(project.namespace, project, commit), class: "commit-row-message"
|
||||
·
|
||||
#{time_ago_with_tooltip(commit.committed_date, skip_js: true)} by
|
||||
= commit_author_link(commit, avatar: true, size: 24)
|
||||
|
|
|
@ -1,53 +0,0 @@
|
|||
%tr.build
|
||||
%td.status
|
||||
= ci_status_with_icon(build.status)
|
||||
|
||||
%td.commit_status-link
|
||||
- if build.target_url
|
||||
= link_to build.target_url do
|
||||
%strong Build ##{build.id}
|
||||
- else
|
||||
%strong Build ##{build.id}
|
||||
|
||||
- if build.show_warning?
|
||||
%i.fa.fa-warning.text-warning
|
||||
|
||||
%td
|
||||
= link_to build.short_sha, namespace_project_commit_path(@project.namespace, @project, build.sha)
|
||||
|
||||
%td
|
||||
= link_to build.ref, namespace_project_commits_path(@project.namespace, @project, build.ref)
|
||||
|
||||
%td
|
||||
- if build.runner
|
||||
= runner_link(build.runner)
|
||||
- else
|
||||
.light none
|
||||
|
||||
%td
|
||||
= build.name
|
||||
|
||||
.pull-right
|
||||
- if build.tags.any?
|
||||
- build.tags.each do |tag|
|
||||
%span.label.label-primary
|
||||
= tag
|
||||
- if build.trigger_request
|
||||
%span.label.label-info triggered
|
||||
- if build.allow_failure
|
||||
%span.label.label-danger allowed to fail
|
||||
|
||||
%td.duration
|
||||
- if build.duration
|
||||
#{duration_in_words(build.finished_at, build.started_at)}
|
||||
|
||||
%td.timestamp
|
||||
- if build.finished_at
|
||||
%span #{time_ago_in_words build.finished_at} ago
|
||||
|
||||
%td
|
||||
.pull-right
|
||||
- if current_user && can?(current_user, :manage_builds, @project)
|
||||
- if build.cancel_url
|
||||
= link_to build.cancel_url, title: 'Cancel' do
|
||||
%i.fa.fa-remove.cred
|
1
app/views/projects/builds/_header_title.html.haml
Normal file
1
app/views/projects/builds/_header_title.html.haml
Normal file
|
@ -0,0 +1 @@
|
|||
- header_title project_title(@project, "Builds", project_builds_path(@project))
|
|
@ -1,12 +1,12 @@
|
|||
- page_title "Builds"
|
||||
- header_title project_title(@project, "Builds", project_builds_path(@project))
|
||||
= render "header_title"
|
||||
|
||||
.project-issuable-filter
|
||||
.controls
|
||||
- if @ci_project && current_user && can?(current_user, :manage_builds, @project)
|
||||
.pull-left.hidden-xs
|
||||
- if @all_builds.running_or_pending.any?
|
||||
= link_to 'Cancel all', cancel_all_namespace_project_builds_path(@project.namespace, @project), data: { confirm: 'Are you sure?' }, class: 'btn btn-danger'
|
||||
= link_to 'Cancel all', cancel_all_namespace_project_builds_path(@project.namespace, @project), data: { confirm: 'Are you sure?' }, class: 'btn btn-danger', method: :post
|
||||
|
||||
%ul.center-top-menu
|
||||
%li{class: ('active' if @scope.nil?)}
|
||||
|
@ -25,7 +25,7 @@
|
|||
%span.badge.js-totalbuilds-count= @all_builds.count(:id)
|
||||
|
||||
.gray-content-block
|
||||
List of #{@scope || 'running'} builds from this project
|
||||
#{(@scope || 'running').capitalize} builds from this project
|
||||
|
||||
%ul.content-list
|
||||
- if @builds.blank?
|
||||
|
@ -40,14 +40,14 @@
|
|||
%th Build ID
|
||||
%th Commit
|
||||
%th Ref
|
||||
%th Runner
|
||||
%th Stage
|
||||
%th Name
|
||||
%th Duration
|
||||
%th Finished at
|
||||
%th
|
||||
|
||||
- @builds.each do |build|
|
||||
= render 'projects/builds/build', build: build
|
||||
= render 'projects/commit_statuses/commit_status', commit_status: build, commit_sha: true, stage: true, allow_retry: true
|
||||
|
||||
= paginate @builds
|
||||
= paginate @builds, theme: 'gitlab'
|
||||
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
- page_title "#{@build.name} (#{@build.id})", "Builds"
|
||||
= render "header_title"
|
||||
|
||||
.build-page
|
||||
.gray-content-block
|
||||
Build for commit
|
||||
Build ##{@build.id} for commit
|
||||
%strong.monospace
|
||||
= link_to @build.commit.short_sha, ci_status_path(@build.commit)
|
||||
from
|
||||
%code #{@build.ref}
|
||||
= link_to @build.ref, namespace_project_commits_path(@project.namespace, @project, @build.ref)
|
||||
|
||||
#up-build-trace
|
||||
- if @commit.matrix_for_ref?(@build.ref)
|
||||
|
@ -20,7 +23,7 @@
|
|||
= build.id
|
||||
|
||||
|
||||
- unless @commit.latest_builds_for_ref(@build.ref).include?(@build)
|
||||
- if @build.retried?
|
||||
%li.active
|
||||
%a
|
||||
Build ##{@build.id}
|
||||
|
@ -37,7 +40,7 @@
|
|||
%i.fa.fa-time
|
||||
#{duration_in_words(@build.finished_at, @build.started_at)}
|
||||
.pull-right
|
||||
= @build.updated_at.stamp('19:00 Aug 27')
|
||||
#{time_ago_with_tooltip(@build.finished_at) if @build.finished_at}
|
||||
|
||||
- if @build.show_warning?
|
||||
- unless @build.any_runners_online?
|
||||
|
@ -87,13 +90,13 @@
|
|||
|
||||
.build-widget
|
||||
%h4.title
|
||||
Build
|
||||
Build ##{@build.id}
|
||||
- if current_user && can?(current_user, :manage_builds, @project)
|
||||
.pull-right
|
||||
- if @build.active?
|
||||
= link_to "Cancel", cancel_namespace_project_build_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-danger'
|
||||
- elsif @build.commands.present?
|
||||
= link_to "Retry", retry_namespace_project_build_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-primary', method: :post
|
||||
- if @build.cancel_url
|
||||
= link_to "Cancel", @build.cancel_url, class: 'btn btn-sm btn-danger', method: :post
|
||||
- elsif @build.retry_url
|
||||
= link_to "Retry", @build.retry_url, class: 'btn btn-sm btn-primary', method: :post
|
||||
|
||||
- if @build.duration
|
||||
%p
|
||||
|
@ -101,15 +104,15 @@
|
|||
#{duration_in_words(@build.finished_at, @build.started_at)}
|
||||
%p
|
||||
%span.attr-name Created:
|
||||
#{time_ago_in_words(@build.created_at)} ago
|
||||
#{time_ago_with_tooltip(@build.created_at)}
|
||||
- if @build.finished_at
|
||||
%p
|
||||
%span.attr-name Finished:
|
||||
#{time_ago_in_words(@build.finished_at)} ago
|
||||
#{time_ago_with_tooltip(@build.finished_at)}
|
||||
%p
|
||||
%span.attr-name Runner:
|
||||
- if @build.runner && current_user && current_user.admin
|
||||
\#{link_to "##{@build.runner.id}", ci_admin_runner_path(@build.runner.id)}
|
||||
= link_to "##{@build.runner.id}", ci_admin_runner_path(@build.runner.id)
|
||||
- elsif @build.runner
|
||||
\##{@build.runner.id}
|
||||
|
||||
|
@ -134,10 +137,11 @@
|
|||
%h4.title
|
||||
Commit
|
||||
.pull-right
|
||||
%small #{build_commit_link @build}
|
||||
%small
|
||||
= link_to @build.commit.short_sha, ci_status_path(@build.commit), class: "monospace"
|
||||
%p
|
||||
%span.attr-name Branch:
|
||||
#{build_ref_link @build}
|
||||
= link_to @build.ref, namespace_project_commits_path(@project.namespace, @project, @build.ref)
|
||||
%p
|
||||
%span.attr-name Author:
|
||||
#{@build.commit.git_author_name}
|
||||
|
@ -155,7 +159,9 @@
|
|||
|
||||
- if @builds.present?
|
||||
.build-widget
|
||||
%h4.title #{pluralize(@builds.count(:id), "other build")} for #{@build.short_sha}:
|
||||
%h4.title #{pluralize(@builds.count(:id), "other build")} for
|
||||
= succeed ":" do
|
||||
= link_to @build.commit.short_sha, ci_status_path(@build.commit), class: "monospace"
|
||||
%table.table.builds
|
||||
- @builds.each_with_index do |build, i|
|
||||
%tr.build
|
||||
|
@ -171,8 +177,5 @@
|
|||
%td.status= build.status
|
||||
|
||||
|
||||
= paginate @builds
|
||||
|
||||
|
||||
:javascript
|
||||
new CiBuild("#{namespace_project_build_url(@project.namespace, @project, @build)}", "#{@build.status}")
|
||||
|
|
|
@ -1 +1,2 @@
|
|||
- page_title @service.title, "CI Services"
|
||||
= render 'form'
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
- page_title "CI Services"
|
||||
%h3.page-title Project services
|
||||
%p.light Project services allow you to integrate GitLab CI with other applications
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
- page_title "CI Settings"
|
||||
- if @ci_project.generated_yaml_config
|
||||
%p.alert.alert-danger
|
||||
CI Jobs are deprecated now, you can #{link_to "download", dumped_yaml_ci_project_path(@ci_project)}
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
- page_title "CI Web Hooks"
|
||||
%h3.page-title
|
||||
CI Web hooks
|
||||
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
= nav_link(path: 'commit#show') do
|
||||
= link_to namespace_project_commit_path(@project.namespace, @project, @commit.id) do
|
||||
Changes
|
||||
= nav_link(path: 'commit#ci') do
|
||||
= link_to ci_namespace_project_commit_path(@project.namespace, @project, @commit.id) do
|
||||
%span.badge= @diffs.count
|
||||
= nav_link(path: 'commit#builds') do
|
||||
= link_to builds_namespace_project_commit_path(@project.namespace, @project, @commit.id) do
|
||||
Builds
|
||||
%span.badge= @builds.count(:id)
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
%p
|
||||
%span.light Commit
|
||||
= link_to @commit.id, namespace_project_commit_path(@project.namespace, @project, @commit)
|
||||
= link_to @commit.id, namespace_project_commit_path(@project.namespace, @project, @commit), class: "monospace"
|
||||
.commit-info-row
|
||||
%span.light Authored by
|
||||
%strong
|
||||
|
@ -36,7 +36,7 @@
|
|||
.commit-info-row
|
||||
%span.cgray= pluralize(@commit.parents.count, "parent")
|
||||
- @commit.parents.each do |parent|
|
||||
= link_to parent.short_id, namespace_project_commit_path(@project.namespace, @project, parent)
|
||||
= link_to parent.short_id, namespace_project_commit_path(@project.namespace, @project, parent), class: "monospace"
|
||||
|
||||
- if @ci_commit
|
||||
.pull-right
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
- page_title "#{@commit.title} (#{@commit.short_id})", "Commits"
|
||||
- page_title "Builds", "#{@commit.title} (#{@commit.short_id})", "Commits"
|
||||
= render "projects/commits/header_title"
|
||||
= render "commit_box"
|
||||
= render "ci_menu"
|
||||
|
@ -26,8 +26,11 @@
|
|||
|
||||
|
||||
- if @ci_project && current_user && can?(current_user, :manage_builds, @project)
|
||||
- if @ci_commit.builds.latest.failed.any?(&:retryable?)
|
||||
= link_to "Retry failed", retry_builds_namespace_project_commit_path(@project.namespace, @project, @commit.sha), class: 'btn btn-xs btn-primary', method: :post
|
||||
|
||||
- if @ci_commit.builds.running_or_pending.any?
|
||||
= link_to "Cancel all", cancel_builds_namespace_project_commit_path(@project.namespace, @project, @commit.sha), class: 'btn btn-xs btn-danger'
|
||||
= link_to "Cancel running", cancel_builds_namespace_project_commit_path(@project.namespace, @project, @commit.sha), class: 'btn btn-xs btn-danger', method: :post
|
||||
|
||||
.table-holder
|
||||
%table.table.builds
|
||||
|
@ -45,7 +48,7 @@
|
|||
%th
|
||||
- @ci_commit.refs.each do |ref|
|
||||
= render partial: "projects/commit_statuses/commit_status", collection: @ci_commit.statuses.for_ref(ref).latest.ordered,
|
||||
locals: { coverage: @ci_project.try(:coverage_enabled?), allow_retry: true }
|
||||
locals: { coverage: @ci_project.try(:coverage_enabled?), stage: true, allow_retry: true }
|
||||
|
||||
- if @ci_commit.retried.any?
|
||||
.gray-content-block.second-block
|
|
@ -12,14 +12,30 @@
|
|||
- if commit_status.show_warning?
|
||||
%i.fa.fa-warning.text-warning
|
||||
|
||||
%td
|
||||
= commit_status.ref
|
||||
- if defined?(commit_sha) && commit_sha
|
||||
%td
|
||||
= link_to commit_status.short_sha, namespace_project_commit_path(@project.namespace, @project, commit_status.sha), class: "monospace"
|
||||
|
||||
%td
|
||||
= commit_status.stage
|
||||
- if commit_status.ref
|
||||
= link_to commit_status.ref, namespace_project_commits_path(@project.namespace, @project, commit_status.ref)
|
||||
- else
|
||||
.light none
|
||||
|
||||
- if defined?(runner) && runner
|
||||
%td
|
||||
- if commit_status.try(:runner)
|
||||
= runner_link(commit_status.runner)
|
||||
- else
|
||||
.light none
|
||||
|
||||
- if defined?(stage) && stage
|
||||
%td
|
||||
= commit_status.stage
|
||||
|
||||
%td
|
||||
= commit_status.name
|
||||
|
||||
.pull-right
|
||||
- if commit_status.tags.any?
|
||||
- commit_status.tags.each do |tag|
|
||||
|
@ -36,7 +52,7 @@
|
|||
|
||||
%td.timestamp
|
||||
- if commit_status.finished_at
|
||||
%span #{time_ago_in_words commit_status.finished_at} ago
|
||||
%span #{time_ago_with_tooltip(commit_status.finished_at)}
|
||||
|
||||
- if defined?(coverage) && coverage
|
||||
%td.coverage
|
||||
|
@ -46,9 +62,10 @@
|
|||
%td
|
||||
.pull-right
|
||||
- if current_user && can?(current_user, :manage_builds, commit_status.gl_project)
|
||||
- if commit_status.cancel_url
|
||||
= link_to commit_status.cancel_url, title: 'Cancel' do
|
||||
%i.fa.fa-remove.cred
|
||||
- if commit_status.active?
|
||||
- if commit_status.cancel_url
|
||||
= link_to commit_status.cancel_url, method: :post, title: 'Cancel' do
|
||||
%i.fa.fa-remove.cred
|
||||
- elsif defined?(allow_retry) && allow_retry && commit_status.retry_url
|
||||
= link_to commit_status.retry_url, method: :post, title: 'Retry' do
|
||||
%i.fa.fa-repeat
|
||||
|
|
|
@ -1,3 +1,5 @@
|
|||
- page_title "Edit", "#{@runner.description} ##{@runner.id}", "Runners"
|
||||
|
||||
%h4 Runner ##{@runner.id}
|
||||
%hr
|
||||
= form_for @runner, url: runner_path(@runner), html: { class: 'form-horizontal' } do |f|
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
- page_title "Runners"
|
||||
.light
|
||||
%p
|
||||
A 'runner' is a process which runs a build.
|
||||
|
|
|
@ -1,13 +1,14 @@
|
|||
= content_for :title do
|
||||
%h3.project-title
|
||||
Runner ##{@runner.id}
|
||||
.pull-right
|
||||
- if @runner.shared?
|
||||
%span.runner-state.runner-state-shared
|
||||
Shared
|
||||
- else
|
||||
%span.runner-state.runner-state-specific
|
||||
Specific
|
||||
- page_title "#{@runner.description} ##{@runner.id}", "Runners"
|
||||
|
||||
%h3.page-title
|
||||
Runner ##{@runner.id}
|
||||
.pull-right
|
||||
- if @runner.shared?
|
||||
%span.runner-state.runner-state-shared
|
||||
Shared
|
||||
- else
|
||||
%span.runner-state.runner-state-specific
|
||||
Specific
|
||||
|
||||
.table-holder
|
||||
%table.table
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
- page_title "Triggers"
|
||||
%h3.page-title
|
||||
Triggers
|
||||
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
- page_title "Variables"
|
||||
%h3.page-title
|
||||
Secret Variables
|
||||
|
||||
|
|
|
@ -472,8 +472,9 @@ Gitlab::Application.routes.draw do
|
|||
resources :commit, only: [:show], constraints: { id: /[[:alnum:]]{6,40}/ } do
|
||||
member do
|
||||
get :branches
|
||||
get :ci
|
||||
get :cancel_builds
|
||||
get :builds
|
||||
post :cancel_builds
|
||||
post :retry_builds
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -588,12 +589,12 @@ Gitlab::Application.routes.draw do
|
|||
|
||||
resources :builds, only: [:index, :show] do
|
||||
collection do
|
||||
get :cancel_all
|
||||
post :cancel_all
|
||||
end
|
||||
|
||||
member do
|
||||
get :cancel
|
||||
get :status
|
||||
post :cancel
|
||||
post :retry
|
||||
end
|
||||
end
|
||||
|
|
|
@ -47,10 +47,11 @@ describe "Builds" do
|
|||
end
|
||||
end
|
||||
|
||||
describe "GET /:project/builds/:id/cancel_all" do
|
||||
describe "POST /:project/builds/:id/cancel_all" do
|
||||
before do
|
||||
@build.run!
|
||||
visit cancel_all_namespace_project_builds_path(@gl_project.namespace, @gl_project)
|
||||
visit namespace_project_builds_path(@gl_project.namespace, @gl_project)
|
||||
click_link "Cancel all"
|
||||
end
|
||||
|
||||
it { expect(page).to have_content 'No builds to show' }
|
||||
|
@ -67,10 +68,11 @@ describe "Builds" do
|
|||
it { expect(page).to have_content @commit.git_author_name }
|
||||
end
|
||||
|
||||
describe "GET /:project/builds/:id/cancel" do
|
||||
describe "POST /:project/builds/:id/cancel" do
|
||||
before do
|
||||
@build.run!
|
||||
visit cancel_namespace_project_build_path(@gl_project.namespace, @gl_project, @build)
|
||||
visit namespace_project_build_path(@gl_project.namespace, @gl_project, @build)
|
||||
click_link "Cancel"
|
||||
end
|
||||
|
||||
it { expect(page).to have_content 'canceled' }
|
||||
|
@ -79,7 +81,9 @@ describe "Builds" do
|
|||
|
||||
describe "POST /:project/builds/:id/retry" do
|
||||
before do
|
||||
visit cancel_namespace_project_build_path(@gl_project.namespace, @gl_project, @build)
|
||||
@build.run!
|
||||
visit namespace_project_build_path(@gl_project.namespace, @gl_project, @build)
|
||||
click_link "Cancel"
|
||||
click_link 'Retry'
|
||||
end
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ describe "Commits" do
|
|||
describe "Cancel all builds" do
|
||||
it "cancels commit" do
|
||||
visit ci_status_path(@commit)
|
||||
click_on "Cancel all"
|
||||
click_on "Cancel running"
|
||||
expect(page).to have_content "canceled"
|
||||
end
|
||||
end
|
||||
|
|
|
@ -39,7 +39,7 @@ describe GitlabCiService do
|
|||
end
|
||||
|
||||
describe :build_page do
|
||||
it { expect(@service.build_page("2ab7834c", 'master')).to eq("http://localhost/#{@ci_project.gl_project.path_with_namespace}/commit/2ab7834c/ci")}
|
||||
it { expect(@service.build_page("2ab7834c", 'master')).to eq("http://localhost/#{@ci_project.gl_project.path_with_namespace}/commit/2ab7834c/builds")}
|
||||
end
|
||||
|
||||
describe "execute" do
|
||||
|
|
Loading…
Reference in a new issue