Class: SupplyChain::ArtifactsReader

Inherits:
Object
  • Object
show all
Defined in:
lib/supply_chain/artifacts_reader.rb

Constant Summary collapse

MAX_FILES_IN_BUNDLE =
1000
MAX_SIZE =
Gitlab::CurrentSettings.current_application_settings.max_artifacts_content_include_size
Error =
Class.new(StandardError)
BundleTooLarge =
Class.new(Error)
NoArtifacts =
Class.new(Error)
ArtifactTooLarge =
Class.new(Error)
DiskFull =
Class.new(Error)
TooManyFiles =
Class.new(Error)

Instance Method Summary collapse

Constructor Details

#initialize(build) ⇒ ArtifactsReader

Returns a new instance of ArtifactsReader.

Raises:



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/supply_chain/artifacts_reader.rb', line 15

def initialize(build)
  @build = build

  raise Error, "Job doesn't exist" unless @build
  raise NoArtifacts, "#{build_id} does not have artifacts" unless @build.artifacts?
  raise Error, "#{build_id} has missing metadata and cannot be extracted" unless @build.artifacts_metadata?

   = build.('', recursive: true)
  raise Error, "#{build_id} has invalid metadata" unless 

  validate_bundle!
end

Instance Method Details

#filesObject



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/supply_chain/artifacts_reader.rb', line 28

def files
  artifacts = 
  @build.artifacts_file.use_open_file(unlink_early: false) do |tmp_open_file|
    zip_file_path = tmp_open_file.file_path

    Zip::File.open(zip_file_path) do |zip_file| # rubocop:disable Performance/Rubyzip -- General purpose flag Bit 3 is set so not possible to get proper info from local header
      artifacts.each do |artifact|
        entry = zip_file.get_entry(artifact)

        yield entry.name, entry.get_input_stream
      end
    end
  end
rescue Errno::EDQUOT, Errno::ENOSPC
  raise DiskFull, "#{build_id} Unable to download artifact bundle: insufficient disk space"
end