module Ci class CreatePipelineService < BaseService def execute unless ref_names.include?(params[:ref]) raise ArgumentError, 'Reference not found' end unless commit raise ArgumentError, 'Commit not found' end unless can?(current_user, :create_pipeline, project) raise RuntimeError, 'Insufficient permissions to create a new pipeline' end pipeline = new_pipeline Ci::Commit.transaction do unless pipeline.config_processor raise ArgumentError, pipeline.yaml_errors || 'Missing .gitlab-ci.yml file' end pipeline.save! pipeline.create_builds(current_user) end pipeline end private def new_pipeline project.ci_commits.new(sha: commit.id, ref: params[:ref], before_sha: Gitlab::Git::BLANK_SHA) end def ref_names @ref_names ||= project.repository.ref_names end def commit @commit ||= project.commit(params[:ref]) end end end