diff options
Diffstat (limited to 'app/models/ci/build.rb')
-rw-r--r-- | app/models/ci/build.rb | 137 |
1 files changed, 31 insertions, 106 deletions
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index bf8817e6e78..4e58f877217 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -11,7 +11,7 @@ module Ci include Presentable include Importable include Ci::HasRef - include HasDeploymentName + include Ci::TrackEnvironmentUsage extend ::Gitlab::Utils::Override @@ -34,7 +34,7 @@ module Ci DEPLOYMENT_NAMES = %w[deploy release rollout].freeze - has_one :deployment, as: :deployable, class_name: 'Deployment' + has_one :deployment, as: :deployable, class_name: 'Deployment', inverse_of: :deployable has_one :pending_state, class_name: 'Ci::BuildPendingState', inverse_of: :build has_one :queuing_entry, class_name: 'Ci::PendingBuild', foreign_key: :build_id has_one :runtime_metadata, class_name: 'Ci::RunningBuild', foreign_key: :build_id @@ -194,7 +194,7 @@ module Ci after_save :stick_build_if_status_changed after_create unless: :importing? do |build| - run_after_commit { build.feature_flagged_execute_hooks } + run_after_commit { build.execute_hooks } end class << self @@ -214,10 +214,11 @@ module Ci def clone_accessors %i[pipeline project ref tag options name - allow_failure stage stage_id stage_idx trigger_request + allow_failure stage stage_idx trigger_request yaml_variables when environment coverage_regex description tag_list protected needs_attributes - job_variables_attributes resource_group scheduling_type].freeze + job_variables_attributes resource_group scheduling_type + ci_stage partition_id].freeze end end @@ -285,7 +286,7 @@ module Ci build.run_after_commit do BuildQueueWorker.perform_async(id) - build.feature_flagged_execute_hooks + build.execute_hooks end end @@ -313,7 +314,7 @@ module Ci build.run_after_commit do build.ensure_persistent_ref - build.feature_flagged_execute_hooks + build.execute_hooks end end @@ -442,6 +443,15 @@ module Ci manual? && starts_environment? && deployment&.blocked? end + def prevent_rollback_deployment? + strong_memoize(:prevent_rollback_deployment) do + Feature.enabled?(:prevent_outdated_deployment_jobs, project) && + starts_environment? && + project.ci_forward_deployment_enabled? && + deployment&.older_than_last_successful_deployment? + end + end + def schedulable? self.when == 'delayed' && options[:start_in].present? end @@ -703,25 +713,7 @@ module Ci end def has_test_reports? - job_artifacts.test_reports.exists? - end - - def has_old_trace? - old_trace.present? - end - - def trace=(data) - raise NotImplementedError - end - - def old_trace - read_attribute(:trace) - end - - def erase_old_trace! - return unless has_old_trace? - - update_column(:trace, nil) + job_artifacts.of_report_type(:test).exists? end def ensure_trace_metadata! @@ -780,14 +772,6 @@ module Ci pending? && !any_runners_online? end - def feature_flagged_execute_hooks - if Feature.enabled?(:execute_build_hooks_inline, project) - execute_hooks - else - BuildHooksWorker.perform_async(self) - end - end - def execute_hooks return unless project return if user&.blocked? @@ -823,41 +807,6 @@ module Ci end end - def erase_erasable_artifacts! - if project.refreshing_build_artifacts_size? - Gitlab::ProjectStatsRefreshConflictsLogger.warn_artifact_deletion_during_stats_refresh( - method: 'Ci::Build#erase_erasable_artifacts!', - project_id: project_id - ) - end - - destroyed_artifacts = job_artifacts.erasable.destroy_all # rubocop: disable Cop/DestroyAll - - Gitlab::Ci::Artifacts::Logger.log_deleted(destroyed_artifacts, 'Ci::Build#erase_erasable_artifacts!') - - destroyed_artifacts - end - - def erase(opts = {}) - return false unless erasable? - - if project.refreshing_build_artifacts_size? - Gitlab::ProjectStatsRefreshConflictsLogger.warn_artifact_deletion_during_stats_refresh( - method: 'Ci::Build#erase', - project_id: project_id - ) - end - - # TODO: We should use DestroyBatchService here - # See https://gitlab.com/gitlab-org/gitlab/-/issues/369132 - destroyed_artifacts = job_artifacts.destroy_all # rubocop: disable Cop/DestroyAll - - Gitlab::Ci::Artifacts::Logger.log_deleted(destroyed_artifacts, 'Ci::Build#erase') - - erase_trace! - update_erased!(opts[:erased_by]) - end - def erasable? complete? && (artifacts? || has_job_artifacts? || has_trace?) end @@ -1004,15 +953,11 @@ module Ci end def collect_test_reports!(test_reports) - test_reports.get_suite(test_suite_name).tap do |test_suite| - each_report(Ci::JobArtifact.file_types_for_report(:test)) do |file_type, blob| - Gitlab::Ci::Parsers.fabricate!(file_type).parse!( - blob, - test_suite, - job: self - ) - end + each_report(Ci::JobArtifact.file_types_for_report(:test)) do |file_type, blob| + Gitlab::Ci::Parsers.fabricate!(file_type).parse!(blob, test_reports, job: self) end + + test_reports end def collect_accessibility_reports!(accessibility_report) @@ -1154,18 +1099,6 @@ module Ci .include?(exit_code) end - def track_deployment_usage - Gitlab::Utils::UsageData.track_usage_event('ci_users_executing_deployment_job', user_id) if user_id.present? && count_user_deployment? - end - - def track_verify_usage - Gitlab::Utils::UsageData.track_usage_event('ci_users_executing_verify_environment_job', user_id) if user_id.present? && count_user_verification? - end - - def count_user_verification? - has_environment? && environment_action == 'verify' - end - def each_report(report_types) job_artifacts_for_types(report_types).each do |report_artifact| report_artifact.each_blob do |blob| @@ -1189,6 +1122,14 @@ module Ci job_artifacts.map(&:file_type) end + def test_suite_name + if matrix_build? + name + else + group_name + end + end + protected def run_status_commit_hooks! @@ -1199,14 +1140,6 @@ module Ci private - def test_suite_name - if matrix_build? - name - else - group_name - end - end - def matrix_build? options.dig(:parallel, :matrix).present? end @@ -1245,14 +1178,6 @@ module Ci job_artifacts.select { |artifact| artifact.file_type.in?(report_types) } end - def erase_trace! - trace.erase! - end - - def update_erased!(user = nil) - self.update(erased_by: user, erased_at: Time.current, artifacts_expire_at: nil) - end - def environment_url options&.dig(:environment, :url) || persisted_environment&.external_url end @@ -1298,7 +1223,7 @@ module Ci end def observe_report_types - return unless ::Gitlab.com? && Feature.enabled?(:report_artifact_build_completed_metrics_on_build_completion) + return unless ::Gitlab.com? report_types = options&.dig(:artifacts, :reports)&.keys || [] |