Use pipelines.errors when communicating the error
This commit is contained in:
parent
379dc6fbcc
commit
ef60b8e168
4 changed files with 41 additions and 31 deletions
|
@ -15,19 +15,17 @@ class Projects::PipelinesController < Projects::ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def new
|
def new
|
||||||
|
@pipeline = project.ci_commits.new
|
||||||
end
|
end
|
||||||
|
|
||||||
def create
|
def create
|
||||||
begin
|
@pipeline = Ci::CreatePipelineService.new(project, current_user, create_params).execute
|
||||||
pipeline = Ci::CreatePipelineService.new(project, current_user, create_params).execute
|
unless @pipeline.persisted?
|
||||||
redirect_to namespace_project_pipeline_path(project.namespace, project, pipeline)
|
|
||||||
rescue ArgumentError => e
|
|
||||||
flash[:alert] = e.message
|
|
||||||
render 'new'
|
|
||||||
rescue
|
|
||||||
flash[:alert] = 'The pipeline could not be created. Please try again.'
|
|
||||||
render 'new'
|
render 'new'
|
||||||
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
redirect_to namespace_project_pipeline_path(project.namespace, project, @pipeline)
|
||||||
end
|
end
|
||||||
|
|
||||||
def show
|
def show
|
||||||
|
|
|
@ -1,27 +1,39 @@
|
||||||
module Ci
|
module Ci
|
||||||
class CreatePipelineService < BaseService
|
class CreatePipelineService < BaseService
|
||||||
def execute
|
def execute
|
||||||
|
pipeline = project.ci_commits.new
|
||||||
|
|
||||||
unless ref_names.include?(params[:ref])
|
unless ref_names.include?(params[:ref])
|
||||||
raise ArgumentError, 'Reference not found'
|
pipeline.errors.add(:base, 'Reference not found')
|
||||||
|
return pipeline
|
||||||
end
|
end
|
||||||
|
|
||||||
unless commit
|
unless commit
|
||||||
raise ArgumentError, 'Commit not found'
|
pipeline.errors.add(:base, 'Commit not found')
|
||||||
|
return pipeline
|
||||||
end
|
end
|
||||||
|
|
||||||
unless can?(current_user, :create_pipeline, project)
|
unless can?(current_user, :create_pipeline, project)
|
||||||
raise RuntimeError, 'Insufficient permissions to create a new pipeline'
|
pipeline.errors.add(:base, 'Insufficient permissions to create a new pipeline')
|
||||||
|
return pipeline
|
||||||
end
|
end
|
||||||
|
|
||||||
pipeline = new_pipeline
|
begin
|
||||||
|
Ci::Commit.transaction do
|
||||||
|
pipeline.sha = commit.id
|
||||||
|
pipeline.ref = params[:ref]
|
||||||
|
pipeline.before_sha = Gitlab::Git::BLANK_SHA
|
||||||
|
|
||||||
Ci::Commit.transaction do
|
unless pipeline.config_processor
|
||||||
unless pipeline.config_processor
|
pipeline.errors.add(:base, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file')
|
||||||
raise ArgumentError, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file'
|
raise ActiveRecord::Rollback
|
||||||
|
end
|
||||||
|
|
||||||
|
pipeline.save!
|
||||||
|
pipeline.create_builds(current_user)
|
||||||
end
|
end
|
||||||
|
rescue
|
||||||
pipeline.save!
|
pipeline.errors.add(:base, 'The pipeline could not be created. Please try again.')
|
||||||
pipeline.create_builds(current_user)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
pipeline
|
pipeline
|
||||||
|
@ -29,10 +41,6 @@ module Ci
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def new_pipeline
|
|
||||||
project.ci_commits.new(sha: commit.id, ref: params[:ref], before_sha: Gitlab::Git::BLANK_SHA)
|
|
||||||
end
|
|
||||||
|
|
||||||
def ref_names
|
def ref_names
|
||||||
@ref_names ||= project.repository.ref_names
|
@ref_names ||= project.repository.ref_names
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,15 +1,12 @@
|
||||||
- page_title "New Pipeline"
|
- page_title "New Pipeline"
|
||||||
= render "header_title"
|
= render "header_title"
|
||||||
|
|
||||||
- if @error
|
|
||||||
.alert.alert-danger
|
|
||||||
%button{ type: "button", class: "close", "data-dismiss" => "alert"} ×
|
|
||||||
= @error
|
|
||||||
%h3.page-title
|
%h3.page-title
|
||||||
New Pipeline
|
New Pipeline
|
||||||
%hr
|
%hr
|
||||||
|
|
||||||
= form_tag namespace_project_pipelines_path, method: :post, id: "new-pipeline-form", class: "form-horizontal js-new-pipeline-form js-requires-input" do
|
= form_for @pipeline, url: namespace_project_pipelines_path(@project.namespace, @project), html: { id: "new-pipeline-form", class: "form-horizontal js-new-pipeline-form js-requires-input" } do
|
||||||
|
= form_errors(@pipeline)
|
||||||
.form-group
|
.form-group
|
||||||
= label_tag :ref, 'Create for', class: 'control-label'
|
= label_tag :ref, 'Create for', class: 'control-label'
|
||||||
.col-sm-10
|
.col-sm-10
|
||||||
|
|
|
@ -126,12 +126,19 @@ describe "Pipelines" do
|
||||||
before { visit new_namespace_project_pipeline_path(project.namespace, project) }
|
before { visit new_namespace_project_pipeline_path(project.namespace, project) }
|
||||||
|
|
||||||
context 'for valid commit' do
|
context 'for valid commit' do
|
||||||
before do
|
before { fill_in('Create for', with: 'master') }
|
||||||
fill_in('Create for', with: 'master')
|
|
||||||
stub_ci_commit_to_return_yaml_file
|
context 'with gitlab-ci.yml' do
|
||||||
|
before { stub_ci_commit_to_return_yaml_file }
|
||||||
|
|
||||||
|
it { expect{ click_on 'Create pipeline' }.to change{ Ci::Commit.count }.by(1) }
|
||||||
end
|
end
|
||||||
|
|
||||||
it { expect{ click_on 'Create pipeline' }.to change{ Ci::Commit.count }.by(1) }
|
context 'without gitlab-ci.yml' do
|
||||||
|
before { click_on 'Create pipeline' }
|
||||||
|
|
||||||
|
it { expect(page).to have_content('Missing .gitlab-ci.yml file') }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
context 'for invalid commit' do
|
context 'for invalid commit' do
|
||||||
|
|
Loading…
Reference in a new issue