Skip to content

Commit a5ef2ad

Browse files
committed
update circleci config
1 parent 7d19032 commit a5ef2ad

File tree

1 file changed

+305
-38
lines changed

1 file changed

+305
-38
lines changed

.circleci/config.yml

Lines changed: 305 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -1,60 +1,327 @@
1-
version: 2
2-
jobs:
3-
build:
4-
working_directory: /workdir
5-
docker:
6-
- image: docker:18.03.0-ce-git
7-
environment:
8-
IMAGE_NAME: "sameersbn/postgresql"
1+
version: 2.1
92

3+
orbs:
4+
shellcheck: circleci/[email protected]
5+
docker: circleci/[email protected]
6+
go: circleci/[email protected]
7+
8+
commands:
9+
docker-build:
10+
description: |
11+
Build and optionally deploy a Docker images
12+
parameters:
13+
dockerfile:
14+
default: Dockerfile
15+
description: 'Name of dockerfile to use, defaults to Dockerfile'
16+
type: string
17+
extra_build_args:
18+
default: ''
19+
description: >
20+
Extra flags to pass to docker build. For examples, see
21+
https://docs.docker.com/engine/reference/commandline/build
22+
type: string
23+
registry:
24+
default: docker.io
25+
description: |
26+
Comma separated list of registry to use, defaults to docker.io
27+
type: string
28+
image:
29+
description: Name of image to build
30+
type: string
31+
tag:
32+
default: $CIRCLE_SHA1
33+
description: 'Image tag, defaults to the value of $CIRCLE_SHA1'
34+
type: string
35+
path:
36+
default: .
37+
description: >
38+
Path to the directory containing your Dockerfile and build context,
39+
defaults to . (working directory)
40+
type: string
41+
cache_from:
42+
default: ''
43+
description: >
44+
Comma-separated list of images, images will first be pulled, then passed
45+
as the --cache-from build argument
46+
https://docs.docker.com/engine/reference/commandline/build/
47+
type: string
48+
no_output_timeout:
49+
default: 10m
50+
description: |
51+
No output timeout for build step
52+
type: string
1053
steps:
11-
- checkout
54+
- when:
55+
condition: <<parameters.cache_from>>
56+
steps:
57+
- run:
58+
name: Build image for <<parameters.registry>>
59+
no_output_timeout: <<parameters.no_output_timeout>>
60+
command: >
61+
echo "<<parameters.cache_from>>" | sed -n 1'p' | tr ',' '\n' |
62+
while read image; do
63+
echo "Pulling ${image}";
64+
docker pull ${image} || true
65+
done
66+
67+
docker_tag_args=""
68+
69+
IFS="," read -ra DOCKER_REGISTRIES \<<< "<< parameters.registry >>"
70+
71+
for registry in "${DOCKER_REGISTRIES[@]}"; do
72+
IFS="," read -ra DOCKER_TAGS \<<< "<< parameters.tag >>"
1273
13-
- setup_remote_docker:
14-
version: 18.03.1-ce
74+
for tag in "${DOCKER_TAGS[@]}"; do
75+
docker_tag_args="$docker_tag_args -t $registry/<<parameters.image>>:${tag}"
76+
done
77+
done
1578
79+
docker build
80+
<<#parameters.extra_build_args>><<parameters.extra_build_args>><</parameters.extra_build_args>>
81+
\
82+
--cache-from <<parameters.cache_from>> \
83+
-f <<parameters.path>>/<<parameters.dockerfile>> \
84+
$docker_tag_args \
85+
<<parameters.path>>
86+
- unless:
87+
condition: <<parameters.cache_from>>
88+
steps:
89+
- run:
90+
name: Building image for <<parameters.registry>>
91+
no_output_timeout: <<parameters.no_output_timeout>>
92+
command: >
93+
docker_tag_args=""
94+
95+
IFS="," read -ra DOCKER_REGISTRIES \<<< "<< parameters.registry >>"
96+
97+
for registry in "${DOCKER_REGISTRIES[@]}"; do
98+
IFS="," read -ra DOCKER_TAGS \<<< "<< parameters.tag >>"
99+
100+
for tag in "${DOCKER_TAGS[@]}"; do
101+
docker_tag_args="$docker_tag_args -t $registry/<<parameters.image>>:${tag}"
102+
done
103+
done
104+
105+
docker build
106+
<<#parameters.extra_build_args>><<parameters.extra_build_args>><</parameters.extra_build_args>>
107+
\
108+
-f <<parameters.path>>/<<parameters.dockerfile>> \
109+
$docker_tag_args \
110+
<<parameters.path>>
111+
112+
docker-save:
113+
description: |
114+
Save one or more images to a tar archive
115+
parameters:
116+
registry:
117+
default: docker.io
118+
description: |
119+
Comma separated list of registry to use, defaults to docker.io
120+
type: string
121+
image:
122+
description: Name of image to build
123+
type: string
124+
tag:
125+
default: $CIRCLE_SHA1
126+
description: 'Image tag, defaults to the value of $CIRCLE_SHA1'
127+
type: string
128+
steps:
16129
- run:
17-
name: Docker info
18-
command: |
19-
docker version
20-
docker info
130+
name: Save image to tar archive
131+
command: >
132+
docker_images=""
21133
22-
- restore_cache:
23-
keys:
24-
- cache-{{ .Branch }}
134+
IFS="," read -ra DOCKER_REGISTRIES \<<< "<< parameters.registry >>"
135+
136+
for registry in "${DOCKER_REGISTRIES[@]}"; do
137+
IFS="," read -ra DOCKER_TAGS \<<< "<< parameters.tag >>"
138+
139+
for tag in "${DOCKER_TAGS[@]}"; do
140+
docker_images="$docker_images $registry/<<parameters.image>>:${tag}"
141+
done
142+
done
143+
144+
mkdir -p ~/docker/
145+
146+
docker save -o ~/docker/docker-images.tar $docker_images
147+
- persist_to_workspace:
148+
root: ~/
25149
paths:
26-
- /cache/layers.tar
150+
- docker
27151

