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