-
Notifications
You must be signed in to change notification settings - Fork 1
/
.gitlab-ci.yml
192 lines (181 loc) · 4.86 KB
/
.gitlab-ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
stages:
- build
- post-build
variables:
GIT_SUBMODULE_STRATEGY: recursive
DOCKER_HOST: tcp://docker:2375/
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
PLATFORMS: linux/amd64
ARCHES: amd64
REGISTRIES: registry.gitlab.com
IMAGE_DOCKER: docker.io/docker:20.10.6
.container-build-init-buildx: &container-build-init-buildx |
set -x
mkdir -p $HOME/.docker/cli-plugins
wget -O $HOME/.docker/cli-plugins/docker-buildx https://github.com/docker/buildx/releases/download/v0.5.1/buildx-v0.5.1.linux-amd64
chmod +x $HOME/.docker/cli-plugins/docker-buildx
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
docker buildx create --use --name builder
.container-build-pre-script: &container-build-pre-script |
set -x
docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
.declare-extra-destinations-img: &declare-extra-destinations |
if [[ ! "$CI_COMMIT_BRANCH" = "$CI_DEFAULT_BRANCH" ]] && [[ -z "$CI_COMMIT_TAG" ]]; then
export BRANCH_NAME="-$CI_COMMIT_BRANCH"
fi
export BASE_TAG=$(date --date="${CI_COMMIT_TIMESTAMP//[T+]/ }" '+%Y.%m.%d.%H%M')
if [[ "$CI_COMMIT_BRANCH" = "$CI_DEFAULT_BRANCH" ]]; then
export CONTAINER_EXTRA_DESTINATION="-t $CI_REGISTRY_IMAGE/${APP}:latest${EXTRA_TAG_NAME}"
else
export CONTAINER_EXTRA_DESTINATION="-t $CI_REGISTRY_IMAGE/${APP}:latest$BRANCH_NAME${EXTRA_TAG_NAME}"
fi
if [ -n "$CI_COMMIT_TAG" ]; then
export BRANCH_NAME=""
export IMAGE_TAG="$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG/${APP}"
export CONTAINER_EXTRA_DESTINATION="-t $CI_REGISTRY_IMAGE/${APP}:$CI_COMMIT_TAG${EXTRA_TAG_NAME}"
fi
.build: &build |
docker buildx build \
--push \
-f $CI_PROJECT_DIR/${APP}.Dockerfile \
$CONTAINER_EXTRA_DESTINATION \
-t $CI_REGISTRY_IMAGE/${APP}:$BASE_TAG$BRANCH_NAME${EXTRA_TAG_NAME} \
--platform $PLATFORMS \
$CI_PROJECT_DIR
# NOTE multi-arch takes too long, something needs to be changed or this will never complete
# it appears to normally take ~30mins for linux/amd64 alone
build-environment-amd64:
stage: build
timeout: 5h
image:
name: $IMAGE_DOCKER
entrypoint: [""]
variables:
APP: environment
PLATFORMS: linux/amd64
EXTRA_TAG_NAME: -amd64
services:
- docker:dind
retry: 2
before_script:
- *container-build-init-buildx
- *container-build-pre-script
- *declare-extra-destinations
script:
- *build
only:
refs:
- tags
changes:
- etc/
- usr/
- environment.Dockerfile
# build-environment-arm64:
# stage: build
# timeout: 5h
# image:
# name: docker.io/docker:stable
# entrypoint: [""]
# variables:
# APP: environment
# PLATFORMS: linux/arm64
# EXTRA_TAG_NAME: -arm64
# services:
# - docker:dind
# retry: 2
# before_script:
# - *container-build-pre-script
# - *declare-extra-destinations
# script:
# - *build
build-exporter:
stage: build
timeout: 5h
image:
name: $IMAGE_DOCKER
entrypoint: [""]
variables:
APP: exporter
services:
- docker:dind
retry: 2
before_script:
- *container-build-init-buildx
- *container-build-pre-script
- *declare-extra-destinations
script:
- *build
only:
refs:
- tags
changes:
- cmd/
- pkg/
- go.mod
- go.sum
- exporter.Dockerfile
build-exposer:
stage: build
timeout: 5h
image:
name: $IMAGE_DOCKER
entrypoint: [""]
variables:
APP: exposer
services:
- docker:dind
retry: 2
before_script:
- *container-build-init-buildx
- *container-build-pre-script
- *declare-extra-destinations
script:
- *build
only:
refs:
- tags
changes:
- cmd/
- pkg/
- go.mod
- go.sum
- exporter.Dockerfile
tag-container-image-environment:
stage: post-build
image: $IMAGE_DOCKER
variables:
APP: environment
DOCKER_HOST: ""
before_script:
- *container-build-pre-script
- *declare-extra-destinations
script:
- |
set -x
for tag in $BASE_TAG$BRANCH_NAME latest$BRANCH_NAME; do
for reg in $REGISTRIES; do
export IMAGE_TAG_WITH_ARCH=""
for arch in $ARCHES; do
IMAGE="$reg/$CI_PROJECT_PATH/${APP}:$tag-$arch"
export IMAGE_TAG_WITH_ARCH="$IMAGE_TAG_WITH_ARCH $IMAGE"
done
docker manifest create $reg/$CI_PROJECT_PATH/${APP}:$tag $IMAGE_TAG_WITH_ARCH
for arch in $ARCHES; do
# TODO tidy up
EXTRA_ARGS=""
if [ "$arch" = "arm64" ]; then
EXTRA_ARGS="--variant v8"
fi
docker manifest annotate $reg/$CI_PROJECT_PATH/${APP}:$tag $reg/$CI_PROJECT_PATH/${APP}:$tag-$arch --os linux --arch $arch $EXTRA_ARGS
done
docker manifest push $reg/$CI_PROJECT_PATH/${APP}:$tag
done
done
only:
refs:
- tags
changes:
- etc/
- usr/
- environment.Dockerfile