152+
docker-load:
153+
description: |
154+
Load tar archive
155+
steps:
156+
- attach_workspace:
157+
at: ~/
28158
- run:
29-
name: Loading docker cache
30-
command: |
31-
if [[ -f /cache/layers.tar ]]; then
32-
docker load -i /cache/layers.tar
33-
fi
159+
name: Load images from tar archive
160+
command: >
161+
docker load -i ~/docker/docker-images.tar
162+
163+
docker-publish:
164+
description: |
165+
Build and optionally deploy a Docker images
166+
parameters:
167+
pr:
168+
default: ''
169+
type: string
170+
registry:
171+
default: docker.io
172+
description: |
173+
Comma separated list of registry to use, defaults to docker.io
174+
type: string
175+
image:
176+
description: Name of image to build
177+
type: string
178+
tag:
179+
default: $CIRCLE_SHA1
180+
description: 'Image tag, defaults to the value of $CIRCLE_SHA1'
181+
type: string
182+
steps:
183+
- unless:
184+
condition: <<parameters.pr>>
185+
steps:
186+
- run:
187+
name: Publish image for <<parameters.registry>>
188+
command: >
189+
IFS="," read -ra DOCKER_REGISTRIES \<<< "<< parameters.registry >>"
190+
191+
for registry in "${DOCKER_REGISTRIES[@]}"; do
192+
IFS="," read -ra DOCKER_TAGS \<<< "<< parameters.tag >>"
193+
194+
for tag in "${DOCKER_TAGS[@]}"; do
195+
docker push $registry/<< parameters.image>>:${tag}
196+
done
197+
done
198+
199+
jobs:
200+
build:
201+
executor: docker/machine
202+
steps:
203+
- checkout
204+
- docker-build:
205+
registry: docker.io,quay.io
206+
image: sameersbn/postgresql
207+
tag: ${CIRCLE_TAG:-latest}
208+
cache_from: docker.io/sameersbn/postgresql:latest
209+
- docker-save:
210+
registry: docker.io,quay.io
211+
image: sameersbn/postgresql
212+
tag: ${CIRCLE_TAG:-latest}
34213

