class Drunker::Artifact

Attributes

bucket[R]
builds[R]
exit_status[R]
logger[R]
name[R]
stderr[R]
stdout[R]

Public Class Methods

new(config:, logger:) click to toggle source
# 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

Public Instance Methods

delete() click to toggle source
# File lib/drunker/artifact.rb, line 57
def delete
  bucket.delete!
  logger.info("Deleted bucket: #{bucket.name}")
end
layers() click to toggle source
# 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:) click to toggle source
# 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) click to toggle source
# File lib/drunker/artifact.rb, line 46
def set_build(build)
  @builds << build
  logger.debug("Set build: { build: #{build}, artifact: #{name} }")
end
to_h() click to toggle source
# File lib/drunker/artifact.rb, line 22
def to_h
  {
    type: "S3",
    location: bucket.name,
    namespace_type: "BUILD_ID",
  }
end

Private Instance Methods

fetch_content(object_id) click to toggle source
# File lib/drunker/artifact.rb, line 68
def fetch_content(object_id)
  logger.debug("Get artifact: #{object_id}")
  bucket.object(object_id).get.body.string
end