summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorZeger-Jan van de Weg <git@zjvandeweg.nl>2017-09-19 09:14:06 +0200
committerKamil Trzcinski <ayufan@ayufan.eu>2017-12-03 12:04:47 +0100
commit25df666156279e5b392b429519b4f4ba01eefaac (patch)
tree6c1283d937cebb3ee4542e5d7bfc974939eff657 /app
parent8ac7f29726989bc0a20ee32780aa18625159f8b4 (diff)
downloadgitlab-ce-25df666156279e5b392b429519b4f4ba01eefaac.tar.gz
Create Ci::Artifacts
To allow jobs/builds to have multiple artifacts, and to start seperating concerns from Ci::Build a new model is created: Ci::Artifact. Changes include the updating of the ArtifactUploader to adapt to a slightly different interface. The uploader expects to be initialized with a `Ci::Build`. Futher a migration with the minimal fields, the needed foreign keys and an index. Last, the way this works is by prepending a module to Ci::Build so we can basically override behaviour but if needed use `super` to get the original behaviour.
Diffstat (limited to 'app')
-rw-r--r--app/models/ci/artifact.rb28
-rw-r--r--app/models/ci/build.rb23
-rw-r--r--app/models/concerns/artifact_migratable.rb37
-rw-r--r--app/uploaders/artifact_uploader.rb4
4 files changed, 70 insertions, 22 deletions
diff --git a/app/models/ci/artifact.rb b/app/models/ci/artifact.rb
index c66c560037e..858609883ce 100644
--- a/app/models/ci/artifact.rb
+++ b/app/models/ci/artifact.rb
@@ -1,12 +1,24 @@
module Ci
class Artifact < ActiveRecord::Base
- belongs_to :build, class_name: "Ci::Build"
- belongs_to :project, class_name: "Ci::Build"
-
- enum type {
- archive: 0,
- metadata: 1,
- trace: 2
- }
+ extend Gitlab::Ci::Model
+
+ belongs_to :project
+ belongs_to :build, class_name: "Ci::Build", foreign_key: :ci_build_id
+
+ before_save :set_size, if: :file_changed?
+
+ mount_uploader :file, ArtifactUploader
+
+ enum type: { archive: 0, metadata: 1 }
+
+ # Allow us to use `type` as column name, without Rails thinking we're using
+ # STI: https://stackoverflow.com/a/29663933
+ def self.inheritance_column
+ nil
+ end
+
+ def set_size
+ self.size = file.exists? ? file.size : 0
+ end
end
end
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index 4ea040dfad5..fae2f5590b4 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -1,5 +1,6 @@
module Ci
class Build < CommitStatus
+ prepend ArtifactMigratable
include TokenAuthenticatable
include AfterCommitQueue
include Presentable
@@ -10,6 +11,7 @@ module Ci
belongs_to :erased_by, class_name: 'User'
has_many :deployments, as: :deployable
+ has_many :artifacts, class_name: 'Ci::Artifact', foreign_key: :ci_build_id
has_one :last_deployment, -> { order('deployments.id DESC') }, as: :deployable, class_name: 'Deployment'
has_many :trace_sections, class_name: 'Ci::BuildTraceSection'
@@ -326,14 +328,6 @@ module Ci
project.running_or_pending_build_count(force: true)
end
- def artifacts?
- !artifacts_expired? && artifacts_file.exists?
- end
-
- def artifacts_metadata?
- artifacts? && artifacts_metadata.exists?
- end
-
def artifacts_metadata_entry(path, **options)
metadata = Gitlab::Ci::Build::Artifacts::Metadata.new(
artifacts_metadata.path,
@@ -429,7 +423,7 @@ module Ci
Gitlab::Ci::Build::Image.from_services(self)
end
- def artifacts
+ def artifacts_options
[options[:artifacts]]
end
@@ -470,6 +464,12 @@ module Ci
super(options).merge(when: read_attribute(:when))
end
+ def update_project_statistics
+ return unless project
+
+ ProjectCacheWorker.perform_async(project_id, [], [:build_artifacts_size])
+ end
+
private
def update_artifacts_size
@@ -560,11 +560,6 @@ module Ci
pipeline.config_processor.build_attributes(name)
end
- def update_project_statistics
- return unless project
-
- ProjectCacheWorker.perform_async(project_id, [], [:build_artifacts_size])
- end
def update_project_statistics_after_save
if previous_changes.include?('artifacts_size')
diff --git a/app/models/concerns/artifact_migratable.rb b/app/models/concerns/artifact_migratable.rb
new file mode 100644
index 00000000000..a14a278df9f
--- /dev/null
+++ b/app/models/concerns/artifact_migratable.rb
@@ -0,0 +1,37 @@
+# Adapter class to unify the interface between mounted uploaders and the
+# Ci::Artifact model
+# Meant to be prepended so the interface can stay the same
+module ArtifactMigratable
+ def artifacts_file
+ artifacts.archive.first&.file || super
+ end
+
+ def artifacts_metadata
+ artifacts.metadata.first&.file || super
+ end
+
+ def artifacts?
+ byebug
+ !artifacts_expired? && artifacts_file.exists?
+ end
+
+ def artifacts_metadata?
+ artifacts? && artifacts_metadata.exists?
+ end
+
+ def remove_artifacts_file!
+ artifacts_file.remove!
+ end
+
+ def remove_artifacts_metadata!
+ artifacts_metadata.remove!
+ end
+
+ def artifacts_file=(file)
+ artifacts.create(project: project, type: :archive, file: file)
+ end
+
+ def artifacts_metadata=(file)
+ artifacts.create(project: project, type: :metadata, file: file)
+ end
+end
diff --git a/app/uploaders/artifact_uploader.rb b/app/uploaders/artifact_uploader.rb
index 14addb6cf14..8ac0e2fe5a2 100644
--- a/app/uploaders/artifact_uploader.rb
+++ b/app/uploaders/artifact_uploader.rb
@@ -12,6 +12,10 @@ class ArtifactUploader < GitlabUploader
end
def initialize(job, field)
+ # Temporairy conditional, needed to move artifacts to their own table,
+ # but keeping compat with Ci::Build for the time being
+ job = job.build if job.respond_to?(:build)
+
@job, @field = job, field
end