From 563942ee3d0c320d6e428f9677c1d11da43d7c39 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Mon, 14 Jan 2019 13:07:46 +0100 Subject: Connect CI/CD bridge jobs to trigger requests too --- app/models/ci/bridge.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb index 29aa00a66d9..85234c06183 100644 --- a/app/models/ci/bridge.rb +++ b/app/models/ci/bridge.rb @@ -7,6 +7,7 @@ module Ci include Gitlab::Utils::StrongMemoize belongs_to :project + belongs_to :trigger_request validates :ref, presence: true def self.retry(bridge, current_user) -- cgit v1.2.3 From 76e7b19c8158bcf000db8575f958161a232d643e Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 22 Jan 2019 13:54:59 +0100 Subject: Segregate interface require to make CI/CD entity processable This commit segregates interface that is require to make CI/CD entity processable, like `Ci::Build`. With this change it is not clear and explicit what methods need to be implement to pass an object to pipeline processing service. --- app/models/ci/build.rb | 1 + app/models/ci/pipeline.rb | 2 ++ app/models/concerns/ci/processable.rb | 27 +++++++++++++++++++++++++++ app/services/ci/process_pipeline_service.rb | 2 +- 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 app/models/concerns/ci/processable.rb (limited to 'app') diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index cfdb3c0d719..304588a417a 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -3,6 +3,7 @@ module Ci class Build < CommitStatus prepend ArtifactMigratable + include Ci::Processable include TokenAuthenticatable include AfterCommitQueue include ObjectStorage::BackgroundMove diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 30a957b4117..014872a2e2a 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -25,6 +25,8 @@ module Ci has_many :stages, -> { order(position: :asc) }, inverse_of: :pipeline has_many :statuses, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline + has_many :processables, -> { where(type: %w[Ci::Build Ci::Bridge]) }, + class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline has_many :builds, foreign_key: :commit_id, inverse_of: :pipeline has_many :trigger_requests, dependent: :destroy, foreign_key: :commit_id # rubocop:disable Cop/ActiveRecordDependent has_many :variables, class_name: 'Ci::PipelineVariable' diff --git a/app/models/concerns/ci/processable.rb b/app/models/concerns/ci/processable.rb new file mode 100644 index 00000000000..8edffb14a30 --- /dev/null +++ b/app/models/concerns/ci/processable.rb @@ -0,0 +1,27 @@ +# frozen_string_literal: true + +module Ci + ## + # This module implements methods that need to be implemented by CI/CD + # entities that are supposed to go through pipeline processing + # services. + # + # + module Processable + def schedulable? + raise NotImplementedError + end + + def action? + raise NotImplementedError + end + + def artifacts? + raise NotImplementedError + end + + def expanded_environment_name + raise NotImplementedError + end + end +end diff --git a/app/services/ci/process_pipeline_service.rb b/app/services/ci/process_pipeline_service.rb index 446188347df..7dbb5c16c70 100644 --- a/app/services/ci/process_pipeline_service.rb +++ b/app/services/ci/process_pipeline_service.rb @@ -55,7 +55,7 @@ module Ci # rubocop: enable CodeReuse/ActiveRecord def created_builds - pipeline.builds.created + pipeline.processables.created end # This method is for compatibility and data consistency and should be removed with 9.3 version of GitLab -- cgit v1.2.3 From 20e7d4882c2ac111489ed44a7a51f6a9023b1d87 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 22 Jan 2019 13:56:06 +0100 Subject: Make CI/CD bridge job a pipeline processable entity --- app/models/ci/bridge.rb | 20 ++++++++++++++++++++ app/presenters/ci/bridge_presenter.rb | 23 +++++++++++++++++++++++ 2 files changed, 43 insertions(+) create mode 100644 app/presenters/ci/bridge_presenter.rb (limited to 'app') diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb index 85234c06183..9fd802692ee 100644 --- a/app/models/ci/bridge.rb +++ b/app/models/ci/bridge.rb @@ -2,6 +2,7 @@ module Ci class Bridge < CommitStatus + include Ci::Processable include Importable include AfterCommitQueue include Gitlab::Utils::StrongMemoize @@ -24,6 +25,21 @@ module Ci .fabricate! end + def schedulable? + false + end + + def action? + false + end + + def artifacts? + false + end + + def expanded_environment_name + end + def predefined_variables raise NotImplementedError end @@ -31,5 +47,9 @@ module Ci def execute_hooks raise NotImplementedError end + + def to_partial_path + 'projects/ci/builds/build' + end end end diff --git a/app/presenters/ci/bridge_presenter.rb b/app/presenters/ci/bridge_presenter.rb new file mode 100644 index 00000000000..2c15f25da93 --- /dev/null +++ b/app/presenters/ci/bridge_presenter.rb @@ -0,0 +1,23 @@ +# frozen_string_literal: true + +module Ci + class BridgePresenter < CommitStatusPresenter + def status_title + tooltip_for_badge + end + + def tooltip_message + "#{subject.name} - #{detailed_status.status_tooltip}" + end + + private + + def tooltip_for_badge + detailed_status.badge_tooltip.capitalize + end + + def detailed_status + @detailed_status ||= subject.detailed_status(user) + end + end +end -- cgit v1.2.3 From 531626ee160a70bbc8063162d1ecd22e49c91dfb Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 22 Jan 2019 14:21:48 +0100 Subject: Use generic commit status as a tmp partial for a bridge --- app/models/ci/bridge.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb index 9fd802692ee..5450d40ea95 100644 --- a/app/models/ci/bridge.rb +++ b/app/models/ci/bridge.rb @@ -49,7 +49,7 @@ module Ci end def to_partial_path - 'projects/ci/builds/build' + 'projects/generic_commit_statuses/generic_commit_status' end end end -- cgit v1.2.3 From ec7f4b487635fe8840adbc39279c3ae689897753 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 22 Jan 2019 16:11:11 +0100 Subject: Add `when` method to be required in case of processables --- app/models/concerns/ci/processable.rb | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'app') diff --git a/app/models/concerns/ci/processable.rb b/app/models/concerns/ci/processable.rb index 8edffb14a30..c33e33c128f 100644 --- a/app/models/concerns/ci/processable.rb +++ b/app/models/concerns/ci/processable.rb @@ -20,6 +20,10 @@ module Ci raise NotImplementedError end + def when + raise NotImplementedError + end + def expanded_environment_name raise NotImplementedError end -- cgit v1.2.3 From e5cd47fc97e7bc85153d695e02f0b0704a43da93 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Tue, 22 Jan 2019 16:11:45 +0100 Subject: Implement default `when` for bridge jobs as `on_success` --- app/models/ci/bridge.rb | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'app') diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb index 5450d40ea95..3c47e870238 100644 --- a/app/models/ci/bridge.rb +++ b/app/models/ci/bridge.rb @@ -37,6 +37,13 @@ module Ci false end + ## + # TODO we probably want to add support for `when` configuration. + # + def when + 'on_success' + end + def expanded_environment_name end -- cgit v1.2.3 From 3508948dfeda84b9ce84325133c96e8f8aa12b85 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 23 Jan 2019 11:15:14 +0100 Subject: Add a new relation between a stage and related bridges --- app/models/ci/stage.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'app') diff --git a/app/models/ci/stage.rb b/app/models/ci/stage.rb index 58f3fe2460a..0389945191e 100644 --- a/app/models/ci/stage.rb +++ b/app/models/ci/stage.rb @@ -14,6 +14,7 @@ module Ci has_many :statuses, class_name: 'CommitStatus', foreign_key: :stage_id has_many :builds, foreign_key: :stage_id + has_many :bridges, foreign_key: :stage_id with_options unless: :importing? do validates :project, presence: true -- cgit v1.2.3 From cd9409f003019819eb9b8e041d8fd645e222f23b Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 23 Jan 2019 11:32:56 +0100 Subject: Simplify pipeline processing service --- app/models/concerns/ci/processable.rb | 4 ---- app/services/ci/process_build_service.rb | 6 +----- 2 files changed, 1 insertion(+), 9 deletions(-) (limited to 'app') diff --git a/app/models/concerns/ci/processable.rb b/app/models/concerns/ci/processable.rb index c33e33c128f..e112bae7d42 100644 --- a/app/models/concerns/ci/processable.rb +++ b/app/models/concerns/ci/processable.rb @@ -16,10 +16,6 @@ module Ci raise NotImplementedError end - def artifacts? - raise NotImplementedError - end - def when raise NotImplementedError end diff --git a/app/services/ci/process_build_service.rb b/app/services/ci/process_build_service.rb index d9f8e7cb452..0fbe93130d0 100644 --- a/app/services/ci/process_build_service.rb +++ b/app/services/ci/process_build_service.rb @@ -9,7 +9,7 @@ module Ci elsif build.action? build.actionize else - enqueue(build) + build.enqueue end true @@ -21,10 +21,6 @@ module Ci private - def enqueue(build) - build.enqueue - end - def valid_statuses_for_when(value) case value when 'on_success' -- cgit v1.2.3 From 8850da27c3a1db7611c856d937a8b93e6b969b86 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 23 Jan 2019 11:36:29 +0100 Subject: Extract common `when` code between CI/CD processables --- app/models/ci/bridge.rb | 7 ------- app/models/ci/build.rb | 4 ---- app/models/concerns/ci/processable.rb | 2 +- 3 files changed, 1 insertion(+), 12 deletions(-) (limited to 'app') diff --git a/app/models/ci/bridge.rb b/app/models/ci/bridge.rb index 3c47e870238..5450d40ea95 100644 --- a/app/models/ci/bridge.rb +++ b/app/models/ci/bridge.rb @@ -37,13 +37,6 @@ module Ci false end - ## - # TODO we probably want to add support for `when` configuration. - # - def when - 'on_success' - end - def expanded_environment_name end diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index 304588a417a..35cf4f8d277 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -639,10 +639,6 @@ module Ci super || project.try(:build_coverage_regex) end - def when - read_attribute(:when) || 'on_success' - end - def options read_metadata_attribute(:options, :config_options, {}) end diff --git a/app/models/concerns/ci/processable.rb b/app/models/concerns/ci/processable.rb index e112bae7d42..1c78b1413a8 100644 --- a/app/models/concerns/ci/processable.rb +++ b/app/models/concerns/ci/processable.rb @@ -17,7 +17,7 @@ module Ci end def when - raise NotImplementedError + read_attribute(:when) || 'on_success' end def expanded_environment_name -- cgit v1.2.3 From db33021d633881939f1c890effae3bfc77f4b966 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 23 Jan 2019 11:48:46 +0100 Subject: Make it clear that pipeline can process processables --- app/services/ci/process_pipeline_service.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'app') diff --git a/app/services/ci/process_pipeline_service.rb b/app/services/ci/process_pipeline_service.rb index 7dbb5c16c70..4a7ce00b8e2 100644 --- a/app/services/ci/process_pipeline_service.rb +++ b/app/services/ci/process_pipeline_service.rb @@ -10,7 +10,7 @@ module Ci update_retried new_builds = - stage_indexes_of_created_builds.map do |index| + stage_indexes_of_created_processables.map do |index| process_stage(index) end @@ -27,7 +27,7 @@ module Ci return if HasStatus::BLOCKED_STATUS.include?(current_status) if HasStatus::COMPLETED_STATUSES.include?(current_status) - created_builds_in_stage(index).select do |build| + created_processables_in_stage(index).select do |build| Gitlab::OptimisticLocking.retry_lock(build) do |subject| Ci::ProcessBuildService.new(project, @user) .execute(build, current_status) @@ -43,18 +43,18 @@ module Ci # rubocop: enable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord - def stage_indexes_of_created_builds - created_builds.order(:stage_idx).pluck('distinct stage_idx') + def stage_indexes_of_created_processables + created_processables.order(:stage_idx).pluck('distinct stage_idx') end # rubocop: enable CodeReuse/ActiveRecord # rubocop: disable CodeReuse/ActiveRecord - def created_builds_in_stage(index) - created_builds.where(stage_idx: index) + def created_processables_in_stage(index) + created_processables.where(stage_idx: index) end # rubocop: enable CodeReuse/ActiveRecord - def created_builds + def created_processables pipeline.processables.created end -- cgit v1.2.3 From 8bd9f8ccef5a95ff343cb33aa2e7c1d9fa2a3e47 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 23 Jan 2019 12:06:30 +0100 Subject: Remove bridge presenter since we no longer need it --- app/presenters/ci/bridge_presenter.rb | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 app/presenters/ci/bridge_presenter.rb (limited to 'app') diff --git a/app/presenters/ci/bridge_presenter.rb b/app/presenters/ci/bridge_presenter.rb deleted file mode 100644 index 2c15f25da93..00000000000 --- a/app/presenters/ci/bridge_presenter.rb +++ /dev/null @@ -1,23 +0,0 @@ -# frozen_string_literal: true - -module Ci - class BridgePresenter < CommitStatusPresenter - def status_title - tooltip_for_badge - end - - def tooltip_message - "#{subject.name} - #{detailed_status.status_tooltip}" - end - - private - - def tooltip_for_badge - detailed_status.badge_tooltip.capitalize - end - - def detailed_status - @detailed_status ||= subject.detailed_status(user) - end - end -end -- cgit v1.2.3 From 2e67da65f11db467feeee9154829e788d58247eb Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Wed, 23 Jan 2019 12:37:50 +0100 Subject: Revert removing overridden method from build service --- app/services/ci/process_build_service.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/services/ci/process_build_service.rb b/app/services/ci/process_build_service.rb index 0fbe93130d0..d9f8e7cb452 100644 --- a/app/services/ci/process_build_service.rb +++ b/app/services/ci/process_build_service.rb @@ -9,7 +9,7 @@ module Ci elsif build.action? build.actionize else - build.enqueue + enqueue(build) end true @@ -21,6 +21,10 @@ module Ci private + def enqueue(build) + build.enqueue + end + def valid_statuses_for_when(value) case value when 'on_success' -- cgit v1.2.3 From 2d154cee32a01fd0880594d9635362df13bcdfb1 Mon Sep 17 00:00:00 2001 From: Grzegorz Bizon Date: Thu, 24 Jan 2019 15:18:47 +0100 Subject: Move processables scope into commit status class --- app/models/ci/pipeline.rb | 2 +- app/models/commit_status.rb | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 014872a2e2a..acef5d2e643 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -25,7 +25,7 @@ module Ci has_many :stages, -> { order(position: :asc) }, inverse_of: :pipeline has_many :statuses, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline - has_many :processables, -> { where(type: %w[Ci::Build Ci::Bridge]) }, + has_many :processables, -> { processables }, class_name: 'CommitStatus', foreign_key: :commit_id, inverse_of: :pipeline has_many :builds, foreign_key: :commit_id, inverse_of: :pipeline has_many :trigger_requests, dependent: :destroy, foreign_key: :commit_id # rubocop:disable Cop/ActiveRecordDependent diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index 0f50bd39131..7f6562b63e5 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -41,6 +41,7 @@ class CommitStatus < ActiveRecord::Base scope :latest_ordered, -> { latest.ordered.includes(project: :namespace) } scope :retried_ordered, -> { retried.ordered.includes(project: :namespace) } scope :after_stage, -> (index) { where('stage_idx > ?', index) } + scope :processables, -> { where(type: %w[Ci::Build Ci::Bridge]) } # We use `CommitStatusEnums.failure_reasons` here so that EE can more easily # extend this `Hash` with new values. -- cgit v1.2.3