@catladder/pipeline 4.6.4 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3061 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`matches snapshot for cloud-run-verify local pipeline YAML 1`] = `
4
+ "image: path/to/docker/jobs-default:the-version
5
+ stages:
6
+ - setup
7
+ - setup dev
8
+ - setup review
9
+ - setup stage
10
+ - setup prod
11
+ - test
12
+ - test dev
13
+ - test review
14
+ - test stage
15
+ - test prod
16
+ - build
17
+ - build dev
18
+ - build review
19
+ - build stage
20
+ - build prod
21
+ - deploy
22
+ - deploy dev
23
+ - deploy review
24
+ - deploy stage
25
+ - deploy prod
26
+ - verify
27
+ - verify dev
28
+ - verify review
29
+ - verify stage
30
+ - verify prod
31
+ - agents
32
+ - agents dev
33
+ - agents review
34
+ - agents stage
35
+ - agents prod
36
+ - rollback
37
+ - rollback dev
38
+ - rollback review
39
+ - rollback stage
40
+ - rollback prod
41
+ - stop
42
+ - stop dev
43
+ - stop review
44
+ - stop stage
45
+ - stop prod
46
+ - release
47
+ variables:
48
+ FF_USE_FASTZIP: 'true'
49
+ ARTIFACT_COMPRESSION_LEVEL: fast
50
+ CACHE_COMPRESSION_LEVEL: fast
51
+ TRANSFER_METER_FREQUENCY: 5s
52
+ GIT_DEPTH: '1'
53
+ workflow:
54
+ name: $PIPELINE_ICON $PIPELINE_NAME
55
+ rules:
56
+ - if: $CI_PIPELINE_SOURCE == "trigger"
57
+ variables:
58
+ PIPELINE_ICON: 🤖
59
+ PIPELINE_NAME: Thinking...
60
+ - if: $CI_MERGE_REQUEST_ID
61
+ variables:
62
+ PIPELINE_ICON: 🐱🔨
63
+ PIPELINE_NAME: mr$CI_MERGE_REQUEST_IID - $CI_MERGE_REQUEST_TITLE
64
+ - if: $CI_COMMIT_TAG
65
+ variables:
66
+ PIPELINE_ICON: 🐱📦
67
+ PIPELINE_NAME: Release $CI_COMMIT_TAG
68
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
69
+ variables:
70
+ PIPELINE_ICON: 🐱🔨
71
+ PIPELINE_NAME: Main - $CI_COMMIT_TITLE
72
+ - when: always
73
+ variables:
74
+ PIPELINE_ICON: 🐱❓
75
+ PIPELINE_NAME: Default
76
+ before_script:
77
+ - |-
78
+ function escapeForDotEnv () {
79
+ input="\${1:-$(cat)}"
80
+ input="\${input//$'\\n'/\\\\n}"
81
+ if [[ "$input" == *\\\\n* ]]; then
82
+ if [[ "$input" == *\\"* && "$input" == *\\'* && "$input" == *\\\`* ]]; then
83
+ printf "\\"%s\\"\\n" "$input"
84
+ elif [[ "$input" == *\\"* && "$input" == *\\'* ]]; then
85
+ printf "\`%s\`\\n" "$input"
86
+ elif [[ "$input" == *\\"* ]]; then
87
+ printf "'%s'\\n" "$input"
88
+ else
89
+ printf "\\"%s\\"\\n" "$input"
90
+ fi
91
+ else
92
+ printf "%s\\n" "$input"
93
+ fi
94
+ }
95
+ - |-
96
+ function collapseable_section_start () {
97
+ local section_title="\${1}"
98
+ local section_description="\${2:-$section_title}"
99
+ echo -e "section_start:\`date +%s\`:\${section_title}[collapsed=true]\\r\\e[0K\${section_description}"
100
+ }
101
+ - |-
102
+ function collapseable_section_end () {
103
+ local section_title="\${1}"
104
+ echo -e "section_end:\`date +%s\`:\${section_title}\\r\\e[0K"
105
+ }
106
+ 'db 🛡 audit | dev ':
107
+ stage: test
108
+ image: path/to/docker/jobs-default:the-version
109
+ variables:
110
+ KUBERNETES_CPU_REQUEST: '0.45'
111
+ KUBERNETES_MEMORY_REQUEST: 1Gi
112
+ KUBERNETES_MEMORY_LIMIT: 4Gi
113
+ script:
114
+ - collapseable_section_start "injectvars" "Injecting variables"
115
+ - export APP_PATH="db"
116
+ - collapseable_section_end "injectvars"
117
+ - cd db
118
+ - yarn npm audit --environment production --severity critical
119
+ rules:
120
+ - when: never
121
+ if: $CI_PIPELINE_SOURCE == "trigger"
122
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
123
+ needs: []
124
+ retry: &a1
125
+ max: 2
126
+ interruptible: true
127
+ allow_failure: true
128
+ 'db 👮 lint | dev ':
129
+ stage: test
130
+ image: path/to/docker/jobs-default:the-version
131
+ variables:
132
+ KUBERNETES_CPU_REQUEST: '0.45'
133
+ KUBERNETES_MEMORY_REQUEST: 1Gi
134
+ KUBERNETES_MEMORY_LIMIT: 4Gi
135
+ script:
136
+ - collapseable_section_start "injectvars" "Injecting variables"
137
+ - export APP_PATH="db"
138
+ - collapseable_section_end "injectvars"
139
+ - collapseable_section_start "nodeinstall" "Ensure node version"
140
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
141
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
142
+ - collapseable_section_end "nodeinstall"
143
+ - cd db
144
+ - collapseable_section_start "nodeinstall" "Ensure node version"
145
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
146
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
147
+ - collapseable_section_end "nodeinstall"
148
+ - collapseable_section_start "yarninstall" "Yarn install"
149
+ - yarn install --immutable --inline-builds
150
+ - collapseable_section_end "yarninstall"
151
+ - yarn lint
152
+ cache:
153
+ - key: db-yarn
154
+ policy: pull-push
155
+ paths:
156
+ - db/.yarn
157
+ - key: db-node-modules
158
+ policy: pull-push
159
+ paths: &a2
160
+ - db/node_modules
161
+ - db/.yarn/install-state.gz
162
+ rules:
163
+ - when: never
164
+ if: $CI_PIPELINE_SOURCE == "trigger"
165
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
166
+ needs: []
167
+ retry: *a1
168
+ interruptible: true
169
+ 'db 🧪 test | dev ':
170
+ stage: test
171
+ image: path/to/docker/jobs-testing-chrome:the-version
172
+ variables:
173
+ KUBERNETES_CPU_REQUEST: '0.45'
174
+ KUBERNETES_MEMORY_REQUEST: 1Gi
175
+ KUBERNETES_MEMORY_LIMIT: 4Gi
176
+ script:
177
+ - collapseable_section_start "injectvars" "Injecting variables"
178
+ - export APP_PATH="db"
179
+ - collapseable_section_end "injectvars"
180
+ - collapseable_section_start "nodeinstall" "Ensure node version"
181
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
182
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
183
+ - collapseable_section_end "nodeinstall"
184
+ - cd db
185
+ - collapseable_section_start "nodeinstall" "Ensure node version"
186
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
187
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
188
+ - collapseable_section_end "nodeinstall"
189
+ - collapseable_section_start "yarninstall" "Yarn install"
190
+ - yarn install --immutable --inline-builds
191
+ - collapseable_section_end "yarninstall"
192
+ - yarn test
193
+ cache:
194
+ - key: db-yarn
195
+ policy: pull-push
196
+ paths:
197
+ - db/.yarn
198
+ - key: db-node-modules
199
+ policy: pull-push
200
+ paths: *a2
201
+ rules:
202
+ - when: never
203
+ if: $CI_PIPELINE_SOURCE == "trigger"
204
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
205
+ needs: []
206
+ retry: *a1
207
+ interruptible: true
208
+ 'db 🔨 app | dev ':
209
+ stage: build
210
+ image: path/to/docker/jobs-default:the-version
211
+ variables:
212
+ KUBERNETES_CPU_REQUEST: '0.45'
213
+ KUBERNETES_MEMORY_REQUEST: 1Gi
214
+ KUBERNETES_MEMORY_LIMIT: 4Gi
215
+ script:
216
+ - collapseable_section_start "injectvars" "Injecting variables"
217
+ - export ENV_SHORT="dev"
218
+ - export APP_DIR="db"
219
+ - export ENV_TYPE="dev"
220
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
221
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
222
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
223
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
224
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
225
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
226
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
227
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-dev-db"
228
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
229
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
230
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_db_GCLOUD_DEPLOY_credentialsKey"
231
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix"
232
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
233
+ - collapseable_section_end "injectvars"
234
+ - collapseable_section_start "write-dotenv-db" "write dot env for db"
235
+ - |-
236
+ cat <<EOF > db/.env
237
+ ENV_SHORT=dev
238
+ APP_DIR=db
239
+ ENV_TYPE=dev
240
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
241
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
242
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
243
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
244
+ DEPLOY_CLOUD_RUN_SERVICE_NAME=pan-test-app-dev-db
245
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
246
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
247
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_db_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
248
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
249
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
250
+ EOF
251
+ - collapseable_section_end "write-dotenv-db"
252
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > db/__build_info.json
253
+ - collapseable_section_start "nodeinstall" "Ensure node version"
254
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
255
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
256
+ - collapseable_section_end "nodeinstall"
257
+ - cd db
258
+ - collapseable_section_start "nodeinstall" "Ensure node version"
259
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
260
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
261
+ - collapseable_section_end "nodeinstall"
262
+ - collapseable_section_start "yarninstall" "Yarn install"
263
+ - yarn install --immutable --inline-builds
264
+ - collapseable_section_end "yarninstall"
265
+ - yarn build
266
+ cache:
267
+ - key: db-yarn
268
+ policy: pull-push
269
+ paths:
270
+ - db/.yarn
271
+ - key: db-node-modules
272
+ policy: pull-push
273
+ paths:
274
+ - db/node_modules
275
+ - db/.yarn/install-state.gz
276
+ artifacts:
277
+ paths:
278
+ - db/__build_info.json
279
+ - db/.next
280
+ - db/dist
281
+ exclude:
282
+ - db/.env
283
+ - db/.next/cache/**/*
284
+ expire_in: 1 day
285
+ when: always
286
+ reports: {}
287
+ rules:
288
+ - when: never
289
+ if: $CI_PIPELINE_SOURCE == "trigger"
290
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
291
+ needs: []
292
+ retry: *a1
293
+ interruptible: true
294
+ 'db 🔨 docker | dev ':
295
+ stage: build
296
+ image: path/to/docker/docker-build:the-version
297
+ services:
298
+ - name: docker:29.5.1-dind
299
+ command:
300
+ - --tls=false
301
+ - --registry-mirror=https://mirror.gcr.io
302
+ variables:
303
+ DOCKER_HOST: tcp://docker:2375
304
+ DOCKER_TLS_CERTDIR: ''
305
+ DOCKER_DRIVER: overlay2
306
+ DOCKER_BUILDKIT: '1'
307
+ KUBERNETES_CPU_REQUEST: '0.45'
308
+ KUBERNETES_MEMORY_REQUEST: 1Gi
309
+ KUBERNETES_MEMORY_LIMIT: 2Gi
310
+ script:
311
+ - collapseable_section_start "injectvars" "Injecting variables"
312
+ - export APP_DIR="db"
313
+ - export DOCKER_BUILD_CONTEXT="."
314
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
315
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/db"
316
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db"
317
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
318
+ - |-
319
+ export DOCKER_COPY_AND_INSTALL_APP="ENV YARN_ENABLE_INLINE_BUILDS=1
320
+ COPY --chown=node:node $APP_DIR .
321
+ RUN yarn plugin import workspace-tools
322
+ RUN yarn workspaces focus --production
323
+ RUN yarn rebuild"
324
+ - |-
325
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node db/package.json /app/db/package.json
326
+ COPY --chown=node:node db/yarn.lock /app/db/yarn.lock
327
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
328
+ COPY --chown=node:node .yarn /app/.yarn"
329
+ - collapseable_section_end "injectvars"
330
+ - ensureNodeDockerfile
331
+ - collapseable_section_start "docker-login" "Docker Login"
332
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_db_GCLOUD_DEPLOY_credentialsKey")
333
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
334
+ - collapseable_section_end "docker-login"
335
+ - collapseable_section_start "docker-build" "Docker build"
336
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
337
+ - collapseable_section_end "docker-build"
338
+ - collapseable_section_start "docker-push" "Docker push and tag"
339
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
340
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
341
+ - docker push $DOCKER_CACHE_IMAGE
342
+ - collapseable_section_end "docker-push"
343
+ cache:
344
+ - key: db-yarn
345
+ policy: pull
346
+ paths:
347
+ - db/.yarn
348
+ rules:
349
+ - when: never
350
+ if: $CI_PIPELINE_SOURCE == "trigger"
351
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
352
+ needs:
353
+ - 'db 🔨 app | dev '
354
+ retry: *a1
355
+ interruptible: true
356
+ 'db 🚀 Deploy | dev ':
357
+ stage: deploy dev
358
+ image: path/to/docker/gcloud:the-version
359
+ variables:
360
+ KUBERNETES_CPU_REQUEST: '0.22'
361
+ KUBERNETES_MEMORY_REQUEST: 200Mi
362
+ KUBERNETES_MEMORY_LIMIT: 400Mi
363
+ script:
364
+ - collapseable_section_start "injectvars" "Injecting variables"
365
+ - export ENV_SHORT="dev"
366
+ - export APP_DIR="db"
367
+ - export ENV_TYPE="dev"
368
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
369
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
370
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
371
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
372
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
373
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
374
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
375
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-dev-db"
376
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
377
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
378
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_db_GCLOUD_DEPLOY_credentialsKey"
379
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix"
380
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
381
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
382
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/db"
383
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db"
384
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
385
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
386
+ - collapseable_section_end "injectvars"
387
+ - collapseable_section_start "prepare" "Prepare..."
388
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_db_GCLOUD_DEPLOY_credentialsKey")
389
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
390
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
391
+ - collapseable_section_end "prepare"
392
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
393
+ - |
394
+ cat > ____envvars.yaml <<EOF
395
+ ENV_SHORT: |-
396
+ dev
397
+ APP_DIR: |-
398
+ db
399
+ ENV_TYPE: |-
400
+ dev
401
+ BUILD_INFO_BUILD_ID: |-
402
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
403
+ BUILD_INFO_BUILD_TIME: |-
404
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
405
+ BUILD_INFO_CURRENT_VERSION: |-
406
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
407
+ HOSTNAME: |-
408
+ $(printf %s "$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
409
+ ROOT_URL: |-
410
+ $(printf %s "https://$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
411
+ HOSTNAME_INTERNAL: |-
412
+ $(printf %s "$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
413
+ ROOT_URL_INTERNAL: |-
414
+ $(printf %s "https://$(printf %s "pan-test-app-dev-db-$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
415
+ DEPLOY_CLOUD_RUN_SERVICE_NAME: |-
416
+ pan-test-app-dev-db
417
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
418
+ asdf
419
+ DEPLOY_CLOUD_RUN_REGION: |-
420
+ asia-east1
421
+ GCLOUD_RUN_canonicalHostSuffix: |-
422
+ $(printf %s "$CL_dev_db_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
423
+ _ALL_ENV_VAR_KEYS: |-
424
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
425
+
426
+ EOF
427
+ - collapseable_section_end "writeenvvars"
428
+ - collapseable_section_start "deploy" "Deploy to cloud run"
429
+ - gcloud run deploy pan-test-app-dev-db --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/db:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=db,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-db --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
430
+ - collapseable_section_end "deploy"
431
+ - collapseable_section_start "cleanup" "Cleanup"
432
+ - set +e
433
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-db --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
434
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/db@$version --quiet --delete-tags; done
435
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db@$version --quiet --delete-tags; done
436
+ - set -e
437
+ - collapseable_section_end "cleanup"
438
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
439
+ environment:
440
+ name: dev/db
441
+ url: $CL_GITLAB_ENVIRONMENT_URL
442
+ on_stop: 'db 🛑 Stop ⚠️ | dev '
443
+ auto_stop_in: 4 weeks
444
+ artifacts:
445
+ reports:
446
+ dotenv: gitlab_environment.env
447
+ rules:
448
+ - when: never
449
+ if: $CI_PIPELINE_SOURCE == "trigger"
450
+ - when: on_success
451
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
452
+ needs:
453
+ - job: 'db 👮 lint | dev '
454
+ artifacts: false
455
+ - job: 'db 🔨 app | dev '
456
+ artifacts: false
457
+ - job: 'db 🔨 docker | dev '
458
+ artifacts: false
459
+ - job: 'db 🧪 test | dev '
460
+ artifacts: false
461
+ - job: 'db 🛡 audit | dev '
462
+ artifacts: false
463
+ retry: *a1
464
+ interruptible: true
465
+ allow_failure: false
466
+ 'db 🛑 Stop ⚠️ | dev ':
467
+ stage: stop dev
468
+ image: path/to/docker/gcloud:the-version
469
+ variables:
470
+ KUBERNETES_CPU_REQUEST: '0.22'
471
+ KUBERNETES_MEMORY_REQUEST: 200Mi
472
+ KUBERNETES_MEMORY_LIMIT: 400Mi
473
+ GIT_STRATEGY: none
474
+ script:
475
+ - collapseable_section_start "injectvars" "Injecting variables"
476
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
477
+ - collapseable_section_end "injectvars"
478
+ - set +e
479
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_db_GCLOUD_DEPLOY_credentialsKey")
480
+ - gcloud run services delete pan-test-app-dev-db --project=asdf --region=asia-east1
481
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/db --quiet --delete-tags
482
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db@$version --quiet --delete-tags; done
483
+ - set -e
484
+ environment:
485
+ name: dev/db
486
+ action: stop
487
+ rules:
488
+ - when: never
489
+ if: $CI_PIPELINE_SOURCE == "trigger"
490
+ - when: manual
491
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
492
+ needs: []
493
+ retry: *a1
494
+ interruptible: true
495
+ allow_failure: true
496
+ 'db 🛡 audit | review ':
497
+ stage: test
498
+ image: path/to/docker/jobs-default:the-version
499
+ variables:
500
+ KUBERNETES_CPU_REQUEST: '0.45'
501
+ KUBERNETES_MEMORY_REQUEST: 1Gi
502
+ KUBERNETES_MEMORY_LIMIT: 4Gi
503
+ script:
504
+ - collapseable_section_start "injectvars" "Injecting variables"
505
+ - export APP_PATH="db"
506
+ - collapseable_section_end "injectvars"
507
+ - cd db
508
+ - yarn npm audit --environment production --severity critical
509
+ rules:
510
+ - when: never
511
+ if: $CI_PIPELINE_SOURCE == "trigger"
512
+ - if: $CI_MERGE_REQUEST_ID
513
+ needs: []
514
+ retry: *a1
515
+ interruptible: true
516
+ allow_failure: true
517
+ 'db 👮 lint | review ':
518
+ stage: test
519
+ image: path/to/docker/jobs-default:the-version
520
+ variables:
521
+ KUBERNETES_CPU_REQUEST: '0.45'
522
+ KUBERNETES_MEMORY_REQUEST: 1Gi
523
+ KUBERNETES_MEMORY_LIMIT: 4Gi
524
+ script:
525
+ - collapseable_section_start "injectvars" "Injecting variables"
526
+ - export APP_PATH="db"
527
+ - collapseable_section_end "injectvars"
528
+ - collapseable_section_start "nodeinstall" "Ensure node version"
529
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
530
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
531
+ - collapseable_section_end "nodeinstall"
532
+ - cd db
533
+ - collapseable_section_start "nodeinstall" "Ensure node version"
534
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
535
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
536
+ - collapseable_section_end "nodeinstall"
537
+ - collapseable_section_start "yarninstall" "Yarn install"
538
+ - yarn install --immutable --inline-builds
539
+ - collapseable_section_end "yarninstall"
540
+ - yarn lint
541
+ cache:
542
+ - key: db-yarn-mr$CI_MERGE_REQUEST_IID
543
+ policy: pull-push
544
+ paths:
545
+ - db/.yarn
546
+ fallback_keys:
547
+ - db-yarn
548
+ - key: db-node-modules-mr$CI_MERGE_REQUEST_IID
549
+ policy: pull-push
550
+ paths: &a3
551
+ - db/node_modules
552
+ - db/.yarn/install-state.gz
553
+ fallback_keys:
554
+ - db-node-modules
555
+ rules:
556
+ - when: never
557
+ if: $CI_PIPELINE_SOURCE == "trigger"
558
+ - if: $CI_MERGE_REQUEST_ID
559
+ needs: []
560
+ retry: *a1
561
+ interruptible: true
562
+ 'db 🧪 test | review ':
563
+ stage: test
564
+ image: path/to/docker/jobs-testing-chrome:the-version
565
+ variables:
566
+ KUBERNETES_CPU_REQUEST: '0.45'
567
+ KUBERNETES_MEMORY_REQUEST: 1Gi
568
+ KUBERNETES_MEMORY_LIMIT: 4Gi
569
+ script:
570
+ - collapseable_section_start "injectvars" "Injecting variables"
571
+ - export APP_PATH="db"
572
+ - collapseable_section_end "injectvars"
573
+ - collapseable_section_start "nodeinstall" "Ensure node version"
574
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
575
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
576
+ - collapseable_section_end "nodeinstall"
577
+ - cd db
578
+ - collapseable_section_start "nodeinstall" "Ensure node version"
579
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
580
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
581
+ - collapseable_section_end "nodeinstall"
582
+ - collapseable_section_start "yarninstall" "Yarn install"
583
+ - yarn install --immutable --inline-builds
584
+ - collapseable_section_end "yarninstall"
585
+ - yarn test
586
+ cache:
587
+ - key: db-yarn-mr$CI_MERGE_REQUEST_IID
588
+ policy: pull-push
589
+ paths:
590
+ - db/.yarn
591
+ fallback_keys:
592
+ - db-yarn
593
+ - key: db-node-modules-mr$CI_MERGE_REQUEST_IID
594
+ policy: pull-push
595
+ paths: *a3
596
+ fallback_keys:
597
+ - db-node-modules
598
+ rules:
599
+ - when: never
600
+ if: $CI_PIPELINE_SOURCE == "trigger"
601
+ - if: $CI_MERGE_REQUEST_ID
602
+ needs: []
603
+ retry: *a1
604
+ interruptible: true
605
+ 'db 🔨 app | review ':
606
+ stage: build
607
+ image: path/to/docker/jobs-default:the-version
608
+ variables:
609
+ KUBERNETES_CPU_REQUEST: '0.45'
610
+ KUBERNETES_MEMORY_REQUEST: 1Gi
611
+ KUBERNETES_MEMORY_LIMIT: 4Gi
612
+ script:
613
+ - collapseable_section_start "injectvars" "Injecting variables"
614
+ - export ENV_SHORT="review"
615
+ - export APP_DIR="db"
616
+ - export ENV_TYPE="review"
617
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
618
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
619
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
620
+ - export HOSTNAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
621
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
622
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
623
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
624
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db" | awk '{print tolower($0)}')"
625
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
626
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
627
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_db_GCLOUD_DEPLOY_credentialsKey"
628
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_db_GCLOUD_RUN_canonicalHostSuffix"
629
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
630
+ - collapseable_section_end "injectvars"
631
+ - collapseable_section_start "write-dotenv-db" "write dot env for db"
632
+ - |-
633
+ cat <<EOF > db/.env
634
+ ENV_SHORT=review
635
+ APP_DIR=db
636
+ ENV_TYPE=review
637
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
638
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
639
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
640
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
641
+ DEPLOY_CLOUD_RUN_SERVICE_NAME=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db" | awk '{print tolower($0)}')" | escapeForDotEnv)
642
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
643
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
644
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_db_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
645
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
646
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
647
+ EOF
648
+ - collapseable_section_end "write-dotenv-db"
649
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > db/__build_info.json
650
+ - collapseable_section_start "nodeinstall" "Ensure node version"
651
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
652
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
653
+ - collapseable_section_end "nodeinstall"
654
+ - cd db
655
+ - collapseable_section_start "nodeinstall" "Ensure node version"
656
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
657
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
658
+ - collapseable_section_end "nodeinstall"
659
+ - collapseable_section_start "yarninstall" "Yarn install"
660
+ - yarn install --immutable --inline-builds
661
+ - collapseable_section_end "yarninstall"
662
+ - yarn build
663
+ cache:
664
+ - key: db-yarn-mr$CI_MERGE_REQUEST_IID
665
+ policy: pull-push
666
+ paths:
667
+ - db/.yarn
668
+ fallback_keys:
669
+ - db-yarn
670
+ - key: db-node-modules-mr$CI_MERGE_REQUEST_IID
671
+ policy: pull-push
672
+ paths:
673
+ - db/node_modules
674
+ - db/.yarn/install-state.gz
675
+ fallback_keys:
676
+ - db-node-modules
677
+ artifacts:
678
+ paths:
679
+ - db/__build_info.json
680
+ - db/.next
681
+ - db/dist
682
+ exclude:
683
+ - db/.env
684
+ - db/.next/cache/**/*
685
+ expire_in: 1 day
686
+ when: always
687
+ reports: {}
688
+ rules:
689
+ - when: never
690
+ if: $CI_PIPELINE_SOURCE == "trigger"
691
+ - if: $CI_MERGE_REQUEST_ID
692
+ needs: []
693
+ retry: *a1
694
+ interruptible: true
695
+ 'db 🔨 docker | review ':
696
+ stage: build
697
+ image: path/to/docker/docker-build:the-version
698
+ services:
699
+ - name: docker:29.5.1-dind
700
+ command:
701
+ - --tls=false
702
+ - --registry-mirror=https://mirror.gcr.io
703
+ variables:
704
+ DOCKER_HOST: tcp://docker:2375
705
+ DOCKER_TLS_CERTDIR: ''
706
+ DOCKER_DRIVER: overlay2
707
+ DOCKER_BUILDKIT: '1'
708
+ KUBERNETES_CPU_REQUEST: '0.45'
709
+ KUBERNETES_MEMORY_REQUEST: 1Gi
710
+ KUBERNETES_MEMORY_LIMIT: 2Gi
711
+ script:
712
+ - collapseable_section_start "injectvars" "Injecting variables"
713
+ - export APP_DIR="db"
714
+ - export DOCKER_BUILD_CONTEXT="."
715
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
716
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/db/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
717
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db"
718
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
719
+ - |-
720
+ export DOCKER_COPY_AND_INSTALL_APP="ENV YARN_ENABLE_INLINE_BUILDS=1
721
+ COPY --chown=node:node $APP_DIR .
722
+ RUN yarn plugin import workspace-tools
723
+ RUN yarn workspaces focus --production
724
+ RUN yarn rebuild"
725
+ - |-
726
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node db/package.json /app/db/package.json
727
+ COPY --chown=node:node db/yarn.lock /app/db/yarn.lock
728
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
729
+ COPY --chown=node:node .yarn /app/.yarn"
730
+ - collapseable_section_end "injectvars"
731
+ - ensureNodeDockerfile
732
+ - collapseable_section_start "docker-login" "Docker Login"
733
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_db_GCLOUD_DEPLOY_credentialsKey")
734
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
735
+ - collapseable_section_end "docker-login"
736
+ - collapseable_section_start "docker-build" "Docker build"
737
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
738
+ - collapseable_section_end "docker-build"
739
+ - collapseable_section_start "docker-push" "Docker push and tag"
740
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
741
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
742
+ - docker push $DOCKER_CACHE_IMAGE
743
+ - collapseable_section_end "docker-push"
744
+ cache:
745
+ - key: db-yarn-mr$CI_MERGE_REQUEST_IID
746
+ policy: pull
747
+ paths:
748
+ - db/.yarn
749
+ fallback_keys:
750
+ - db-yarn
751
+ rules:
752
+ - when: never
753
+ if: $CI_PIPELINE_SOURCE == "trigger"
754
+ - if: $CI_MERGE_REQUEST_ID
755
+ needs:
756
+ - 'db 🔨 app | review '
757
+ retry: *a1
758
+ interruptible: true
759
+ 'db 🚀 Deploy | review ':
760
+ stage: deploy review
761
+ image: path/to/docker/gcloud:the-version
762
+ variables:
763
+ KUBERNETES_CPU_REQUEST: '0.22'
764
+ KUBERNETES_MEMORY_REQUEST: 200Mi
765
+ KUBERNETES_MEMORY_LIMIT: 400Mi
766
+ script:
767
+ - collapseable_section_start "injectvars" "Injecting variables"
768
+ - export ENV_SHORT="review"
769
+ - export APP_DIR="db"
770
+ - export ENV_TYPE="review"
771
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
772
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
773
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
774
+ - export HOSTNAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
775
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
776
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
777
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
778
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db" | awk '{print tolower($0)}')"
779
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
780
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
781
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_db_GCLOUD_DEPLOY_credentialsKey"
782
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_db_GCLOUD_RUN_canonicalHostSuffix"
783
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
784
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
785
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/db/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
786
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db"
787
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
788
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
789
+ - collapseable_section_end "injectvars"
790
+ - collapseable_section_start "prepare" "Prepare..."
791
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_db_GCLOUD_DEPLOY_credentialsKey")
792
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
793
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
794
+ - collapseable_section_end "prepare"
795
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
796
+ - |
797
+ cat > ____envvars.yaml <<EOF
798
+ ENV_SHORT: |-
799
+ review
800
+ APP_DIR: |-
801
+ db
802
+ ENV_TYPE: |-
803
+ review
804
+ BUILD_INFO_BUILD_ID: |-
805
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
806
+ BUILD_INFO_BUILD_TIME: |-
807
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
808
+ BUILD_INFO_CURRENT_VERSION: |-
809
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
810
+ HOSTNAME: |-
811
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
812
+ ROOT_URL: |-
813
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
814
+ HOSTNAME_INTERNAL: |-
815
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
816
+ ROOT_URL_INTERNAL: |-
817
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db-$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
818
+ DEPLOY_CLOUD_RUN_SERVICE_NAME: |-
819
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
820
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
821
+ asdf
822
+ DEPLOY_CLOUD_RUN_REGION: |-
823
+ asia-east1
824
+ GCLOUD_RUN_canonicalHostSuffix: |-
825
+ $(printf %s "$CL_review_db_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
826
+ _ALL_ENV_VAR_KEYS: |-
827
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
828
+
829
+ EOF
830
+ - collapseable_section_end "writeenvvars"
831
+ - collapseable_section_start "deploy" "Deploy to cloud run"
832
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db" | awk '{print tolower($0)}') --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/db/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=db,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
833
+ - collapseable_section_end "deploy"
834
+ - collapseable_section_start "cleanup" "Cleanup"
835
+ - set +e
836
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
837
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/db/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/db/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
838
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db@$version --quiet --delete-tags; done
839
+ - set +e
840
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/db --quiet --delete-tags
841
+ - set -e
842
+ - set -e
843
+ - collapseable_section_end "cleanup"
844
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
845
+ environment:
846
+ name: review/$CI_COMMIT_REF_NAME/db
847
+ url: $CL_GITLAB_ENVIRONMENT_URL
848
+ on_stop: 'db 🛑 Stop ⚠️ | review '
849
+ auto_stop_in: 1 week
850
+ artifacts:
851
+ reports:
852
+ dotenv: gitlab_environment.env
853
+ rules:
854
+ - when: never
855
+ if: $CI_PIPELINE_SOURCE == "trigger"
856
+ - when: on_success
857
+ if: $CI_MERGE_REQUEST_ID
858
+ needs:
859
+ - job: 'db 👮 lint | review '
860
+ artifacts: false
861
+ - job: 'db 🔨 app | review '
862
+ artifacts: false
863
+ - job: 'db 🔨 docker | review '
864
+ artifacts: false
865
+ - job: 'db 🧪 test | review '
866
+ artifacts: false
867
+ - job: 'db 🛡 audit | review '
868
+ artifacts: false
869
+ retry: *a1
870
+ interruptible: true
871
+ allow_failure: false
872
+ 'db 🛑 Stop ⚠️ | review ':
873
+ stage: stop review
874
+ image: path/to/docker/gcloud:the-version
875
+ variables:
876
+ KUBERNETES_CPU_REQUEST: '0.22'
877
+ KUBERNETES_MEMORY_REQUEST: 200Mi
878
+ KUBERNETES_MEMORY_LIMIT: 400Mi
879
+ GIT_STRATEGY: none
880
+ script:
881
+ - collapseable_section_start "injectvars" "Injecting variables"
882
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
883
+ - collapseable_section_end "injectvars"
884
+ - set +e
885
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_db_GCLOUD_DEPLOY_credentialsKey")
886
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-db" | awk '{print tolower($0)}') --project=asdf --region=asia-east1
887
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/db/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags
888
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db@$version --quiet --delete-tags; done
889
+ - set +e
890
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/db --quiet --delete-tags
891
+ - set -e
892
+ - set -e
893
+ environment:
894
+ name: review/$CI_COMMIT_REF_NAME/db
895
+ action: stop
896
+ rules:
897
+ - when: never
898
+ if: $CI_PIPELINE_SOURCE == "trigger"
899
+ - when: manual
900
+ if: $CI_MERGE_REQUEST_ID
901
+ needs: []
902
+ retry: *a1
903
+ interruptible: true
904
+ allow_failure: true
905
+ 'db 🔨 app | stage ':
906
+ stage: build
907
+ image: path/to/docker/jobs-default:the-version
908
+ variables:
909
+ KUBERNETES_CPU_REQUEST: '0.45'
910
+ KUBERNETES_MEMORY_REQUEST: 1Gi
911
+ KUBERNETES_MEMORY_LIMIT: 4Gi
912
+ script:
913
+ - collapseable_section_start "injectvars" "Injecting variables"
914
+ - export ENV_SHORT="stage"
915
+ - export APP_DIR="db"
916
+ - export ENV_TYPE="stage"
917
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
918
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
919
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
920
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
921
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
922
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
923
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
924
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-stage-db"
925
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
926
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
927
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_db_GCLOUD_DEPLOY_credentialsKey"
928
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix"
929
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
930
+ - collapseable_section_end "injectvars"
931
+ - collapseable_section_start "write-dotenv-db" "write dot env for db"
932
+ - |-
933
+ cat <<EOF > db/.env
934
+ ENV_SHORT=stage
935
+ APP_DIR=db
936
+ ENV_TYPE=stage
937
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
938
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
939
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
940
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
941
+ DEPLOY_CLOUD_RUN_SERVICE_NAME=pan-test-app-stage-db
942
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
943
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
944
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_db_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
945
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
946
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
947
+ EOF
948
+ - collapseable_section_end "write-dotenv-db"
949
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > db/__build_info.json
950
+ - collapseable_section_start "nodeinstall" "Ensure node version"
951
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
952
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
953
+ - collapseable_section_end "nodeinstall"
954
+ - cd db
955
+ - collapseable_section_start "nodeinstall" "Ensure node version"
956
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
957
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
958
+ - collapseable_section_end "nodeinstall"
959
+ - collapseable_section_start "yarninstall" "Yarn install"
960
+ - yarn install --immutable --inline-builds
961
+ - collapseable_section_end "yarninstall"
962
+ - yarn build
963
+ cache:
964
+ - key: db-yarn
965
+ policy: pull-push
966
+ paths:
967
+ - db/.yarn
968
+ - key: db-node-modules
969
+ policy: pull-push
970
+ paths:
971
+ - db/node_modules
972
+ - db/.yarn/install-state.gz
973
+ artifacts:
974
+ paths:
975
+ - db/__build_info.json
976
+ - db/.next
977
+ - db/dist
978
+ exclude:
979
+ - db/.env
980
+ - db/.next/cache/**/*
981
+ expire_in: 1 day
982
+ when: always
983
+ reports: {}
984
+ rules:
985
+ - when: never
986
+ if: $CI_PIPELINE_SOURCE == "trigger"
987
+ - if: $CI_COMMIT_TAG
988
+ needs: []
989
+ retry: *a1
990
+ interruptible: true
991
+ 'db 🔨 docker | stage ':
992
+ stage: build
993
+ image: path/to/docker/docker-build:the-version
994
+ services:
995
+ - name: docker:29.5.1-dind
996
+ command:
997
+ - --tls=false
998
+ - --registry-mirror=https://mirror.gcr.io
999
+ variables:
1000
+ DOCKER_HOST: tcp://docker:2375
1001
+ DOCKER_TLS_CERTDIR: ''
1002
+ DOCKER_DRIVER: overlay2
1003
+ DOCKER_BUILDKIT: '1'
1004
+ KUBERNETES_CPU_REQUEST: '0.45'
1005
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1006
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1007
+ script:
1008
+ - collapseable_section_start "injectvars" "Injecting variables"
1009
+ - export APP_DIR="db"
1010
+ - export DOCKER_BUILD_CONTEXT="."
1011
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1012
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/db"
1013
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db"
1014
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1015
+ - |-
1016
+ export DOCKER_COPY_AND_INSTALL_APP="ENV YARN_ENABLE_INLINE_BUILDS=1
1017
+ COPY --chown=node:node $APP_DIR .
1018
+ RUN yarn plugin import workspace-tools
1019
+ RUN yarn workspaces focus --production
1020
+ RUN yarn rebuild"
1021
+ - |-
1022
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node db/package.json /app/db/package.json
1023
+ COPY --chown=node:node db/yarn.lock /app/db/yarn.lock
1024
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1025
+ COPY --chown=node:node .yarn /app/.yarn"
1026
+ - collapseable_section_end "injectvars"
1027
+ - ensureNodeDockerfile
1028
+ - collapseable_section_start "docker-login" "Docker Login"
1029
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_db_GCLOUD_DEPLOY_credentialsKey")
1030
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1031
+ - collapseable_section_end "docker-login"
1032
+ - collapseable_section_start "docker-build" "Docker build"
1033
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1034
+ - collapseable_section_end "docker-build"
1035
+ - collapseable_section_start "docker-push" "Docker push and tag"
1036
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1037
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1038
+ - docker push $DOCKER_CACHE_IMAGE
1039
+ - collapseable_section_end "docker-push"
1040
+ cache:
1041
+ - key: db-yarn
1042
+ policy: pull
1043
+ paths:
1044
+ - db/.yarn
1045
+ rules:
1046
+ - when: never
1047
+ if: $CI_PIPELINE_SOURCE == "trigger"
1048
+ - if: $CI_COMMIT_TAG
1049
+ needs:
1050
+ - 'db 🔨 app | stage '
1051
+ retry: *a1
1052
+ interruptible: true
1053
+ 'db 🚀 Deploy | stage ':
1054
+ stage: deploy stage
1055
+ image: path/to/docker/gcloud:the-version
1056
+ variables:
1057
+ KUBERNETES_CPU_REQUEST: '0.22'
1058
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1059
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1060
+ script:
1061
+ - collapseable_section_start "injectvars" "Injecting variables"
1062
+ - export ENV_SHORT="stage"
1063
+ - export APP_DIR="db"
1064
+ - export ENV_TYPE="stage"
1065
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1066
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1067
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1068
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1069
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1070
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1071
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1072
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-stage-db"
1073
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1074
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1075
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_db_GCLOUD_DEPLOY_credentialsKey"
1076
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix"
1077
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1078
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1079
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/db"
1080
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db"
1081
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1082
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1083
+ - collapseable_section_end "injectvars"
1084
+ - collapseable_section_start "prepare" "Prepare..."
1085
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_db_GCLOUD_DEPLOY_credentialsKey")
1086
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1087
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1088
+ - collapseable_section_end "prepare"
1089
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1090
+ - |
1091
+ cat > ____envvars.yaml <<EOF
1092
+ ENV_SHORT: |-
1093
+ stage
1094
+ APP_DIR: |-
1095
+ db
1096
+ ENV_TYPE: |-
1097
+ stage
1098
+ BUILD_INFO_BUILD_ID: |-
1099
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1100
+ BUILD_INFO_BUILD_TIME: |-
1101
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1102
+ BUILD_INFO_CURRENT_VERSION: |-
1103
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
1104
+ HOSTNAME: |-
1105
+ $(printf %s "$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1106
+ ROOT_URL: |-
1107
+ $(printf %s "https://$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1108
+ HOSTNAME_INTERNAL: |-
1109
+ $(printf %s "$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1110
+ ROOT_URL_INTERNAL: |-
1111
+ $(printf %s "https://$(printf %s "pan-test-app-stage-db-$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1112
+ DEPLOY_CLOUD_RUN_SERVICE_NAME: |-
1113
+ pan-test-app-stage-db
1114
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1115
+ asdf
1116
+ DEPLOY_CLOUD_RUN_REGION: |-
1117
+ asia-east1
1118
+ GCLOUD_RUN_canonicalHostSuffix: |-
1119
+ $(printf %s "$CL_stage_db_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1120
+ _ALL_ENV_VAR_KEYS: |-
1121
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1122
+
1123
+ EOF
1124
+ - collapseable_section_end "writeenvvars"
1125
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1126
+ - gcloud run deploy pan-test-app-stage-db --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/db:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=db,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-db --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1127
+ - collapseable_section_end "deploy"
1128
+ - collapseable_section_start "cleanup" "Cleanup"
1129
+ - set +e
1130
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-db --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
1131
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/db@$version --quiet --delete-tags; done
1132
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db@$version --quiet --delete-tags; done
1133
+ - set -e
1134
+ - collapseable_section_end "cleanup"
1135
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1136
+ environment:
1137
+ name: stage/db
1138
+ url: $CL_GITLAB_ENVIRONMENT_URL
1139
+ on_stop: 'db 🛑 Stop ⚠️ | stage '
1140
+ artifacts:
1141
+ reports:
1142
+ dotenv: gitlab_environment.env
1143
+ rules:
1144
+ - when: never
1145
+ if: $CI_PIPELINE_SOURCE == "trigger"
1146
+ - when: on_success
1147
+ if: $CI_COMMIT_TAG
1148
+ needs:
1149
+ - job: 'db 🔨 app | stage '
1150
+ artifacts: false
1151
+ - job: 'db 🔨 docker | stage '
1152
+ artifacts: false
1153
+ retry: *a1
1154
+ interruptible: true
1155
+ allow_failure: false
1156
+ 'db 🛑 Stop ⚠️ | stage ':
1157
+ stage: stop stage
1158
+ image: path/to/docker/gcloud:the-version
1159
+ variables:
1160
+ KUBERNETES_CPU_REQUEST: '0.22'
1161
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1162
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1163
+ GIT_STRATEGY: none
1164
+ script:
1165
+ - collapseable_section_start "injectvars" "Injecting variables"
1166
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1167
+ - collapseable_section_end "injectvars"
1168
+ - set +e
1169
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_db_GCLOUD_DEPLOY_credentialsKey")
1170
+ - gcloud run services delete pan-test-app-stage-db --project=asdf --region=asia-east1
1171
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/db --quiet --delete-tags
1172
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db@$version --quiet --delete-tags; done
1173
+ - set -e
1174
+ environment:
1175
+ name: stage/db
1176
+ action: stop
1177
+ rules:
1178
+ - when: never
1179
+ if: $CI_PIPELINE_SOURCE == "trigger"
1180
+ - when: manual
1181
+ if: $CI_COMMIT_TAG
1182
+ needs: []
1183
+ retry: *a1
1184
+ interruptible: true
1185
+ allow_failure: true
1186
+ 'db 🔨 app | prod ':
1187
+ stage: build
1188
+ image: path/to/docker/jobs-default:the-version
1189
+ variables:
1190
+ KUBERNETES_CPU_REQUEST: '0.45'
1191
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1192
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1193
+ script:
1194
+ - collapseable_section_start "injectvars" "Injecting variables"
1195
+ - export ENV_SHORT="prod"
1196
+ - export APP_DIR="db"
1197
+ - export ENV_TYPE="prod"
1198
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1199
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1200
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1201
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1202
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1203
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1204
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1205
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-prod-db"
1206
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1207
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1208
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_db_GCLOUD_DEPLOY_credentialsKey"
1209
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix"
1210
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1211
+ - collapseable_section_end "injectvars"
1212
+ - collapseable_section_start "write-dotenv-db" "write dot env for db"
1213
+ - |-
1214
+ cat <<EOF > db/.env
1215
+ ENV_SHORT=prod
1216
+ APP_DIR=db
1217
+ ENV_TYPE=prod
1218
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1219
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1220
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1221
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1222
+ DEPLOY_CLOUD_RUN_SERVICE_NAME=pan-test-app-prod-db
1223
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
1224
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
1225
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_db_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1226
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1227
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1228
+ EOF
1229
+ - collapseable_section_end "write-dotenv-db"
1230
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > db/__build_info.json
1231
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1232
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1233
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1234
+ - collapseable_section_end "nodeinstall"
1235
+ - cd db
1236
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1237
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1238
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1239
+ - collapseable_section_end "nodeinstall"
1240
+ - collapseable_section_start "yarninstall" "Yarn install"
1241
+ - yarn install --immutable --inline-builds
1242
+ - collapseable_section_end "yarninstall"
1243
+ - yarn build
1244
+ cache:
1245
+ - key: db-yarn
1246
+ policy: pull-push
1247
+ paths:
1248
+ - db/.yarn
1249
+ - key: db-node-modules
1250
+ policy: pull-push
1251
+ paths:
1252
+ - db/node_modules
1253
+ - db/.yarn/install-state.gz
1254
+ artifacts:
1255
+ paths:
1256
+ - db/__build_info.json
1257
+ - db/.next
1258
+ - db/dist
1259
+ exclude:
1260
+ - db/.env
1261
+ - db/.next/cache/**/*
1262
+ expire_in: 1 day
1263
+ when: always
1264
+ reports: {}
1265
+ rules:
1266
+ - when: never
1267
+ if: $CI_PIPELINE_SOURCE == "trigger"
1268
+ - if: $CI_COMMIT_TAG
1269
+ needs: []
1270
+ retry: *a1
1271
+ interruptible: true
1272
+ 'db 🔨 docker | prod ':
1273
+ stage: build
1274
+ image: path/to/docker/docker-build:the-version
1275
+ services:
1276
+ - name: docker:29.5.1-dind
1277
+ command:
1278
+ - --tls=false
1279
+ - --registry-mirror=https://mirror.gcr.io
1280
+ variables:
1281
+ DOCKER_HOST: tcp://docker:2375
1282
+ DOCKER_TLS_CERTDIR: ''
1283
+ DOCKER_DRIVER: overlay2
1284
+ DOCKER_BUILDKIT: '1'
1285
+ KUBERNETES_CPU_REQUEST: '0.45'
1286
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1287
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1288
+ script:
1289
+ - collapseable_section_start "injectvars" "Injecting variables"
1290
+ - export APP_DIR="db"
1291
+ - export DOCKER_BUILD_CONTEXT="."
1292
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1293
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/db"
1294
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db"
1295
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1296
+ - |-
1297
+ export DOCKER_COPY_AND_INSTALL_APP="ENV YARN_ENABLE_INLINE_BUILDS=1
1298
+ COPY --chown=node:node $APP_DIR .
1299
+ RUN yarn plugin import workspace-tools
1300
+ RUN yarn workspaces focus --production
1301
+ RUN yarn rebuild"
1302
+ - |-
1303
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node db/package.json /app/db/package.json
1304
+ COPY --chown=node:node db/yarn.lock /app/db/yarn.lock
1305
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1306
+ COPY --chown=node:node .yarn /app/.yarn"
1307
+ - collapseable_section_end "injectvars"
1308
+ - ensureNodeDockerfile
1309
+ - collapseable_section_start "docker-login" "Docker Login"
1310
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_db_GCLOUD_DEPLOY_credentialsKey")
1311
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1312
+ - collapseable_section_end "docker-login"
1313
+ - collapseable_section_start "docker-build" "Docker build"
1314
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1315
+ - collapseable_section_end "docker-build"
1316
+ - collapseable_section_start "docker-push" "Docker push and tag"
1317
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1318
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1319
+ - docker push $DOCKER_CACHE_IMAGE
1320
+ - collapseable_section_end "docker-push"
1321
+ cache:
1322
+ - key: db-yarn
1323
+ policy: pull
1324
+ paths:
1325
+ - db/.yarn
1326
+ rules:
1327
+ - when: never
1328
+ if: $CI_PIPELINE_SOURCE == "trigger"
1329
+ - if: $CI_COMMIT_TAG
1330
+ needs:
1331
+ - 'db 🔨 app | prod '
1332
+ retry: *a1
1333
+ interruptible: true
1334
+ 'db 🚀 Deploy | prod ':
1335
+ stage: deploy prod
1336
+ image: path/to/docker/gcloud:the-version
1337
+ variables:
1338
+ KUBERNETES_CPU_REQUEST: '0.22'
1339
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1340
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1341
+ script:
1342
+ - collapseable_section_start "injectvars" "Injecting variables"
1343
+ - export ENV_SHORT="prod"
1344
+ - export APP_DIR="db"
1345
+ - export ENV_TYPE="prod"
1346
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1347
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1348
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1349
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1350
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1351
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1352
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1353
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-prod-db"
1354
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1355
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1356
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_db_GCLOUD_DEPLOY_credentialsKey"
1357
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix"
1358
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1359
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1360
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/db"
1361
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db"
1362
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1363
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1364
+ - collapseable_section_end "injectvars"
1365
+ - collapseable_section_start "prepare" "Prepare..."
1366
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_db_GCLOUD_DEPLOY_credentialsKey")
1367
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1368
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1369
+ - collapseable_section_end "prepare"
1370
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1371
+ - |
1372
+ cat > ____envvars.yaml <<EOF
1373
+ ENV_SHORT: |-
1374
+ prod
1375
+ APP_DIR: |-
1376
+ db
1377
+ ENV_TYPE: |-
1378
+ prod
1379
+ BUILD_INFO_BUILD_ID: |-
1380
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1381
+ BUILD_INFO_BUILD_TIME: |-
1382
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1383
+ BUILD_INFO_CURRENT_VERSION: |-
1384
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
1385
+ HOSTNAME: |-
1386
+ $(printf %s "$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1387
+ ROOT_URL: |-
1388
+ $(printf %s "https://$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1389
+ HOSTNAME_INTERNAL: |-
1390
+ $(printf %s "$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1391
+ ROOT_URL_INTERNAL: |-
1392
+ $(printf %s "https://$(printf %s "pan-test-app-prod-db-$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1393
+ DEPLOY_CLOUD_RUN_SERVICE_NAME: |-
1394
+ pan-test-app-prod-db
1395
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1396
+ asdf
1397
+ DEPLOY_CLOUD_RUN_REGION: |-
1398
+ asia-east1
1399
+ GCLOUD_RUN_canonicalHostSuffix: |-
1400
+ $(printf %s "$CL_prod_db_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1401
+ _ALL_ENV_VAR_KEYS: |-
1402
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1403
+
1404
+ EOF
1405
+ - collapseable_section_end "writeenvvars"
1406
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1407
+ - gcloud run deploy pan-test-app-prod-db --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/db:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=db,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-db --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1408
+ - collapseable_section_end "deploy"
1409
+ - collapseable_section_start "cleanup" "Cleanup"
1410
+ - set +e
1411
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-db --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
1412
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/db@$version --quiet --delete-tags; done
1413
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db@$version --quiet --delete-tags; done
1414
+ - set -e
1415
+ - collapseable_section_end "cleanup"
1416
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1417
+ environment:
1418
+ name: prod/db
1419
+ url: $CL_GITLAB_ENVIRONMENT_URL
1420
+ on_stop: 'db 🛑 Stop ⚠️ | prod '
1421
+ artifacts:
1422
+ reports:
1423
+ dotenv: gitlab_environment.env
1424
+ rules:
1425
+ - when: never
1426
+ if: $CI_PIPELINE_SOURCE == "trigger"
1427
+ - when: manual
1428
+ if: $CI_COMMIT_TAG
1429
+ needs:
1430
+ - job: 'db 🔨 app | prod '
1431
+ artifacts: false
1432
+ - job: 'db 🔨 docker | prod '
1433
+ artifacts: false
1434
+ retry: *a1
1435
+ interruptible: true
1436
+ allow_failure: true
1437
+ 'db 🛑 Stop ⚠️ | prod ':
1438
+ stage: stop prod
1439
+ image: path/to/docker/gcloud:the-version
1440
+ variables:
1441
+ KUBERNETES_CPU_REQUEST: '0.22'
1442
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1443
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1444
+ GIT_STRATEGY: none
1445
+ script:
1446
+ - collapseable_section_start "injectvars" "Injecting variables"
1447
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1448
+ - collapseable_section_end "injectvars"
1449
+ - set +e
1450
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_db_GCLOUD_DEPLOY_credentialsKey")
1451
+ - gcloud run services delete pan-test-app-prod-db --project=asdf --region=asia-east1
1452
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/db --quiet --delete-tags
1453
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/db@$version --quiet --delete-tags; done
1454
+ - set -e
1455
+ environment:
1456
+ name: prod/db
1457
+ action: stop
1458
+ rules:
1459
+ - when: never
1460
+ if: $CI_PIPELINE_SOURCE == "trigger"
1461
+ - when: manual
1462
+ if: $CI_COMMIT_TAG
1463
+ needs: []
1464
+ retry: *a1
1465
+ interruptible: true
1466
+ allow_failure: true
1467
+ 'api 🛡 audit | dev ':
1468
+ stage: test
1469
+ image: path/to/docker/jobs-default:the-version
1470
+ variables:
1471
+ KUBERNETES_CPU_REQUEST: '0.45'
1472
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1473
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1474
+ script:
1475
+ - collapseable_section_start "injectvars" "Injecting variables"
1476
+ - export APP_PATH="api"
1477
+ - collapseable_section_end "injectvars"
1478
+ - cd api
1479
+ - yarn npm audit --environment production --severity critical
1480
+ rules:
1481
+ - when: never
1482
+ if: $CI_PIPELINE_SOURCE == "trigger"
1483
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
1484
+ needs: []
1485
+ retry: *a1
1486
+ interruptible: true
1487
+ allow_failure: true
1488
+ 'api 👮 lint | dev ':
1489
+ stage: test
1490
+ image: path/to/docker/jobs-default:the-version
1491
+ variables:
1492
+ KUBERNETES_CPU_REQUEST: '0.45'
1493
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1494
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1495
+ script:
1496
+ - collapseable_section_start "injectvars" "Injecting variables"
1497
+ - export APP_PATH="api"
1498
+ - collapseable_section_end "injectvars"
1499
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1500
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1501
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1502
+ - collapseable_section_end "nodeinstall"
1503
+ - cd api
1504
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1505
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1506
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1507
+ - collapseable_section_end "nodeinstall"
1508
+ - collapseable_section_start "yarninstall" "Yarn install"
1509
+ - yarn install --immutable --inline-builds
1510
+ - collapseable_section_end "yarninstall"
1511
+ - yarn lint
1512
+ cache:
1513
+ - key: api-yarn
1514
+ policy: pull-push
1515
+ paths:
1516
+ - api/.yarn
1517
+ - key: api-node-modules
1518
+ policy: pull-push
1519
+ paths: &a4
1520
+ - api/node_modules
1521
+ - api/.yarn/install-state.gz
1522
+ rules:
1523
+ - when: never
1524
+ if: $CI_PIPELINE_SOURCE == "trigger"
1525
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
1526
+ needs: []
1527
+ retry: *a1
1528
+ interruptible: true
1529
+ 'api 🧪 test | dev ':
1530
+ stage: test
1531
+ image: path/to/docker/jobs-testing-chrome:the-version
1532
+ variables:
1533
+ KUBERNETES_CPU_REQUEST: '0.45'
1534
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1535
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1536
+ script:
1537
+ - collapseable_section_start "injectvars" "Injecting variables"
1538
+ - export APP_PATH="api"
1539
+ - collapseable_section_end "injectvars"
1540
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1541
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1542
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1543
+ - collapseable_section_end "nodeinstall"
1544
+ - cd api
1545
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1546
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1547
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1548
+ - collapseable_section_end "nodeinstall"
1549
+ - collapseable_section_start "yarninstall" "Yarn install"
1550
+ - yarn install --immutable --inline-builds
1551
+ - collapseable_section_end "yarninstall"
1552
+ - yarn test
1553
+ cache:
1554
+ - key: api-yarn
1555
+ policy: pull-push
1556
+ paths:
1557
+ - api/.yarn
1558
+ - key: api-node-modules
1559
+ policy: pull-push
1560
+ paths: *a4
1561
+ rules:
1562
+ - when: never
1563
+ if: $CI_PIPELINE_SOURCE == "trigger"
1564
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
1565
+ needs: []
1566
+ retry: *a1
1567
+ interruptible: true
1568
+ 'api 🔨 app | dev ':
1569
+ stage: build
1570
+ image: path/to/docker/jobs-default:the-version
1571
+ variables:
1572
+ KUBERNETES_CPU_REQUEST: '0.45'
1573
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1574
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1575
+ script:
1576
+ - collapseable_section_start "injectvars" "Injecting variables"
1577
+ - export ENV_SHORT="dev"
1578
+ - export APP_DIR="api"
1579
+ - export ENV_TYPE="dev"
1580
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1581
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1582
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1583
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1584
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1585
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1586
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1587
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-dev-api"
1588
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1589
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1590
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
1591
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
1592
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1593
+ - collapseable_section_end "injectvars"
1594
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
1595
+ - |-
1596
+ cat <<EOF > api/.env
1597
+ ENV_SHORT=dev
1598
+ APP_DIR=api
1599
+ ENV_TYPE=dev
1600
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1601
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1602
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1603
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1604
+ DEPLOY_CLOUD_RUN_SERVICE_NAME=pan-test-app-dev-api
1605
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
1606
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
1607
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1608
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1609
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1610
+ EOF
1611
+ - collapseable_section_end "write-dotenv-api"
1612
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1613
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1614
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1615
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1616
+ - collapseable_section_end "nodeinstall"
1617
+ - cd api
1618
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1619
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1620
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1621
+ - collapseable_section_end "nodeinstall"
1622
+ - collapseable_section_start "yarninstall" "Yarn install"
1623
+ - yarn install --immutable --inline-builds
1624
+ - collapseable_section_end "yarninstall"
1625
+ - yarn build
1626
+ cache:
1627
+ - key: api-yarn
1628
+ policy: pull-push
1629
+ paths:
1630
+ - api/.yarn
1631
+ - key: api-node-modules
1632
+ policy: pull-push
1633
+ paths:
1634
+ - api/node_modules
1635
+ - api/.yarn/install-state.gz
1636
+ artifacts:
1637
+ paths:
1638
+ - api/__build_info.json
1639
+ - api/.next
1640
+ - api/dist
1641
+ exclude:
1642
+ - api/.env
1643
+ - api/.next/cache/**/*
1644
+ expire_in: 1 day
1645
+ when: always
1646
+ reports: {}
1647
+ rules:
1648
+ - when: never
1649
+ if: $CI_PIPELINE_SOURCE == "trigger"
1650
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
1651
+ needs: []
1652
+ retry: *a1
1653
+ interruptible: true
1654
+ 'api 🔨 docker | dev ':
1655
+ stage: build
1656
+ image: path/to/docker/docker-build:the-version
1657
+ services:
1658
+ - name: docker:29.5.1-dind
1659
+ command:
1660
+ - --tls=false
1661
+ - --registry-mirror=https://mirror.gcr.io
1662
+ variables:
1663
+ DOCKER_HOST: tcp://docker:2375
1664
+ DOCKER_TLS_CERTDIR: ''
1665
+ DOCKER_DRIVER: overlay2
1666
+ DOCKER_BUILDKIT: '1'
1667
+ KUBERNETES_CPU_REQUEST: '0.45'
1668
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1669
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1670
+ script:
1671
+ - collapseable_section_start "injectvars" "Injecting variables"
1672
+ - export APP_DIR="api"
1673
+ - export DOCKER_BUILD_CONTEXT="."
1674
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1675
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api"
1676
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
1677
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1678
+ - |-
1679
+ export DOCKER_COPY_AND_INSTALL_APP="ENV YARN_ENABLE_INLINE_BUILDS=1
1680
+ COPY --chown=node:node $APP_DIR .
1681
+ RUN yarn plugin import workspace-tools
1682
+ RUN yarn workspaces focus --production
1683
+ RUN yarn rebuild"
1684
+ - |-
1685
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1686
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1687
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1688
+ COPY --chown=node:node .yarn /app/.yarn"
1689
+ - collapseable_section_end "injectvars"
1690
+ - ensureNodeDockerfile
1691
+ - collapseable_section_start "docker-login" "Docker Login"
1692
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
1693
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1694
+ - collapseable_section_end "docker-login"
1695
+ - collapseable_section_start "docker-build" "Docker build"
1696
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1697
+ - collapseable_section_end "docker-build"
1698
+ - collapseable_section_start "docker-push" "Docker push and tag"
1699
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1700
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1701
+ - docker push $DOCKER_CACHE_IMAGE
1702
+ - collapseable_section_end "docker-push"
1703
+ cache:
1704
+ - key: api-yarn
1705
+ policy: pull
1706
+ paths:
1707
+ - api/.yarn
1708
+ rules:
1709
+ - when: never
1710
+ if: $CI_PIPELINE_SOURCE == "trigger"
1711
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
1712
+ needs:
1713
+ - 'api 🔨 app | dev '
1714
+ retry: *a1
1715
+ interruptible: true
1716
+ 'api 🚀 Deploy | dev ':
1717
+ stage: deploy dev
1718
+ image: path/to/docker/gcloud:the-version
1719
+ variables:
1720
+ KUBERNETES_CPU_REQUEST: '0.22'
1721
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1722
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1723
+ script:
1724
+ - collapseable_section_start "injectvars" "Injecting variables"
1725
+ - export ENV_SHORT="dev"
1726
+ - export APP_DIR="api"
1727
+ - export ENV_TYPE="dev"
1728
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1729
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1730
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1731
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1732
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1733
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1734
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1735
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-dev-api"
1736
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1737
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1738
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
1739
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
1740
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1741
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1742
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api"
1743
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
1744
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1745
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1746
+ - collapseable_section_end "injectvars"
1747
+ - collapseable_section_start "prepare" "Prepare..."
1748
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
1749
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1750
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1751
+ - collapseable_section_end "prepare"
1752
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1753
+ - |
1754
+ cat > ____envvars.yaml <<EOF
1755
+ ENV_SHORT: |-
1756
+ dev
1757
+ APP_DIR: |-
1758
+ api
1759
+ ENV_TYPE: |-
1760
+ dev
1761
+ BUILD_INFO_BUILD_ID: |-
1762
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1763
+ BUILD_INFO_BUILD_TIME: |-
1764
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1765
+ BUILD_INFO_CURRENT_VERSION: |-
1766
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
1767
+ HOSTNAME: |-
1768
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1769
+ ROOT_URL: |-
1770
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1771
+ HOSTNAME_INTERNAL: |-
1772
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1773
+ ROOT_URL_INTERNAL: |-
1774
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1775
+ DEPLOY_CLOUD_RUN_SERVICE_NAME: |-
1776
+ pan-test-app-dev-api
1777
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1778
+ asdf
1779
+ DEPLOY_CLOUD_RUN_REGION: |-
1780
+ asia-east1
1781
+ GCLOUD_RUN_canonicalHostSuffix: |-
1782
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1783
+ _ALL_ENV_VAR_KEYS: |-
1784
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1785
+
1786
+ EOF
1787
+ - collapseable_section_end "writeenvvars"
1788
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1789
+ - gcloud run deploy pan-test-app-dev-api --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --no-allow-unauthenticated --ingress=all --cpu-boost
1790
+ - collapseable_section_end "deploy"
1791
+ - collapseable_section_start "cleanup" "Cleanup"
1792
+ - set +e
1793
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
1794
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api@$version --quiet --delete-tags; done
1795
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1796
+ - set -e
1797
+ - collapseable_section_end "cleanup"
1798
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1799
+ environment:
1800
+ name: dev/api
1801
+ url: $CL_GITLAB_ENVIRONMENT_URL
1802
+ on_stop: 'api 🛑 Stop ⚠️ | dev '
1803
+ auto_stop_in: 4 weeks
1804
+ artifacts:
1805
+ reports:
1806
+ dotenv: gitlab_environment.env
1807
+ rules:
1808
+ - when: never
1809
+ if: $CI_PIPELINE_SOURCE == "trigger"
1810
+ - when: on_success
1811
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
1812
+ needs:
1813
+ - job: 'api 👮 lint | dev '
1814
+ artifacts: false
1815
+ - job: 'api 🔨 app | dev '
1816
+ artifacts: false
1817
+ - job: 'api 🔨 docker | dev '
1818
+ artifacts: false
1819
+ - job: 'api 🧪 test | dev '
1820
+ artifacts: false
1821
+ - job: 'api 🛡 audit | dev '
1822
+ artifacts: false
1823
+ retry: *a1
1824
+ interruptible: true
1825
+ allow_failure: false
1826
+ 'api 🛑 Stop ⚠️ | dev ':
1827
+ stage: stop dev
1828
+ image: path/to/docker/gcloud:the-version
1829
+ variables:
1830
+ KUBERNETES_CPU_REQUEST: '0.22'
1831
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1832
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1833
+ GIT_STRATEGY: none
1834
+ script:
1835
+ - collapseable_section_start "injectvars" "Injecting variables"
1836
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1837
+ - collapseable_section_end "injectvars"
1838
+ - set +e
1839
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
1840
+ - gcloud run services delete pan-test-app-dev-api --project=asdf --region=asia-east1
1841
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags
1842
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1843
+ - set -e
1844
+ environment:
1845
+ name: dev/api
1846
+ action: stop
1847
+ rules:
1848
+ - when: never
1849
+ if: $CI_PIPELINE_SOURCE == "trigger"
1850
+ - when: manual
1851
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
1852
+ needs: []
1853
+ retry: *a1
1854
+ interruptible: true
1855
+ allow_failure: true
1856
+ 'api 🔍 verify | dev ':
1857
+ stage: verify dev
1858
+ image: path/to/docker/jobs-testing-chrome:the-version
1859
+ variables:
1860
+ KUBERNETES_CPU_REQUEST: '0.45'
1861
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1862
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1863
+ script:
1864
+ - collapseable_section_start "injectvars" "Injecting variables"
1865
+ - export ENV_SHORT="dev"
1866
+ - export APP_DIR="api"
1867
+ - export ENV_TYPE="dev"
1868
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1869
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1870
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1871
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1872
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1873
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1874
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1875
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-dev-api"
1876
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1877
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1878
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
1879
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
1880
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1881
+ - collapseable_section_end "injectvars"
1882
+ - collapseable_section_start "verifygcloudauth" "Setup google application credentials"
1883
+ - echo "$GCLOUD_DEPLOY_credentialsKey" > "$CI_PROJECT_DIR/.gcloud-sa.json"
1884
+ - export GOOGLE_APPLICATION_CREDENTIALS="$CI_PROJECT_DIR/.gcloud-sa.json"
1885
+ - collapseable_section_end "verifygcloudauth"
1886
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1887
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1888
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1889
+ - collapseable_section_end "nodeinstall"
1890
+ - cd api
1891
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1892
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1893
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1894
+ - collapseable_section_end "nodeinstall"
1895
+ - collapseable_section_start "yarninstall" "Yarn install"
1896
+ - yarn install --immutable --inline-builds
1897
+ - collapseable_section_end "yarninstall"
1898
+ - yarn e2e
1899
+ cache:
1900
+ - key: api-yarn
1901
+ policy: pull
1902
+ paths:
1903
+ - api/.yarn
1904
+ - key: api-node-modules
1905
+ policy: pull
1906
+ paths:
1907
+ - api/node_modules
1908
+ - api/.yarn/install-state.gz
1909
+ rules:
1910
+ - when: never
1911
+ if: $CI_PIPELINE_SOURCE == "trigger"
1912
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && ($CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/ || $CI_PIPELINE_SOURCE != "push")
1913
+ needs:
1914
+ - job: 'api 🚀 Deploy | dev '
1915
+ artifacts: false
1916
+ - job: 'db 🚀 Deploy | dev '
1917
+ artifacts: false
1918
+ retry: *a1
1919
+ interruptible: true
1920
+ 'api 🛡 audit | review ':
1921
+ stage: test
1922
+ image: path/to/docker/jobs-default:the-version
1923
+ variables:
1924
+ KUBERNETES_CPU_REQUEST: '0.45'
1925
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1926
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1927
+ script:
1928
+ - collapseable_section_start "injectvars" "Injecting variables"
1929
+ - export APP_PATH="api"
1930
+ - collapseable_section_end "injectvars"
1931
+ - cd api
1932
+ - yarn npm audit --environment production --severity critical
1933
+ rules:
1934
+ - when: never
1935
+ if: $CI_PIPELINE_SOURCE == "trigger"
1936
+ - if: $CI_MERGE_REQUEST_ID
1937
+ needs: []
1938
+ retry: *a1
1939
+ interruptible: true
1940
+ allow_failure: true
1941
+ 'api 👮 lint | review ':
1942
+ stage: test
1943
+ image: path/to/docker/jobs-default:the-version
1944
+ variables:
1945
+ KUBERNETES_CPU_REQUEST: '0.45'
1946
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1947
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1948
+ script:
1949
+ - collapseable_section_start "injectvars" "Injecting variables"
1950
+ - export APP_PATH="api"
1951
+ - collapseable_section_end "injectvars"
1952
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1953
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1954
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1955
+ - collapseable_section_end "nodeinstall"
1956
+ - cd api
1957
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1958
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1959
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1960
+ - collapseable_section_end "nodeinstall"
1961
+ - collapseable_section_start "yarninstall" "Yarn install"
1962
+ - yarn install --immutable --inline-builds
1963
+ - collapseable_section_end "yarninstall"
1964
+ - yarn lint
1965
+ cache:
1966
+ - key: api-yarn-mr$CI_MERGE_REQUEST_IID
1967
+ policy: pull-push
1968
+ paths:
1969
+ - api/.yarn
1970
+ fallback_keys:
1971
+ - api-yarn
1972
+ - key: api-node-modules-mr$CI_MERGE_REQUEST_IID
1973
+ policy: pull-push
1974
+ paths: &a5
1975
+ - api/node_modules
1976
+ - api/.yarn/install-state.gz
1977
+ fallback_keys:
1978
+ - api-node-modules
1979
+ rules:
1980
+ - when: never
1981
+ if: $CI_PIPELINE_SOURCE == "trigger"
1982
+ - if: $CI_MERGE_REQUEST_ID
1983
+ needs: []
1984
+ retry: *a1
1985
+ interruptible: true
1986
+ 'api 🧪 test | review ':
1987
+ stage: test
1988
+ image: path/to/docker/jobs-testing-chrome:the-version
1989
+ variables:
1990
+ KUBERNETES_CPU_REQUEST: '0.45'
1991
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1992
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1993
+ script:
1994
+ - collapseable_section_start "injectvars" "Injecting variables"
1995
+ - export APP_PATH="api"
1996
+ - collapseable_section_end "injectvars"
1997
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1998
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1999
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2000
+ - collapseable_section_end "nodeinstall"
2001
+ - cd api
2002
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2003
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2004
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2005
+ - collapseable_section_end "nodeinstall"
2006
+ - collapseable_section_start "yarninstall" "Yarn install"
2007
+ - yarn install --immutable --inline-builds
2008
+ - collapseable_section_end "yarninstall"
2009
+ - yarn test
2010
+ cache:
2011
+ - key: api-yarn-mr$CI_MERGE_REQUEST_IID
2012
+ policy: pull-push
2013
+ paths:
2014
+ - api/.yarn
2015
+ fallback_keys:
2016
+ - api-yarn
2017
+ - key: api-node-modules-mr$CI_MERGE_REQUEST_IID
2018
+ policy: pull-push
2019
+ paths: *a5
2020
+ fallback_keys:
2021
+ - api-node-modules
2022
+ rules:
2023
+ - when: never
2024
+ if: $CI_PIPELINE_SOURCE == "trigger"
2025
+ - if: $CI_MERGE_REQUEST_ID
2026
+ needs: []
2027
+ retry: *a1
2028
+ interruptible: true
2029
+ 'api 🔨 app | review ':
2030
+ stage: build
2031
+ image: path/to/docker/jobs-default:the-version
2032
+ variables:
2033
+ KUBERNETES_CPU_REQUEST: '0.45'
2034
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2035
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2036
+ script:
2037
+ - collapseable_section_start "injectvars" "Injecting variables"
2038
+ - export ENV_SHORT="review"
2039
+ - export APP_DIR="api"
2040
+ - export ENV_TYPE="review"
2041
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2042
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2043
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2044
+ - export HOSTNAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2045
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2046
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2047
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2048
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')"
2049
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2050
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2051
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
2052
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
2053
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2054
+ - collapseable_section_end "injectvars"
2055
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
2056
+ - |-
2057
+ cat <<EOF > api/.env
2058
+ ENV_SHORT=review
2059
+ APP_DIR=api
2060
+ ENV_TYPE=review
2061
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2062
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2063
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2064
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2065
+ DEPLOY_CLOUD_RUN_SERVICE_NAME=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')" | escapeForDotEnv)
2066
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
2067
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
2068
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
2069
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
2070
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2071
+ EOF
2072
+ - collapseable_section_end "write-dotenv-api"
2073
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
2074
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2075
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2076
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2077
+ - collapseable_section_end "nodeinstall"
2078
+ - cd api
2079
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2080
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2081
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2082
+ - collapseable_section_end "nodeinstall"
2083
+ - collapseable_section_start "yarninstall" "Yarn install"
2084
+ - yarn install --immutable --inline-builds
2085
+ - collapseable_section_end "yarninstall"
2086
+ - yarn build
2087
+ cache:
2088
+ - key: api-yarn-mr$CI_MERGE_REQUEST_IID
2089
+ policy: pull-push
2090
+ paths:
2091
+ - api/.yarn
2092
+ fallback_keys:
2093
+ - api-yarn
2094
+ - key: api-node-modules-mr$CI_MERGE_REQUEST_IID
2095
+ policy: pull-push
2096
+ paths:
2097
+ - api/node_modules
2098
+ - api/.yarn/install-state.gz
2099
+ fallback_keys:
2100
+ - api-node-modules
2101
+ artifacts:
2102
+ paths:
2103
+ - api/__build_info.json
2104
+ - api/.next
2105
+ - api/dist
2106
+ exclude:
2107
+ - api/.env
2108
+ - api/.next/cache/**/*
2109
+ expire_in: 1 day
2110
+ when: always
2111
+ reports: {}
2112
+ rules:
2113
+ - when: never
2114
+ if: $CI_PIPELINE_SOURCE == "trigger"
2115
+ - if: $CI_MERGE_REQUEST_ID
2116
+ needs: []
2117
+ retry: *a1
2118
+ interruptible: true
2119
+ 'api 🔨 docker | review ':
2120
+ stage: build
2121
+ image: path/to/docker/docker-build:the-version
2122
+ services:
2123
+ - name: docker:29.5.1-dind
2124
+ command:
2125
+ - --tls=false
2126
+ - --registry-mirror=https://mirror.gcr.io
2127
+ variables:
2128
+ DOCKER_HOST: tcp://docker:2375
2129
+ DOCKER_TLS_CERTDIR: ''
2130
+ DOCKER_DRIVER: overlay2
2131
+ DOCKER_BUILDKIT: '1'
2132
+ KUBERNETES_CPU_REQUEST: '0.45'
2133
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2134
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2135
+ script:
2136
+ - collapseable_section_start "injectvars" "Injecting variables"
2137
+ - export APP_DIR="api"
2138
+ - export DOCKER_BUILD_CONTEXT="."
2139
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2140
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
2141
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
2142
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2143
+ - |-
2144
+ export DOCKER_COPY_AND_INSTALL_APP="ENV YARN_ENABLE_INLINE_BUILDS=1
2145
+ COPY --chown=node:node $APP_DIR .
2146
+ RUN yarn plugin import workspace-tools
2147
+ RUN yarn workspaces focus --production
2148
+ RUN yarn rebuild"
2149
+ - |-
2150
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
2151
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2152
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2153
+ COPY --chown=node:node .yarn /app/.yarn"
2154
+ - collapseable_section_end "injectvars"
2155
+ - ensureNodeDockerfile
2156
+ - collapseable_section_start "docker-login" "Docker Login"
2157
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
2158
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
2159
+ - collapseable_section_end "docker-login"
2160
+ - collapseable_section_start "docker-build" "Docker build"
2161
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2162
+ - collapseable_section_end "docker-build"
2163
+ - collapseable_section_start "docker-push" "Docker push and tag"
2164
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2165
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2166
+ - docker push $DOCKER_CACHE_IMAGE
2167
+ - collapseable_section_end "docker-push"
2168
+ cache:
2169
+ - key: api-yarn-mr$CI_MERGE_REQUEST_IID
2170
+ policy: pull
2171
+ paths:
2172
+ - api/.yarn
2173
+ fallback_keys:
2174
+ - api-yarn
2175
+ rules:
2176
+ - when: never
2177
+ if: $CI_PIPELINE_SOURCE == "trigger"
2178
+ - if: $CI_MERGE_REQUEST_ID
2179
+ needs:
2180
+ - 'api 🔨 app | review '
2181
+ retry: *a1
2182
+ interruptible: true
2183
+ 'api 🚀 Deploy | review ':
2184
+ stage: deploy review
2185
+ image: path/to/docker/gcloud:the-version
2186
+ variables:
2187
+ KUBERNETES_CPU_REQUEST: '0.22'
2188
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2189
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2190
+ script:
2191
+ - collapseable_section_start "injectvars" "Injecting variables"
2192
+ - export ENV_SHORT="review"
2193
+ - export APP_DIR="api"
2194
+ - export ENV_TYPE="review"
2195
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2196
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2197
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2198
+ - export HOSTNAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2199
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2200
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2201
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2202
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')"
2203
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2204
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2205
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
2206
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
2207
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2208
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2209
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
2210
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
2211
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2212
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2213
+ - collapseable_section_end "injectvars"
2214
+ - collapseable_section_start "prepare" "Prepare..."
2215
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
2216
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
2217
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2218
+ - collapseable_section_end "prepare"
2219
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
2220
+ - |
2221
+ cat > ____envvars.yaml <<EOF
2222
+ ENV_SHORT: |-
2223
+ review
2224
+ APP_DIR: |-
2225
+ api
2226
+ ENV_TYPE: |-
2227
+ review
2228
+ BUILD_INFO_BUILD_ID: |-
2229
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2230
+ BUILD_INFO_BUILD_TIME: |-
2231
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2232
+ BUILD_INFO_CURRENT_VERSION: |-
2233
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
2234
+ HOSTNAME: |-
2235
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2236
+ ROOT_URL: |-
2237
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2238
+ HOSTNAME_INTERNAL: |-
2239
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2240
+ ROOT_URL_INTERNAL: |-
2241
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2242
+ DEPLOY_CLOUD_RUN_SERVICE_NAME: |-
2243
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2244
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2245
+ asdf
2246
+ DEPLOY_CLOUD_RUN_REGION: |-
2247
+ asia-east1
2248
+ GCLOUD_RUN_canonicalHostSuffix: |-
2249
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
2250
+ _ALL_ENV_VAR_KEYS: |-
2251
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2252
+
2253
+ EOF
2254
+ - collapseable_section_end "writeenvvars"
2255
+ - collapseable_section_start "deploy" "Deploy to cloud run"
2256
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --no-allow-unauthenticated --ingress=all --cpu-boost
2257
+ - collapseable_section_end "deploy"
2258
+ - collapseable_section_start "cleanup" "Cleanup"
2259
+ - set +e
2260
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
2261
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
2262
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2263
+ - set +e
2264
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
2265
+ - set -e
2266
+ - set -e
2267
+ - collapseable_section_end "cleanup"
2268
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
2269
+ environment:
2270
+ name: review/$CI_COMMIT_REF_NAME/api
2271
+ url: $CL_GITLAB_ENVIRONMENT_URL
2272
+ on_stop: 'api 🛑 Stop ⚠️ | review '
2273
+ auto_stop_in: 1 week
2274
+ artifacts:
2275
+ reports:
2276
+ dotenv: gitlab_environment.env
2277
+ rules:
2278
+ - when: never
2279
+ if: $CI_PIPELINE_SOURCE == "trigger"
2280
+ - when: on_success
2281
+ if: $CI_MERGE_REQUEST_ID
2282
+ needs:
2283
+ - job: 'api 👮 lint | review '
2284
+ artifacts: false
2285
+ - job: 'api 🔨 app | review '
2286
+ artifacts: false
2287
+ - job: 'api 🔨 docker | review '
2288
+ artifacts: false
2289
+ - job: 'api 🧪 test | review '
2290
+ artifacts: false
2291
+ - job: 'api 🛡 audit | review '
2292
+ artifacts: false
2293
+ retry: *a1
2294
+ interruptible: true
2295
+ allow_failure: false
2296
+ 'api 🛑 Stop ⚠️ | review ':
2297
+ stage: stop review
2298
+ image: path/to/docker/gcloud:the-version
2299
+ variables:
2300
+ KUBERNETES_CPU_REQUEST: '0.22'
2301
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2302
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2303
+ GIT_STRATEGY: none
2304
+ script:
2305
+ - collapseable_section_start "injectvars" "Injecting variables"
2306
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2307
+ - collapseable_section_end "injectvars"
2308
+ - set +e
2309
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
2310
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --project=asdf --region=asia-east1
2311
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags
2312
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2313
+ - set +e
2314
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
2315
+ - set -e
2316
+ - set -e
2317
+ environment:
2318
+ name: review/$CI_COMMIT_REF_NAME/api
2319
+ action: stop
2320
+ rules:
2321
+ - when: never
2322
+ if: $CI_PIPELINE_SOURCE == "trigger"
2323
+ - when: manual
2324
+ if: $CI_MERGE_REQUEST_ID
2325
+ needs: []
2326
+ retry: *a1
2327
+ interruptible: true
2328
+ allow_failure: true
2329
+ 'api 🔍 verify | review ':
2330
+ stage: verify review
2331
+ image: path/to/docker/jobs-testing-chrome:the-version
2332
+ variables:
2333
+ KUBERNETES_CPU_REQUEST: '0.45'
2334
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2335
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2336
+ script:
2337
+ - collapseable_section_start "injectvars" "Injecting variables"
2338
+ - export ENV_SHORT="review"
2339
+ - export APP_DIR="api"
2340
+ - export ENV_TYPE="review"
2341
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2342
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2343
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2344
+ - export HOSTNAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2345
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2346
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2347
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2348
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}')"
2349
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2350
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2351
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
2352
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
2353
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2354
+ - collapseable_section_end "injectvars"
2355
+ - collapseable_section_start "verifygcloudauth" "Setup google application credentials"
2356
+ - echo "$GCLOUD_DEPLOY_credentialsKey" > "$CI_PROJECT_DIR/.gcloud-sa.json"
2357
+ - export GOOGLE_APPLICATION_CREDENTIALS="$CI_PROJECT_DIR/.gcloud-sa.json"
2358
+ - collapseable_section_end "verifygcloudauth"
2359
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2360
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2361
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2362
+ - collapseable_section_end "nodeinstall"
2363
+ - cd api
2364
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2365
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2366
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2367
+ - collapseable_section_end "nodeinstall"
2368
+ - collapseable_section_start "yarninstall" "Yarn install"
2369
+ - yarn install --immutable --inline-builds
2370
+ - collapseable_section_end "yarninstall"
2371
+ - yarn e2e
2372
+ cache:
2373
+ - key: api-yarn-mr$CI_MERGE_REQUEST_IID
2374
+ policy: pull
2375
+ paths:
2376
+ - api/.yarn
2377
+ fallback_keys:
2378
+ - api-yarn
2379
+ - key: api-node-modules-mr$CI_MERGE_REQUEST_IID
2380
+ policy: pull
2381
+ paths:
2382
+ - api/node_modules
2383
+ - api/.yarn/install-state.gz
2384
+ fallback_keys:
2385
+ - api-node-modules
2386
+ rules:
2387
+ - when: never
2388
+ if: $CI_PIPELINE_SOURCE == "trigger"
2389
+ - if: $CI_MERGE_REQUEST_ID
2390
+ needs:
2391
+ - job: 'api 🚀 Deploy | review '
2392
+ artifacts: false
2393
+ - job: 'db 🚀 Deploy | review '
2394
+ artifacts: false
2395
+ retry: *a1
2396
+ interruptible: true
2397
+ 'api 🔨 app | stage ':
2398
+ stage: build
2399
+ image: path/to/docker/jobs-default:the-version
2400
+ variables:
2401
+ KUBERNETES_CPU_REQUEST: '0.45'
2402
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2403
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2404
+ script:
2405
+ - collapseable_section_start "injectvars" "Injecting variables"
2406
+ - export ENV_SHORT="stage"
2407
+ - export APP_DIR="api"
2408
+ - export ENV_TYPE="stage"
2409
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2410
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2411
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2412
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2413
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2414
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2415
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2416
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-stage-api"
2417
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2418
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2419
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
2420
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
2421
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2422
+ - collapseable_section_end "injectvars"
2423
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
2424
+ - |-
2425
+ cat <<EOF > api/.env
2426
+ ENV_SHORT=stage
2427
+ APP_DIR=api
2428
+ ENV_TYPE=stage
2429
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2430
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2431
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2432
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2433
+ DEPLOY_CLOUD_RUN_SERVICE_NAME=pan-test-app-stage-api
2434
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
2435
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
2436
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
2437
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
2438
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2439
+ EOF
2440
+ - collapseable_section_end "write-dotenv-api"
2441
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
2442
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2443
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2444
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2445
+ - collapseable_section_end "nodeinstall"
2446
+ - cd api
2447
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2448
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2449
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2450
+ - collapseable_section_end "nodeinstall"
2451
+ - collapseable_section_start "yarninstall" "Yarn install"
2452
+ - yarn install --immutable --inline-builds
2453
+ - collapseable_section_end "yarninstall"
2454
+ - yarn build
2455
+ cache:
2456
+ - key: api-yarn
2457
+ policy: pull-push
2458
+ paths:
2459
+ - api/.yarn
2460
+ - key: api-node-modules
2461
+ policy: pull-push
2462
+ paths:
2463
+ - api/node_modules
2464
+ - api/.yarn/install-state.gz
2465
+ artifacts:
2466
+ paths:
2467
+ - api/__build_info.json
2468
+ - api/.next
2469
+ - api/dist
2470
+ exclude:
2471
+ - api/.env
2472
+ - api/.next/cache/**/*
2473
+ expire_in: 1 day
2474
+ when: always
2475
+ reports: {}
2476
+ rules:
2477
+ - when: never
2478
+ if: $CI_PIPELINE_SOURCE == "trigger"
2479
+ - if: $CI_COMMIT_TAG
2480
+ needs: []
2481
+ retry: *a1
2482
+ interruptible: true
2483
+ 'api 🔨 docker | stage ':
2484
+ stage: build
2485
+ image: path/to/docker/docker-build:the-version
2486
+ services:
2487
+ - name: docker:29.5.1-dind
2488
+ command:
2489
+ - --tls=false
2490
+ - --registry-mirror=https://mirror.gcr.io
2491
+ variables:
2492
+ DOCKER_HOST: tcp://docker:2375
2493
+ DOCKER_TLS_CERTDIR: ''
2494
+ DOCKER_DRIVER: overlay2
2495
+ DOCKER_BUILDKIT: '1'
2496
+ KUBERNETES_CPU_REQUEST: '0.45'
2497
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2498
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2499
+ script:
2500
+ - collapseable_section_start "injectvars" "Injecting variables"
2501
+ - export APP_DIR="api"
2502
+ - export DOCKER_BUILD_CONTEXT="."
2503
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2504
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api"
2505
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
2506
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2507
+ - |-
2508
+ export DOCKER_COPY_AND_INSTALL_APP="ENV YARN_ENABLE_INLINE_BUILDS=1
2509
+ COPY --chown=node:node $APP_DIR .
2510
+ RUN yarn plugin import workspace-tools
2511
+ RUN yarn workspaces focus --production
2512
+ RUN yarn rebuild"
2513
+ - |-
2514
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
2515
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2516
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2517
+ COPY --chown=node:node .yarn /app/.yarn"
2518
+ - collapseable_section_end "injectvars"
2519
+ - ensureNodeDockerfile
2520
+ - collapseable_section_start "docker-login" "Docker Login"
2521
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
2522
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
2523
+ - collapseable_section_end "docker-login"
2524
+ - collapseable_section_start "docker-build" "Docker build"
2525
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2526
+ - collapseable_section_end "docker-build"
2527
+ - collapseable_section_start "docker-push" "Docker push and tag"
2528
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2529
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2530
+ - docker push $DOCKER_CACHE_IMAGE
2531
+ - collapseable_section_end "docker-push"
2532
+ cache:
2533
+ - key: api-yarn
2534
+ policy: pull
2535
+ paths:
2536
+ - api/.yarn
2537
+ rules:
2538
+ - when: never
2539
+ if: $CI_PIPELINE_SOURCE == "trigger"
2540
+ - if: $CI_COMMIT_TAG
2541
+ needs:
2542
+ - 'api 🔨 app | stage '
2543
+ retry: *a1
2544
+ interruptible: true
2545
+ 'api 🚀 Deploy | stage ':
2546
+ stage: deploy stage
2547
+ image: path/to/docker/gcloud:the-version
2548
+ variables:
2549
+ KUBERNETES_CPU_REQUEST: '0.22'
2550
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2551
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2552
+ script:
2553
+ - collapseable_section_start "injectvars" "Injecting variables"
2554
+ - export ENV_SHORT="stage"
2555
+ - export APP_DIR="api"
2556
+ - export ENV_TYPE="stage"
2557
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2558
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2559
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2560
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2561
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2562
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2563
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2564
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-stage-api"
2565
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2566
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2567
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
2568
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
2569
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2570
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2571
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api"
2572
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
2573
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2574
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2575
+ - collapseable_section_end "injectvars"
2576
+ - collapseable_section_start "prepare" "Prepare..."
2577
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
2578
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
2579
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2580
+ - collapseable_section_end "prepare"
2581
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
2582
+ - |
2583
+ cat > ____envvars.yaml <<EOF
2584
+ ENV_SHORT: |-
2585
+ stage
2586
+ APP_DIR: |-
2587
+ api
2588
+ ENV_TYPE: |-
2589
+ stage
2590
+ BUILD_INFO_BUILD_ID: |-
2591
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2592
+ BUILD_INFO_BUILD_TIME: |-
2593
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2594
+ BUILD_INFO_CURRENT_VERSION: |-
2595
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
2596
+ HOSTNAME: |-
2597
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2598
+ ROOT_URL: |-
2599
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2600
+ HOSTNAME_INTERNAL: |-
2601
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2602
+ ROOT_URL_INTERNAL: |-
2603
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2604
+ DEPLOY_CLOUD_RUN_SERVICE_NAME: |-
2605
+ pan-test-app-stage-api
2606
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2607
+ asdf
2608
+ DEPLOY_CLOUD_RUN_REGION: |-
2609
+ asia-east1
2610
+ GCLOUD_RUN_canonicalHostSuffix: |-
2611
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
2612
+ _ALL_ENV_VAR_KEYS: |-
2613
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2614
+
2615
+ EOF
2616
+ - collapseable_section_end "writeenvvars"
2617
+ - collapseable_section_start "deploy" "Deploy to cloud run"
2618
+ - gcloud run deploy pan-test-app-stage-api --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --no-allow-unauthenticated --ingress=all --cpu-boost
2619
+ - collapseable_section_end "deploy"
2620
+ - collapseable_section_start "cleanup" "Cleanup"
2621
+ - set +e
2622
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
2623
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api@$version --quiet --delete-tags; done
2624
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2625
+ - set -e
2626
+ - collapseable_section_end "cleanup"
2627
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
2628
+ environment:
2629
+ name: stage/api
2630
+ url: $CL_GITLAB_ENVIRONMENT_URL
2631
+ on_stop: 'api 🛑 Stop ⚠️ | stage '
2632
+ artifacts:
2633
+ reports:
2634
+ dotenv: gitlab_environment.env
2635
+ rules:
2636
+ - when: never
2637
+ if: $CI_PIPELINE_SOURCE == "trigger"
2638
+ - when: on_success
2639
+ if: $CI_COMMIT_TAG
2640
+ needs:
2641
+ - job: 'api 🔨 app | stage '
2642
+ artifacts: false
2643
+ - job: 'api 🔨 docker | stage '
2644
+ artifacts: false
2645
+ retry: *a1
2646
+ interruptible: true
2647
+ allow_failure: false
2648
+ 'api 🛑 Stop ⚠️ | stage ':
2649
+ stage: stop stage
2650
+ image: path/to/docker/gcloud:the-version
2651
+ variables:
2652
+ KUBERNETES_CPU_REQUEST: '0.22'
2653
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2654
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2655
+ GIT_STRATEGY: none
2656
+ script:
2657
+ - collapseable_section_start "injectvars" "Injecting variables"
2658
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2659
+ - collapseable_section_end "injectvars"
2660
+ - set +e
2661
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
2662
+ - gcloud run services delete pan-test-app-stage-api --project=asdf --region=asia-east1
2663
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags
2664
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2665
+ - set -e
2666
+ environment:
2667
+ name: stage/api
2668
+ action: stop
2669
+ rules:
2670
+ - when: never
2671
+ if: $CI_PIPELINE_SOURCE == "trigger"
2672
+ - when: manual
2673
+ if: $CI_COMMIT_TAG
2674
+ needs: []
2675
+ retry: *a1
2676
+ interruptible: true
2677
+ allow_failure: true
2678
+ 'api 🔍 verify | stage ':
2679
+ stage: verify stage
2680
+ image: path/to/docker/jobs-testing-chrome:the-version
2681
+ variables:
2682
+ KUBERNETES_CPU_REQUEST: '0.45'
2683
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2684
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2685
+ script:
2686
+ - collapseable_section_start "injectvars" "Injecting variables"
2687
+ - export ENV_SHORT="stage"
2688
+ - export APP_DIR="api"
2689
+ - export ENV_TYPE="stage"
2690
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2691
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2692
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2693
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2694
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2695
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2696
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2697
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-stage-api"
2698
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2699
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2700
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
2701
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
2702
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2703
+ - collapseable_section_end "injectvars"
2704
+ - collapseable_section_start "verifygcloudauth" "Setup google application credentials"
2705
+ - echo "$GCLOUD_DEPLOY_credentialsKey" > "$CI_PROJECT_DIR/.gcloud-sa.json"
2706
+ - export GOOGLE_APPLICATION_CREDENTIALS="$CI_PROJECT_DIR/.gcloud-sa.json"
2707
+ - collapseable_section_end "verifygcloudauth"
2708
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2709
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2710
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2711
+ - collapseable_section_end "nodeinstall"
2712
+ - cd api
2713
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2714
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2715
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2716
+ - collapseable_section_end "nodeinstall"
2717
+ - collapseable_section_start "yarninstall" "Yarn install"
2718
+ - yarn install --immutable --inline-builds
2719
+ - collapseable_section_end "yarninstall"
2720
+ - yarn e2e
2721
+ cache:
2722
+ - key: api-yarn
2723
+ policy: pull
2724
+ paths:
2725
+ - api/.yarn
2726
+ - key: api-node-modules
2727
+ policy: pull
2728
+ paths:
2729
+ - api/node_modules
2730
+ - api/.yarn/install-state.gz
2731
+ rules:
2732
+ - when: never
2733
+ if: $CI_PIPELINE_SOURCE == "trigger"
2734
+ - if: $CI_COMMIT_TAG
2735
+ needs:
2736
+ - job: 'api 🚀 Deploy | stage '
2737
+ artifacts: false
2738
+ - job: 'db 🚀 Deploy | stage '
2739
+ artifacts: false
2740
+ retry: *a1
2741
+ interruptible: true
2742
+ 'api 🔨 app | prod ':
2743
+ stage: build
2744
+ image: path/to/docker/jobs-default:the-version
2745
+ variables:
2746
+ KUBERNETES_CPU_REQUEST: '0.45'
2747
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2748
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2749
+ script:
2750
+ - collapseable_section_start "injectvars" "Injecting variables"
2751
+ - export ENV_SHORT="prod"
2752
+ - export APP_DIR="api"
2753
+ - export ENV_TYPE="prod"
2754
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2755
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2756
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2757
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2758
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2759
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2760
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2761
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-prod-api"
2762
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2763
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2764
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
2765
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
2766
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2767
+ - collapseable_section_end "injectvars"
2768
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
2769
+ - |-
2770
+ cat <<EOF > api/.env
2771
+ ENV_SHORT=prod
2772
+ APP_DIR=api
2773
+ ENV_TYPE=prod
2774
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2775
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2776
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2777
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2778
+ DEPLOY_CLOUD_RUN_SERVICE_NAME=pan-test-app-prod-api
2779
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
2780
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
2781
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
2782
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
2783
+ _ALL_ENV_VAR_KEYS=["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2784
+ EOF
2785
+ - collapseable_section_end "write-dotenv-api"
2786
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
2787
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2788
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2789
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2790
+ - collapseable_section_end "nodeinstall"
2791
+ - cd api
2792
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2793
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2794
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2795
+ - collapseable_section_end "nodeinstall"
2796
+ - collapseable_section_start "yarninstall" "Yarn install"
2797
+ - yarn install --immutable --inline-builds
2798
+ - collapseable_section_end "yarninstall"
2799
+ - yarn build
2800
+ cache:
2801
+ - key: api-yarn
2802
+ policy: pull-push
2803
+ paths:
2804
+ - api/.yarn
2805
+ - key: api-node-modules
2806
+ policy: pull-push
2807
+ paths:
2808
+ - api/node_modules
2809
+ - api/.yarn/install-state.gz
2810
+ artifacts:
2811
+ paths:
2812
+ - api/__build_info.json
2813
+ - api/.next
2814
+ - api/dist
2815
+ exclude:
2816
+ - api/.env
2817
+ - api/.next/cache/**/*
2818
+ expire_in: 1 day
2819
+ when: always
2820
+ reports: {}
2821
+ rules:
2822
+ - when: never
2823
+ if: $CI_PIPELINE_SOURCE == "trigger"
2824
+ - if: $CI_COMMIT_TAG
2825
+ needs: []
2826
+ retry: *a1
2827
+ interruptible: true
2828
+ 'api 🔨 docker | prod ':
2829
+ stage: build
2830
+ image: path/to/docker/docker-build:the-version
2831
+ services:
2832
+ - name: docker:29.5.1-dind
2833
+ command:
2834
+ - --tls=false
2835
+ - --registry-mirror=https://mirror.gcr.io
2836
+ variables:
2837
+ DOCKER_HOST: tcp://docker:2375
2838
+ DOCKER_TLS_CERTDIR: ''
2839
+ DOCKER_DRIVER: overlay2
2840
+ DOCKER_BUILDKIT: '1'
2841
+ KUBERNETES_CPU_REQUEST: '0.45'
2842
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2843
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2844
+ script:
2845
+ - collapseable_section_start "injectvars" "Injecting variables"
2846
+ - export APP_DIR="api"
2847
+ - export DOCKER_BUILD_CONTEXT="."
2848
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2849
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api"
2850
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
2851
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2852
+ - |-
2853
+ export DOCKER_COPY_AND_INSTALL_APP="ENV YARN_ENABLE_INLINE_BUILDS=1
2854
+ COPY --chown=node:node $APP_DIR .
2855
+ RUN yarn plugin import workspace-tools
2856
+ RUN yarn workspaces focus --production
2857
+ RUN yarn rebuild"
2858
+ - |-
2859
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
2860
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2861
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2862
+ COPY --chown=node:node .yarn /app/.yarn"
2863
+ - collapseable_section_end "injectvars"
2864
+ - ensureNodeDockerfile
2865
+ - collapseable_section_start "docker-login" "Docker Login"
2866
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
2867
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
2868
+ - collapseable_section_end "docker-login"
2869
+ - collapseable_section_start "docker-build" "Docker build"
2870
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2871
+ - collapseable_section_end "docker-build"
2872
+ - collapseable_section_start "docker-push" "Docker push and tag"
2873
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2874
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2875
+ - docker push $DOCKER_CACHE_IMAGE
2876
+ - collapseable_section_end "docker-push"
2877
+ cache:
2878
+ - key: api-yarn
2879
+ policy: pull
2880
+ paths:
2881
+ - api/.yarn
2882
+ rules:
2883
+ - when: never
2884
+ if: $CI_PIPELINE_SOURCE == "trigger"
2885
+ - if: $CI_COMMIT_TAG
2886
+ needs:
2887
+ - 'api 🔨 app | prod '
2888
+ retry: *a1
2889
+ interruptible: true
2890
+ 'api 🚀 Deploy | prod ':
2891
+ stage: deploy prod
2892
+ image: path/to/docker/gcloud:the-version
2893
+ variables:
2894
+ KUBERNETES_CPU_REQUEST: '0.22'
2895
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2896
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2897
+ script:
2898
+ - collapseable_section_start "injectvars" "Injecting variables"
2899
+ - export ENV_SHORT="prod"
2900
+ - export APP_DIR="api"
2901
+ - export ENV_TYPE="prod"
2902
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2903
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2904
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2905
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2906
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2907
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2908
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2909
+ - export DEPLOY_CLOUD_RUN_SERVICE_NAME="pan-test-app-prod-api"
2910
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2911
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2912
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
2913
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
2914
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_SERVICE_NAME\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2915
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2916
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api"
2917
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
2918
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2919
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2920
+ - collapseable_section_end "injectvars"
2921
+ - collapseable_section_start "prepare" "Prepare..."
2922
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
2923
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
2924
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2925
+ - collapseable_section_end "prepare"
2926
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
2927
+ - |
2928
+ cat > ____envvars.yaml <<EOF
2929
+ ENV_SHORT: |-
2930
+ prod
2931
+ APP_DIR: |-
2932
+ api
2933
+ ENV_TYPE: |-
2934
+ prod
2935
+ BUILD_INFO_BUILD_ID: |-
2936
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2937
+ BUILD_INFO_BUILD_TIME: |-
2938
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2939
+ BUILD_INFO_CURRENT_VERSION: |-
2940
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
2941
+ HOSTNAME: |-
2942
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2943
+ ROOT_URL: |-
2944
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2945
+ HOSTNAME_INTERNAL: |-
2946
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2947
+ ROOT_URL_INTERNAL: |-
2948
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2949
+ DEPLOY_CLOUD_RUN_SERVICE_NAME: |-
2950
+ pan-test-app-prod-api
2951
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2952
+ asdf
2953
+ DEPLOY_CLOUD_RUN_REGION: |-
2954
+ asia-east1
2955
+ GCLOUD_RUN_canonicalHostSuffix: |-
2956
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
2957
+ _ALL_ENV_VAR_KEYS: |-
2958
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_SERVICE_NAME","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2959
+
2960
+ EOF
2961
+ - collapseable_section_end "writeenvvars"
2962
+ - collapseable_section_start "deploy" "Deploy to cloud run"
2963
+ - gcloud run deploy pan-test-app-prod-api --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --no-allow-unauthenticated --ingress=all --cpu-boost
2964
+ - collapseable_section_end "deploy"
2965
+ - collapseable_section_start "cleanup" "Cleanup"
2966
+ - set +e
2967
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
2968
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api@$version --quiet --delete-tags; done
2969
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
2970
+ - set -e
2971
+ - collapseable_section_end "cleanup"
2972
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
2973
+ environment:
2974
+ name: prod/api
2975
+ url: $CL_GITLAB_ENVIRONMENT_URL
2976
+ on_stop: 'api 🛑 Stop ⚠️ | prod '
2977
+ artifacts:
2978
+ reports:
2979
+ dotenv: gitlab_environment.env
2980
+ rules:
2981
+ - when: never
2982
+ if: $CI_PIPELINE_SOURCE == "trigger"
2983
+ - when: manual
2984
+ if: $CI_COMMIT_TAG
2985
+ needs:
2986
+ - job: 'api 🔨 app | prod '
2987
+ artifacts: false
2988
+ - job: 'api 🔨 docker | prod '
2989
+ artifacts: false
2990
+ retry: *a1
2991
+ interruptible: true
2992
+ allow_failure: true
2993
+ 'api 🛑 Stop ⚠️ | prod ':
2994
+ stage: stop prod
2995
+ image: path/to/docker/gcloud:the-version
2996
+ variables:
2997
+ KUBERNETES_CPU_REQUEST: '0.22'
2998
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2999
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3000
+ GIT_STRATEGY: none
3001
+ script:
3002
+ - collapseable_section_start "injectvars" "Injecting variables"
3003
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
3004
+ - collapseable_section_end "injectvars"
3005
+ - set +e
3006
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
3007
+ - gcloud run services delete pan-test-app-prod-api --project=asdf --region=asia-east1
3008
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags
3009
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
3010
+ - set -e
3011
+ environment:
3012
+ name: prod/api
3013
+ action: stop
3014
+ rules:
3015
+ - when: never
3016
+ if: $CI_PIPELINE_SOURCE == "trigger"
3017
+ - when: manual
3018
+ if: $CI_COMMIT_TAG
3019
+ needs: []
3020
+ retry: *a1
3021
+ interruptible: true
3022
+ allow_failure: true
3023
+ create release:
3024
+ stage: release
3025
+ image: path/to/docker/semantic-release:the-version
3026
+ script:
3027
+ - semanticRelease
3028
+ after_script:
3029
+ - echo '👉 If this job failed with access denied, the project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
3030
+ rules:
3031
+ - &a6
3032
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
3033
+ when: never
3034
+ - &a7
3035
+ if: $CI_PIPELINE_SOURCE == "trigger"
3036
+ when: never
3037
+ - &a8
3038
+ if: $CI_PIPELINE_SOURCE == "schedule"
3039
+ when: never
3040
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3041
+ when: manual
3042
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
3043
+ when: manual
3044
+ ⚠️ force create release:
3045
+ stage: release
3046
+ image: path/to/docker/semantic-release:the-version
3047
+ script:
3048
+ - semanticRelease
3049
+ after_script:
3050
+ - echo '👉 If this job failed with access denied, the project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
3051
+ rules:
3052
+ - *a6
3053
+ - *a7
3054
+ - *a8
3055
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3056
+ when: manual
3057
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
3058
+ when: manual
3059
+ needs: []
3060
+ "
3061
+ `;