50 lines
1.2 KiB
Ruby
50 lines
1.2 KiB
Ruby
module Ci
|
|
class CreatePipelineService < BaseService
|
|
def execute
|
|
pipeline = project.pipelines.new(params)
|
|
|
|
unless ref_names.include?(params[:ref])
|
|
pipeline.errors.add(:base, 'Reference not found')
|
|
return pipeline
|
|
end
|
|
|
|
unless commit
|
|
pipeline.errors.add(:base, 'Commit not found')
|
|
return pipeline
|
|
end
|
|
|
|
unless can?(current_user, :create_pipeline, project)
|
|
pipeline.errors.add(:base, 'Insufficient permissions to create a new pipeline')
|
|
return pipeline
|
|
end
|
|
|
|
begin
|
|
Ci::Pipeline.transaction do
|
|
pipeline.sha = commit.id
|
|
|
|
unless pipeline.config_processor
|
|
pipeline.errors.add(:base, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file')
|
|
raise ActiveRecord::Rollback
|
|
end
|
|
|
|
pipeline.save!
|
|
pipeline.create_builds(current_user)
|
|
end
|
|
rescue
|
|
pipeline.errors.add(:base, 'The pipeline could not be created. Please try again.')
|
|
end
|
|
|
|
pipeline
|
|
end
|
|
|
|
private
|
|
|
|
def ref_names
|
|
@ref_names ||= project.repository.ref_names
|
|
end
|
|
|
|
def commit
|
|
@commit ||= project.commit(params[:ref])
|
|
end
|
|
end
|
|
end
|