214+
test:
215+
executor: docker/machine
216+
steps:
217+
- checkout
218+
- docker-load
35219
- run:
36-
name: Build docker image
220+
name: Update tag in docker-compose.yml
37221
command: |
38-
docker build --cache-from=${IMAGE_NAME} -t ${IMAGE_NAME} .
222+
sed -i "s|image: sameersbn/postgresql:.*|image: sameersbn/postgresql:${CIRCLE_TAG:-latest}|" docker-compose.yml
223+
- run:
224+
name: Launch postgresql container
225+
command: docker-compose up -d --quiet-pull
226+
- run:
227+
name: Wait for bootup
228+
command: sleep 15
229+
- run:
230+
name: Container info
231+
command: docker ps
232+
- run:
233+
name: Test image
234+
command: docker exec $(docker-compose ps -q PostgreSQL) pg_isready
39235

236+
publish-dockerhub:
237+
executor: docker/machine
238+
steps:
239+
- docker-load
240+
- docker/check:
241+
registry: docker.io
242+
docker-username: DOCKER_LOGIN
243+
docker-password: DOCKER_PASSWORD
244+
- docker-publish:
245+
registry: docker.io
246+
image: sameersbn/postgresql
247+
tag: ${CIRCLE_TAG:-latest}
248+
249+
publish-quay:
250+
executor: docker/machine
251+
steps:
252+
- docker-load
253+
- docker/check:
254+
registry: quay.io
255+
docker-username: DOCKER_LOGIN
256+
docker-password: DOCKER_PASSWORD
257+
- docker-publish:
258+
registry: quay.io
259+
image: sameersbn/postgresql
260+
tag: ${CIRCLE_TAG:-latest}
261+
262+
release:
263+
executor:
264+
name: go/default
265+
tag: '1.14'
266+
steps:
267+
- checkout
268+
- run:
269+
name: Installing github-release tool
270+
command: go get github.com/meterup/github-release
40271
- run:
41-
name: Generate docker build image cache
272+
name: Creating github release
42273
command: |
43-
mkdir -p /cache
44-
docker save -o /cache/layers.tar ${IMAGE_NAME}
45-
46-
- save_cache:
47-
key: cache-{{ .Branch }}-{{ epoch }}
48-
paths:
49-
- /cache/layers.tar
274+
PRE_RELEASE=${CIRCLE_TAG/${CIRCLE_TAG%-rc[0-9]*}/}
275+
github-release delete -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -t ${CIRCLE_TAG} 2>/dev/null ||:
276+
./scripts/release-notes.sh ${CIRCLE_TAG} | github-release release ${PRE_RELEASE:+-p} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -t ${CIRCLE_TAG} -d -
277+
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
50278
51279
workflows:
52-
version: 2
53-
build-and-test:
280+
build-test-and-release:
54281
jobs:
282+
- shellcheck/check:
283+
name: shellcheck
284+
ignore: SC2086,SC2181
285+
filters:
286+
tags:
287+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
55288
- build:
289+
requires:
290+
- shellcheck
291+
filters:
292+
tags:
293+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
294+
- test:
295+
requires:
296+
- build
297+
filters:
298+
tags:
299+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
300+
- publish-dockerhub:
301+
context: dockerhub
302+
requires:
303+
- test
56304
filters:
57305
branches:
58-
only: /.*/
306+
only: master
307+
tags:
308+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
309+
- publish-quay:
310+
context: quay
311+
requires:
312+
- test
313+
filters:
59314
tags:
60-
only: /.*/
315+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
316+
branches:
317+
only: master
318+
- release:
319+
context: github
320+
requires:
321+
- publish-dockerhub
322+
- publish-quay
323+
filters:
324+
tags:
325+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
326+
branches:
327+
ignore: /.*/

0 commit comments

Comments
 (0)