Cleanup CiCommit and CiBuild
- Remove all view related methods from Ci::Build and CommitStatus - Remove unused Ci::Commit and Ci::Build methods - Use polymorphism to render different types of CommitStatus
This commit is contained in:
parent
37ba5a12b5
commit
0672258915
18 changed files with 174 additions and 304 deletions
|
@ -128,7 +128,7 @@ module Ci
|
||||||
end
|
end
|
||||||
|
|
||||||
def retried?
|
def retried?
|
||||||
!self.commit.latest_builds_for_ref(self.ref).include?(self)
|
!self.commit.latest_statuses_for_ref(self.ref).include?(self)
|
||||||
end
|
end
|
||||||
|
|
||||||
def depends_on_builds
|
def depends_on_builds
|
||||||
|
@ -309,22 +309,6 @@ module Ci
|
||||||
project.valid_runners_token? token
|
project.valid_runners_token? token
|
||||||
end
|
end
|
||||||
|
|
||||||
def target_url
|
|
||||||
namespace_project_build_url(project.namespace, project, self)
|
|
||||||
end
|
|
||||||
|
|
||||||
def cancel_url
|
|
||||||
if active?
|
|
||||||
cancel_namespace_project_build_path(project.namespace, project, self)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def retry_url
|
|
||||||
if retryable?
|
|
||||||
retry_namespace_project_build_path(project.namespace, project, self)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def can_be_served?(runner)
|
def can_be_served?(runner)
|
||||||
(tag_list - runner.tag_list).empty?
|
(tag_list - runner.tag_list).empty?
|
||||||
end
|
end
|
||||||
|
@ -333,7 +317,7 @@ module Ci
|
||||||
project.any_runners? { |runner| runner.active? && runner.online? && can_be_served?(runner) }
|
project.any_runners? { |runner| runner.active? && runner.online? && can_be_served?(runner) }
|
||||||
end
|
end
|
||||||
|
|
||||||
def show_warning?
|
def stuck?
|
||||||
pending? && !any_runners_online?
|
pending? && !any_runners_online?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -348,18 +332,6 @@ module Ci
|
||||||
artifacts_file.exists?
|
artifacts_file.exists?
|
||||||
end
|
end
|
||||||
|
|
||||||
def artifacts_download_url
|
|
||||||
if artifacts?
|
|
||||||
download_namespace_project_build_artifacts_path(project.namespace, project, self)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def artifacts_browse_url
|
|
||||||
if artifacts_metadata?
|
|
||||||
browse_namespace_project_build_artifacts_path(project.namespace, project, self)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def artifacts_metadata?
|
def artifacts_metadata?
|
||||||
artifacts? && artifacts_metadata.exists?
|
artifacts? && artifacts_metadata.exists?
|
||||||
end
|
end
|
||||||
|
|
|
@ -25,8 +25,6 @@ module Ci
|
||||||
has_many :builds, class_name: 'Ci::Build'
|
has_many :builds, class_name: 'Ci::Build'
|
||||||
has_many :trigger_requests, dependent: :destroy, class_name: 'Ci::TriggerRequest'
|
has_many :trigger_requests, dependent: :destroy, class_name: 'Ci::TriggerRequest'
|
||||||
|
|
||||||
scope :ordered, -> { order('CASE WHEN ci_commits.committed_at IS NULL THEN 0 ELSE 1 END', :committed_at, :id) }
|
|
||||||
|
|
||||||
validates_presence_of :sha
|
validates_presence_of :sha
|
||||||
validate :valid_commit_sha
|
validate :valid_commit_sha
|
||||||
|
|
||||||
|
@ -42,16 +40,6 @@ module Ci
|
||||||
project.id
|
project.id
|
||||||
end
|
end
|
||||||
|
|
||||||
def last_build
|
|
||||||
builds.order(:id).last
|
|
||||||
end
|
|
||||||
|
|
||||||
def retry
|
|
||||||
latest_builds.each do |build|
|
|
||||||
Ci::Build.retry(build)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
def valid_commit_sha
|
def valid_commit_sha
|
||||||
if self.sha == Gitlab::Git::BLANK_SHA
|
if self.sha == Gitlab::Git::BLANK_SHA
|
||||||
self.errors.add(:sha, " cant be 00000000 (branch removal)")
|
self.errors.add(:sha, " cant be 00000000 (branch removal)")
|
||||||
|
@ -121,12 +109,8 @@ module Ci
|
||||||
@latest_statuses ||= statuses.latest.to_a
|
@latest_statuses ||= statuses.latest.to_a
|
||||||
end
|
end
|
||||||
|
|
||||||
def latest_builds
|
def latest_statuses_for_ref(ref)
|
||||||
@latest_builds ||= builds.latest.to_a
|
latest_statuses.select { |status| status.ref == ref }
|
||||||
end
|
|
||||||
|
|
||||||
def latest_builds_for_ref(ref)
|
|
||||||
latest_builds.select { |build| build.ref == ref }
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def retried
|
def retried
|
||||||
|
@ -170,7 +154,7 @@ module Ci
|
||||||
end
|
end
|
||||||
|
|
||||||
def duration
|
def duration
|
||||||
duration_array = latest_statuses.map(&:duration).compact
|
duration_array = statuses.map(&:duration).compact
|
||||||
duration_array.reduce(:+).to_i
|
duration_array.reduce(:+).to_i
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -183,16 +167,12 @@ module Ci
|
||||||
end
|
end
|
||||||
|
|
||||||
def coverage
|
def coverage
|
||||||
coverage_array = latest_builds.map(&:coverage).compact
|
coverage_array = latest_statuses.map(&:coverage).compact
|
||||||
if coverage_array.size >= 1
|
if coverage_array.size >= 1
|
||||||
'%.2f' % (coverage_array.reduce(:+) / coverage_array.size)
|
'%.2f' % (coverage_array.reduce(:+) / coverage_array.size)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def matrix_for_ref?(ref)
|
|
||||||
latest_builds_for_ref(ref).size > 1
|
|
||||||
end
|
|
||||||
|
|
||||||
def config_processor
|
def config_processor
|
||||||
return nil unless ci_yaml_file
|
return nil unless ci_yaml_file
|
||||||
@config_processor ||= Ci::GitlabCiYamlProcessor.new(ci_yaml_file, project.path_with_namespace)
|
@config_processor ||= Ci::GitlabCiYamlProcessor.new(ci_yaml_file, project.path_with_namespace)
|
||||||
|
@ -218,10 +198,6 @@ module Ci
|
||||||
git_commit_message =~ /(\[ci skip\])/ if git_commit_message
|
git_commit_message =~ /(\[ci skip\])/ if git_commit_message
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_committed!
|
|
||||||
update!(committed_at: DateTime.now)
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def save_yaml_error(error)
|
def save_yaml_error(error)
|
||||||
|
|
|
@ -125,23 +125,7 @@ class CommitStatus < ActiveRecord::Base
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def cancel_url
|
def stuck?
|
||||||
nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def retry_url
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def show_warning?
|
|
||||||
false
|
false
|
||||||
end
|
end
|
||||||
|
|
||||||
def artifacts_download_url
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
|
|
||||||
def artifacts_browse_url
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@ module Ci
|
||||||
def execute(project, opts)
|
def execute(project, opts)
|
||||||
sha = opts[:sha] || ref_sha(project, opts[:ref])
|
sha = opts[:sha] || ref_sha(project, opts[:ref])
|
||||||
|
|
||||||
commit = project.ci_commits.ordered.find_by(sha: sha)
|
commit = project.ci_commits.find_by(sha: sha)
|
||||||
image_name = image_for_commit(commit)
|
image_name = image_for_commit(commit)
|
||||||
|
|
||||||
image_path = Rails.root.join('public/ci', image_name)
|
image_path = Rails.root.join('public/ci', image_name)
|
||||||
|
|
|
@ -33,7 +33,6 @@ class CreateCommitBuildsService
|
||||||
unless commit.skip_ci?
|
unless commit.skip_ci?
|
||||||
# Create builds for commit
|
# Create builds for commit
|
||||||
tag = Gitlab::Git.tag_ref?(origin_ref)
|
tag = Gitlab::Git.tag_ref?(origin_ref)
|
||||||
commit.update_committed!
|
|
||||||
commit.create_builds(ref, tag, user)
|
commit.create_builds(ref, tag, user)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -4,13 +4,13 @@
|
||||||
= ci_status_with_icon(build.status)
|
= ci_status_with_icon(build.status)
|
||||||
|
|
||||||
%td.build-link
|
%td.build-link
|
||||||
- if can?(current_user, :read_build, project) && build.target_url
|
- if can?(current_user, :read_build, build.project)
|
||||||
= link_to build.target_url do
|
= link_to namespace_project_build_url(build.project.namespace, build.project, build) do
|
||||||
%strong Build ##{build.id}
|
%strong Build ##{build.id}
|
||||||
- else
|
- else
|
||||||
%strong Build ##{build.id}
|
%strong Build ##{build.id}
|
||||||
|
|
||||||
- if build.show_warning?
|
- if build.stuck?
|
||||||
%i.fa.fa-warning.text-warning
|
%i.fa.fa-warning.text-warning
|
||||||
|
|
||||||
%td
|
%td
|
||||||
|
@ -18,11 +18,11 @@
|
||||||
= link_to project.name_with_namespace, admin_namespace_project_path(project.namespace, project), class: "monospace"
|
= link_to project.name_with_namespace, admin_namespace_project_path(project.namespace, project), class: "monospace"
|
||||||
|
|
||||||
%td
|
%td
|
||||||
= link_to build.short_sha, namespace_project_commit_path(project.namespace, project, build.sha), class: "monospace"
|
= link_to build.short_sha, namespace_project_commit_path(build.project.namespace, build.project, build.sha), class: "monospace"
|
||||||
|
|
||||||
%td
|
%td
|
||||||
- if build.ref
|
- if build.ref
|
||||||
= link_to build.ref, namespace_project_commits_path(project.namespace, project, build.ref)
|
= link_to build.ref, namespace_project_commits_path(build.project.namespace, build.project, build.ref)
|
||||||
- else
|
- else
|
||||||
.light none
|
.light none
|
||||||
|
|
||||||
|
@ -61,13 +61,12 @@
|
||||||
%td
|
%td
|
||||||
.pull-right
|
.pull-right
|
||||||
- if can?(current_user, :read_build, project) && build.artifacts?
|
- if can?(current_user, :read_build, project) && build.artifacts?
|
||||||
= link_to build.artifacts_download_url, title: 'Download artifacts' do
|
= link_to download_namespace_project_build_artifacts_path(build.project.namespace, build.project, build), title: 'Download artifacts' do
|
||||||
%i.fa.fa-download
|
%i.fa.fa-download
|
||||||
- if can?(current_user, :update_build, build.project)
|
- if can?(current_user, :update_build, build.project)
|
||||||
- if build.active?
|
- if build.active?
|
||||||
- if build.cancel_url
|
= link_to cancel_namespace_project_build_path(build.project.namespace, build.project, build, return_to: request.original_url), method: :post, title: 'Cancel' do
|
||||||
= link_to build.cancel_url, method: :post, title: 'Cancel' do
|
%i.fa.fa-remove.cred
|
||||||
%i.fa.fa-remove.cred
|
- elsif defined?(allow_retry) && allow_retry && build.retryable?
|
||||||
- elsif defined?(allow_retry) && allow_retry && build.retry_url
|
= link_to retry_namespace_project_build_path(build.project.namespace, build.project, build, return_to: request.original_url), method: :post, title: 'Retry' do
|
||||||
= link_to build.retry_url, method: :post, title: 'Retry' do
|
|
||||||
%i.fa.fa-repeat
|
%i.fa.fa-repeat
|
||||||
|
|
|
@ -1,32 +0,0 @@
|
||||||
%tr.build
|
|
||||||
%td.status
|
|
||||||
= ci_status_with_icon(commit.status)
|
|
||||||
- if commit.running?
|
|
||||||
·
|
|
||||||
= commit.stage
|
|
||||||
|
|
||||||
|
|
||||||
%td.build-link
|
|
||||||
= link_to ci_status_path(commit) do
|
|
||||||
%strong #{commit.short_sha}
|
|
||||||
|
|
||||||
%td.build-message
|
|
||||||
%span= truncate_first_line(commit.git_commit_message)
|
|
||||||
|
|
||||||
%td.build-branch
|
|
||||||
- unless @ref
|
|
||||||
%span
|
|
||||||
- commit.refs.each do |ref|
|
|
||||||
= link_to truncate(ref, length: 25), ci_project_path(@project, ref: ref)
|
|
||||||
|
|
||||||
%td.duration
|
|
||||||
- if commit.duration > 0
|
|
||||||
#{time_interval_in_words commit.duration}
|
|
||||||
|
|
||||||
%td.timestamp
|
|
||||||
- if commit.finished_at
|
|
||||||
%span #{time_ago_in_words commit.finished_at} ago
|
|
||||||
|
|
||||||
- if commit.coverage
|
|
||||||
%td.coverage
|
|
||||||
#{commit.coverage}%
|
|
|
@ -55,7 +55,6 @@
|
||||||
%th Coverage
|
%th Coverage
|
||||||
%th
|
%th
|
||||||
|
|
||||||
- @builds.each do |build|
|
= render @builds, commit_sha: true, stage: true, allow_retry: true, coverage: @project.build_coverage_enabled?
|
||||||
= render 'projects/commit_statuses/commit_status', commit_status: build, commit_sha: true, stage: true, coverage: @project.build_coverage_enabled?, allow_retry: true
|
|
||||||
|
|
||||||
= paginate @builds, theme: 'gitlab'
|
= paginate @builds, theme: 'gitlab'
|
||||||
|
|
|
@ -13,9 +13,10 @@
|
||||||
= link_to "merge request ##{merge_request.iid}", merge_request_path(merge_request)
|
= link_to "merge request ##{merge_request.iid}", merge_request_path(merge_request)
|
||||||
|
|
||||||
#up-build-trace
|
#up-build-trace
|
||||||
- if @commit.matrix_for_ref?(@build.ref)
|
- builds = @build.commit.builds.similar(@build).latest.ordered.to_a
|
||||||
|
- if builds.size > 1
|
||||||
%ul.nav-links.no-top.no-bottom
|
%ul.nav-links.no-top.no-bottom
|
||||||
- @commit.latest_builds_for_ref(@build.ref).each do |build|
|
- builds.each do |build|
|
||||||
%li{class: ('active' if build == @build) }
|
%li{class: ('active' if build == @build) }
|
||||||
= link_to namespace_project_build_path(@project.namespace, @project, build) do
|
= link_to namespace_project_build_path(@project.namespace, @project, build) do
|
||||||
= ci_icon_for_status(build.status)
|
= ci_icon_for_status(build.status)
|
||||||
|
@ -44,7 +45,7 @@
|
||||||
.pull-right
|
.pull-right
|
||||||
#{time_ago_with_tooltip(@build.finished_at) if @build.finished_at}
|
#{time_ago_with_tooltip(@build.finished_at) if @build.finished_at}
|
||||||
|
|
||||||
- if @build.show_warning?
|
- if @build.stuck?
|
||||||
- unless @build.any_runners_online?
|
- unless @build.any_runners_online?
|
||||||
.bs-callout.bs-callout-warning
|
.bs-callout.bs-callout-warning
|
||||||
%p
|
%p
|
||||||
|
@ -100,12 +101,12 @@
|
||||||
%h4.title Build artifacts
|
%h4.title Build artifacts
|
||||||
.center
|
.center
|
||||||
.btn-group{ role: :group }
|
.btn-group{ role: :group }
|
||||||
= link_to @build.artifacts_download_url, class: 'btn btn-sm btn-primary' do
|
= link_to download_namespace_project_build_artifacts_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-primary' do
|
||||||
= icon('download')
|
= icon('download')
|
||||||
Download
|
Download
|
||||||
|
|
||||||
- if @build.artifacts_metadata?
|
- if @build.artifacts_metadata?
|
||||||
= link_to @build.artifacts_browse_url, class: 'btn btn-sm btn-primary' do
|
= link_to browse_namespace_project_build_artifacts_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-primary' do
|
||||||
= icon('folder-open')
|
= icon('folder-open')
|
||||||
Browse
|
Browse
|
||||||
|
|
||||||
|
@ -115,10 +116,10 @@
|
||||||
- if can?(current_user, :update_build, @project)
|
- if can?(current_user, :update_build, @project)
|
||||||
.center
|
.center
|
||||||
.btn-group{ role: :group }
|
.btn-group{ role: :group }
|
||||||
- if @build.cancel_url
|
- if @build.active?
|
||||||
= link_to "Cancel", @build.cancel_url, class: 'btn btn-sm btn-danger', method: :post
|
= link_to "Cancel", cancel_namespace_project_build_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-danger', method: :post
|
||||||
- elsif @build.retry_url
|
- elsif @build.retryable?
|
||||||
= link_to "Retry", @build.retry_url, class: 'btn btn-sm btn-primary', method: :post
|
= link_to "Retry", retry_namespace_project_build_path(@project.namespace, @project, @build), class: 'btn btn-sm btn-primary', method: :post
|
||||||
|
|
||||||
- if @build.erasable?
|
- if @build.erasable?
|
||||||
= link_to erase_namespace_project_build_path(@project.namespace, @project, @build),
|
= link_to erase_namespace_project_build_path(@project.namespace, @project, @build),
|
||||||
|
|
78
app/views/projects/ci/builds/_build.html.haml
Normal file
78
app/views/projects/ci/builds/_build.html.haml
Normal file
|
@ -0,0 +1,78 @@
|
||||||
|
%tr.build
|
||||||
|
%td.status
|
||||||
|
- if can?(current_user, :read_build, build)
|
||||||
|
= link_to namespace_project_build_url(build.project.namespace, build.project, build), class: "ci-status ci-#{build.status}" do
|
||||||
|
= ci_icon_for_status(build.status)
|
||||||
|
= build.status
|
||||||
|
- else
|
||||||
|
= ci_status_with_icon(build.status)
|
||||||
|
|
||||||
|
%td.build-link
|
||||||
|
- if can?(current_user, :read_build, build)
|
||||||
|
= link_to namespace_project_build_url(build.project.namespace, build.project, build) do
|
||||||
|
%strong ##{build.id}
|
||||||
|
- else
|
||||||
|
%strong ##{build.id}
|
||||||
|
|
||||||
|
- if build.stuck?
|
||||||
|
%i.fa.fa-warning.text-warning
|
||||||
|
|
||||||
|
- if defined?(commit_sha) && commit_sha
|
||||||
|
%td
|
||||||
|
= link_to build.short_sha, namespace_project_commit_path(build.project.namespace, build.project, build.sha), class: "monospace"
|
||||||
|
|
||||||
|
%td
|
||||||
|
- if build.ref
|
||||||
|
= link_to build.ref, namespace_project_commits_path(build.project.namespace, build.project, build.ref)
|
||||||
|
- else
|
||||||
|
.light none
|
||||||
|
|
||||||
|
- if defined?(runner) && runner
|
||||||
|
%td
|
||||||
|
- if build.try(:runner)
|
||||||
|
= runner_link(build.runner)
|
||||||
|
- else
|
||||||
|
.light none
|
||||||
|
|
||||||
|
- if defined?(stage) && stage
|
||||||
|
%td
|
||||||
|
= build.stage
|
||||||
|
|
||||||
|
%td
|
||||||
|
= build.name
|
||||||
|
|
||||||
|
.pull-right
|
||||||
|
- if build.tags.any?
|
||||||
|
- build.tags.each do |tag|
|
||||||
|
%span.label.label-primary
|
||||||
|
= tag
|
||||||
|
- if build.try(:trigger_request)
|
||||||
|
%span.label.label-info triggered
|
||||||
|
- if build.try(: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_with_tooltip(build.finished_at)}
|
||||||
|
|
||||||
|
- if defined?(coverage) && coverage
|
||||||
|
%td.coverage
|
||||||
|
- if build.try(:coverage)
|
||||||
|
#{build.coverage}%
|
||||||
|
|
||||||
|
%td
|
||||||
|
.pull-right
|
||||||
|
- if can?(current_user, :read_build, build) && build.artifacts?
|
||||||
|
= link_to download_namespace_project_build_artifacts_path(build.project.namespace, build.project, build), title: 'Download artifacts' do
|
||||||
|
%i.fa.fa-download
|
||||||
|
- if can?(current_user, :update_build, build)
|
||||||
|
- if build.active?
|
||||||
|
= link_to cancel_namespace_project_build_path(build.project.namespace, build.project, build, return_to: request.original_url), method: :post, title: 'Cancel' do
|
||||||
|
%i.fa.fa-remove.cred
|
||||||
|
- elsif defined?(allow_retry) && allow_retry && build.retryable?
|
||||||
|
= link_to retry_namespace_project_build_path(build.project.namespace, build.project, build, return_to: request.original_url), method: :post, title: 'Retry' do
|
||||||
|
%i.fa.fa-repeat
|
|
@ -43,8 +43,8 @@
|
||||||
%th Coverage
|
%th Coverage
|
||||||
%th
|
%th
|
||||||
- @ci_commit.refs.each do |ref|
|
- @ci_commit.refs.each do |ref|
|
||||||
= render partial: "projects/commit_statuses/commit_status", collection: @ci_commit.statuses.for_ref(ref).latest.ordered,
|
- builds = @ci_commit.statuses.for_ref(ref).latest.ordered
|
||||||
locals: { coverage: @ci_commit.project.build_coverage_enabled?, stage: true, allow_retry: true }
|
= render builds, coverage: @ci_commit.project.build_coverage_enabled?, stage: true, allow_retry: true
|
||||||
|
|
||||||
- if @ci_commit.retried.any?
|
- if @ci_commit.retried.any?
|
||||||
.gray-content-block.second-block
|
.gray-content-block.second-block
|
||||||
|
@ -64,5 +64,4 @@
|
||||||
- if @ci_commit.project.build_coverage_enabled?
|
- if @ci_commit.project.build_coverage_enabled?
|
||||||
%th Coverage
|
%th Coverage
|
||||||
%th
|
%th
|
||||||
= render partial: "projects/commit_statuses/commit_status", collection: @ci_commit.retried,
|
= render @ci_commit.retried, coverage: @ci_commit.project.build_coverage_enabled?, stage: true
|
||||||
locals: { coverage: @ci_commit.project.build_coverage_enabled?, stage: true }
|
|
||||||
|
|
|
@ -1,79 +0,0 @@
|
||||||
%tr.commit_status
|
|
||||||
%td.status
|
|
||||||
- if can?(current_user, :read_commit_status, commit_status) && commit_status.target_url
|
|
||||||
= link_to commit_status.target_url, class: "ci-status ci-#{commit_status.status}" do
|
|
||||||
= ci_icon_for_status(commit_status.status)
|
|
||||||
= commit_status.status
|
|
||||||
- else
|
|
||||||
= ci_status_with_icon(commit_status.status)
|
|
||||||
|
|
||||||
%td.commit_status-link
|
|
||||||
- if can?(current_user, :read_commit_status, commit_status) && commit_status.target_url
|
|
||||||
= link_to commit_status.target_url do
|
|
||||||
%strong ##{commit_status.id}
|
|
||||||
- else
|
|
||||||
%strong ##{commit_status.id}
|
|
||||||
|
|
||||||
- if commit_status.show_warning?
|
|
||||||
%i.fa.fa-warning.text-warning{data: { toggle: "tooltip" }, title: "This build is stuck, open it to know more"}
|
|
||||||
|
|
||||||
- if defined?(commit_sha) && commit_sha
|
|
||||||
%td
|
|
||||||
= link_to commit_status.short_sha, namespace_project_commit_path(commit_status.project.namespace, commit_status.project, commit_status.sha), class: "monospace"
|
|
||||||
|
|
||||||
%td
|
|
||||||
- if commit_status.ref
|
|
||||||
= link_to commit_status.ref, namespace_project_commits_path(commit_status.project.namespace, commit_status.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|
|
|
||||||
%span.label.label-primary
|
|
||||||
= tag
|
|
||||||
- if commit_status.try(:trigger_request)
|
|
||||||
%span.label.label-info triggered
|
|
||||||
- if commit_status.try(:allow_failure)
|
|
||||||
%span.label.label-danger allowed to fail
|
|
||||||
|
|
||||||
%td.duration
|
|
||||||
- if commit_status.duration
|
|
||||||
#{duration_in_words(commit_status.finished_at, commit_status.started_at)}
|
|
||||||
|
|
||||||
%td.timestamp
|
|
||||||
- if commit_status.finished_at
|
|
||||||
%span #{time_ago_with_tooltip(commit_status.finished_at)}
|
|
||||||
|
|
||||||
- if defined?(coverage) && coverage
|
|
||||||
%td.coverage
|
|
||||||
- if commit_status.try(:coverage)
|
|
||||||
#{commit_status.coverage}%
|
|
||||||
|
|
||||||
%td
|
|
||||||
.pull-right
|
|
||||||
- if can?(current_user, :read_commit_status, commit_status) && commit_status.artifacts_download_url
|
|
||||||
= link_to commit_status.artifacts_download_url, title: 'Download artifacts' do
|
|
||||||
%i.fa.fa-download
|
|
||||||
- if can?(current_user, :update_commit_status, commit_status)
|
|
||||||
- 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
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
%tr.generic_commit_status
|
||||||
|
%td.status
|
||||||
|
- if can?(current_user, :read_commit_status, generic_commit_status) && generic_commit_status.target_url
|
||||||
|
= link_to generic_commit_status.target_url, class: "ci-status ci-#{generic_commit_status.status}" do
|
||||||
|
= ci_icon_for_status(generic_commit_status.status)
|
||||||
|
= generic_commit_status.status
|
||||||
|
- else
|
||||||
|
= ci_status_with_icon(generic_commit_status.status)
|
||||||
|
|
||||||
|
%td.generic_commit_status-link
|
||||||
|
- if can?(current_user, :read_commit_status, generic_commit_status) && generic_commit_status.target_url
|
||||||
|
= link_to generic_commit_status.target_url do
|
||||||
|
%strong ##{generic_commit_status.id}
|
||||||
|
- else
|
||||||
|
%strong ##{generic_commit_status.id}
|
||||||
|
|
||||||
|
- if defined?(commit_sha) && commit_sha
|
||||||
|
%td
|
||||||
|
= link_to generic_commit_status.short_sha, namespace_project_commit_path(generic_commit_status.project.namespace, generic_commit_status.project, generic_commit_status.sha), class: "monospace"
|
||||||
|
|
||||||
|
%td
|
||||||
|
- if generic_commit_status.ref
|
||||||
|
= link_to generic_commit_status.ref, namespace_project_commits_path(generic_commit_status.project.namespace, generic_commit_status.project, generic_commit_status.ref)
|
||||||
|
- else
|
||||||
|
.light none
|
||||||
|
|
||||||
|
- if defined?(runner) && runner
|
||||||
|
%td
|
||||||
|
- if generic_commit_status.try(:runner)
|
||||||
|
= runner_link(generic_commit_status.runner)
|
||||||
|
- else
|
||||||
|
.light none
|
||||||
|
|
||||||
|
- if defined?(stage) && stage
|
||||||
|
%td
|
||||||
|
= generic_commit_status.stage
|
||||||
|
|
||||||
|
%td
|
||||||
|
= generic_commit_status.name
|
||||||
|
|
||||||
|
.pull-right
|
||||||
|
- if generic_commit_status.tags.any?
|
||||||
|
- generic_commit_status.tags.each do |tag|
|
||||||
|
%span.label.label-primary
|
||||||
|
= tag
|
||||||
|
|
||||||
|
%td.duration
|
||||||
|
- if generic_commit_status.duration
|
||||||
|
#{duration_in_words(generic_commit_status.finished_at, generic_commit_status.started_at)}
|
||||||
|
|
||||||
|
%td.timestamp
|
||||||
|
- if generic_commit_status.finished_at
|
||||||
|
%span #{time_ago_with_tooltip(generic_commit_status.finished_at)}
|
||||||
|
|
||||||
|
- if defined?(coverage) && coverage
|
||||||
|
%td.coverage
|
||||||
|
- if generic_commit_status.try(:coverage)
|
||||||
|
#{generic_commit_status.coverage}%
|
||||||
|
|
||||||
|
%td
|
|
@ -33,7 +33,6 @@ Example of response
|
||||||
},
|
},
|
||||||
"coverage": null,
|
"coverage": null,
|
||||||
"created_at": "2015-12-24T15:51:21.802Z",
|
"created_at": "2015-12-24T15:51:21.802Z",
|
||||||
"download_url": null,
|
|
||||||
"artifacts_file": {
|
"artifacts_file": {
|
||||||
"filename": "artifacts.zip",
|
"filename": "artifacts.zip",
|
||||||
"size": 1000
|
"size": 1000
|
||||||
|
@ -75,7 +74,6 @@ Example of response
|
||||||
},
|
},
|
||||||
"coverage": null,
|
"coverage": null,
|
||||||
"created_at": "2015-12-24T15:51:21.727Z",
|
"created_at": "2015-12-24T15:51:21.727Z",
|
||||||
"download_url": null,
|
|
||||||
"artifacts_file": null,
|
"artifacts_file": null,
|
||||||
"finished_at": "2015-12-24T17:54:24.921Z",
|
"finished_at": "2015-12-24T17:54:24.921Z",
|
||||||
"id": 6,
|
"id": 6,
|
||||||
|
@ -139,7 +137,6 @@ Example of response
|
||||||
},
|
},
|
||||||
"coverage": null,
|
"coverage": null,
|
||||||
"created_at": "2016-01-11T10:13:33.506Z",
|
"created_at": "2016-01-11T10:13:33.506Z",
|
||||||
"download_url": null,
|
|
||||||
"artifacts_file": null,
|
"artifacts_file": null,
|
||||||
"finished_at": "2016-01-11T10:14:09.526Z",
|
"finished_at": "2016-01-11T10:14:09.526Z",
|
||||||
"id": 69,
|
"id": 69,
|
||||||
|
@ -164,7 +161,6 @@ Example of response
|
||||||
},
|
},
|
||||||
"coverage": null,
|
"coverage": null,
|
||||||
"created_at": "2015-12-24T15:51:21.957Z",
|
"created_at": "2015-12-24T15:51:21.957Z",
|
||||||
"download_url": null,
|
|
||||||
"artifacts_file": null,
|
"artifacts_file": null,
|
||||||
"finished_at": "2015-12-24T17:54:33.913Z",
|
"finished_at": "2015-12-24T17:54:33.913Z",
|
||||||
"id": 9,
|
"id": 9,
|
||||||
|
@ -226,7 +222,6 @@ Example of response
|
||||||
},
|
},
|
||||||
"coverage": null,
|
"coverage": null,
|
||||||
"created_at": "2015-12-24T15:51:21.880Z",
|
"created_at": "2015-12-24T15:51:21.880Z",
|
||||||
"download_url": null,
|
|
||||||
"artifacts_file": null,
|
"artifacts_file": null,
|
||||||
"finished_at": "2015-12-24T17:54:31.198Z",
|
"finished_at": "2015-12-24T17:54:31.198Z",
|
||||||
"id": 8,
|
"id": 8,
|
||||||
|
@ -315,7 +310,6 @@ Example of response
|
||||||
},
|
},
|
||||||
"coverage": null,
|
"coverage": null,
|
||||||
"created_at": "2016-01-11T10:13:33.506Z",
|
"created_at": "2016-01-11T10:13:33.506Z",
|
||||||
"download_url": null,
|
|
||||||
"artifacts_file": null,
|
"artifacts_file": null,
|
||||||
"finished_at": "2016-01-11T10:14:09.526Z",
|
"finished_at": "2016-01-11T10:14:09.526Z",
|
||||||
"id": 69,
|
"id": 69,
|
||||||
|
@ -362,7 +356,6 @@ Example of response
|
||||||
},
|
},
|
||||||
"coverage": null,
|
"coverage": null,
|
||||||
"created_at": "2016-01-11T10:13:33.506Z",
|
"created_at": "2016-01-11T10:13:33.506Z",
|
||||||
"download_url": null,
|
|
||||||
"artifacts_file": null,
|
"artifacts_file": null,
|
||||||
"finished_at": null,
|
"finished_at": null,
|
||||||
"id": 69,
|
"id": 69,
|
||||||
|
|
|
@ -68,7 +68,7 @@ module SharedBuilds
|
||||||
end
|
end
|
||||||
|
|
||||||
step 'I see the build' do
|
step 'I see the build' do
|
||||||
page.within('.commit_status') do
|
page.within('.build') do
|
||||||
expect(page).to have_content "##{@build.id}"
|
expect(page).to have_content "##{@build.id}"
|
||||||
expect(page).to have_content @build.sha[0..7]
|
expect(page).to have_content @build.sha[0..7]
|
||||||
expect(page).to have_content @build.ref
|
expect(page).to have_content @build.ref
|
||||||
|
|
|
@ -401,13 +401,6 @@ module API
|
||||||
expose :id, :status, :stage, :name, :ref, :tag, :coverage
|
expose :id, :status, :stage, :name, :ref, :tag, :coverage
|
||||||
expose :created_at, :started_at, :finished_at
|
expose :created_at, :started_at, :finished_at
|
||||||
expose :user, with: User
|
expose :user, with: User
|
||||||
# TODO: download_url in Ci:Build model is an GitLab Web Interface URL, not API URL. We should think on some API
|
|
||||||
# for downloading of artifacts (see: https://gitlab.com/gitlab-org/gitlab-ce/issues/4255)
|
|
||||||
expose :download_url do |repo_obj, options|
|
|
||||||
if options[:user_can_download_artifacts]
|
|
||||||
repo_obj.artifacts_download_url
|
|
||||||
end
|
|
||||||
end
|
|
||||||
expose :artifacts_file, using: BuildArtifactFile, if: -> (build, opts) { build.artifacts? }
|
expose :artifacts_file, using: BuildArtifactFile, if: -> (build, opts) { build.artifacts? }
|
||||||
expose :commit, with: RepoCommit do |repo_obj, _options|
|
expose :commit, with: RepoCommit do |repo_obj, _options|
|
||||||
if repo_obj.respond_to?(:commit)
|
if repo_obj.respond_to?(:commit)
|
||||||
|
|
|
@ -312,8 +312,8 @@ describe Ci::Build, models: true do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe :show_warning? do
|
describe :stuck? do
|
||||||
subject { build.show_warning? }
|
subject { build.stuck? }
|
||||||
|
|
||||||
%w(pending).each do |state|
|
%w(pending).each do |state|
|
||||||
context "if commit_status.status is #{state}" do
|
context "if commit_status.status is #{state}" do
|
||||||
|
@ -343,34 +343,6 @@ describe Ci::Build, models: true do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe :artifacts_download_url do
|
|
||||||
subject { build.artifacts_download_url }
|
|
||||||
|
|
||||||
context 'artifacts file does not exist' do
|
|
||||||
before { build.update_attributes(artifacts_file: nil) }
|
|
||||||
it { is_expected.to be_nil }
|
|
||||||
end
|
|
||||||
|
|
||||||
context 'artifacts file exists' do
|
|
||||||
let(:build) { create(:ci_build, :artifacts) }
|
|
||||||
it { is_expected.to_not be_nil }
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe :artifacts_browse_url do
|
|
||||||
subject { build.artifacts_browse_url }
|
|
||||||
|
|
||||||
it "should be nil if artifacts browser is unsupported" do
|
|
||||||
allow(build).to receive(:artifacts_metadata?).and_return(false)
|
|
||||||
is_expected.to be_nil
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'should not be nil if artifacts browser is supported' do
|
|
||||||
allow(build).to receive(:artifacts_metadata?).and_return(true)
|
|
||||||
is_expected.to_not be_nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe :artifacts? do
|
describe :artifacts? do
|
||||||
subject { build.artifacts? }
|
subject { build.artifacts? }
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ describe Ci::Commit, models: true do
|
||||||
let(:commit) { FactoryGirl.create :ci_commit, project: project }
|
let(:commit) { FactoryGirl.create :ci_commit, project: project }
|
||||||
|
|
||||||
it { is_expected.to belong_to(:project) }
|
it { is_expected.to belong_to(:project) }
|
||||||
it { is_expected.to have_many(:statuses) }
|
it { is_expected.to have_many(:commit_statuses) }
|
||||||
it { is_expected.to have_many(:trigger_requests) }
|
it { is_expected.to have_many(:trigger_requests) }
|
||||||
it { is_expected.to have_many(:builds) }
|
it { is_expected.to have_many(:builds) }
|
||||||
it { is_expected.to validate_presence_of :sha }
|
it { is_expected.to validate_presence_of :sha }
|
||||||
|
@ -32,50 +32,6 @@ describe Ci::Commit, models: true do
|
||||||
it { is_expected.to respond_to :git_author_email }
|
it { is_expected.to respond_to :git_author_email }
|
||||||
it { is_expected.to respond_to :short_sha }
|
it { is_expected.to respond_to :short_sha }
|
||||||
|
|
||||||
describe :ordered do
|
|
||||||
let(:project) { FactoryGirl.create :empty_project }
|
|
||||||
|
|
||||||
it 'returns ordered list of commits' do
|
|
||||||
commit1 = FactoryGirl.create :ci_commit, committed_at: 1.hour.ago, project: project
|
|
||||||
commit2 = FactoryGirl.create :ci_commit, committed_at: 2.hours.ago, project: project
|
|
||||||
expect(project.ci_commits.ordered).to eq([commit2, commit1])
|
|
||||||
end
|
|
||||||
|
|
||||||
it 'returns commits ordered by committed_at and id, with nulls last' do
|
|
||||||
commit1 = FactoryGirl.create :ci_commit, committed_at: 1.hour.ago, project: project
|
|
||||||
commit2 = FactoryGirl.create :ci_commit, committed_at: nil, project: project
|
|
||||||
commit3 = FactoryGirl.create :ci_commit, committed_at: 2.hours.ago, project: project
|
|
||||||
commit4 = FactoryGirl.create :ci_commit, committed_at: nil, project: project
|
|
||||||
expect(project.ci_commits.ordered).to eq([commit2, commit4, commit3, commit1])
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe :last_build do
|
|
||||||
subject { commit.last_build }
|
|
||||||
before do
|
|
||||||
@first = FactoryGirl.create :ci_build, commit: commit, created_at: Date.yesterday
|
|
||||||
@second = FactoryGirl.create :ci_build, commit: commit
|
|
||||||
end
|
|
||||||
|
|
||||||
it { is_expected.to be_a(Ci::Build) }
|
|
||||||
it('returns with the most recently created build') { is_expected.to eq(@second) }
|
|
||||||
end
|
|
||||||
|
|
||||||
describe :retry do
|
|
||||||
before do
|
|
||||||
@first = FactoryGirl.create :ci_build, commit: commit, created_at: Date.yesterday
|
|
||||||
@second = FactoryGirl.create :ci_build, commit: commit
|
|
||||||
end
|
|
||||||
|
|
||||||
it "creates only a new build" do
|
|
||||||
expect(commit.builds.count(:all)).to eq 2
|
|
||||||
expect(commit.statuses.count(:all)).to eq 2
|
|
||||||
commit.retry
|
|
||||||
expect(commit.builds.count(:all)).to eq 3
|
|
||||||
expect(commit.statuses.count(:all)).to eq 3
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe :valid_commit_sha do
|
describe :valid_commit_sha do
|
||||||
context 'commit.sha can not start with 00000000' do
|
context 'commit.sha can not start with 00000000' do
|
||||||
before do
|
before do
|
||||||
|
|
Loading…
Reference in a new issue