diff --git a/.circleci/config.yml b/.circleci/config.yml index b993837..76e592b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -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: <> + steps: + - run: + name: Build image for <> + no_output_timeout: <> + command: > + echo "<>" | 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 \<<< "<>" + + for registry in "${DOCKER_REGISTRIES[@]}"; do + IFS="," read -ra DOCKER_TAGS \<<< "<>" + + for tag in "${DOCKER_TAGS[@]}"; do + docker_tag_args="${docker_tag_args} -t ${registry}/<>:${tag}" + done + done + + docker build + <<#parameters.extra_build_args>><><> + \ + --cache-from <> \ + -f <>/<> \ + ${docker_tag_args} \ + <> + - unless: + condition: <> + steps: + - run: + name: Building image for <> + no_output_timeout: <> + command: > + docker_tag_args="" + + IFS="," read -ra DOCKER_REGISTRIES \<<< "<>" + + for registry in "${DOCKER_REGISTRIES[@]}"; do + IFS="," read -ra DOCKER_TAGS \<<< "<>" + + for tag in "${DOCKER_TAGS[@]}"; do + docker_tag_args="${docker_tag_args} -t ${registry}/<>:${tag}" + done + done + + docker build + <<#parameters.extra_build_args>><><> + \ + -f <>/<> \ + ${docker_tag_args} \ + <> + + 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 \<<< "<>" + + for registry in "${DOCKER_REGISTRIES[@]}"; do + IFS="," read -ra DOCKER_TAGS \<<< "<>" + + for tag in "${DOCKER_TAGS[@]}"; do + docker_images="${docker_images} ${registry}/<>:${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 \ No newline at end of file + - build: + filters: + tags: + only: /^[0-9._]+$/ + - test: + requires: + - build + filters: + tags: + only: /^[0-9._]+$/ diff --git a/hooks/build b/hooks/build index b984052..2e6b61d 100644 --- a/hooks/build +++ b/hooks/build @@ -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}" .