debian-mirror-gitlab/app/models/concerns/ci/artifactable.rb

64 lines
1.9 KiB
Ruby
Raw Normal View History

2020-10-24 23:57:45 +05:30
# frozen_string_literal: true
module Ci
module Artifactable
extend ActiveSupport::Concern
2021-04-29 21:17:54 +05:30
include ObjectStorable
2022-08-27 11:52:29 +05:30
include Gitlab::Ci::Artifacts::Logger
2020-11-24 15:15:51 +05:30
2021-04-29 21:17:54 +05:30
STORE_COLUMN = :file_store
NotSupportedAdapterError = Class.new(StandardError)
2023-06-09 08:11:10 +05:30
2020-10-24 23:57:45 +05:30
FILE_FORMAT_ADAPTERS = {
2022-10-11 01:57:18 +05:30
# While zip is a streamable file format, performing streaming
# reads requires that each entry in the zip has certain headers
# present at the front of the entry. These headers are OPTIONAL
# according to the file format specification. GitLab Runner uses
# Go's `archive/zip` to create zip archives, which does not include
# these headers. Go maintainers have expressed that they don't intend
# to support them: https://github.com/golang/go/issues/23301#issuecomment-363240781
#
# If you need GitLab to be able to read Artifactables, store them in
# raw or gzip format instead of zip.
2020-10-24 23:57:45 +05:30
gzip: Gitlab::Ci::Build::Artifacts::Adapters::GzipStream,
raw: Gitlab::Ci::Build::Artifacts::Adapters::RawStream
}.freeze
included do
enum file_format: {
raw: 1,
zip: 2,
gzip: 3
}, _suffix: true
2020-11-24 15:15:51 +05:30
2021-03-08 18:12:59 +05:30
scope :expired_before, -> (timestamp) { where(arel_table[:expire_at].lt(timestamp)) }
2022-07-23 23:45:48 +05:30
scope :expired, -> { expired_before(Time.current) }
2021-04-29 21:17:54 +05:30
scope :project_id_in, ->(ids) { where(project_id: ids) }
2020-11-24 15:15:51 +05:30
end
def each_blob(&blk)
unless file_format_adapter_class
raise NotSupportedAdapterError, 'This file format requires a dedicated adapter'
end
2023-06-09 08:11:10 +05:30
::Gitlab::Ci::Artifacts::DecompressedArtifactSizeValidator
.new(file: file, file_format: file_format.to_sym).validate!
2022-08-27 11:52:29 +05:30
log_artifacts_filesize(file.model)
2022-08-13 15:12:31 +05:30
2020-11-24 15:15:51 +05:30
file.open do |stream|
file_format_adapter_class.new(stream).each_blob(&blk)
end
end
private
def file_format_adapter_class
FILE_FORMAT_ADAPTERS[file_format.to_sym]
2020-10-24 23:57:45 +05:30
end
end
end
2021-04-29 21:17:54 +05:30
2021-06-08 01:23:25 +05:30
Ci::Artifactable.prepend_mod