class GzRelease::Tasks

Rake tasks for building a docker image

Constants

BuildError
DOCKERFILE_PATH
DOCKER_CACHE_PATH
DOCKER_IMAGE_PATH
TIMESTAMP_FORMAT

Attributes

version[R]

Public Class Methods

install(*args) click to toggle source
# File lib/gz_release/tasks.rb, line 17
def install(*args)
  new(*args).install
end
new(options = {}) click to toggle source
# File lib/gz_release/tasks.rb, line 24
def initialize(options = {})
  @image_name, @version = options.values_at(:image_name, :version)

  raise BuildError, 'Image name not specified.' unless image_name
end

Public Instance Methods

branch() click to toggle source
# File lib/gz_release/tasks.rb, line 181
def branch
  @branch ||= (ENV['CIRCLE_BRANCH'] ? ENV['CIRCLE_BRANCH'] : `git rev-parse --abbrev-ref HEAD`).strip.gsub(/\//,'_')
end
build() click to toggle source
# File lib/gz_release/tasks.rb, line 106
def build
  run("docker build -t #{image_sha} .")
end
docker_repository() click to toggle source
# File lib/gz_release/tasks.rb, line 155
def docker_repository
  ENV['DOCKER_REPOSITORY'] || ''
end
dump() click to toggle source
# File lib/gz_release/tasks.rb, line 99
def dump
  require 'fileutils'

  FileUtils.mkdir_p(DOCKER_CACHE_PATH)
  run("docker save #{image_latest} > #{DOCKER_IMAGE_PATH}")
end
git_push(tag_name) click to toggle source
# File lib/gz_release/tasks.rb, line 124
def git_push(tag_name)
  run("git push origin #{tag_name}")
end
git_tag(tag_name) click to toggle source
# File lib/gz_release/tasks.rb, line 114
def git_tag(tag_name)
  run("git tag -a #{tag_name} -m 'Tagging #{tag_name} from #{branch}(#{sha})' #{sha}")
end
image_branch() click to toggle source
# File lib/gz_release/tasks.rb, line 177
def image_branch
  "#{image_name}:#{branch}"
end
image_latest() click to toggle source
# File lib/gz_release/tasks.rb, line 211
def image_latest
  "#{image_name}:latest"
end
image_name() click to toggle source
# File lib/gz_release/tasks.rb, line 149
def image_name
  name = ''
  name << "#{docker_repository}/" unless docker_repository.empty?
  name << @image_name
end
image_release() click to toggle source
# File lib/gz_release/tasks.rb, line 224
def image_release
  "#{image_name}:release"
end
image_sha() click to toggle source

SHA

# File lib/gz_release/tasks.rb, line 160
def image_sha
  "#{image_name}:#{sha}"
end
image_timestamp() click to toggle source
# File lib/gz_release/tasks.rb, line 239
def image_timestamp
  "#{image_name}:#{timestamp}"
end
image_version() click to toggle source
# File lib/gz_release/tasks.rb, line 198
def image_version
  "#{image_name}:#{version}"
end
install() click to toggle source
# File lib/gz_release/tasks.rb, line 30
def install
  namespace :release do
    desc 'Creates a latest tag and version tag if available. Version is set in Rakefile'

    desc 'Creates a git tag and image tag of the current timestamp.'
    task(:tag_timestamp){tag_timestamp}

    desc 'Pulls latest version of the image from dockerhub'
    task(:pull){pull}

    desc 'Loads ~/.docker/image.tar into docker cache. If file does not exist, pulls from dockerhub.'
    task(:load){load}

    desc 'Dumps docker cache into ~/.docker/image.tar'
    task(:dump){dump}

    desc 'Builds the docker image from generated Dockerfile'
    task(:build){build}

    namespace :tag do
      desc 'Creates a tag for the branch for the docker image'
      task(:branch){tag_branch}

      desc 'Creates a tag for version specified in Rakefile for docker image'
      task(:version){tag_version}

      desc 'Creates latest tag for the docker image'
      task(:latest){tag_latest}

      desc 'Creates release tag for the docker image'
      task(:release){tag_release}

      desc 'Creates timestamp tag for the docker image and git repo'
      task(:timestamp){tag_timestamp}
    end

    namespace :push do
      desc 'Pushes docker image tagged as current git branch.'
      task(branch: :'release:tag:branch'){push_branch}

      desc 'Pushes docker image tagged as version specified in Rakefile'
      task(version: :'release:tag:version'){push_version}

      desc 'Pushes docker image tagged as latest'
      task(latest: :'release:tag:latest'){push_latest}

      desc 'Pushes docker image tagged as release'
      task(release: :'release:tag:release'){push_release}

      desc 'Pushes docker image and git tag tagged by the timestamp.'
      task(timestamp: :'release:tag:timestamp'){push_timestamp}
    end
  end
end
load() click to toggle source
# File lib/gz_release/tasks.rb, line 91
def load
  if File.exist?(DOCKER_IMAGE_PATH)
    run("docker load -i #{DOCKER_IMAGE_PATH}")
  else
    pull
  end
end
login() click to toggle source
# File lib/gz_release/tasks.rb, line 128
def login
  email = ENV['DOCKER_EMAIL']
  user = ENV['DOCKER_USER']
  password = ENV['DOCKER_PASSWORD']

  errors = []
  errors << 'Missing DOCKER_EMAIL environment variable.' unless email
  errors << 'Missing DOCKER_USER environment variable.' unless user
  errors << 'Missing DOCKER_PASSWORD environment variable.' unless password
  raise BuildError, "Encountered the following errors:\n #{errors.join("\n")}" if errors.any?

  run("docker login -e #{email} -u #{user} -p #{password} #{docker_repository}", display_command: false)
end
pull() click to toggle source
# File lib/gz_release/tasks.rb, line 85
def pull
  run("docker pull #{image_version}")
rescue BuildError
  puts 'Skipping pull. Note, this should generally only happen on first build.'
end
push(tag_name) click to toggle source
# File lib/gz_release/tasks.rb, line 118
def push(tag_name)
  login

  run("docker push #{tag_name}")
end
push_branch() click to toggle source
# File lib/gz_release/tasks.rb, line 173
def push_branch
  push(image_branch)
end
push_latest() click to toggle source
# File lib/gz_release/tasks.rb, line 207
def push_latest
  push(image_latest)
end
push_release() click to toggle source
# File lib/gz_release/tasks.rb, line 220
def push_release
  push(image_release)
end
push_timestamp() click to toggle source
# File lib/gz_release/tasks.rb, line 234
def push_timestamp
  git_push(timestamp)
  push(image_timestamp)
end
push_version() click to toggle source
# File lib/gz_release/tasks.rb, line 192
def push_version
  return unless version

  push(image_version)
end
run(command, options = {display_command: true}) click to toggle source
# File lib/gz_release/tasks.rb, line 142
def run(command, options = {display_command: true})
  puts command if options[:display_command]
  system(command)

  raise BuildError, 'There was a problem executing this command.' unless $CHILD_STATUS == 0
end
sha() click to toggle source
# File lib/gz_release/tasks.rb, line 164
def sha
  @sha ||= `git rev-parse HEAD`.strip
end
tag(tag_name) click to toggle source
# File lib/gz_release/tasks.rb, line 110
def tag(tag_name)
  run("docker tag -f #{image_sha} #{tag_name}")
end
tag_branch() click to toggle source

Branch

# File lib/gz_release/tasks.rb, line 169
def tag_branch
  tag(image_branch)
end
tag_latest() click to toggle source

Latest

# File lib/gz_release/tasks.rb, line 203
def tag_latest
  tag(image_latest)
end
tag_release() click to toggle source

Release

# File lib/gz_release/tasks.rb, line 216
def tag_release
  tag(image_release)
end
tag_timestamp() click to toggle source

Timestamp

# File lib/gz_release/tasks.rb, line 229
def tag_timestamp
  git_tag(timestamp)
  tag(image_timestamp)
end
tag_version() click to toggle source

Version

# File lib/gz_release/tasks.rb, line 186
def tag_version
  return unless version

  tag(image_version)
end
timestamp() click to toggle source
# File lib/gz_release/tasks.rb, line 243
def timestamp
  @timestamp ||= Time.now.utc.strftime(TIMESTAMP_FORMAT)
end