Class: Drunker::Artifact

Inherits:
Object
  • Object
show all
Defined in:
lib/drunker/artifact.rb,
lib/drunker/artifact/layer.rb

Defined Under Namespace

Classes: Layer

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config:, logger:) ⇒ Artifact

Returns a new instance of Artifact.



8
9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/drunker/artifact.rb', line 8

def initialize(config:, logger:)
  timestamp = Time.now.to_i
  s3 = Aws::S3::Resource.new(client: Aws::S3::Client.new(config.aws_client_options))

  @bucket = s3.create_bucket(bucket: "drunker-artifact-store-#{timestamp}")
  logger.info("Created artifact bucket: #{bucket.name}")
  @name = "drunker_artifact_#{timestamp}"
  @stdout = "drunker_artifact_#{timestamp}_stdout.txt"
  @stderr = "drunker_artifact_#{timestamp}_stderr.txt"
  @exit_status = "drunker_artifact_#{timestamp}_exit_status.txt"
  @builds = []
  @logger = logger
end

Instance Attribute Details

#bucketObject (readonly)

Returns the value of attribute bucket.



3
4
5
# File 'lib/drunker/artifact.rb', line 3

def bucket
  @bucket
end

#exit_statusObject (readonly)

Returns the value of attribute exit_status.



6
7
8
# File 'lib/drunker/artifact.rb', line 6

def exit_status
  @exit_status
end

#stderrObject (readonly)

Returns the value of attribute stderr.



5
6
7
# File 'lib/drunker/artifact.rb', line 5

def stderr
  @stderr
end

#stdoutObject (readonly)

Returns the value of attribute stdout.



4
5
6
# File 'lib/drunker/artifact.rb', line 4

def stdout
  @stdout
end

Instance Method Details

#deleteObject



57
58
59
60
# File 'lib/drunker/artifact.rb', line 57

def delete
  bucket.delete!
  logger.info("Deleted bucket: #{bucket.name}")
end

#layersObject



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/drunker/artifact.rb', line 30

def layers
  @layers ||= builds.each_with_object([]) do |build, layers|
    project_name, build_id = build.split(":")
    layers << Layer.new(build_id: build).tap do |layer|
      begin
        layer.stdout = fetch_content("#{build_id}/#{project_name}/#{stdout}")
        layer.stderr = fetch_content("#{build_id}/#{project_name}/#{stderr}")
        layer.exit_status = fetch_content("#{build_id}/#{project_name}/#{exit_status}")
      rescue Aws::S3::Errors::NoSuchKey
        logger.debug("Artifact not found")
        layer.invalid!
      end
    end
  end
end

#replace_build(before:, after:) ⇒ Object



51
52
53
54
55
# File 'lib/drunker/artifact.rb', line 51

def replace_build(before:, after:)
  builds.delete(before)
  logger.debug("Unset build: { build: #{before}, artifact: #{name} }")
  set_build(after)
end

#set_build(build) ⇒ Object



46
47
48
49
# File 'lib/drunker/artifact.rb', line 46

def set_build(build)
  @builds << build
  logger.debug("Set build: { build: #{build}, artifact: #{name} }")
end

#to_hObject



22
23
24
25
26
27
28
# File 'lib/drunker/artifact.rb', line 22

def to_h
  {
    type: "S3",
    location: bucket.name,
    namespace_type: "BUILD_ID",
  }
end