Commit f5d24e60 authored by Kamil Trzcinski's avatar Kamil Trzcinski

Pipeline view

parent 406a796f
...@@ -38,9 +38,6 @@ table { ...@@ -38,9 +38,6 @@ table {
.rotate { .rotate {
height: 140px; height: 140px;
white-space: nowrap; white-space: nowrap;
}
.rotate > div {
transform: transform:
/* Magic Numbers */ /* Magic Numbers */
translate(25px, 51px) translate(25px, 51px)
......
class Projects::PipelinesController < Projects::ApplicationController class Projects::PipelinesController < Projects::ApplicationController
before_action :ci_commit, except: [:index, :new, :create] before_action :pipeline, except: [:index, :new, :create]
before_action :authorize_read_pipeline! before_action :authorize_read_pipeline!
before_action :authorize_create_pipeline!, only: [:new, :create] before_action :authorize_create_pipeline!, only: [:new, :create]
before_action :authorize_update_pipeline!, only: [:retry, :cancel] before_action :authorize_update_pipeline!, only: [:retry, :cancel]
...@@ -7,26 +7,24 @@ class Projects::PipelinesController < Projects::ApplicationController ...@@ -7,26 +7,24 @@ class Projects::PipelinesController < Projects::ApplicationController
def index def index
@scope = params[:scope] @scope = params[:scope]
@all_commits = project.ci_commits @all_pipelines = project.ci_commits
@commits = @all_commits.order(id: :desc) @pipelines = @all_pipelines.order(id: :desc)
@commits = @pipelines =
case @scope case @scope
when 'latest'
@commits
when 'running' when 'running'
@commits.running_or_pending @pipelines.running_or_pending
when 'branches' when 'branches'
refs = project.repository.branches.map(&:name) @branches = project.repository.branches.map(&:name)
ids = @all_commits.where(ref: refs).group(:ref).select('max(id)') @branches_ids = @all_pipelines.where(ref: @branches).group(:ref).select('max(id)')
@commits.where(id: ids) @pipelines.where(id: @branches_ids)
when 'tags' when 'tags'
refs = project.repository.tags.map(&:name) @tags = project.repository.tags.map(&:name)
ids = @all_commits.where(ref: refs).group(:ref).select('max(id)') @tags_ids = @all_pipelines.where(ref: @tags).group(:ref).select('max(id)')
@commits.where(id: ids) @pipelines.where(id: @tags_ids)
else else
@commits @pipelines
end end
@commits = @commits.page(params[:page]).per(30) @pipelines = @pipelines.page(params[:page]).per(30)
end end
def new def new
...@@ -47,56 +45,44 @@ class Projects::PipelinesController < Projects::ApplicationController ...@@ -47,56 +45,44 @@ class Projects::PipelinesController < Projects::ApplicationController
return return
end end
ci_commit = project.ci_commit(commit.id, params[:ref]) pipeline = project.ci_commits.new(sha: commit.id, ref: params[:ref], before_sha: Gitlab::Git::BLANK_SHA)
if ci_commit
@error = 'Pipeline already created'
render action: 'new'
return
end
# Skip creating ci_commit when no gitlab-ci.yml is found # Skip creating ci_commit when no gitlab-ci.yml is found
commit = project.ci_commits.new(sha: commit.id, ref: params[:ref], before_sha: Gitlab::Git::BLANK_SHA) unless pipeline.config_processor
unless commit.config_processor @error = pipeline.yaml_errors || 'Missing .gitlab-ci.yml file'
@error = commit.yaml_errors || 'Missing .gitlab-ci.yml file'
render action: 'new' render action: 'new'
return return
end end
Ci::Commit.transaction do Ci::Commit.transaction do
commit.save! commit.save!
commit.create_builds(params[:ref], false, current_user) commit.create_builds(current_user)
end end
redirect_to builds_namespace_project_commit_path(project.namespace, project, commit.id) redirect_to builds_namespace_project_commit_path(project.namespace, project, commit.id)
end end
def show def show
@commit = @ci_commit.commit
@builds = @ci_commit.builds
@statuses = @ci_commit.statuses
respond_to do |format| respond_to do |format|
format.html format.html
end end
end end
def retry def retry
ci_commit.builds.latest.failed.select(&:retryable?).each(&:retry) pipeline.builds.latest.failed.select(&:retryable?).each(&:retry)
redirect_back_or_default default: namespace_project_pipelines_path(project.namespace, project) redirect_back_or_default default: namespace_project_pipelines_path(project.namespace, project)
end end
def cancel def cancel
ci_commit.builds.running_or_pending.each(&:cancel) pipeline.builds.running_or_pending.each(&:cancel)
redirect_back_or_default default: namespace_project_pipelines_path(project.namespace, project) redirect_back_or_default default: namespace_project_pipelines_path(project.namespace, project)
end end
def retry_builds
end
private private
def ci_commit def pipeline
@ci_commit ||= project.ci_commits.find_by!(id: params[:id]) @pipeline ||= project.ci_commits.find_by!(id: params[:id])
end end
end end
...@@ -94,6 +94,13 @@ module Ci ...@@ -94,6 +94,13 @@ module Ci
end end
end end
def latest?
return false unless ref
commit = project.commit(ref)
return false unless commit
commit.sha == sha
end
def triggered? def triggered?
trigger_requests.any? trigger_requests.any?
end end
......
...@@ -13,7 +13,9 @@ ...@@ -13,7 +13,9 @@
%strong ##{build.id} %strong ##{build.id}
- if build.stuck? - if build.stuck?
%i.fa.fa-warning.text-warning %i.fa.fa-warning.text-warning.has-tooltip(title="Build is stuck. Check runners.")
- if defined?(retried) && retried
%i.fa.fa-warning.has-tooltip(title="Build was retried")
- if defined?(commit_sha) && commit_sha - if defined?(commit_sha) && commit_sha
%td %td
......
- status = commit.status - status = commit.status
%tr.commit %tr.commit
%td.commit-link %td.commit-link
= link_to namespace_project_commit_path(@project.namespace, @project, commit.sha), class: "ci-status ci-#{status}" do = link_to namespace_project_pipeline_path(@project.namespace, @project, commit.id), class: "ci-status ci-#{status}" do
= ci_icon_for_status(status) = ci_icon_for_status(status)
%strong ##{commit.id} %strong ##{commit.id}
%td %td
%div %div.branch-commit
- if commit.ref - if commit.ref
= link_to commit.ref, namespace_project_commits_path(@project.namespace, @project, commit.ref) = link_to commit.ref, namespace_project_commits_path(@project.namespace, @project, commit.ref), class: "monospace"
&middot;
= link_to commit.short_sha, namespace_project_commit_path(@project.namespace, @project, commit.sha), class: "commit-id monospace"
&nbsp; &nbsp;
- if commit.latest?
%span.label.label-success latest
- if commit.tag? - if commit.tag?
%span.label.label-primary tag %span.label.label-primary tag
- if commit.branch?
%span.label.label-primary branch
- if commit.triggered? - if commit.triggered?
%span.label.label-primary triggered %span.label.label-primary triggered
- if commit.yaml_errors.present? - if commit.yaml_errors.present?
...@@ -21,32 +23,36 @@ ...@@ -21,32 +23,36 @@
- if commit.builds.any?(&:stuck?) - if commit.builds.any?(&:stuck?)
%span.label.label-warning stuck %span.label.label-warning stuck
- if commit_data = commit.commit_data %p
= render 'projects/branches/commit', commit: commit_data, project: @project %span
- else - if commit_data = commit.commit_data
%p = link_to_gfm commit_data.title, namespace_project_commit_path(@project.namespace, @project, commit_data.id), class: "commit-row-message"
Cant find HEAD commit for this branch - else
Cant find HEAD commit for this branch
- stages_status = commit.statuses.stages_status - stages_status = commit.statuses.stages_status
- stages.each do |stage| - stages.each do |stage|
%td %td
- if status = stages_status[stage] - if status = stages_status[stage]
%span.has-tooltip(title="#{status}"){class: "ci-status-icon-#{status}"} %span.has-tooltip(title="#{stage.titleize}: #{status}"){class: "ci-status-icon-#{status}"}
= ci_icon_for_status(status) = ci_icon_for_status(status)
%td %td
- if commit.started_at && commit.finished_at - if commit.started_at && commit.finished_at
%p %p
%i.fa.fa-late-o %i.fa.fa-clock-o
&nbsp;
#{duration_in_words(commit.finished_at, commit.started_at)} #{duration_in_words(commit.finished_at, commit.started_at)}
- if commit.finished_at - if commit.finished_at
%p %p
%i.fa.fa-date-o %i.fa.fa-calendar
&nbsp;
#{time_ago_with_tooltip(commit.finished_at)} #{time_ago_with_tooltip(commit.finished_at)}
%td.content %td
.controls.hidden-xs.pull-right .controls.hidden-xs.pull-right
- artifacts = commit.builds.latest.select { |status| status.artifacts? } - artifacts = commit.builds.latest
- if artifacts.present? - if artifacts.present?
.dropdown.inline .dropdown.inline
%button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'} %button.dropdown-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'}
...@@ -58,15 +64,12 @@ ...@@ -58,15 +64,12 @@
= link_to download_namespace_project_build_artifacts_path(@project.namespace, @project, build), rel: 'nofollow' do = link_to download_namespace_project_build_artifacts_path(@project.namespace, @project, build), rel: 'nofollow' do
%i.fa.fa-download %i.fa.fa-download
%span #{build.name} %span #{build.name}
&nbsp;
- if can?(current_user, :update_pipeline, @project) - if can?(current_user, :update_pipeline, @project)
- if commit.retryable? - if commit.retryable? && commit.builds.failed.any?
= link_to retry_namespace_project_pipeline_path(@project.namespace, @project, commit.id), class: 'btn has-tooltip', title: "Retry", method: :post do = link_to retry_namespace_project_pipeline_path(@project.namespace, @project, commit.id), class: 'btn has-tooltip', title: "Retry", method: :post do
= icon("repeat") = icon("repeat")
&nbsp; &nbsp;
- if commit.active? - if commit.active?
= link_to cancel_namespace_project_pipeline_path(@project.namespace, @project, commit.id), class: 'btn btn-remove has-tooltip', title: "Cancel", method: :post do = link_to cancel_namespace_project_pipeline_path(@project.namespace, @project, commit.id), class: 'btn btn-remove has-tooltip', title: "Cancel", method: :post do
= icon("remove cred") = icon("remove cred")
...@@ -2,12 +2,15 @@ ...@@ -2,12 +2,15 @@
.pull-right .pull-right
- if can?(current_user, :update_build, @project) - if can?(current_user, :update_build, @project)
- if ci_commit.builds.latest.failed.any?(&:retryable?) - if ci_commit.builds.latest.failed.any?(&:retryable?)
= link_to "Retry failed", retry_builds_namespace_project_commit_path(@project.namespace, @project, @commit.id), class: 'btn btn-grouped btn-primary', method: :post = link_to "Retry failed", retry_namespace_project_pipeline_path(@project.namespace, @project, ci_commit.id), class: 'btn btn-grouped btn-primary', method: :post
- if ci_commit.builds.running_or_pending.any? - if ci_commit.builds.running_or_pending.any?
= link_to "Cancel running", cancel_builds_namespace_project_commit_path(@project.namespace, @project, @commit.id), data: { confirm: 'Are you sure?' }, class: 'btn btn-grouped btn-danger', method: :post = link_to "Cancel running", cancel_namespace_project_pipeline_path(@project.namespace, @project, ci_commit.id), data: { confirm: 'Are you sure?' }, class: 'btn btn-grouped btn-danger', method: :post
.oneline .oneline
Pipeline
= link_to "##{ci_commit.id}", namespace_project_pipeline_path(@project.namespace, @project, ci_commit.id), class: "monospace"
with
= pluralize ci_commit.statuses.count(:id), "build" = pluralize ci_commit.statuses.count(:id), "build"
- if ci_commit.ref - if ci_commit.ref
for for
...@@ -17,7 +20,7 @@ ...@@ -17,7 +20,7 @@
for commit for commit
= link_to @commit.short_id, namespace_project_commit_path(@project.namespace, @project, @commit.id), class: "monospace" = link_to @commit.short_id, namespace_project_commit_path(@project.namespace, @project, @commit.id), class: "monospace"
- if ci_commit.duration > 0 - if ci_commit.duration > 0
in took
= time_interval_in_words ci_commit.duration = time_interval_in_words ci_commit.duration
- if ci_commit.yaml_errors.present? - if ci_commit.yaml_errors.present?
...@@ -47,23 +50,4 @@ ...@@ -47,23 +50,4 @@
%th %th
- builds = ci_commit.statuses.latest.ordered - builds = ci_commit.statuses.latest.ordered
= render builds, coverage: @project.build_coverage_enabled?, stage: true, ref: false, allow_retry: true = render builds, coverage: @project.build_coverage_enabled?, stage: true, ref: false, allow_retry: true
= render ci_commit.retried, coverage: @project.build_coverage_enabled?, stage: true, ref: false, retried: true
- if ci_commit.retried.any?
.gray-content-block.second-block
Retried builds
.table-holder
%table.table.builds
%thead
%tr
%th Status
%th Build ID
%th Ref
%th Stage
%th Name
%th Duration
%th Finished at
- if @project.build_coverage_enabled?
%th Coverage
%th
= render ci_commit.retried, coverage: @project.build_coverage_enabled?, stage: true, ref: false
...@@ -7,25 +7,21 @@ ...@@ -7,25 +7,21 @@
= link_to project_pipelines_path(@project) do = link_to project_pipelines_path(@project) do
All All
%span.badge.js-totalbuilds-count %span.badge.js-totalbuilds-count
= number_with_delimiter(@all_commits.count(:id)) = number_with_delimiter(@all_pipelines.count)
%li{class: ('active' if @scope == 'running')}
= link_to project_pipelines_path(@project, scope: :running) do
Running
%span.badge.js-running-count
= number_with_delimiter(@all_pipelines.running_or_pending.count)
%li{class: ('active' if @scope == 'branches')} %li{class: ('active' if @scope == 'branches')}
= link_to project_pipelines_path(@project, scope: :branches) do = link_to project_pipelines_path(@project, scope: :branches) do
Branches Branches
%span.badge.js-running-count
= number_with_delimiter(@all_commits.running_or_pending.count(:id))
%li{class: ('active' if @scope == 'tags')} %li{class: ('active' if @scope == 'tags')}
= link_to project_pipelines_path(@project, scope: :tags) do = link_to project_pipelines_path(@project, scope: :tags) do
Tags Tags
%span.badge.js-running-count
= number_with_delimiter(@all_commits.running_or_pending.count(:id))
%li{class: ('active' if @scope == 'running')}
= link_to project_pipelines_path(@project, scope: :running) do
Failed
%span.badge.js-running-count
= number_with_delimiter(@all_commits.running_or_pending.count(:id))
.nav-controls .nav-controls
- if can? current_user, :create_pipeline, @project - if can? current_user, :create_pipeline, @project
...@@ -45,8 +41,8 @@ ...@@ -45,8 +41,8 @@
Pipelines for #{(@scope || 'changes')} on this project Pipelines for #{(@scope || 'changes')} on this project
%ul.content-list %ul.content-list
- stages = @commits.stages - stages = @pipelines.stages
- if @commits.blank? - if @pipelines.blank?
%li %li
.nothing-here-block No pipelines to show .nothing-here-block No pipelines to show
- else - else
...@@ -55,11 +51,12 @@ ...@@ -55,11 +51,12 @@
%tbody %tbody
%th Pipeline ID %th Pipeline ID
%th Commit %th Commit
- @commits.stages.each do |stage| - @pipelines.stages.each do |stage|
%th.rotate %th
= stage.titleize %span.has-tooltip(title="#{stage.titleize}")
= truncate(stage.titleize.pluralize, length: 8)
%th %th
%th %th
= render @commits, commit_sha: true, stage: true, allow_retry: true, stages: stages = render @pipelines, commit_sha: true, stage: true, allow_retry: true, stages: stages
= paginate @commits, theme: 'gitlab' = paginate @pipelines, theme: 'gitlab'
- page_title "Pipeline"
= render "header_title"
= render "projects/commit/ci_commit", ci_commit: @pipeline
...@@ -654,7 +654,7 @@ Rails.application.routes.draw do ...@@ -654,7 +654,7 @@ Rails.application.routes.draw do
resource :variables, only: [:show, :update] resource :variables, only: [:show, :update]
resources :triggers, only: [:index, :create, :destroy] resources :triggers, only: [:index, :create, :destroy]
resources :pipelines, only: [:index, :new, :create] do resources :pipelines, only: [:index, :new, :create, :show] do
member do member do
post :cancel post :cancel
post :retry post :retry
......
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