updated ci pipeline
parent
0de5ef1c76
commit
5f0b941589
|
@ -1,72 +1,327 @@
|
||||||
version: 2
|
version: 2.1
|
||||||
|
|
||||||
|
orbs:
|
||||||
|
shellcheck: circleci/shellcheck@1.3.16
|
||||||
|
docker: circleci/docker@1.0.1
|
||||||
|
go: circleci/go@1.1.1
|
||||||
|
|
||||||
|
commands:
|
||||||
|
docker-build:
|
||||||
|
description: |
|
||||||
|
Build and optionally deploy a Docker images
|
||||||
|
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:
|
||||||
|
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 build
|
||||||
|
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
|
||||||
|
|
||||||
|
docker-publish:
|
||||||
|
description: |
|
||||||
|
Build and optionally deploy a Docker images
|
||||||
|
parameters:
|
||||||
|
pr:
|
||||||
|
default: ''
|
||||||
|
type: string
|
||||||
|
registry:
|
||||||
|
default: docker.io
|
||||||
|
description: |
|
||||||
|
Comma separated list of registry to use, defaults to docker.io
|
||||||
|
type: string
|
||||||
|
image:
|
||||||
|
description: Name of image to build
|
||||||
|
type: string
|
||||||
|
tag:
|
||||||
|
default: $CIRCLE_SHA1
|
||||||
|
description: 'Image tag, defaults to the value of $CIRCLE_SHA1'
|
||||||
|
type: string
|
||||||
|
steps:
|
||||||
|
- unless:
|
||||||
|
condition: <<parameters.pr>>
|
||||||
|
steps:
|
||||||
|
- run:
|
||||||
|
name: Publish image for <<parameters.registry>>
|
||||||
|
command: >
|
||||||
|
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 push $registry/<< parameters.image>>:${tag}
|
||||||
|
done
|
||||||
|
done
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
working_directory: /workdir
|
executor: docker/machine
|
||||||
docker:
|
|
||||||
- image: docker:18.03.0-ce-git
|
|
||||||
environment:
|
|
||||||
IMAGE_NAME: "sameersbn/bind"
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- checkout
|
- checkout
|
||||||
|
- docker-build:
|
||||||
|
registry: docker.io,quay.io
|
||||||
|
image: sameersbn/bind
|
||||||
|
tag: ${CIRCLE_TAG:-latest}
|
||||||
|
cache_from: docker.io/sameersbn/bind:latest
|
||||||
|
- docker-save:
|
||||||
|
registry: docker.io,quay.io
|
||||||
|
image: sameersbn/bind
|
||||||
|
tag: ${CIRCLE_TAG:-latest}
|
||||||
|
|
||||||
- setup_remote_docker:
|
test:
|
||||||
version: 18.03.1-ce
|
executor: docker/machine
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- docker-load
|
||||||
- run:
|
- run:
|
||||||
name: Docker info
|
name: Create test network
|
||||||
command: |
|
command: docker network create testnet
|
||||||
docker version
|
|
||||||
docker info
|
|
||||||
|
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- cache-{{ .Branch }}
|
|
||||||
paths:
|
|
||||||
- /cache/layers.tar
|
|
||||||
|
|
||||||
- run:
|
- run:
|
||||||
name: Loading docker cache
|
name: Launch bind container
|
||||||
command: |
|
command: docker run --name bind -d --net testnet sameersbn/bind:${CIRCLE_TAG:-latest}
|
||||||
if [[ -f /cache/layers.tar ]]; then
|
|
||||||
docker load -i /cache/layers.tar
|
|
||||||
fi
|
|
||||||
|
|
||||||
- run:
|
- run:
|
||||||
name: Build docker image
|
name: Wait for container bootup
|
||||||
command: |
|
command: sleep 15
|
||||||
docker build --cache-from=${IMAGE_NAME} -t ${IMAGE_NAME} .
|
|
||||||
|
|
||||||
- run:
|
- run:
|
||||||
name: Launching container for testing
|
name: Container info
|
||||||
command: |
|
command: docker ps -a
|
||||||
docker network create testnet
|
|
||||||
docker run --name bind-server -d --net testnet $IMAGE_NAME
|
|
||||||
sleep 5
|
|
||||||
|
|
||||||
- run:
|
- run:
|
||||||
name: Testing image
|
name: Test image
|
||||||
command: |
|
command: |
|
||||||
docker run --rm --net testnet $IMAGE_NAME host www.google.com bind-server
|
docker run --rm --net testnet sameersbn/bind:${CIRCLE_TAG:-latest} host www.google.com bind
|
||||||
|
|
||||||
|
publish-dockerhub:
|
||||||
|
executor: docker/machine
|
||||||
|
steps:
|
||||||
|
- docker-load
|
||||||
|
- docker/check:
|
||||||
|
registry: docker.io
|
||||||
|
docker-username: DOCKER_LOGIN
|
||||||
|
docker-password: DOCKER_PASSWORD
|
||||||
|
- docker-publish:
|
||||||
|
registry: docker.io
|
||||||
|
image: sameersbn/bind
|
||||||
|
tag: ${CIRCLE_TAG:-latest}
|
||||||
|
|
||||||
|
publish-quay:
|
||||||
|
executor: docker/machine
|
||||||
|
steps:
|
||||||
|
- docker-load
|
||||||
|
- docker/check:
|
||||||
|
registry: quay.io
|
||||||
|
docker-username: DOCKER_LOGIN
|
||||||
|
docker-password: DOCKER_PASSWORD
|
||||||
|
- docker-publish:
|
||||||
|
registry: quay.io
|
||||||
|
image: sameersbn/bind
|
||||||
|
tag: ${CIRCLE_TAG:-latest}
|
||||||
|
|
||||||
|
release:
|
||||||
|
executor:
|
||||||
|
name: go/default
|
||||||
|
tag: '1.14'
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
- run:
|
- run:
|
||||||
name: Generate docker build image cache
|
name: Installing github-release tool
|
||||||
|
command: go get github.com/meterup/github-release
|
||||||
|
- run:
|
||||||
|
name: Creating github release
|
||||||
command: |
|
command: |
|
||||||
mkdir -p /cache
|
PRE_RELEASE=${CIRCLE_TAG/${CIRCLE_TAG%-rc[0-9]*}/}
|
||||||
docker save -o /cache/layers.tar ${IMAGE_NAME}
|
github-release delete -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -t ${CIRCLE_TAG} 2>/dev/null ||:
|
||||||
|
./scripts/release-notes.sh ${CIRCLE_TAG} | github-release release ${PRE_RELEASE:+-p} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -t ${CIRCLE_TAG} -d -
|
||||||
- save_cache:
|
for f in $(find /tmp/dist -type f); do github-release upload -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -t ${CIRCLE_TAG} -n $(basename ${f}) -f ${f} ; done
|
||||||
key: cache-{{ .Branch }}-{{ epoch }}
|
|
||||||
paths:
|
|
||||||
- /cache/layers.tar
|
|
||||||
|
|
||||||
workflows:
|
workflows:
|
||||||
version: 2
|
build-test-and-release:
|
||||||
build-and-test:
|
|
||||||
jobs:
|
jobs:
|
||||||
|
- shellcheck/check:
|
||||||
|
name: shellcheck
|
||||||
|
ignore: SC2086,SC2181
|
||||||
|
filters:
|
||||||
|
tags:
|
||||||
|
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
|
||||||
- build:
|
- build:
|
||||||
|
requires:
|
||||||
|
- shellcheck
|
||||||
|
filters:
|
||||||
|
tags:
|
||||||
|
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
|
||||||
|
- test:
|
||||||
|
requires:
|
||||||
|
- build
|
||||||
|
filters:
|
||||||
|
tags:
|
||||||
|
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
|
||||||
|
- publish-dockerhub:
|
||||||
|
context: dockerhub
|
||||||
|
requires:
|
||||||
|
- test
|
||||||
filters:
|
filters:
|
||||||
branches:
|
branches:
|
||||||
only: /.*/
|
only: master
|
||||||
tags:
|
tags:
|
||||||
only: /.*/
|
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
|
||||||
|
- publish-quay:
|
||||||
|
context: quay
|
||||||
|
requires:
|
||||||
|
- test
|
||||||
|
filters:
|
||||||
|
tags:
|
||||||
|
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
|
||||||
|
branches:
|
||||||
|
only: master
|
||||||
|
- release:
|
||||||
|
context: github
|
||||||
|
requires:
|
||||||
|
- publish-dockerhub
|
||||||
|
- publish-quay
|
||||||
|
filters:
|
||||||
|
tags:
|
||||||
|
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
|
||||||
|
branches:
|
||||||
|
ignore: /.*/
|
||||||
|
|
|
@ -6,21 +6,21 @@ set -e
|
||||||
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
|
# (will allow for "$XYZ_DB_PASSWORD_FILE" to fill in the value of
|
||||||
# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
|
# "$XYZ_DB_PASSWORD" from a file, especially for Docker's secrets feature)
|
||||||
file_env() {
|
file_env() {
|
||||||
local var="$1"
|
local var="$1"
|
||||||
local fileVar="${var}_FILE"
|
local fileVar="${var}_FILE"
|
||||||
local def="${2:-}"
|
local def="${2:-}"
|
||||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||||
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
|
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
local val="$def"
|
local val="$def"
|
||||||
if [ "${!var:-}" ]; then
|
if [ "${!var:-}" ]; then
|
||||||
val="${!var}"
|
val="${!var}"
|
||||||
elif [ "${!fileVar:-}" ]; then
|
elif [ "${!fileVar:-}" ]; then
|
||||||
val="$(< "${!fileVar}")"
|
val="$(< "${!fileVar}")"
|
||||||
fi
|
fi
|
||||||
export "$var"="$val"
|
export "$var"="$val"
|
||||||
unset "$fileVar"
|
unset "$fileVar"
|
||||||
}
|
}
|
||||||
|
|
||||||
file_env 'ROOT_PASSWORD'
|
file_env 'ROOT_PASSWORD'
|
||||||
|
@ -84,12 +84,14 @@ set_root_passwd() {
|
||||||
}
|
}
|
||||||
|
|
||||||
create_pid_dir() {
|
create_pid_dir() {
|
||||||
mkdir -m 0775 -p /var/run/named
|
mkdir -p /var/run/named
|
||||||
|
chmod 0775 /var/run/named
|
||||||
chown root:${BIND_USER} /var/run/named
|
chown root:${BIND_USER} /var/run/named
|
||||||
}
|
}
|
||||||
|
|
||||||
create_bind_cache_dir() {
|
create_bind_cache_dir() {
|
||||||
mkdir -m 0775 -p /var/cache/bind
|
mkdir -p /var/cache/bind
|
||||||
|
chmod 0775 /var/cache/bind
|
||||||
chown root:${BIND_USER} /var/cache/bind
|
chown root:${BIND_USER} /var/cache/bind
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,10 +114,10 @@ create_bind_cache_dir
|
||||||
|
|
||||||
# allow arguments to be passed to named
|
# allow arguments to be passed to named
|
||||||
if [[ ${1:0:1} = '-' ]]; then
|
if [[ ${1:0:1} = '-' ]]; then
|
||||||
EXTRA_ARGS="$@"
|
EXTRA_ARGS="$*"
|
||||||
set --
|
set --
|
||||||
elif [[ ${1} == named || ${1} == $(which named) ]]; then
|
elif [[ ${1} == named || ${1} == "$(command -v named)" ]]; then
|
||||||
EXTRA_ARGS="${@:2}"
|
EXTRA_ARGS="${*:2}"
|
||||||
set --
|
set --
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
@ -130,7 +132,7 @@ if [[ -z ${1} ]]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Starting named..."
|
echo "Starting named..."
|
||||||
exec $(which named) -u ${BIND_USER} -g ${EXTRA_ARGS}
|
exec "$(command -v named)" -u ${BIND_USER} -g ${EXTRA_ARGS}
|
||||||
else
|
else
|
||||||
exec "$@"
|
exec "$@"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
#!/usr/bin/env sh
|
||||||
|
|
||||||
|
RELEASE=${GIT_TAG:-$1}
|
||||||
|
|
||||||
|
if [ -z "${RELEASE}" ]; then
|
||||||
|
echo "Usage:"
|
||||||
|
echo "./scripts/release-notes.sh v0.1.0"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! git rev-list ${RELEASE} >/dev/null 2>&1; then
|
||||||
|
echo "${RELEASE} does not exist"
|
||||||
|
exit
|
||||||
|
fi
|
||||||
|
|
||||||
|
PREV_RELEASE=${PREV_RELEASE:-$(git describe --tags --abbrev=0 ${RELEASE}^)}
|
||||||
|
PREV_RELEASE=${PREV_RELEASE:-$(git rev-list --max-parents=0 ${RELEASE}^)}
|
||||||
|
NOTABLE_CHANGES=$(git cat-file -p ${RELEASE} | sed '/-----BEGIN PGP SIGNATURE-----/,//d' | tail -n +6)
|
||||||
|
CHANGELOG=$(git log --no-merges --pretty=format:'- [%h] %s (%aN)' ${PREV_RELEASE}..${RELEASE})
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error creating changelog"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat <<EOF
|
||||||
|
${NOTABLE_CHANGES}
|
||||||
|
|
||||||
|
## Docker Images for sameersbn/bind:${RELEASE}
|
||||||
|
|
||||||
|
- [docker.io](https://hub.docker.com/r/sameersbn/bind/tags)
|
||||||
|
- [quay.io](https://quay.io/repository/sameersbn/bind?tag=${RELEASE}&tab=tags)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
For installation and usage instructions please refer to the [README](https://github.com/sameersbn/docker-bind/blob/${RELEASE}/README.md)
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
If you find this image useful here's how you can help:
|
||||||
|
|
||||||
|
- Send a Pull Request with your awesome new features and bug fixes
|
||||||
|
- Be a part of the community and help resolve [issues](https://github.com/sameersbn/docker-bind/issues)
|
||||||
|
- Support the development of this image with a [donation](http://www.damagehead.com/donate/)
|
||||||
|
|
||||||
|
## Changelog
|
||||||
|
|
||||||
|
${CHANGELOG}
|
||||||
|
EOF
|
Loading…
Reference in New Issue