class ContainerCI::ExportGithubProjectIntoContainer

Exports a github project into a container–set up so that CI systems can push this and pull the latest source.

Public Class Methods

new(dsl: ::Rake::Task) click to toggle source
# File lib/containerci.rb, line 12
def initialize(dsl: ::Rake::Task)
  @dsl = dsl
  define
end

Public Instance Methods

current_version() click to toggle source
# File lib/containerci.rb, line 27
def current_version
  `docker images | grep -v latest | grep ^#{USER}/#{PROJECT_NAME} | \
 awk '{print $2}' | head -1`
end
define() click to toggle source
# File lib/containerci.rb, line 42
def define
  @dsl.define_task(:update_github_project) do
    puts "pulling #{GITHUB_PROJECT}..."
    unless Dir.exist? GITHUB_PROJECT
      sh 'git clone https://$GITHUB_OAUTH:x-oauth-basic@' \
         "github.com/#{USER}/#{GITHUB_PROJECT}.git"
    end
    sh "cd #{GITHUB_PROJECT} && git rev-parse HEAD"
    sh "cd #{GITHUB_PROJECT} && git fetch --tags"
    sh "cd #{GITHUB_PROJECT} && git pull origin tests_passed"
    sh "cd #{GITHUB_PROJECT} && git show-ref --tags"
    sh "cd #{GITHUB_PROJECT} && git rev-parse HEAD"
    puts 'done'
  end

  @dsl.define_task(:docker_pull) do
    docker_pull_cmds = 'false; ' \
       'until [ $? -eq 0 ]; do ' \
       "docker pull #{USER}/#{PROJECT_NAME}:latest < /dev/null; done"
    puts 'Restoring from docker cache...'
    sh "if [ -e ~/docker/#{PROJECT_NAME}.tar ]; " \
       'then ' \
       '  echo "restoring from cache"; ' \
       "  docker load -i ~/docker/#{PROJECT_NAME}.tar;" \
       "  #{docker_pull_cmds};" \
       'else ' \
       '  echo "recreating cache"; ' \
       "  #{docker_pull_cmds};" \
       "  mkdir -p ~/docker; docker save #{USER}/#{PROJECT_NAME}:latest " \
       "    > ~/docker/#{PROJECT_NAME}.tar; " \
       'fi; '
  end

  @dsl.define_task(:get_docker_machine) do
    sh 'if [ ! -d ~/docker-machine ]; ' \
       'then ' \
       '  mkdir -p ~/docker-machine; ' \
       'fi'
    sh 'if [ ! -f ~/docker-machine/docker-machine ]; ' \
       'then ' \
       "  curl -L #{docker_machine_url} > " \
       '      ~/docker-machine/docker-machine; ' \
       'fi'
    sh 'if [ ! -x ~/docker-machine/docker-machine ]; ' \
       'then ' \
       '  chmod +x ~/docker-machine/docker-machine; ' \
       'fi'
  end

  @dsl.define_task(dependencies:
                     [:update_github_project,
                      :docker_pull,
                      :get_docker_machine])

  @dsl.define_task(:print_next_version) do
    puts "next version is #{next_version}"
  end

  @dsl.define_task(:docker_build_next_version) do
    sh "docker build -t #{USER}/#{PROJECT_NAME}:#{next_version} ."
  end

  @dsl.define_task(:docker_tag) do
    sh "docker tag -f #{USER}/#{PROJECT_NAME}:#{next_version} " \
       "#{USER}/#{PROJECT_NAME}:latest || " \
       "docker tag #{USER}/#{PROJECT_NAME}:#{next_version} " \
       "#{USER}/#{PROJECT_NAME}:latest"
  end

  @dsl.define_task(build:
                     [:print_next_version,
                      :docker_build_next_version,
                      :docker_tag])

  @dsl.define_task(:docker_push) do
    sh docker_push_cmds('latest')
    sh docker_push_cmds(current_version)
  end

  @dsl.define_task(after_test_success:
                     [:docker_push,
                      :deploy
                     ])
end
docker_machine_url() click to toggle source
# File lib/containerci.rb, line 22
def docker_machine_url
  'https://github.com/docker/machine/releases/download/v0.3.0/' \
  "docker-machine_#{os}-amd64"
end
docker_push_cmds(version) click to toggle source
# File lib/containerci.rb, line 36
def docker_push_cmds(version)
  'false; ' \
  'until [ $? -eq 0 ]; do ' \
  "docker push #{USER}/#{PROJECT_NAME}:#{version} < /dev/null; done"
end
next_version() click to toggle source
# File lib/containerci.rb, line 32
def next_version
  @next_version ||= `sh -c 'TZ=UTC date +%Y-%m-%d-%H%M'`.chomp
end
os() click to toggle source
# File lib/containerci.rb, line 17
def os
  os = `uname -s`.chomp
  os.downcase
end