feat: Update CircleCI configuration file

This commit is contained in:
Carlos Álvaro
2020-05-23 20:48:54 +02:00
parent 6f84e5a220
commit bb1a3cddba
2 changed files with 205 additions and 55 deletions

View File

@@ -1,64 +1,214 @@
version: 2
version: 2.1
orbs:
docker: circleci/docker@1.0.1
commands:
docker-build:
description: |
Build a Docker image
parameters:
dockerfile:
default: Dockerfile
description: |
Name of dockerfile to use, defaults to Dockerfile
type: string
extra_build_args:
default: ''
description: >
Extra flags to pass to docker build. For examples, see
https://docs.docker.com/engine/reference/commandline/build
type: string
registry:
default: docker.io
description: |
Comma separated list of registry to use, defaults to docker.io
type: string
image:
default: cdalvaro/saltstack-master
description: |
Name of image to build
type: string
tag:
default: ${CIRCLE_SHA1}
description: |
Image tag, defaults to the value of $CIRCLE_SHA1
type: string
path:
default: .
description: |
Path to the directory containing your Dockerfile and build context,
defaults to . (working directory)
type: string
cache_from:
default: ''
description: |
Comma-separated list of images. Images will first be pulled, then passed
as the --cache-from build argument
https://docs.docker.com/engine/reference/commandline/build/
type: string
no_output_timeout:
default: 10m
description: |
No output timeout for build step
type: string
steps:
- when:
condition: <<parameters.cache_from>>
steps:
- run:
name: Build image for <<parameters.registry>>
no_output_timeout: <<parameters.no_output_timeout>>
command: >
echo "<<parameters.cache_from>>" | sed -n 1'p' | tr ',' '\n' |
while read image; do
echo "Pulling ${image} ...";
docker pull "${image}" || true
done
docker_tag_args=""
IFS="," read -ra DOCKER_REGISTRIES \<<< "<<parameters.registry>>"
for registry in "${DOCKER_REGISTRIES[@]}"; do
IFS="," read -ra DOCKER_TAGS \<<< "<<parameters.tag>>"
for tag in "${DOCKER_TAGS[@]}"; do
docker_tag_args="${docker_tag_args} -t ${registry}/<<parameters.image>>:${tag}"
done
done
docker build
<<#parameters.extra_build_args>><<parameters.extra_build_args>><</parameters.extra_build_args>>
\
--cache-from <<parameters.cache_from>> \
-f <<parameters.path>>/<<parameters.dockerfile>> \
${docker_tag_args} \
<<parameters.path>>
- unless:
condition: <<parameters.cache_from>>
steps:
- run:
name: Building image for <<parameters.registry>>
no_output_timeout: <<parameters.no_output_timeout>>
command: >
docker_tag_args=""
IFS="," read -ra DOCKER_REGISTRIES \<<< "<<parameters.registry>>"
for registry in "${DOCKER_REGISTRIES[@]}"; do
IFS="," read -ra DOCKER_TAGS \<<< "<<parameters.tag>>"
for tag in "${DOCKER_TAGS[@]}"; do
docker_tag_args="${docker_tag_args} -t ${registry}/<<parameters.image>>:${tag}"
done
done
docker build
<<#parameters.extra_build_args>><<parameters.extra_build_args>><</parameters.extra_build_args>>
\
-f <<parameters.path>>/<<parameters.dockerfile>> \
${docker_tag_args} \
<<parameters.path>>
docker-save:
description: |
Save one or more images to a tar archive
parameters:
registry:
default: docker.io
description: |
Comma separated list of registry to use, defaults to docker.io
type: string
image:
description: |
Name of image to save
type: string
tag:
default: ${CIRCLE_SHA1}
description: |
Image tag, defaults to the value of $CIRCLE_SHA1
type: string
steps:
- run:
name: Save image to tar archive
command: >
docker_images=""
IFS="," read -ra DOCKER_REGISTRIES \<<< "<<parameters.registry>>"
for registry in "${DOCKER_REGISTRIES[@]}"; do
IFS="," read -ra DOCKER_TAGS \<<< "<<parameters.tag>>"
for tag in "${DOCKER_TAGS[@]}"; do
docker_images="${docker_images} ${registry}/<<parameters.image>>:${tag}"
done
done
mkdir -p ~/docker/
docker save -o ~/docker/docker-images.tar ${docker_images}
- persist_to_workspace:
root: ~/
paths:
- docker
docker-load:
description: |
Load tar archive
steps:
- attach_workspace:
at: ~/
- run:
name: Load images from tar archive
command: >
docker load -i ~/docker/docker-images.tar
jobs:
build:
docker:
- image: circleci/golang:1-stretch-browsers-legacy
environment:
IMAGE_NAME: "cdalvaro/saltstack-master"
executor: docker/machine
steps:
- checkout
- docker-build:
registry: docker.io,quay.io
image: cdalvaro/saltstack-master
tag: ${CIRCLE_TAG:-latest}
cache_from: docker.io/cdalvaro/saltstack-master:latest
extra_build_args: '--build-arg VCS_REF=${CIRCLE_TAG:-${CIRCLE_SHA1}} --build-arg BUILD_DATE="$(date +"%Y-%m-%d %H:%M:%S%:z")"'
no_output_timeout: 45m
- docker-save:
registry: docker.io,quay.io
image: cdalvaro/saltstack-master
tag: ${CIRCLE_TAG:-latest}
- setup_remote_docker:
version: 18.03.1-ce
test:
executor: docker/machine
steps:
- checkout
- docker-load
- run:
name: Docker info
command: |
docker version
docker info
- restore_cache:
keys:
- cache-v2-{{ .Branch }}
paths:
- /tmp/cache/layers.tar
name: Launch docker container
command: docker run -it --rm -d --name salt_master cdalvaro/saltstack-master:${CIRCLE_TAG:-latest}
- run:
name: Loading docker cache
command: |
if [[ -f /tmp/cache/layers.tar ]]; then
echo "Loading cache ..."
docker load -i /tmp/cache/layers.tar
docker image ls
else
echo "Couldn't find any caches"
fi
name: Container info
command: docker container ls
- run:
name: Build docker image
command: |
docker build \
--pull \
--cache-from=${IMAGE_NAME} \
--build-arg BUILD_DATE="$(date +"%Y-%m-%d %H:%M:%S%:z")" \
--build-arg VCS_REF=$(git rev-parse --short HEAD) \
-t ${IMAGE_NAME}:$(cat VERSION) .
name: Wait for salt-master bootup
command: sleep 60
- run:
name: Launching container for testing
command: |
docker run --rm --detach --name saltstack-master ${IMAGE_NAME}:$(cat VERSION)
sleep 120
- run:
name: Generate docker build image cache
command: |
mkdir -p /tmp/cache/
docker save -o /tmp/cache/layers.tar ${IMAGE_NAME}
- save_cache:
key: cache-v2-{{ .Branch }}
paths:
- /tmp/cache/layers.tar
name: Test image bootup
command: docker exec -it salt_master /usr/local/bin/healthcheck
workflows:
version: 2
build:
build-and-test:
jobs:
- build
- build:
filters:
tags:
only: /^[0-9._]+$/
- test:
requires:
- build
filters:
tags:
only: /^[0-9._]+$/

View File

@@ -3,10 +3,10 @@
# Docker Daemon Build Hook
# $IMAGE_NAME var is injected into the build so the tag is correct.
docker pull ${DOCKER_REPO}:latest
docker pull "${DOCKER_REPO}:latest"
docker build \
--cache-from=${DOCKER_REPO}:latest \
--cache-from="${DOCKER_REPO}:latest" \
--build-arg=BUILD_DATE="$(date +"%Y-%m-%d %H:%M:%S%:z")" \
--build-arg=VCS_REF="$(git rev-parse --short HEAD)" \
-t ${IMAGE_NAME} .
-t "${IMAGE_NAME}" .