Skip to content

Commit 1fd39dc

Browse files
committed
update ci pipeline to circleci 2.1
1 parent e63965e commit 1fd39dc

File tree

3 files changed

+361
-47
lines changed

3 files changed

+361
-47
lines changed

.circleci/config.yml

Lines changed: 312 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,66 +1,331 @@
1-
version: 2
2-
jobs:
3-
shellcheck:
4-
docker:
5-
- image: nlknguyen/alpine-shellcheck:v0.4.6
1+
version: 2.1
2+
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
53+
steps:
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 >>"
73+
74+
for tag in "${DOCKER_TAGS[@]}"; do
75+
docker_tag_args="$docker_tag_args -t $registry/<<parameters.image>>:${tag}"
76+
done
77+
done
78+
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
6128
steps:
7-
- checkout
8129
- run:
9-
name: Check Docker Hub Hooks
10-
command: |
11-
find hooks -type f | wc -l
12-
find hooks -type f | xargs shellcheck -e SC2086 --external-sources
130+
name: Save image to tar archive
131+
command: >
132+
docker_images=""
133+
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: ~/
149+
paths:
150+
- docker
151+
152+
docker-load:
153+
description: |
154+
Load tar archive
155+
steps:
156+
- attach_workspace:
157+
at: ~/
13158
- run:
14-
name: Check Scripts
15-
command: |
16-
find . -type f -name '*.sh' | wc -l
17-
find . -type f -name '*.sh' | xargs shellcheck -e SC2086 -e SC1090 --external-sources
159+
name: Load images from tar archive
160+
command: >
161+
docker load -i ~/docker/docker-images.tar
18162
19-
build:
20-
docker:
21-
- image: circleci/golang:1-stretch-browsers-legacy
22-
environment:
23-
IMAGE_NAME: "sameersbn/gitlab"
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 >>"
24193
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
25202
steps:
26203
- checkout
204+
- docker-build:
205+
registry: docker.io,quay.io
206+
image: sameersbn/gitlab
207+
tag: ${CIRCLE_TAG:-latest}
208+
cache_from: docker.io/sameersbn/gitlab:latest
209+
extra_build_args: '--build-arg GIT_COMMIT=${CIRCLE_SHA1} --build-arg GIT_TAG=$(date +%s)'
210+
no_output_timeout: 45m
211+
- docker-save:
212+
registry: docker.io,quay.io
213+
image: sameersbn/gitlab
214+
tag: ${CIRCLE_TAG:-latest}
27215

28-
- setup_remote_docker:
29-
version: 18.03.1-ce
30-
216+
test:
217+
executor: docker/machine
218+
steps:
219+
- checkout
220+
- docker-load
31221
- run:
32-
name: Docker info
222+
name: Update tag in docker-compose.yml
33223
command: |
34-
docker version
35-
docker info
36-
224+
sed -i "s|image: sameersbn/gitlab:.*|image: sameersbn/gitlab:${CIRCLE_TAG:-latest}|" docker-compose.yml
37225
- run:
38-
name: Build docker image
39-
command: |
40-
docker build \
41-
--pull \
42-
--cache-from=${IMAGE_NAME} \
43-
--build-arg BUILD_DATE="$(date +"%Y-%m-%d %H:%M:%S%:z")" \
44-
--build-arg VCS_REF=$(git rev-parse --short HEAD) \
45-
-t ${IMAGE_NAME}:$(cat VERSION) .
46-
no_output_timeout: 60m
47-
226+
name: Launch gitlab stack
227+
command: docker-compose up -d --quiet-pull
48228
- run:
49-
name: Launching container for testing
50-
command: |
51-
docker-compose up -d
52-
sleep 180
53-
229+
name: Container info
230+
command: docker ps
231+
- run:
232+
name: Wait for stack bootup
233+
command: sleep 90
54234
- run:
55-
name: Testing image
235+
name: Test image bootup
56236
command: |
57237
docker run --network container:$(docker-compose ps -q gitlab) \
58-
appropriate/curl --ipv4 --retry 15 --retry-delay 5 --retry-connrefused http://localhost/explore
238+
curlimages/curl --ipv4 --retry 60 --retry-delay 5 --retry-connrefused -svf http://localhost/explore -o /dev/null
239+
240+
publish-dockerhub:
241+
executor: docker/machine
242+
steps:
243+
- docker-load
244+
- docker/check:
245+
registry: docker.io
246+
docker-username: DOCKER_LOGIN
247+
docker-password: DOCKER_PASSWORD
248+
- docker-publish:
249+
registry: docker.io
250+
image: sameersbn/gitlab
251+
tag: ${CIRCLE_TAG:-latest}
252+
253+
publish-quay:
254+
executor: docker/machine
255+
steps:
256+
- docker-load
257+
- docker/check:
258+
registry: quay.io
259+
docker-username: DOCKER_LOGIN
260+
docker-password: DOCKER_PASSWORD
261+
- docker-publish:
262+
registry: quay.io
263+
image: sameersbn/gitlab
264+
tag: ${CIRCLE_TAG:-latest}
59265

266+
release:
267+
executor:
268+
name: go/default
269+
tag: '1.14'
270+
steps:
271+
- checkout
272+
- run:
273+
name: Installing github-release tool
274+
command: go get github.com/meterup/github-release
275+
- run:
276+
name: Creating github release
277+
command: |
278+
PRE_RELEASE=${CIRCLE_TAG/${CIRCLE_TAG%-rc[0-9]*}/}
279+
github-release delete -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -t ${CIRCLE_TAG} 2>/dev/null ||:
280+
./scripts/release-notes.sh ${CIRCLE_TAG} | github-release release ${PRE_RELEASE:+-p} -u ${CIRCLE_PROJECT_USERNAME} -r ${CIRCLE_PROJECT_REPONAME} -t ${CIRCLE_TAG} -d -
281+
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
60282
61283
workflows:
62-
version: 2
63-
build-and-test:
284+
build-test-and-release:
64285
jobs:
65-
- shellcheck
66-
- build
286+
- shellcheck/check:
287+
name: shellcheck
288+
ignore: SC2086,SC2181
289+
filters:
290+
tags:
291+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
292+
- build:
293+
requires:
294+
- shellcheck
295+
filters:
296+
tags:
297+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
298+
- test:
299+
requires:
300+
- build
301+
filters:
302+
tags:
303+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
304+
- publish-dockerhub:
305+
context: dockerhub
306+
requires:
307+
- test
308+
filters:
309+
branches:
310+
only: master
311+
tags:
312+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
313+
- publish-quay:
314+
context: quay
315+
requires:
316+
- test
317+
filters:
318+
tags:
319+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
320+
branches:
321+
only: master
322+
- release:
323+
context: github
324+
requires:
325+
- publish-dockerhub
326+
- publish-quay
327+
filters:
328+
tags:
329+
only: /^([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+[0-9A-Za-z-]+)?$/
330+
branches:
331+
ignore: /.*/

entrypoint.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
set -e
33
set -o pipefail
44

5+
# shellcheck source=assets/runtime/functions
56
source "${GITLAB_RUNTIME_DIR}/functions"
67

78
[[ $DEBUG == true ]] && set -x

0 commit comments

Comments
 (0)