class Minos::Artifact

Attributes

artifact[R]
options[R]

Public Class Methods

new(artifact, options: {}) click to toggle source
# File lib/minos/artifact.rb, line 15
def initialize(artifact, options: {})
  @artifact = artifact
  @options = options
end

Public Instance Methods

build() { |Task[ *map.each_with_index { |cache, i| docker_pull(i, cache) }| ... } click to toggle source
# File lib/minos/artifact.rb, line 24
def build
  yield List::Task[
    *caches.map.each_with_index { |cache, i| docker_pull(i, cache) }
  ]
  .traverse
  .bind { |_| docker_build }
  .to_result
end
name() click to toggle source
# File lib/minos/artifact.rb, line 20
def name
  artifact['name']
end
push() { |Task[ *map.each_with_index { |tag, i| docker_push(i, tag) }| ... } click to toggle source
# File lib/minos/artifact.rb, line 33
def push
  yield List::Task[
    *tags.map.each_with_index { |tag, i| docker_push(i, tag) }
  ]
  .traverse
  .to_result
end

Private Instance Methods

caches() click to toggle source
# File lib/minos/artifact.rb, line 138
def caches
  docker['cacheFrom']
end
colors() click to toggle source
# File lib/minos/artifact.rb, line 123
def colors
  %i(blue cyan yellow magenta)
end
docker() click to toggle source
# File lib/minos/artifact.rb, line 134
def docker
  artifact['docker']
end
docker_build() click to toggle source
# File lib/minos/artifact.rb, line 61
def docker_build
  Task[:io, &-> {
    color = :green
    print "Building #{target}...", color: color
    if run "docker build --rm #{Minos::Utils.to_args(docker)} .", color: color
      print "Successfully built #{target}", color: color
      return Success()
    else
      print "Failed building #{target}", color: :red
      return Failure($?)
    end
  }]
end
docker_pull(i, cache) click to toggle source
# File lib/minos/artifact.rb, line 43
def docker_pull(i, cache)
  Task[:io, &-> {
    color = select_color(i)
    if run "docker inspect #{cache} -f '{{json .ID}}' > /dev/null 2>&1"
      print "Using local #{cache}", color: color
    else
      print "Trying to pull #{cache}...", color: color
      if run "docker pull #{cache} 2> /dev/null", color: color
        print "Using local #{cache}", color: color
      else
        print "Enable to pull #{cache}", color: color
      end
    end

    return Success()
  }]
end
docker_push(i, tag) click to toggle source
# File lib/minos/artifact.rb, line 75
def docker_push(i, tag)
  Task[:io, &-> {
    color = select_color(i)
    print "Pushing #{image}:#{tag}...", color: color
    if run "docker tag #{image}:#{target} #{image}:#{tag} && docker push #{image}:#{tag}", color: color
      print "Successfully pushed #{image}:#{tag}", color: color
      return Success()
    else
      print "Failed pushing #{image}:#{tag}", color: :red
      return Failure($?)
    end
  }]
end
env() click to toggle source
# File lib/minos/artifact.rb, line 127
def env
  {
    'IMAGE'  => image,
    'TARGET' => target,
  }
end
image() click to toggle source
# File lib/minos/artifact.rb, line 142
def image
  artifact['image']
end
print(msg, color: colors.first) click to toggle source
run(cmd, color: colors.first) click to toggle source
# File lib/minos/artifact.rb, line 89
def run(cmd, color: colors.first)
  Open3.popen3("#{Minos::Utils.to_envs(env)} ; #{cmd}") do |stdin, stdout, stderr, wait_thr|
    t_out = Thread.new do
      while line = stdout.gets do
        print(line, color: color)
      end
    end

    t_err = Thread.new do
      while line = stderr.gets do
        print(line, color: :red)
      end
    end

    wait_thr.join
    t_err.join
    t_out.join

    stdin.close
    stdout.close
    stderr.close

    wait_thr.value.success?
  end
end
select_color(i) click to toggle source
# File lib/minos/artifact.rb, line 119
def select_color(i)
  colors[i % colors.count]
end
tags() click to toggle source
# File lib/minos/artifact.rb, line 150
def tags
  artifact['tags'].to_a
end
target() click to toggle source
# File lib/minos/artifact.rb, line 146
def target
  docker['target']
end