summaryrefslogtreecommitdiff
path: root/app/services/ci
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/ci')
-rw-r--r--app/services/ci/pipeline_trigger_service.rb29
-rw-r--r--app/services/ci/process_pipeline_service.rb7
-rw-r--r--app/services/ci/retry_build_service.rb11
3 files changed, 40 insertions, 7 deletions
diff --git a/app/services/ci/pipeline_trigger_service.rb b/app/services/ci/pipeline_trigger_service.rb
index 0e99f142492..37b9b4c362c 100644
--- a/app/services/ci/pipeline_trigger_service.rb
+++ b/app/services/ci/pipeline_trigger_service.rb
@@ -38,11 +38,34 @@ module Ci
end
def create_pipeline_from_job(job)
- # overridden in EE
+ # this check is to not leak the presence of the project if user cannot read it
+ return unless can?(job.user, :read_project, project)
+
+ return error("400 Job has to be running", 400) unless job.running?
+
+ pipeline = Ci::CreatePipelineService.new(project, job.user, ref: params[:ref])
+ .execute(:pipeline, ignore_skip_ci: true) do |pipeline|
+ source = job.sourced_pipelines.build(
+ source_pipeline: job.pipeline,
+ source_project: job.project,
+ pipeline: pipeline,
+ project: project)
+
+ pipeline.source_pipeline = source
+ pipeline.variables.build(variables)
+ end
+
+ if pipeline.persisted?
+ success(pipeline: pipeline)
+ else
+ error(pipeline.errors.messages, 400)
+ end
end
def job_from_token
- # overridden in EE
+ strong_memoize(:job) do
+ Ci::Build.find_by_token(params[:token].to_s)
+ end
end
def variables
@@ -52,5 +75,3 @@ module Ci
end
end
end
-
-Ci::PipelineTriggerService.prepend_if_ee('EE::Ci::PipelineTriggerService')
diff --git a/app/services/ci/process_pipeline_service.rb b/app/services/ci/process_pipeline_service.rb
index 3b145a65d79..039670f58c8 100644
--- a/app/services/ci/process_pipeline_service.rb
+++ b/app/services/ci/process_pipeline_service.rb
@@ -2,6 +2,8 @@
module Ci
class ProcessPipelineService < BaseService
+ include Gitlab::Utils::StrongMemoize
+
attr_reader :pipeline
def execute(pipeline, trigger_build_ids = nil)
@@ -33,9 +35,9 @@ module Ci
return unless HasStatus::COMPLETED_STATUSES.include?(current_status)
- created_processables_in_stage_without_needs(index).select do |build|
+ created_processables_in_stage_without_needs(index).find_each.select do |build|
process_build(build, current_status)
- end
+ end.any?
end
def process_builds_with_needs(trigger_build_ids)
@@ -92,6 +94,7 @@ module Ci
def created_processables_in_stage_without_needs(index)
created_processables_without_needs
+ .with_preloads
.for_stage(index)
end
diff --git a/app/services/ci/retry_build_service.rb b/app/services/ci/retry_build_service.rb
index 338495ba030..7a5e33c61ba 100644
--- a/app/services/ci/retry_build_service.rb
+++ b/app/services/ci/retry_build_service.rb
@@ -39,9 +39,18 @@ module Ci
.where(name: build.name)
.update_all(retried: true)
- project.builds.create!(Hash[attributes])
+ create_build!(attributes)
end
end
# rubocop: enable CodeReuse/ActiveRecord
+
+ private
+
+ def create_build!(attributes)
+ build = project.builds.new(Hash[attributes])
+ build.deployment = ::Gitlab::Ci::Pipeline::Seed::Deployment.new(build).to_resource
+ build.save!
+ build
+ end
end
end