-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path.gitlab-ci.yml
304 lines (264 loc) · 7.13 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
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
variables:
DOCKER_TLS_CERTDIR: "" # HACK: see https://gitlab.com/gitlab-org/gitlab-runner/issues/4501
stages:
- setup
- check
- build
- deploy
# TODO: maybe stup some notifications as a last stage?
#==[ JOB TEMPLATES ]============================================================
.node-job: &node-job
image: node:16-alpine
only:
- pushes
.fe-node-job:
<<: *node-job
cache:
key:
files:
- frontend/package-lock.json
paths:
- frontend/.npm/
before_script:
- cd frontend
- npm ci --cache .npm --prefer-offline --production=false
.be-node-job:
<<: *node-job
cache:
key:
files:
- backend/package-lock.json
paths:
- backend/.npm/
before_script:
- cd backend
- npm ci --cache .npm --prefer-offline
#==[ SETUP STAGE ]==============================================================
#--[ Frontend ]-----------------------------------------------------------------
fe-cache-job:
extends: .fe-node-job
stage: setup
script:
- echo "Done!"
#--[ Backend ]------------------------------------------------------------------
be-cache-job:
extends: .be-node-job
stage: setup
script:
- echo "Done!"
#--[ Cetera ]-------------------------------------------------------------------
app-tagger-job:
stage: setup
variables:
GIT_STRATEGY: clone
GIT_DEPTH: 0
script:
- GIT_DESCRIPTOR=$(git describe --tags --always)
- echo Detected app version ${GIT_DESCRIPTOR}
- echo "APP_VERSION=${GIT_DESCRIPTOR#v}" >> build.env
artifacts:
reports:
dotenv: build.env
only:
- tags
- development
#==[ CHECK STAGE ]==============================================================
#--[ Frontend ]-----------------------------------------------------------------
.fe-check-job: &fe-check-job
extends: .fe-node-job
stage: check
needs:
- fe-cache-job
# allow_failure: true # TODO: disallow!
fe-format-job:
<<: *fe-check-job
script:
- npm run format:check
fe-lint-job:
<<: *fe-check-job
script:
- npm run lint:check
fe-test-job:
<<: *fe-check-job
script:
- npm run test
#--[ Backend ]------------------------------------------------------------------
.be-check-job: &be-check-job
extends: .be-node-job
stage: check
needs:
- be-cache-job
# allow_failure: true # TODO: disallow!
be-format-job:
<<: *be-check-job
script:
- npm run format:check
be-lint-job:
<<: *be-check-job
script:
- npm run lint:check
be-test-job:
<<: *be-check-job
script:
- npm run test
#==[ BUILD STAGE ]==============================================================
#--[ Frontend ]-----------------------------------------------------------------
prd-fe-build-job:
extends: .fe-node-job
stage: build
variables:
NODE_ENV: production
ROLLBAR_ACCESS_TOKEN: $POST_CLIENT_ITEM_ROLLBAR_ACCESS_TOKEN
script:
- npm run build -- --dist-dir dist/prd
artifacts:
paths:
- frontend/dist/prd
expire_in: 1 week
only:
- tags
stg-fe-build-job:
extends: .fe-node-job
stage: build
variables:
NODE_ENV: staging
ROLLBAR_ACCESS_TOKEN: $POST_CLIENT_ITEM_ROLLBAR_ACCESS_TOKEN
script:
- npm run build -- --dist-dir dist/stg
artifacts:
paths:
- frontend/dist/stg
expire_in: 1 week
only:
- development
#--[ Backend ]------------------------------------------------------------------
.be-build-job:
stage: build
image:
name: gcr.io/kaniko-project/executor:debug
entrypoint: [""]
variables:
IMAGE_NAME: $CI_REGISTRY_IMAGE/backend
before_script:
- mkdir -p /kaniko/.docker
- echo "{\"auths\":{\"${CI_REGISTRY}\":{\"auth\":\"$(printf "%s:%s" "${CI_REGISTRY_USER}" "${CI_REGISTRY_PASSWORD}" | base64 | tr -d '\n')\"}}}" > /kaniko/.docker/config.json
prd-be-build-job:
extends: .be-build-job
stage: build
script: >-
/kaniko/executor
--context "${CI_PROJECT_DIR}/backend"
--dockerfile "${CI_PROJECT_DIR}/backend/Dockerfile"
--target production
--destination ${CI_REGISTRY_IMAGE}/backend:latest
--destination ${CI_REGISTRY_IMAGE}/backend:${APP_VERSION}
--destination ${CI_REGISTRY_IMAGE}/backend:${APP_VERSION%.*}
--destination ${CI_REGISTRY_IMAGE}/backend:${APP_VERSION%%.*}
--destination ${CI_REGISTRY_IMAGE}/backend:${CI_COMMIT_SHA}
--build-arg APP_VERSION=$APP_VERSION
--build-arg ROLLBAR_ACCESS_TOKEN=$POST_SERVER_ITEM_ROLLBAR_ACCESS_TOKEN
only:
- tags
stg-be-build-job:
extends: .be-build-job
stage: build
script: >-
/kaniko/executor
--context "${CI_PROJECT_DIR}/backend"
--dockerfile "${CI_PROJECT_DIR}/backend/Dockerfile"
--target production
--destination ${CI_REGISTRY_IMAGE}/backend:${CI_COMMIT_REF_NAME}
--destination ${CI_REGISTRY_IMAGE}/backend:${APP_VERSION}
--destination ${CI_REGISTRY_IMAGE}/backend:${CI_COMMIT_SHA}
--build-arg APP_VERSION=$APP_VERSION
--build-arg ROLLBAR_ACCESS_TOKEN=$POST_SERVER_ITEM_ROLLBAR_ACCESS_TOKEN
only:
- development
#==[ DEPLOY STAGE ]=============================================================
#--[ Frontend ]-----------------------------------------------------------------
.fe-deploy-job:
image: alpine:latest
stage: deploy
before_script:
- ./ci/install-butler-on-alpine.sh
script:
- >
butler push
$DIST_PATH
eurac/$GAME_NAME:html5
--userversion ${USER_VERSION}
prd-fe-deploy-job:
extends: .fe-deploy-job
needs:
- app-tagger-job
- job: prd-fe-build-job
artifacts: true
environment:
name: production/frontend
deployment_tier: production
url: https://eurac.itch.io/oetzit
variables:
GAME_NAME: oetzit
DIST_PATH: frontend/dist/prd
USER_VERSION: ${APP_VERSION}
only:
- tags
stg-fe-deploy-job:
extends: .fe-deploy-job
needs:
- app-tagger-job
- job: stg-fe-build-job
artifacts: true
environment:
name: staging/frontend
deployment_tier: staging
url: https://eurac.itch.io/oetzit-staging
variables:
GAME_NAME: oetzit-staging
DIST_PATH: frontend/dist/stg
USER_VERSION: ${APP_VERSION}
only:
- development
#--[ Backend ]------------------------------------------------------------------
prd-be-deploy-job:
stage: deploy
image:
name: bitnami/kubectl:latest
entrypoint: [""]
needs:
- app-tagger-job
- job: prd-be-build-job
artifacts: false
environment:
name: production/backend
deployment_tier: production
url: https://lt.eurac.edu/oetzit/backend/
script: >-
kubectl set image
deployment/webserver-deployment
webserver=re.eurac.edu/${CI_PROJECT_PATH}/backend:${APP_VERSION}
--namespace=prd-oetzit
--kubeconfig=${PRD_KUBECONFIG}
only:
- tags
stg-be-deploy-job:
stage: deploy
image:
name: bitnami/kubectl:latest
entrypoint: [""]
needs:
- app-tagger-job
- job: stg-be-build-job
artifacts: false
environment:
name: staging/backend
deployment_tier: staging
url: https://lt-dev.eurac.edu/oetzit/backend/
script: >-
kubectl set image
deployment/webserver-deployment
webserver=re.eurac.edu/${CI_PROJECT_PATH}/backend:${APP_VERSION}
--namespace=stg-oetzit
--kubeconfig=${STG_KUBECONFIG}
only:
- development