summaryrefslogtreecommitdiff
path: root/app/models/ci/build.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/ci/build.rb')
-rw-r--r--app/models/ci/build.rb65
1 files changed, 50 insertions, 15 deletions
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index 49c5b67d600..7e7c580a48e 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -13,17 +13,11 @@ module Ci
include Importable
include Gitlab::Utils::StrongMemoize
include HasRef
+ include IgnorableColumns
BuildArchivedError = Class.new(StandardError)
- self.ignored_columns += %i[
- artifacts_file
- artifacts_file_store
- artifacts_metadata
- artifacts_metadata_store
- artifacts_size
- commands
- ]
+ ignore_columns :artifacts_file, :artifacts_file_store, :artifacts_metadata, :artifacts_metadata_store, :artifacts_size, :commands, remove_after: '2019-12-15', remove_with: '12.7'
belongs_to :project, inverse_of: :builds
belongs_to :runner
@@ -120,6 +114,20 @@ module Ci
scope :eager_load_job_artifacts, -> { includes(:job_artifacts) }
+ scope :eager_load_everything, -> do
+ includes(
+ [
+ { pipeline: [:project, :user] },
+ :job_artifacts_archive,
+ :metadata,
+ :trigger_request,
+ :project,
+ :user,
+ :tags
+ ]
+ )
+ end
+
scope :with_exposed_artifacts, -> do
joins(:metadata).merge(Ci::BuildMetadata.with_exposed_artifacts)
.includes(:metadata, :job_artifacts_metadata)
@@ -161,6 +169,7 @@ module Ci
end
scope :queued_before, ->(time) { where(arel_table[:queued_at].lt(time)) }
+ scope :order_id_desc, -> { order('ci_builds.id DESC') }
acts_as_taggable
@@ -247,10 +256,11 @@ module Ci
end
after_transition pending: :running do |build|
- build.pipeline.persistent_ref.create
build.deployment&.run
build.run_after_commit do
+ build.pipeline.persistent_ref.create
+
BuildHooksWorker.perform_async(id)
end
end
@@ -277,7 +287,7 @@ module Ci
begin
build.deployment.drop!
rescue => e
- Gitlab::Sentry.track_exception(e, extra: { build_id: build.id })
+ Gitlab::ErrorTracking.track_and_raise_for_dev_exception(e, build_id: build.id)
end
true
@@ -415,6 +425,18 @@ module Ci
end
end
+ def expanded_kubernetes_namespace
+ return unless has_environment?
+
+ namespace = options.dig(:environment, :kubernetes, :namespace)
+
+ if namespace.present?
+ strong_memoize(:expanded_kubernetes_namespace) do
+ ExpandVariables.expand(namespace, -> { simple_variables })
+ end
+ end
+ end
+
def has_environment?
environment.present?
end
@@ -640,9 +662,8 @@ module Ci
def execute_hooks
return unless project
- build_data = Gitlab::DataBuilder::Build.build(self)
- project.execute_hooks(build_data.dup, :job_hooks)
- project.execute_services(build_data.dup, :job_hooks)
+ project.execute_hooks(build_data.dup, :job_hooks) if project.has_active_hooks?(:job_hooks)
+ project.execute_services(build_data.dup, :job_hooks) if project.has_active_services?(:job_hooks)
end
def browsable_artifacts?
@@ -741,6 +762,10 @@ module Ci
Gitlab::Ci::Build::Credentials::Factory.new(self).create!
end
+ def all_dependencies
+ (dependencies + cross_dependencies).uniq
+ end
+
def dependencies
return [] if empty_dependencies?
@@ -748,7 +773,7 @@ module Ci
# find all jobs that are needed
if Feature.enabled?(:ci_dag_support, project, default_enabled: true) && needs.exists?
- depended_jobs = depended_jobs.where(name: needs.select(:name))
+ depended_jobs = depended_jobs.where(name: needs.artifacts.select(:name))
end
# find all jobs that are dependent on
@@ -756,9 +781,15 @@ module Ci
depended_jobs = depended_jobs.where(name: options[:dependencies])
end
+ # if both needs and dependencies are used,
+ # the end result will be an intersection between them
depended_jobs
end
+ def cross_dependencies
+ []
+ end
+
def empty_dependencies?
options[:dependencies]&.empty?
end
@@ -849,6 +880,10 @@ module Ci
private
+ def build_data
+ @build_data ||= Gitlab::DataBuilder::Build.build(self)
+ end
+
def successful_deployment_status
if deployment&.last?
:last
@@ -860,7 +895,7 @@ module Ci
def each_report(report_types)
job_artifacts_for_types(report_types).each do |report_artifact|
report_artifact.each_blob do |blob|
- yield report_artifact.file_type, blob
+ yield report_artifact.file_type, blob, report_artifact
end
end
end