@catladder/pipeline 1.169.0 → 1.170.1

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,4535 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for referencing-other-vars 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
+ - rollback
32
+ - rollback dev
33
+ - rollback review
34
+ - rollback stage
35
+ - rollback prod
36
+ - stop
37
+ - stop dev
38
+ - stop review
39
+ - stop stage
40
+ - stop prod
41
+ - release
42
+ variables:
43
+ FF_USE_FASTZIP: 'true'
44
+ ARTIFACT_COMPRESSION_LEVEL: fast
45
+ CACHE_COMPRESSION_LEVEL: fast
46
+ TRANSFER_METER_FREQUENCY: 5s
47
+ GIT_DEPTH: '1'
48
+ app1 🛡 audit:
49
+ stage: test
50
+ image: path/to/docker/jobs-default:the-version
51
+ variables:
52
+ KUBERNETES_CPU_REQUEST: '0.45'
53
+ KUBERNETES_MEMORY_REQUEST: 1Gi
54
+ KUBERNETES_MEMORY_LIMIT: 4Gi
55
+ script:
56
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
57
+ - export APP_PATH="app1"
58
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
59
+ - cd app1
60
+ - yarn npm audit --environment production
61
+ rules:
62
+ - when: never
63
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
64
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
65
+ - if: $CI_MERGE_REQUEST_ID
66
+ needs: []
67
+ retry: &a1
68
+ max: 2
69
+ when:
70
+ - runner_system_failure
71
+ - stuck_or_timeout_failure
72
+ interruptible: true
73
+ allow_failure: true
74
+ app1 👮 lint:
75
+ stage: test
76
+ image: path/to/docker/jobs-default:the-version
77
+ variables:
78
+ KUBERNETES_CPU_REQUEST: '0.45'
79
+ KUBERNETES_MEMORY_REQUEST: 1Gi
80
+ KUBERNETES_MEMORY_LIMIT: 4Gi
81
+ script:
82
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
83
+ - export APP_PATH="app1"
84
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
85
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
86
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
87
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
88
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
89
+ - cd app1
90
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
91
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
92
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
93
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
94
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
95
+ - yarn install --immutable
96
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
97
+ - yarn lint
98
+ cache:
99
+ - key: app1-yarn
100
+ policy: pull-push
101
+ paths:
102
+ - app1/.yarn
103
+ - key: app1-node-modules
104
+ policy: pull-push
105
+ paths:
106
+ - app1/node_modules
107
+ rules:
108
+ - when: never
109
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
110
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
111
+ - if: $CI_MERGE_REQUEST_ID
112
+ needs: []
113
+ retry: *a1
114
+ interruptible: true
115
+ app1 đŸ§Ē test:
116
+ stage: test
117
+ image: path/to/docker/jobs-testing-chrome:the-version
118
+ variables:
119
+ KUBERNETES_CPU_REQUEST: '0.45'
120
+ KUBERNETES_MEMORY_REQUEST: 1Gi
121
+ KUBERNETES_MEMORY_LIMIT: 4Gi
122
+ script:
123
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
124
+ - export APP_PATH="app1"
125
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
126
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
127
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
128
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
129
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
130
+ - cd app1
131
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
132
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
133
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
134
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
135
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
136
+ - yarn install --immutable
137
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
138
+ - yarn test
139
+ cache:
140
+ - key: app1-yarn
141
+ policy: pull-push
142
+ paths:
143
+ - app1/.yarn
144
+ - key: app1-node-modules
145
+ policy: pull-push
146
+ paths:
147
+ - app1/node_modules
148
+ rules:
149
+ - when: never
150
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
151
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
152
+ - if: $CI_MERGE_REQUEST_ID
153
+ needs: []
154
+ retry: *a1
155
+ interruptible: true
156
+ 'app1 🔨 app | dev ':
157
+ stage: build
158
+ image: path/to/docker/jobs-default:the-version
159
+ variables:
160
+ KUBERNETES_CPU_REQUEST: '0.45'
161
+ KUBERNETES_MEMORY_REQUEST: 1Gi
162
+ KUBERNETES_MEMORY_LIMIT: 4Gi
163
+ script:
164
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
165
+ - export ENV_SHORT="dev"
166
+ - export APP_DIR="app1"
167
+ - export ENV_TYPE="dev"
168
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
169
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
170
+ - 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")"
171
+ - export HOST="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
172
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
173
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
174
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
175
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
176
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
177
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
178
+ - export SECRET1="$CL_dev_app1_SECRET1"
179
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey"
180
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix"
181
+ - export foo="foo-value"
182
+ - export bar="bar-value"
183
+ - 'export foo3="from app3: foo-value-3"'
184
+ - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
185
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
186
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
187
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
188
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
189
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
190
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
191
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
192
+ - cd app1
193
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
194
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
195
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
196
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
197
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
198
+ - yarn install --immutable
199
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
200
+ - yarn build
201
+ cache:
202
+ - key: app1-yarn
203
+ policy: pull-push
204
+ paths:
205
+ - app1/.yarn
206
+ - key: app1-node-modules
207
+ policy: pull-push
208
+ paths:
209
+ - app1/node_modules
210
+ - key: app1-next-cache
211
+ policy: pull-push
212
+ paths:
213
+ - app1/.next/cache
214
+ artifacts:
215
+ paths:
216
+ - app1/__build_info.json
217
+ - app1/.next
218
+ - app1/dist
219
+ expire_in: 1 day
220
+ when: always
221
+ reports: {}
222
+ rules:
223
+ - when: never
224
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
225
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
226
+ needs: []
227
+ retry: *a1
228
+ interruptible: true
229
+ 'app1 🔨 docker | dev ':
230
+ stage: build
231
+ image: path/to/docker/docker-build:the-version
232
+ services:
233
+ - name: docker:24.0.6-dind
234
+ command:
235
+ - --tls=false
236
+ - --registry-mirror=https://mirror.gcr.io
237
+ variables:
238
+ DOCKER_HOST: tcp://0.0.0.0:2375
239
+ DOCKER_TLS_CERTDIR: ''
240
+ DOCKER_DRIVER: overlay2
241
+ DOCKER_BUILDKIT: '1'
242
+ KUBERNETES_CPU_REQUEST: '0.45'
243
+ KUBERNETES_MEMORY_REQUEST: 1Gi
244
+ KUBERNETES_MEMORY_LIMIT: 2Gi
245
+ script:
246
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
247
+ - export APP_DIR="app1"
248
+ - export DOCKER_BUILD_CONTEXT="."
249
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
250
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1"
251
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
252
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
253
+ - |-
254
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
255
+ RUN yarn plugin import workspace-tools
256
+ RUN yarn workspaces focus --production && yarn rebuild"
257
+ - |-
258
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app1/package.json /app/app1/package.json
259
+ COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
260
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
261
+ COPY --chown=node:node .yarn /app/.yarn"
262
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
263
+ - ensureNodeDockerfile
264
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
265
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey")
266
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
267
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
268
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
269
+ - 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
270
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
271
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
272
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
273
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
274
+ - docker push $DOCKER_CACHE_IMAGE
275
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
276
+ cache:
277
+ - key: app1-yarn
278
+ policy: pull
279
+ paths:
280
+ - app1/.yarn
281
+ rules:
282
+ - when: never
283
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
284
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
285
+ needs:
286
+ - 'app1 🔨 app | dev '
287
+ retry: *a1
288
+ interruptible: true
289
+ 'app1 🧾 sbom | dev ':
290
+ stage: build
291
+ image: aquasec/trivy:0.38.3
292
+ variables: {}
293
+ script:
294
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
295
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
296
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
297
+ artifacts:
298
+ paths:
299
+ - __sbom.json
300
+ rules:
301
+ - when: never
302
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
303
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
304
+ needs: []
305
+ retry: *a1
306
+ interruptible: true
307
+ allow_failure: true
308
+ 'app1 🚀 Deploy | dev ':
309
+ stage: deploy dev
310
+ image: path/to/docker/gcloud:the-version
311
+ variables:
312
+ KUBERNETES_CPU_REQUEST: '0.22'
313
+ KUBERNETES_MEMORY_REQUEST: 200Mi
314
+ KUBERNETES_MEMORY_LIMIT: 400Mi
315
+ script:
316
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
317
+ - export ENV_SHORT="dev"
318
+ - export APP_DIR="app1"
319
+ - export ENV_TYPE="dev"
320
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
321
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
322
+ - 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")"
323
+ - export HOST="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
324
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
325
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
326
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
327
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
328
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
329
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
330
+ - export SECRET1="$CL_dev_app1_SECRET1"
331
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey"
332
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix"
333
+ - export foo="foo-value"
334
+ - export bar="bar-value"
335
+ - 'export foo3="from app3: foo-value-3"'
336
+ - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
337
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
338
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
339
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1"
340
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
341
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
342
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
343
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
344
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
345
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey")
346
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
347
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
348
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
349
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
350
+ - |
351
+ cat > ____envvars.yaml <<EOF
352
+ ENV_SHORT: |-
353
+ dev
354
+ APP_DIR: |-
355
+ app1
356
+ ENV_TYPE: |-
357
+ dev
358
+ BUILD_INFO_BUILD_ID: |-
359
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
360
+ BUILD_INFO_BUILD_TIME: |-
361
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
362
+ BUILD_INFO_CURRENT_VERSION: |-
363
+ $(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 's/^/ /')
364
+ HOST: |-
365
+ $(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
366
+ ROOT_URL: |-
367
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
368
+ HOST_INTERNAL: |-
369
+ $(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
370
+ HOST_CANONICAL: |-
371
+ $(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
372
+ ROOT_URL_INTERNAL: |-
373
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
374
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
375
+ asdf
376
+ DEPLOY_CLOUD_RUN_REGION: |-
377
+ asia-east1
378
+ SECRET1: |-
379
+ $(printf %s "$CL_dev_app1_SECRET1" | sed 's/^/ /')
380
+ GCLOUD_RUN_canonicalHostSuffix: |-
381
+ $(printf %s "$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
382
+ foo: |-
383
+ foo-value
384
+ bar: |-
385
+ bar-value
386
+ foo3: |-
387
+ from app3: foo-value-3
388
+ circle: |-
389
+ this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
390
+ _ALL_ENV_VAR_KEYS: |-
391
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
392
+
393
+ EOF
394
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
395
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
396
+ - gcloud run deploy pan-test-app-dev-app1 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app1,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-app1 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
397
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
398
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
399
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-app1 --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
400
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1 --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/app1@$version --quiet --delete-tags; done
401
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
402
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
403
+ - echo 'Uploading SBOM to Dependency Track'
404
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
405
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
406
+ environment:
407
+ name: dev/app1
408
+ url: $CL_GITLAB_ENVIRONMENT_URL
409
+ on_stop: 'app1 🛑 Stop âš ī¸ | dev '
410
+ auto_stop_in: 4 weeks
411
+ artifacts:
412
+ reports:
413
+ dotenv: gitlab_environment.env
414
+ rules:
415
+ - when: never
416
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
417
+ - when: on_success
418
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
419
+ needs:
420
+ - job: app1 👮 lint
421
+ artifacts: false
422
+ - job: 'app1 🔨 app | dev '
423
+ artifacts: false
424
+ - job: 'app1 🔨 docker | dev '
425
+ artifacts: false
426
+ - job: app1 đŸ§Ē test
427
+ artifacts: false
428
+ - job: 'app1 🧾 sbom | dev '
429
+ artifacts: true
430
+ - job: app1 🛡 audit
431
+ artifacts: false
432
+ retry: *a1
433
+ interruptible: true
434
+ allow_failure: false
435
+ 'app1 🛑 Stop âš ī¸ | dev ':
436
+ stage: stop dev
437
+ image: path/to/docker/gcloud:the-version
438
+ variables:
439
+ KUBERNETES_CPU_REQUEST: '0.22'
440
+ KUBERNETES_MEMORY_REQUEST: 200Mi
441
+ KUBERNETES_MEMORY_LIMIT: 400Mi
442
+ GIT_STRATEGY: none
443
+ script:
444
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
445
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
446
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
447
+ - set +e
448
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey")
449
+ - gcloud run services delete pan-test-app-dev-app1 --project=asdf --region=asia-east1
450
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1 --quiet --delete-tags
451
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
452
+ - echo 'Disabling component in Dependency Track'
453
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app1" "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
454
+ - set -e
455
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
456
+ environment:
457
+ name: dev/app1
458
+ url: $CL_GITLAB_ENVIRONMENT_URL
459
+ action: stop
460
+ artifacts:
461
+ reports:
462
+ dotenv: gitlab_environment.env
463
+ rules:
464
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
465
+ when: on_success
466
+ - when: never
467
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
468
+ - when: manual
469
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
470
+ needs: []
471
+ retry: *a1
472
+ interruptible: true
473
+ allow_failure: true
474
+ 'app1 🔨 app | review ':
475
+ stage: build
476
+ image: path/to/docker/jobs-default:the-version
477
+ variables:
478
+ KUBERNETES_CPU_REQUEST: '0.45'
479
+ KUBERNETES_MEMORY_REQUEST: 1Gi
480
+ KUBERNETES_MEMORY_LIMIT: 4Gi
481
+ script:
482
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
483
+ - export ENV_SHORT="review"
484
+ - export APP_DIR="app1"
485
+ - export ENV_TYPE="review"
486
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
487
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
488
+ - 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")"
489
+ - export HOST="$(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
490
+ - 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
491
+ - export HOST_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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
492
+ - export HOST_CANONICAL="$(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
493
+ - 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
494
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
495
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
496
+ - export SECRET1="$CL_review_app1_SECRET1"
497
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_app1_GCLOUD_DEPLOY_credentialsKey"
498
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix"
499
+ - export foo="foo-value"
500
+ - export bar="bar-value"
501
+ - 'export foo3="from app3: foo-value-3"'
502
+ - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
503
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
504
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
505
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
506
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
507
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
508
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
509
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
510
+ - cd app1
511
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
512
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
513
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
514
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
515
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
516
+ - yarn install --immutable
517
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
518
+ - yarn build
519
+ cache:
520
+ - key: app1-yarn
521
+ policy: pull-push
522
+ paths:
523
+ - app1/.yarn
524
+ - key: app1-node-modules
525
+ policy: pull-push
526
+ paths:
527
+ - app1/node_modules
528
+ - key: app1-next-cache
529
+ policy: pull-push
530
+ paths:
531
+ - app1/.next/cache
532
+ artifacts:
533
+ paths:
534
+ - app1/__build_info.json
535
+ - app1/.next
536
+ - app1/dist
537
+ expire_in: 1 day
538
+ when: always
539
+ reports: {}
540
+ rules:
541
+ - if: $CI_MERGE_REQUEST_ID
542
+ needs: []
543
+ retry: *a1
544
+ interruptible: true
545
+ 'app1 🔨 docker | review ':
546
+ stage: build
547
+ image: path/to/docker/docker-build:the-version
548
+ services:
549
+ - name: docker:24.0.6-dind
550
+ command:
551
+ - --tls=false
552
+ - --registry-mirror=https://mirror.gcr.io
553
+ variables:
554
+ DOCKER_HOST: tcp://0.0.0.0:2375
555
+ DOCKER_TLS_CERTDIR: ''
556
+ DOCKER_DRIVER: overlay2
557
+ DOCKER_BUILDKIT: '1'
558
+ KUBERNETES_CPU_REQUEST: '0.45'
559
+ KUBERNETES_MEMORY_REQUEST: 1Gi
560
+ KUBERNETES_MEMORY_LIMIT: 2Gi
561
+ script:
562
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
563
+ - export APP_DIR="app1"
564
+ - export DOCKER_BUILD_CONTEXT="."
565
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
566
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
567
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
568
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
569
+ - |-
570
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
571
+ RUN yarn plugin import workspace-tools
572
+ RUN yarn workspaces focus --production && yarn rebuild"
573
+ - |-
574
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app1/package.json /app/app1/package.json
575
+ COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
576
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
577
+ COPY --chown=node:node .yarn /app/.yarn"
578
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
579
+ - ensureNodeDockerfile
580
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
581
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app1_GCLOUD_DEPLOY_credentialsKey")
582
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
583
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
584
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
585
+ - 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
586
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
587
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
588
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
589
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
590
+ - docker push $DOCKER_CACHE_IMAGE
591
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
592
+ cache:
593
+ - key: app1-yarn
594
+ policy: pull
595
+ paths:
596
+ - app1/.yarn
597
+ rules:
598
+ - if: $CI_MERGE_REQUEST_ID
599
+ needs:
600
+ - 'app1 🔨 app | review '
601
+ retry: *a1
602
+ interruptible: true
603
+ 'app1 🧾 sbom | review ':
604
+ stage: build
605
+ image: aquasec/trivy:0.38.3
606
+ variables: {}
607
+ script:
608
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
609
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
610
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
611
+ artifacts:
612
+ paths:
613
+ - __sbom.json
614
+ rules:
615
+ - if: $CI_MERGE_REQUEST_ID
616
+ needs: []
617
+ retry: *a1
618
+ interruptible: true
619
+ allow_failure: true
620
+ 'app1 🚀 Deploy | review ':
621
+ stage: deploy review
622
+ image: path/to/docker/gcloud:the-version
623
+ variables:
624
+ KUBERNETES_CPU_REQUEST: '0.22'
625
+ KUBERNETES_MEMORY_REQUEST: 200Mi
626
+ KUBERNETES_MEMORY_LIMIT: 400Mi
627
+ script:
628
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
629
+ - export ENV_SHORT="review"
630
+ - export APP_DIR="app1"
631
+ - export ENV_TYPE="review"
632
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
633
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
634
+ - 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")"
635
+ - export HOST="$(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
636
+ - 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
637
+ - export HOST_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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
638
+ - export HOST_CANONICAL="$(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
639
+ - 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
640
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
641
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
642
+ - export SECRET1="$CL_review_app1_SECRET1"
643
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_app1_GCLOUD_DEPLOY_credentialsKey"
644
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix"
645
+ - export foo="foo-value"
646
+ - export bar="bar-value"
647
+ - 'export foo3="from app3: foo-value-3"'
648
+ - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
649
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
650
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
651
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
652
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
653
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
654
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
655
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
656
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
657
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app1_GCLOUD_DEPLOY_credentialsKey")
658
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
659
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
660
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
661
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
662
+ - |
663
+ cat > ____envvars.yaml <<EOF
664
+ ENV_SHORT: |-
665
+ review
666
+ APP_DIR: |-
667
+ app1
668
+ ENV_TYPE: |-
669
+ review
670
+ BUILD_INFO_BUILD_ID: |-
671
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
672
+ BUILD_INFO_BUILD_TIME: |-
673
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
674
+ BUILD_INFO_CURRENT_VERSION: |-
675
+ $(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 's/^/ /')
676
+ HOST: |-
677
+ $(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
678
+ ROOT_URL: |-
679
+ $(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
680
+ HOST_INTERNAL: |-
681
+ $(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
682
+ HOST_CANONICAL: |-
683
+ $(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
684
+ ROOT_URL_INTERNAL: |-
685
+ $(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
686
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
687
+ asdf
688
+ DEPLOY_CLOUD_RUN_REGION: |-
689
+ asia-east1
690
+ SECRET1: |-
691
+ $(printf %s "$CL_review_app1_SECRET1" | sed 's/^/ /')
692
+ GCLOUD_RUN_canonicalHostSuffix: |-
693
+ $(printf %s "$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
694
+ foo: |-
695
+ foo-value
696
+ bar: |-
697
+ bar-value
698
+ foo3: |-
699
+ from app3: foo-value-3
700
+ circle: |-
701
+ this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
702
+ _ALL_ENV_VAR_KEYS: |-
703
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
704
+
705
+ EOF
706
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
707
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
708
+ - 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"; })-app1" | awk '{print tolower($0)}') --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -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=app1,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"; })-app1" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
709
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
710
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
711
+ - 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"; })-app1" | 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
712
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -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/app1/$([ -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
713
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
714
+ - set +e
715
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1 --quiet --delete-tags
716
+ - set -e
717
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
718
+ - echo 'Uploading SBOM to Dependency Track'
719
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
720
+ - echo "CL_GITLAB_ENVIRONMENT_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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
721
+ environment:
722
+ name: review/$CI_COMMIT_REF_NAME/app1
723
+ url: $CL_GITLAB_ENVIRONMENT_URL
724
+ on_stop: 'app1 🛑 Stop âš ī¸ | review '
725
+ auto_stop_in: 1 week
726
+ artifacts:
727
+ reports:
728
+ dotenv: gitlab_environment.env
729
+ rules:
730
+ - when: on_success
731
+ if: $CI_MERGE_REQUEST_ID
732
+ needs:
733
+ - job: app1 👮 lint
734
+ artifacts: false
735
+ - job: 'app1 🔨 app | review '
736
+ artifacts: false
737
+ - job: 'app1 🔨 docker | review '
738
+ artifacts: false
739
+ - job: app1 đŸ§Ē test
740
+ artifacts: false
741
+ - job: 'app1 🧾 sbom | review '
742
+ artifacts: true
743
+ - job: app1 🛡 audit
744
+ artifacts: false
745
+ retry: *a1
746
+ interruptible: true
747
+ allow_failure: false
748
+ 'app1 🛑 Stop âš ī¸ | review ':
749
+ stage: stop review
750
+ image: path/to/docker/gcloud:the-version
751
+ variables:
752
+ KUBERNETES_CPU_REQUEST: '0.22'
753
+ KUBERNETES_MEMORY_REQUEST: 200Mi
754
+ KUBERNETES_MEMORY_LIMIT: 400Mi
755
+ GIT_STRATEGY: none
756
+ script:
757
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
758
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
759
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
760
+ - set +e
761
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app1_GCLOUD_DEPLOY_credentialsKey")
762
+ - 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"; })-app1" | awk '{print tolower($0)}') --project=asdf --region=asia-east1
763
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -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
764
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
765
+ - set +e
766
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1 --quiet --delete-tags
767
+ - set -e
768
+ - echo 'Disabling component in Dependency Track'
769
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app1" "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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
770
+ - set -e
771
+ - echo "CL_GITLAB_ENVIRONMENT_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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
772
+ environment:
773
+ name: review/$CI_COMMIT_REF_NAME/app1
774
+ url: $CL_GITLAB_ENVIRONMENT_URL
775
+ action: stop
776
+ artifacts:
777
+ reports:
778
+ dotenv: gitlab_environment.env
779
+ rules:
780
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
781
+ when: on_success
782
+ - when: manual
783
+ if: $CI_MERGE_REQUEST_ID
784
+ needs: []
785
+ retry: *a1
786
+ interruptible: true
787
+ allow_failure: true
788
+ 'app1 🔨 app | stage ':
789
+ stage: build
790
+ image: path/to/docker/jobs-default:the-version
791
+ variables:
792
+ KUBERNETES_CPU_REQUEST: '0.45'
793
+ KUBERNETES_MEMORY_REQUEST: 1Gi
794
+ KUBERNETES_MEMORY_LIMIT: 4Gi
795
+ script:
796
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
797
+ - export ENV_SHORT="stage"
798
+ - export APP_DIR="app1"
799
+ - export ENV_TYPE="stage"
800
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
801
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
802
+ - 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")"
803
+ - export HOST="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
804
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
805
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
806
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
807
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
808
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
809
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
810
+ - export SECRET1="$CL_stage_app1_SECRET1"
811
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey"
812
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix"
813
+ - export foo="foo-value"
814
+ - export bar="bar-value"
815
+ - 'export foo3="from app3: foo-value-3"'
816
+ - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
817
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
818
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
819
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
820
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
821
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
822
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
823
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
824
+ - cd app1
825
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
826
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
827
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
828
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
829
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
830
+ - yarn install --immutable
831
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
832
+ - yarn build
833
+ cache:
834
+ - key: app1-yarn
835
+ policy: pull-push
836
+ paths:
837
+ - app1/.yarn
838
+ - key: app1-node-modules
839
+ policy: pull-push
840
+ paths:
841
+ - app1/node_modules
842
+ - key: app1-next-cache
843
+ policy: pull-push
844
+ paths:
845
+ - app1/.next/cache
846
+ artifacts:
847
+ paths:
848
+ - app1/__build_info.json
849
+ - app1/.next
850
+ - app1/dist
851
+ expire_in: 1 day
852
+ when: always
853
+ reports: {}
854
+ rules:
855
+ - if: $CI_COMMIT_TAG
856
+ needs: []
857
+ retry: *a1
858
+ interruptible: true
859
+ 'app1 🔨 docker | stage ':
860
+ stage: build
861
+ image: path/to/docker/docker-build:the-version
862
+ services:
863
+ - name: docker:24.0.6-dind
864
+ command:
865
+ - --tls=false
866
+ - --registry-mirror=https://mirror.gcr.io
867
+ variables:
868
+ DOCKER_HOST: tcp://0.0.0.0:2375
869
+ DOCKER_TLS_CERTDIR: ''
870
+ DOCKER_DRIVER: overlay2
871
+ DOCKER_BUILDKIT: '1'
872
+ KUBERNETES_CPU_REQUEST: '0.45'
873
+ KUBERNETES_MEMORY_REQUEST: 1Gi
874
+ KUBERNETES_MEMORY_LIMIT: 2Gi
875
+ script:
876
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
877
+ - export APP_DIR="app1"
878
+ - export DOCKER_BUILD_CONTEXT="."
879
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
880
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1"
881
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
882
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
883
+ - |-
884
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
885
+ RUN yarn plugin import workspace-tools
886
+ RUN yarn workspaces focus --production && yarn rebuild"
887
+ - |-
888
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app1/package.json /app/app1/package.json
889
+ COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
890
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
891
+ COPY --chown=node:node .yarn /app/.yarn"
892
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
893
+ - ensureNodeDockerfile
894
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
895
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey")
896
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
897
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
898
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
899
+ - 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
900
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
901
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
902
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
903
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
904
+ - docker push $DOCKER_CACHE_IMAGE
905
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
906
+ cache:
907
+ - key: app1-yarn
908
+ policy: pull
909
+ paths:
910
+ - app1/.yarn
911
+ rules:
912
+ - if: $CI_COMMIT_TAG
913
+ needs:
914
+ - 'app1 🔨 app | stage '
915
+ retry: *a1
916
+ interruptible: true
917
+ 'app1 🧾 sbom | stage ':
918
+ stage: build
919
+ image: aquasec/trivy:0.38.3
920
+ variables: {}
921
+ script:
922
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
923
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
924
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
925
+ artifacts:
926
+ paths:
927
+ - __sbom.json
928
+ rules:
929
+ - if: $CI_COMMIT_TAG
930
+ needs: []
931
+ retry: *a1
932
+ interruptible: true
933
+ allow_failure: true
934
+ 'app1 🚀 Deploy | stage ':
935
+ stage: deploy stage
936
+ image: path/to/docker/gcloud:the-version
937
+ variables:
938
+ KUBERNETES_CPU_REQUEST: '0.22'
939
+ KUBERNETES_MEMORY_REQUEST: 200Mi
940
+ KUBERNETES_MEMORY_LIMIT: 400Mi
941
+ script:
942
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
943
+ - export ENV_SHORT="stage"
944
+ - export APP_DIR="app1"
945
+ - export ENV_TYPE="stage"
946
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
947
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
948
+ - 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")"
949
+ - export HOST="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
950
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
951
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
952
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
953
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
954
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
955
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
956
+ - export SECRET1="$CL_stage_app1_SECRET1"
957
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey"
958
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix"
959
+ - export foo="foo-value"
960
+ - export bar="bar-value"
961
+ - 'export foo3="from app3: foo-value-3"'
962
+ - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
963
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
964
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
965
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1"
966
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
967
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
968
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
969
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
970
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
971
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey")
972
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
973
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
974
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
975
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
976
+ - |
977
+ cat > ____envvars.yaml <<EOF
978
+ ENV_SHORT: |-
979
+ stage
980
+ APP_DIR: |-
981
+ app1
982
+ ENV_TYPE: |-
983
+ stage
984
+ BUILD_INFO_BUILD_ID: |-
985
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
986
+ BUILD_INFO_BUILD_TIME: |-
987
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
988
+ BUILD_INFO_CURRENT_VERSION: |-
989
+ $(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 's/^/ /')
990
+ HOST: |-
991
+ $(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
992
+ ROOT_URL: |-
993
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
994
+ HOST_INTERNAL: |-
995
+ $(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
996
+ HOST_CANONICAL: |-
997
+ $(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
998
+ ROOT_URL_INTERNAL: |-
999
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1000
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1001
+ asdf
1002
+ DEPLOY_CLOUD_RUN_REGION: |-
1003
+ asia-east1
1004
+ SECRET1: |-
1005
+ $(printf %s "$CL_stage_app1_SECRET1" | sed 's/^/ /')
1006
+ GCLOUD_RUN_canonicalHostSuffix: |-
1007
+ $(printf %s "$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1008
+ foo: |-
1009
+ foo-value
1010
+ bar: |-
1011
+ bar-value
1012
+ foo3: |-
1013
+ from app3: foo-value-3
1014
+ circle: |-
1015
+ this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
1016
+ _ALL_ENV_VAR_KEYS: |-
1017
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
1018
+
1019
+ EOF
1020
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1021
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1022
+ - gcloud run deploy pan-test-app-stage-app1 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app1,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-app1 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1023
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1024
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1025
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-app1 --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
1026
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1 --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/app1@$version --quiet --delete-tags; done
1027
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
1028
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1029
+ - echo 'Uploading SBOM to Dependency Track'
1030
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1031
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1032
+ environment:
1033
+ name: stage/app1
1034
+ url: $CL_GITLAB_ENVIRONMENT_URL
1035
+ on_stop: 'app1 🛑 Stop âš ī¸ | stage '
1036
+ artifacts:
1037
+ reports:
1038
+ dotenv: gitlab_environment.env
1039
+ rules:
1040
+ - when: on_success
1041
+ if: $CI_COMMIT_TAG
1042
+ needs:
1043
+ - job: 'app1 🔨 app | stage '
1044
+ artifacts: false
1045
+ - job: 'app1 🔨 docker | stage '
1046
+ artifacts: false
1047
+ - job: 'app1 🧾 sbom | stage '
1048
+ artifacts: true
1049
+ retry: *a1
1050
+ interruptible: true
1051
+ allow_failure: false
1052
+ 'app1 🛑 Stop âš ī¸ | stage ':
1053
+ stage: stop stage
1054
+ image: path/to/docker/gcloud:the-version
1055
+ variables:
1056
+ KUBERNETES_CPU_REQUEST: '0.22'
1057
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1058
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1059
+ GIT_STRATEGY: none
1060
+ script:
1061
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1062
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1063
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1064
+ - set +e
1065
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey")
1066
+ - gcloud run services delete pan-test-app-stage-app1 --project=asdf --region=asia-east1
1067
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1 --quiet --delete-tags
1068
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
1069
+ - echo 'Disabling component in Dependency Track'
1070
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app1" "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1071
+ - set -e
1072
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1073
+ environment:
1074
+ name: stage/app1
1075
+ url: $CL_GITLAB_ENVIRONMENT_URL
1076
+ action: stop
1077
+ artifacts:
1078
+ reports:
1079
+ dotenv: gitlab_environment.env
1080
+ rules:
1081
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1082
+ when: on_success
1083
+ - when: manual
1084
+ if: $CI_COMMIT_TAG
1085
+ needs: []
1086
+ retry: *a1
1087
+ interruptible: true
1088
+ allow_failure: true
1089
+ 'app1 🔨 app | prod ':
1090
+ stage: build
1091
+ image: path/to/docker/jobs-default:the-version
1092
+ variables:
1093
+ KUBERNETES_CPU_REQUEST: '0.45'
1094
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1095
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1096
+ script:
1097
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1098
+ - export ENV_SHORT="prod"
1099
+ - export APP_DIR="app1"
1100
+ - export ENV_TYPE="prod"
1101
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1102
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1103
+ - 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")"
1104
+ - export HOST="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1105
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1106
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1107
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1108
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1109
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1110
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1111
+ - export SECRET1="$CL_prod_app1_SECRET1"
1112
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey"
1113
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix"
1114
+ - export foo="foo-value"
1115
+ - export bar="bar-value"
1116
+ - 'export foo3="from app3: foo-value-3"'
1117
+ - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
1118
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
1119
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1120
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
1121
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1122
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1123
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1124
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1125
+ - cd app1
1126
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1127
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1128
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1129
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1130
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1131
+ - yarn install --immutable
1132
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1133
+ - yarn build
1134
+ cache:
1135
+ - key: app1-yarn
1136
+ policy: pull-push
1137
+ paths:
1138
+ - app1/.yarn
1139
+ - key: app1-node-modules
1140
+ policy: pull-push
1141
+ paths:
1142
+ - app1/node_modules
1143
+ - key: app1-next-cache
1144
+ policy: pull-push
1145
+ paths:
1146
+ - app1/.next/cache
1147
+ artifacts:
1148
+ paths:
1149
+ - app1/__build_info.json
1150
+ - app1/.next
1151
+ - app1/dist
1152
+ expire_in: 1 day
1153
+ when: always
1154
+ reports: {}
1155
+ rules:
1156
+ - if: $CI_COMMIT_TAG
1157
+ needs: []
1158
+ retry: *a1
1159
+ interruptible: true
1160
+ 'app1 🔨 docker | prod ':
1161
+ stage: build
1162
+ image: path/to/docker/docker-build:the-version
1163
+ services:
1164
+ - name: docker:24.0.6-dind
1165
+ command:
1166
+ - --tls=false
1167
+ - --registry-mirror=https://mirror.gcr.io
1168
+ variables:
1169
+ DOCKER_HOST: tcp://0.0.0.0:2375
1170
+ DOCKER_TLS_CERTDIR: ''
1171
+ DOCKER_DRIVER: overlay2
1172
+ DOCKER_BUILDKIT: '1'
1173
+ KUBERNETES_CPU_REQUEST: '0.45'
1174
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1175
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1176
+ script:
1177
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1178
+ - export APP_DIR="app1"
1179
+ - export DOCKER_BUILD_CONTEXT="."
1180
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1181
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1"
1182
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
1183
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1184
+ - |-
1185
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1186
+ RUN yarn plugin import workspace-tools
1187
+ RUN yarn workspaces focus --production && yarn rebuild"
1188
+ - |-
1189
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app1/package.json /app/app1/package.json
1190
+ COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
1191
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1192
+ COPY --chown=node:node .yarn /app/.yarn"
1193
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1194
+ - ensureNodeDockerfile
1195
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1196
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey")
1197
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1198
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1199
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1200
+ - 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
1201
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1202
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1203
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1204
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1205
+ - docker push $DOCKER_CACHE_IMAGE
1206
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1207
+ cache:
1208
+ - key: app1-yarn
1209
+ policy: pull
1210
+ paths:
1211
+ - app1/.yarn
1212
+ rules:
1213
+ - if: $CI_COMMIT_TAG
1214
+ needs:
1215
+ - 'app1 🔨 app | prod '
1216
+ retry: *a1
1217
+ interruptible: true
1218
+ 'app1 🧾 sbom | prod ':
1219
+ stage: build
1220
+ image: aquasec/trivy:0.38.3
1221
+ variables: {}
1222
+ script:
1223
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1224
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1225
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
1226
+ artifacts:
1227
+ paths:
1228
+ - __sbom.json
1229
+ rules:
1230
+ - if: $CI_COMMIT_TAG
1231
+ needs: []
1232
+ retry: *a1
1233
+ interruptible: true
1234
+ allow_failure: true
1235
+ 'app1 🚀 Deploy | prod ':
1236
+ stage: deploy prod
1237
+ image: path/to/docker/gcloud:the-version
1238
+ variables:
1239
+ KUBERNETES_CPU_REQUEST: '0.22'
1240
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1241
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1242
+ script:
1243
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1244
+ - export ENV_SHORT="prod"
1245
+ - export APP_DIR="app1"
1246
+ - export ENV_TYPE="prod"
1247
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1248
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1249
+ - 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")"
1250
+ - export HOST="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1251
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1252
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1253
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1254
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1255
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1256
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1257
+ - export SECRET1="$CL_prod_app1_SECRET1"
1258
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey"
1259
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix"
1260
+ - export foo="foo-value"
1261
+ - export bar="bar-value"
1262
+ - 'export foo3="from app3: foo-value-3"'
1263
+ - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
1264
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
1265
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1266
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1"
1267
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
1268
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1269
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1270
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1271
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1272
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey")
1273
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1274
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1275
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1276
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1277
+ - |
1278
+ cat > ____envvars.yaml <<EOF
1279
+ ENV_SHORT: |-
1280
+ prod
1281
+ APP_DIR: |-
1282
+ app1
1283
+ ENV_TYPE: |-
1284
+ prod
1285
+ BUILD_INFO_BUILD_ID: |-
1286
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1287
+ BUILD_INFO_BUILD_TIME: |-
1288
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1289
+ BUILD_INFO_CURRENT_VERSION: |-
1290
+ $(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 's/^/ /')
1291
+ HOST: |-
1292
+ $(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1293
+ ROOT_URL: |-
1294
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1295
+ HOST_INTERNAL: |-
1296
+ $(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1297
+ HOST_CANONICAL: |-
1298
+ $(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1299
+ ROOT_URL_INTERNAL: |-
1300
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1301
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1302
+ asdf
1303
+ DEPLOY_CLOUD_RUN_REGION: |-
1304
+ asia-east1
1305
+ SECRET1: |-
1306
+ $(printf %s "$CL_prod_app1_SECRET1" | sed 's/^/ /')
1307
+ GCLOUD_RUN_canonicalHostSuffix: |-
1308
+ $(printf %s "$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1309
+ foo: |-
1310
+ foo-value
1311
+ bar: |-
1312
+ bar-value
1313
+ foo3: |-
1314
+ from app3: foo-value-3
1315
+ circle: |-
1316
+ this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
1317
+ _ALL_ENV_VAR_KEYS: |-
1318
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
1319
+
1320
+ EOF
1321
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1322
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1323
+ - gcloud run deploy pan-test-app-prod-app1 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app1,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-app1 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1324
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1325
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1326
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-app1 --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
1327
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1 --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/app1@$version --quiet --delete-tags; done
1328
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
1329
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1330
+ - echo 'Uploading SBOM to Dependency Track'
1331
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1332
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1333
+ environment:
1334
+ name: prod/app1
1335
+ url: $CL_GITLAB_ENVIRONMENT_URL
1336
+ on_stop: 'app1 🛑 Stop âš ī¸ | prod '
1337
+ artifacts:
1338
+ reports:
1339
+ dotenv: gitlab_environment.env
1340
+ rules:
1341
+ - when: manual
1342
+ if: $CI_COMMIT_TAG
1343
+ needs:
1344
+ - job: 'app1 🔨 app | prod '
1345
+ artifacts: false
1346
+ - job: 'app1 🔨 docker | prod '
1347
+ artifacts: false
1348
+ - job: 'app1 🧾 sbom | prod '
1349
+ artifacts: true
1350
+ retry: *a1
1351
+ interruptible: true
1352
+ allow_failure: true
1353
+ 'app1 🛑 Stop âš ī¸ | prod ':
1354
+ stage: stop prod
1355
+ image: path/to/docker/gcloud:the-version
1356
+ variables:
1357
+ KUBERNETES_CPU_REQUEST: '0.22'
1358
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1359
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1360
+ GIT_STRATEGY: none
1361
+ script:
1362
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1363
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1364
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1365
+ - set +e
1366
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey")
1367
+ - gcloud run services delete pan-test-app-prod-app1 --project=asdf --region=asia-east1
1368
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1 --quiet --delete-tags
1369
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
1370
+ - echo 'Disabling component in Dependency Track'
1371
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app1" "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1372
+ - set -e
1373
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1374
+ environment:
1375
+ name: prod/app1
1376
+ url: $CL_GITLAB_ENVIRONMENT_URL
1377
+ action: stop
1378
+ artifacts:
1379
+ reports:
1380
+ dotenv: gitlab_environment.env
1381
+ rules:
1382
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1383
+ when: on_success
1384
+ - when: manual
1385
+ if: $CI_COMMIT_TAG
1386
+ needs: []
1387
+ retry: *a1
1388
+ interruptible: true
1389
+ allow_failure: true
1390
+ app2 🛡 audit:
1391
+ stage: test
1392
+ image: path/to/docker/jobs-default:the-version
1393
+ variables:
1394
+ KUBERNETES_CPU_REQUEST: '0.45'
1395
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1396
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1397
+ script:
1398
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1399
+ - export APP_PATH="app2"
1400
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1401
+ - cd app2
1402
+ - yarn npm audit --environment production
1403
+ rules:
1404
+ - when: never
1405
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1406
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1407
+ - if: $CI_MERGE_REQUEST_ID
1408
+ needs: []
1409
+ retry: *a1
1410
+ interruptible: true
1411
+ allow_failure: true
1412
+ app2 👮 lint:
1413
+ stage: test
1414
+ image: path/to/docker/jobs-default:the-version
1415
+ variables:
1416
+ KUBERNETES_CPU_REQUEST: '0.45'
1417
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1418
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1419
+ script:
1420
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1421
+ - export APP_PATH="app2"
1422
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1423
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1424
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1425
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1426
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1427
+ - cd app2
1428
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1429
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1430
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1431
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1432
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1433
+ - yarn install --immutable
1434
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1435
+ - yarn lint
1436
+ cache:
1437
+ - key: app2-yarn
1438
+ policy: pull-push
1439
+ paths:
1440
+ - app2/.yarn
1441
+ - key: app2-node-modules
1442
+ policy: pull-push
1443
+ paths:
1444
+ - app2/node_modules
1445
+ rules:
1446
+ - when: never
1447
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1448
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1449
+ - if: $CI_MERGE_REQUEST_ID
1450
+ needs: []
1451
+ retry: *a1
1452
+ interruptible: true
1453
+ app2 đŸ§Ē test:
1454
+ stage: test
1455
+ image: path/to/docker/jobs-testing-chrome:the-version
1456
+ variables:
1457
+ KUBERNETES_CPU_REQUEST: '0.45'
1458
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1459
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1460
+ script:
1461
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1462
+ - export APP_PATH="app2"
1463
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1464
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1465
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1466
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1467
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1468
+ - cd app2
1469
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1470
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1471
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1472
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1473
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1474
+ - yarn install --immutable
1475
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1476
+ - yarn test
1477
+ cache:
1478
+ - key: app2-yarn
1479
+ policy: pull-push
1480
+ paths:
1481
+ - app2/.yarn
1482
+ - key: app2-node-modules
1483
+ policy: pull-push
1484
+ paths:
1485
+ - app2/node_modules
1486
+ rules:
1487
+ - when: never
1488
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1489
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1490
+ - if: $CI_MERGE_REQUEST_ID
1491
+ needs: []
1492
+ retry: *a1
1493
+ interruptible: true
1494
+ 'app2 🔨 app | dev ':
1495
+ stage: build
1496
+ image: path/to/docker/jobs-default:the-version
1497
+ variables:
1498
+ KUBERNETES_CPU_REQUEST: '0.45'
1499
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1500
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1501
+ script:
1502
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1503
+ - export ENV_SHORT="dev"
1504
+ - export APP_DIR="app2"
1505
+ - export ENV_TYPE="dev"
1506
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1507
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1508
+ - 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")"
1509
+ - export HOST="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1510
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1511
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1512
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1513
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1514
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1515
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1516
+ - export SECRET2="$CL_dev_app2_SECRET2"
1517
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey"
1518
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix"
1519
+ - export foo2="foo-value-2"
1520
+ - 'export referencingSecret="secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
1521
+ - 'export foo1="this is from app1: foo-value"'
1522
+ - 'export selfReference="this is from self: foo-value-2"'
1523
+ - 'export selfReference2="this is from self: this is from app1: foo-value"'
1524
+ - export app1Api="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
1525
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
1526
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1527
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
1528
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1529
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1530
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1531
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1532
+ - cd app2
1533
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1534
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1535
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1536
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1537
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1538
+ - yarn install --immutable
1539
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1540
+ - yarn build
1541
+ cache:
1542
+ - key: app2-yarn
1543
+ policy: pull-push
1544
+ paths:
1545
+ - app2/.yarn
1546
+ - key: app2-node-modules
1547
+ policy: pull-push
1548
+ paths:
1549
+ - app2/node_modules
1550
+ - key: app2-next-cache
1551
+ policy: pull-push
1552
+ paths:
1553
+ - app2/.next/cache
1554
+ artifacts:
1555
+ paths:
1556
+ - app2/__build_info.json
1557
+ - app2/.next
1558
+ - app2/dist
1559
+ expire_in: 1 day
1560
+ when: always
1561
+ reports: {}
1562
+ rules:
1563
+ - when: never
1564
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1565
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1566
+ needs: []
1567
+ retry: *a1
1568
+ interruptible: true
1569
+ 'app2 🔨 docker | dev ':
1570
+ stage: build
1571
+ image: path/to/docker/docker-build:the-version
1572
+ services:
1573
+ - name: docker:24.0.6-dind
1574
+ command:
1575
+ - --tls=false
1576
+ - --registry-mirror=https://mirror.gcr.io
1577
+ variables:
1578
+ DOCKER_HOST: tcp://0.0.0.0:2375
1579
+ DOCKER_TLS_CERTDIR: ''
1580
+ DOCKER_DRIVER: overlay2
1581
+ DOCKER_BUILDKIT: '1'
1582
+ KUBERNETES_CPU_REQUEST: '0.45'
1583
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1584
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1585
+ script:
1586
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1587
+ - export APP_DIR="app2"
1588
+ - export DOCKER_BUILD_CONTEXT="."
1589
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1590
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2"
1591
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
1592
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1593
+ - |-
1594
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1595
+ RUN yarn plugin import workspace-tools
1596
+ RUN yarn workspaces focus --production && yarn rebuild"
1597
+ - |-
1598
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app2/package.json /app/app2/package.json
1599
+ COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
1600
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1601
+ COPY --chown=node:node .yarn /app/.yarn"
1602
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1603
+ - ensureNodeDockerfile
1604
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1605
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey")
1606
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1607
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1608
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1609
+ - 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
1610
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1611
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1612
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1613
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1614
+ - docker push $DOCKER_CACHE_IMAGE
1615
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1616
+ cache:
1617
+ - key: app2-yarn
1618
+ policy: pull
1619
+ paths:
1620
+ - app2/.yarn
1621
+ rules:
1622
+ - when: never
1623
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1624
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1625
+ needs:
1626
+ - 'app2 🔨 app | dev '
1627
+ retry: *a1
1628
+ interruptible: true
1629
+ 'app2 🧾 sbom | dev ':
1630
+ stage: build
1631
+ image: aquasec/trivy:0.38.3
1632
+ variables: {}
1633
+ script:
1634
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1635
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1636
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
1637
+ artifacts:
1638
+ paths:
1639
+ - __sbom.json
1640
+ rules:
1641
+ - when: never
1642
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1643
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1644
+ needs: []
1645
+ retry: *a1
1646
+ interruptible: true
1647
+ allow_failure: true
1648
+ 'app2 🚀 Deploy | dev ':
1649
+ stage: deploy dev
1650
+ image: path/to/docker/gcloud:the-version
1651
+ variables:
1652
+ KUBERNETES_CPU_REQUEST: '0.22'
1653
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1654
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1655
+ script:
1656
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1657
+ - export ENV_SHORT="dev"
1658
+ - export APP_DIR="app2"
1659
+ - export ENV_TYPE="dev"
1660
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1661
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1662
+ - 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")"
1663
+ - export HOST="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1664
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1665
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1666
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1667
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1668
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1669
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1670
+ - export SECRET2="$CL_dev_app2_SECRET2"
1671
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey"
1672
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix"
1673
+ - export foo2="foo-value-2"
1674
+ - 'export referencingSecret="secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
1675
+ - 'export foo1="this is from app1: foo-value"'
1676
+ - 'export selfReference="this is from self: foo-value-2"'
1677
+ - 'export selfReference2="this is from self: this is from app1: foo-value"'
1678
+ - export app1Api="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
1679
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
1680
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1681
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2"
1682
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
1683
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1684
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1685
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1686
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1687
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey")
1688
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1689
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1690
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1691
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1692
+ - |
1693
+ cat > ____envvars.yaml <<EOF
1694
+ ENV_SHORT: |-
1695
+ dev
1696
+ APP_DIR: |-
1697
+ app2
1698
+ ENV_TYPE: |-
1699
+ dev
1700
+ BUILD_INFO_BUILD_ID: |-
1701
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1702
+ BUILD_INFO_BUILD_TIME: |-
1703
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1704
+ BUILD_INFO_CURRENT_VERSION: |-
1705
+ $(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 's/^/ /')
1706
+ HOST: |-
1707
+ $(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1708
+ ROOT_URL: |-
1709
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1710
+ HOST_INTERNAL: |-
1711
+ $(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1712
+ HOST_CANONICAL: |-
1713
+ $(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1714
+ ROOT_URL_INTERNAL: |-
1715
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1716
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1717
+ asdf
1718
+ DEPLOY_CLOUD_RUN_REGION: |-
1719
+ asia-east1
1720
+ SECRET2: |-
1721
+ $(printf %s "$CL_dev_app2_SECRET2" | sed 's/^/ /')
1722
+ GCLOUD_RUN_canonicalHostSuffix: |-
1723
+ $(printf %s "$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1724
+ foo2: |-
1725
+ foo-value-2
1726
+ referencingSecret: |-
1727
+ $(printf %s "secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2" | sed 's/^/ /')
1728
+ foo1: |-
1729
+ this is from app1: foo-value
1730
+ selfReference: |-
1731
+ this is from self: foo-value-2
1732
+ selfReference2: |-
1733
+ this is from self: this is from app1: foo-value
1734
+ app1Api: |-
1735
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
1736
+ _ALL_ENV_VAR_KEYS: |-
1737
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
1738
+
1739
+ EOF
1740
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1741
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1742
+ - gcloud run deploy pan-test-app-dev-app2 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app2,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-app2 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1743
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1744
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1745
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-app2 --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
1746
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2 --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/app2@$version --quiet --delete-tags; done
1747
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
1748
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1749
+ - echo 'Uploading SBOM to Dependency Track'
1750
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1751
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1752
+ environment:
1753
+ name: dev/app2
1754
+ url: $CL_GITLAB_ENVIRONMENT_URL
1755
+ on_stop: 'app2 🛑 Stop âš ī¸ | dev '
1756
+ auto_stop_in: 4 weeks
1757
+ artifacts:
1758
+ reports:
1759
+ dotenv: gitlab_environment.env
1760
+ rules:
1761
+ - when: never
1762
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1763
+ - when: on_success
1764
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1765
+ needs:
1766
+ - job: app2 👮 lint
1767
+ artifacts: false
1768
+ - job: 'app2 🔨 app | dev '
1769
+ artifacts: false
1770
+ - job: 'app2 🔨 docker | dev '
1771
+ artifacts: false
1772
+ - job: app2 đŸ§Ē test
1773
+ artifacts: false
1774
+ - job: 'app2 🧾 sbom | dev '
1775
+ artifacts: true
1776
+ - job: app2 🛡 audit
1777
+ artifacts: false
1778
+ retry: *a1
1779
+ interruptible: true
1780
+ allow_failure: false
1781
+ 'app2 🛑 Stop âš ī¸ | dev ':
1782
+ stage: stop dev
1783
+ image: path/to/docker/gcloud:the-version
1784
+ variables:
1785
+ KUBERNETES_CPU_REQUEST: '0.22'
1786
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1787
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1788
+ GIT_STRATEGY: none
1789
+ script:
1790
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1791
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1792
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1793
+ - set +e
1794
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey")
1795
+ - gcloud run services delete pan-test-app-dev-app2 --project=asdf --region=asia-east1
1796
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2 --quiet --delete-tags
1797
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
1798
+ - echo 'Disabling component in Dependency Track'
1799
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app2" "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1800
+ - set -e
1801
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1802
+ environment:
1803
+ name: dev/app2
1804
+ url: $CL_GITLAB_ENVIRONMENT_URL
1805
+ action: stop
1806
+ artifacts:
1807
+ reports:
1808
+ dotenv: gitlab_environment.env
1809
+ rules:
1810
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1811
+ when: on_success
1812
+ - when: never
1813
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1814
+ - when: manual
1815
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1816
+ needs: []
1817
+ retry: *a1
1818
+ interruptible: true
1819
+ allow_failure: true
1820
+ 'app2 🔨 app | review ':
1821
+ stage: build
1822
+ image: path/to/docker/jobs-default:the-version
1823
+ variables:
1824
+ KUBERNETES_CPU_REQUEST: '0.45'
1825
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1826
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1827
+ script:
1828
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1829
+ - export ENV_SHORT="review"
1830
+ - export APP_DIR="app2"
1831
+ - export ENV_TYPE="review"
1832
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1833
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1834
+ - 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")"
1835
+ - export HOST="$(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1836
+ - 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1837
+ - export HOST_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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1838
+ - export HOST_CANONICAL="$(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1839
+ - 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1840
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1841
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1842
+ - export SECRET2="$CL_review_app2_SECRET2"
1843
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_app2_GCLOUD_DEPLOY_credentialsKey"
1844
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix"
1845
+ - export foo2="foo-value-2"
1846
+ - 'export referencingSecret="secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
1847
+ - 'export foo1="this is from app1: foo-value"'
1848
+ - 'export selfReference="this is from self: foo-value-2"'
1849
+ - 'export selfReference2="this is from self: this is from app1: foo-value"'
1850
+ - export app1Api="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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
1851
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
1852
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1853
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
1854
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1855
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1856
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1857
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1858
+ - cd app2
1859
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1860
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1861
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1862
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1863
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1864
+ - yarn install --immutable
1865
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1866
+ - yarn build
1867
+ cache:
1868
+ - key: app2-yarn
1869
+ policy: pull-push
1870
+ paths:
1871
+ - app2/.yarn
1872
+ - key: app2-node-modules
1873
+ policy: pull-push
1874
+ paths:
1875
+ - app2/node_modules
1876
+ - key: app2-next-cache
1877
+ policy: pull-push
1878
+ paths:
1879
+ - app2/.next/cache
1880
+ artifacts:
1881
+ paths:
1882
+ - app2/__build_info.json
1883
+ - app2/.next
1884
+ - app2/dist
1885
+ expire_in: 1 day
1886
+ when: always
1887
+ reports: {}
1888
+ rules:
1889
+ - if: $CI_MERGE_REQUEST_ID
1890
+ needs: []
1891
+ retry: *a1
1892
+ interruptible: true
1893
+ 'app2 🔨 docker | review ':
1894
+ stage: build
1895
+ image: path/to/docker/docker-build:the-version
1896
+ services:
1897
+ - name: docker:24.0.6-dind
1898
+ command:
1899
+ - --tls=false
1900
+ - --registry-mirror=https://mirror.gcr.io
1901
+ variables:
1902
+ DOCKER_HOST: tcp://0.0.0.0:2375
1903
+ DOCKER_TLS_CERTDIR: ''
1904
+ DOCKER_DRIVER: overlay2
1905
+ DOCKER_BUILDKIT: '1'
1906
+ KUBERNETES_CPU_REQUEST: '0.45'
1907
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1908
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1909
+ script:
1910
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1911
+ - export APP_DIR="app2"
1912
+ - export DOCKER_BUILD_CONTEXT="."
1913
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1914
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
1915
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
1916
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1917
+ - |-
1918
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1919
+ RUN yarn plugin import workspace-tools
1920
+ RUN yarn workspaces focus --production && yarn rebuild"
1921
+ - |-
1922
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app2/package.json /app/app2/package.json
1923
+ COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
1924
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1925
+ COPY --chown=node:node .yarn /app/.yarn"
1926
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1927
+ - ensureNodeDockerfile
1928
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1929
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app2_GCLOUD_DEPLOY_credentialsKey")
1930
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1931
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1932
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1933
+ - 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
1934
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1935
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1936
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1937
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1938
+ - docker push $DOCKER_CACHE_IMAGE
1939
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1940
+ cache:
1941
+ - key: app2-yarn
1942
+ policy: pull
1943
+ paths:
1944
+ - app2/.yarn
1945
+ rules:
1946
+ - if: $CI_MERGE_REQUEST_ID
1947
+ needs:
1948
+ - 'app2 🔨 app | review '
1949
+ retry: *a1
1950
+ interruptible: true
1951
+ 'app2 🧾 sbom | review ':
1952
+ stage: build
1953
+ image: aquasec/trivy:0.38.3
1954
+ variables: {}
1955
+ script:
1956
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1957
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1958
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
1959
+ artifacts:
1960
+ paths:
1961
+ - __sbom.json
1962
+ rules:
1963
+ - if: $CI_MERGE_REQUEST_ID
1964
+ needs: []
1965
+ retry: *a1
1966
+ interruptible: true
1967
+ allow_failure: true
1968
+ 'app2 🚀 Deploy | review ':
1969
+ stage: deploy review
1970
+ image: path/to/docker/gcloud:the-version
1971
+ variables:
1972
+ KUBERNETES_CPU_REQUEST: '0.22'
1973
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1974
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1975
+ script:
1976
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1977
+ - export ENV_SHORT="review"
1978
+ - export APP_DIR="app2"
1979
+ - export ENV_TYPE="review"
1980
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1981
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1982
+ - 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")"
1983
+ - export HOST="$(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1984
+ - 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1985
+ - export HOST_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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1986
+ - export HOST_CANONICAL="$(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1987
+ - 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1988
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1989
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1990
+ - export SECRET2="$CL_review_app2_SECRET2"
1991
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_app2_GCLOUD_DEPLOY_credentialsKey"
1992
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix"
1993
+ - export foo2="foo-value-2"
1994
+ - 'export referencingSecret="secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
1995
+ - 'export foo1="this is from app1: foo-value"'
1996
+ - 'export selfReference="this is from self: foo-value-2"'
1997
+ - 'export selfReference2="this is from self: this is from app1: foo-value"'
1998
+ - export app1Api="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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
1999
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2000
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2001
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
2002
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
2003
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2004
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2005
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2006
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2007
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app2_GCLOUD_DEPLOY_credentialsKey")
2008
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
2009
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2010
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2011
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2012
+ - |
2013
+ cat > ____envvars.yaml <<EOF
2014
+ ENV_SHORT: |-
2015
+ review
2016
+ APP_DIR: |-
2017
+ app2
2018
+ ENV_TYPE: |-
2019
+ review
2020
+ BUILD_INFO_BUILD_ID: |-
2021
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2022
+ BUILD_INFO_BUILD_TIME: |-
2023
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2024
+ BUILD_INFO_CURRENT_VERSION: |-
2025
+ $(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 's/^/ /')
2026
+ HOST: |-
2027
+ $(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2028
+ ROOT_URL: |-
2029
+ $(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2030
+ HOST_INTERNAL: |-
2031
+ $(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2032
+ HOST_CANONICAL: |-
2033
+ $(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2034
+ ROOT_URL_INTERNAL: |-
2035
+ $(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2036
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2037
+ asdf
2038
+ DEPLOY_CLOUD_RUN_REGION: |-
2039
+ asia-east1
2040
+ SECRET2: |-
2041
+ $(printf %s "$CL_review_app2_SECRET2" | sed 's/^/ /')
2042
+ GCLOUD_RUN_canonicalHostSuffix: |-
2043
+ $(printf %s "$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2044
+ foo2: |-
2045
+ foo-value-2
2046
+ referencingSecret: |-
2047
+ $(printf %s "secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2" | sed 's/^/ /')
2048
+ foo1: |-
2049
+ this is from app1: foo-value
2050
+ selfReference: |-
2051
+ this is from self: foo-value-2
2052
+ selfReference2: |-
2053
+ this is from self: this is from app1: foo-value
2054
+ app1Api: |-
2055
+ $(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
2056
+ _ALL_ENV_VAR_KEYS: |-
2057
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2058
+
2059
+ EOF
2060
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2061
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2062
+ - 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"; })-app2" | awk '{print tolower($0)}') --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -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=app2,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"; })-app2" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2063
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2064
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2065
+ - 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"; })-app2" | 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
2066
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -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/app2/$([ -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
2067
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
2068
+ - set +e
2069
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2 --quiet --delete-tags
2070
+ - set -e
2071
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2072
+ - echo 'Uploading SBOM to Dependency Track'
2073
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2074
+ - echo "CL_GITLAB_ENVIRONMENT_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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2075
+ environment:
2076
+ name: review/$CI_COMMIT_REF_NAME/app2
2077
+ url: $CL_GITLAB_ENVIRONMENT_URL
2078
+ on_stop: 'app2 🛑 Stop âš ī¸ | review '
2079
+ auto_stop_in: 1 week
2080
+ artifacts:
2081
+ reports:
2082
+ dotenv: gitlab_environment.env
2083
+ rules:
2084
+ - when: on_success
2085
+ if: $CI_MERGE_REQUEST_ID
2086
+ needs:
2087
+ - job: app2 👮 lint
2088
+ artifacts: false
2089
+ - job: 'app2 🔨 app | review '
2090
+ artifacts: false
2091
+ - job: 'app2 🔨 docker | review '
2092
+ artifacts: false
2093
+ - job: app2 đŸ§Ē test
2094
+ artifacts: false
2095
+ - job: 'app2 🧾 sbom | review '
2096
+ artifacts: true
2097
+ - job: app2 🛡 audit
2098
+ artifacts: false
2099
+ retry: *a1
2100
+ interruptible: true
2101
+ allow_failure: false
2102
+ 'app2 🛑 Stop âš ī¸ | review ':
2103
+ stage: stop review
2104
+ image: path/to/docker/gcloud:the-version
2105
+ variables:
2106
+ KUBERNETES_CPU_REQUEST: '0.22'
2107
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2108
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2109
+ GIT_STRATEGY: none
2110
+ script:
2111
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2112
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2113
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2114
+ - set +e
2115
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app2_GCLOUD_DEPLOY_credentialsKey")
2116
+ - 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"; })-app2" | awk '{print tolower($0)}') --project=asdf --region=asia-east1
2117
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -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
2118
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
2119
+ - set +e
2120
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2 --quiet --delete-tags
2121
+ - set -e
2122
+ - echo 'Disabling component in Dependency Track'
2123
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app2" "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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
2124
+ - set -e
2125
+ - echo "CL_GITLAB_ENVIRONMENT_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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2126
+ environment:
2127
+ name: review/$CI_COMMIT_REF_NAME/app2
2128
+ url: $CL_GITLAB_ENVIRONMENT_URL
2129
+ action: stop
2130
+ artifacts:
2131
+ reports:
2132
+ dotenv: gitlab_environment.env
2133
+ rules:
2134
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2135
+ when: on_success
2136
+ - when: manual
2137
+ if: $CI_MERGE_REQUEST_ID
2138
+ needs: []
2139
+ retry: *a1
2140
+ interruptible: true
2141
+ allow_failure: true
2142
+ 'app2 🔨 app | stage ':
2143
+ stage: build
2144
+ image: path/to/docker/jobs-default:the-version
2145
+ variables:
2146
+ KUBERNETES_CPU_REQUEST: '0.45'
2147
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2148
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2149
+ script:
2150
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2151
+ - export ENV_SHORT="stage"
2152
+ - export APP_DIR="app2"
2153
+ - export ENV_TYPE="stage"
2154
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2155
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2156
+ - 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")"
2157
+ - export HOST="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2158
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2159
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2160
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2161
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2162
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2163
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2164
+ - export SECRET2="$CL_stage_app2_SECRET2"
2165
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey"
2166
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix"
2167
+ - export foo2="foo-value-2"
2168
+ - 'export referencingSecret="secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
2169
+ - 'export foo1="this is from app1: foo-value"'
2170
+ - 'export selfReference="this is from self: foo-value-2"'
2171
+ - 'export selfReference2="this is from self: this is from app1: foo-value"'
2172
+ - export app1Api="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
2173
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2174
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2175
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
2176
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2177
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2178
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2179
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2180
+ - cd app2
2181
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2182
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2183
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2184
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2185
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2186
+ - yarn install --immutable
2187
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2188
+ - yarn build
2189
+ cache:
2190
+ - key: app2-yarn
2191
+ policy: pull-push
2192
+ paths:
2193
+ - app2/.yarn
2194
+ - key: app2-node-modules
2195
+ policy: pull-push
2196
+ paths:
2197
+ - app2/node_modules
2198
+ - key: app2-next-cache
2199
+ policy: pull-push
2200
+ paths:
2201
+ - app2/.next/cache
2202
+ artifacts:
2203
+ paths:
2204
+ - app2/__build_info.json
2205
+ - app2/.next
2206
+ - app2/dist
2207
+ expire_in: 1 day
2208
+ when: always
2209
+ reports: {}
2210
+ rules:
2211
+ - if: $CI_COMMIT_TAG
2212
+ needs: []
2213
+ retry: *a1
2214
+ interruptible: true
2215
+ 'app2 🔨 docker | stage ':
2216
+ stage: build
2217
+ image: path/to/docker/docker-build:the-version
2218
+ services:
2219
+ - name: docker:24.0.6-dind
2220
+ command:
2221
+ - --tls=false
2222
+ - --registry-mirror=https://mirror.gcr.io
2223
+ variables:
2224
+ DOCKER_HOST: tcp://0.0.0.0:2375
2225
+ DOCKER_TLS_CERTDIR: ''
2226
+ DOCKER_DRIVER: overlay2
2227
+ DOCKER_BUILDKIT: '1'
2228
+ KUBERNETES_CPU_REQUEST: '0.45'
2229
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2230
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2231
+ script:
2232
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2233
+ - export APP_DIR="app2"
2234
+ - export DOCKER_BUILD_CONTEXT="."
2235
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2236
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2"
2237
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
2238
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2239
+ - |-
2240
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2241
+ RUN yarn plugin import workspace-tools
2242
+ RUN yarn workspaces focus --production && yarn rebuild"
2243
+ - |-
2244
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app2/package.json /app/app2/package.json
2245
+ COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
2246
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2247
+ COPY --chown=node:node .yarn /app/.yarn"
2248
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2249
+ - ensureNodeDockerfile
2250
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2251
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey")
2252
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
2253
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2254
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2255
+ - 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
2256
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2257
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2258
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2259
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2260
+ - docker push $DOCKER_CACHE_IMAGE
2261
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2262
+ cache:
2263
+ - key: app2-yarn
2264
+ policy: pull
2265
+ paths:
2266
+ - app2/.yarn
2267
+ rules:
2268
+ - if: $CI_COMMIT_TAG
2269
+ needs:
2270
+ - 'app2 🔨 app | stage '
2271
+ retry: *a1
2272
+ interruptible: true
2273
+ 'app2 🧾 sbom | stage ':
2274
+ stage: build
2275
+ image: aquasec/trivy:0.38.3
2276
+ variables: {}
2277
+ script:
2278
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2279
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2280
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
2281
+ artifacts:
2282
+ paths:
2283
+ - __sbom.json
2284
+ rules:
2285
+ - if: $CI_COMMIT_TAG
2286
+ needs: []
2287
+ retry: *a1
2288
+ interruptible: true
2289
+ allow_failure: true
2290
+ 'app2 🚀 Deploy | stage ':
2291
+ stage: deploy stage
2292
+ image: path/to/docker/gcloud:the-version
2293
+ variables:
2294
+ KUBERNETES_CPU_REQUEST: '0.22'
2295
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2296
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2297
+ script:
2298
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2299
+ - export ENV_SHORT="stage"
2300
+ - export APP_DIR="app2"
2301
+ - export ENV_TYPE="stage"
2302
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2303
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2304
+ - 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")"
2305
+ - export HOST="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2306
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2307
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2308
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2309
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2310
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2311
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2312
+ - export SECRET2="$CL_stage_app2_SECRET2"
2313
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey"
2314
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix"
2315
+ - export foo2="foo-value-2"
2316
+ - 'export referencingSecret="secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
2317
+ - 'export foo1="this is from app1: foo-value"'
2318
+ - 'export selfReference="this is from self: foo-value-2"'
2319
+ - 'export selfReference2="this is from self: this is from app1: foo-value"'
2320
+ - export app1Api="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
2321
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2322
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2323
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2"
2324
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
2325
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2326
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2327
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2328
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2329
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey")
2330
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
2331
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2332
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2333
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2334
+ - |
2335
+ cat > ____envvars.yaml <<EOF
2336
+ ENV_SHORT: |-
2337
+ stage
2338
+ APP_DIR: |-
2339
+ app2
2340
+ ENV_TYPE: |-
2341
+ stage
2342
+ BUILD_INFO_BUILD_ID: |-
2343
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2344
+ BUILD_INFO_BUILD_TIME: |-
2345
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2346
+ BUILD_INFO_CURRENT_VERSION: |-
2347
+ $(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 's/^/ /')
2348
+ HOST: |-
2349
+ $(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2350
+ ROOT_URL: |-
2351
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2352
+ HOST_INTERNAL: |-
2353
+ $(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2354
+ HOST_CANONICAL: |-
2355
+ $(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2356
+ ROOT_URL_INTERNAL: |-
2357
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2358
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2359
+ asdf
2360
+ DEPLOY_CLOUD_RUN_REGION: |-
2361
+ asia-east1
2362
+ SECRET2: |-
2363
+ $(printf %s "$CL_stage_app2_SECRET2" | sed 's/^/ /')
2364
+ GCLOUD_RUN_canonicalHostSuffix: |-
2365
+ $(printf %s "$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2366
+ foo2: |-
2367
+ foo-value-2
2368
+ referencingSecret: |-
2369
+ $(printf %s "secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2" | sed 's/^/ /')
2370
+ foo1: |-
2371
+ this is from app1: foo-value
2372
+ selfReference: |-
2373
+ this is from self: foo-value-2
2374
+ selfReference2: |-
2375
+ this is from self: this is from app1: foo-value
2376
+ app1Api: |-
2377
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
2378
+ _ALL_ENV_VAR_KEYS: |-
2379
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2380
+
2381
+ EOF
2382
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2383
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2384
+ - gcloud run deploy pan-test-app-stage-app2 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app2,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-app2 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2385
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2386
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2387
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-app2 --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
2388
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2 --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/app2@$version --quiet --delete-tags; done
2389
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
2390
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2391
+ - echo 'Uploading SBOM to Dependency Track'
2392
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2393
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2394
+ environment:
2395
+ name: stage/app2
2396
+ url: $CL_GITLAB_ENVIRONMENT_URL
2397
+ on_stop: 'app2 🛑 Stop âš ī¸ | stage '
2398
+ artifacts:
2399
+ reports:
2400
+ dotenv: gitlab_environment.env
2401
+ rules:
2402
+ - when: on_success
2403
+ if: $CI_COMMIT_TAG
2404
+ needs:
2405
+ - job: 'app2 🔨 app | stage '
2406
+ artifacts: false
2407
+ - job: 'app2 🔨 docker | stage '
2408
+ artifacts: false
2409
+ - job: 'app2 🧾 sbom | stage '
2410
+ artifacts: true
2411
+ retry: *a1
2412
+ interruptible: true
2413
+ allow_failure: false
2414
+ 'app2 🛑 Stop âš ī¸ | stage ':
2415
+ stage: stop stage
2416
+ image: path/to/docker/gcloud:the-version
2417
+ variables:
2418
+ KUBERNETES_CPU_REQUEST: '0.22'
2419
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2420
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2421
+ GIT_STRATEGY: none
2422
+ script:
2423
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2424
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2425
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2426
+ - set +e
2427
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey")
2428
+ - gcloud run services delete pan-test-app-stage-app2 --project=asdf --region=asia-east1
2429
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2 --quiet --delete-tags
2430
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
2431
+ - echo 'Disabling component in Dependency Track'
2432
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app2" "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
2433
+ - set -e
2434
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2435
+ environment:
2436
+ name: stage/app2
2437
+ url: $CL_GITLAB_ENVIRONMENT_URL
2438
+ action: stop
2439
+ artifacts:
2440
+ reports:
2441
+ dotenv: gitlab_environment.env
2442
+ rules:
2443
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2444
+ when: on_success
2445
+ - when: manual
2446
+ if: $CI_COMMIT_TAG
2447
+ needs: []
2448
+ retry: *a1
2449
+ interruptible: true
2450
+ allow_failure: true
2451
+ 'app2 🔨 app | prod ':
2452
+ stage: build
2453
+ image: path/to/docker/jobs-default:the-version
2454
+ variables:
2455
+ KUBERNETES_CPU_REQUEST: '0.45'
2456
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2457
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2458
+ script:
2459
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2460
+ - export ENV_SHORT="prod"
2461
+ - export APP_DIR="app2"
2462
+ - export ENV_TYPE="prod"
2463
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2464
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2465
+ - 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")"
2466
+ - export HOST="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2467
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2468
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2469
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2470
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2471
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2472
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2473
+ - export SECRET2="$CL_prod_app2_SECRET2"
2474
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey"
2475
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix"
2476
+ - export foo2="foo-value-2"
2477
+ - 'export referencingSecret="secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
2478
+ - 'export foo1="this is from app1: foo-value"'
2479
+ - 'export selfReference="this is from self: foo-value-2"'
2480
+ - 'export selfReference2="this is from self: this is from app1: foo-value"'
2481
+ - export app1Api="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
2482
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2483
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2484
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
2485
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2486
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2487
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2488
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2489
+ - cd app2
2490
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2491
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2492
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2493
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2494
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2495
+ - yarn install --immutable
2496
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2497
+ - yarn build
2498
+ cache:
2499
+ - key: app2-yarn
2500
+ policy: pull-push
2501
+ paths:
2502
+ - app2/.yarn
2503
+ - key: app2-node-modules
2504
+ policy: pull-push
2505
+ paths:
2506
+ - app2/node_modules
2507
+ - key: app2-next-cache
2508
+ policy: pull-push
2509
+ paths:
2510
+ - app2/.next/cache
2511
+ artifacts:
2512
+ paths:
2513
+ - app2/__build_info.json
2514
+ - app2/.next
2515
+ - app2/dist
2516
+ expire_in: 1 day
2517
+ when: always
2518
+ reports: {}
2519
+ rules:
2520
+ - if: $CI_COMMIT_TAG
2521
+ needs: []
2522
+ retry: *a1
2523
+ interruptible: true
2524
+ 'app2 🔨 docker | prod ':
2525
+ stage: build
2526
+ image: path/to/docker/docker-build:the-version
2527
+ services:
2528
+ - name: docker:24.0.6-dind
2529
+ command:
2530
+ - --tls=false
2531
+ - --registry-mirror=https://mirror.gcr.io
2532
+ variables:
2533
+ DOCKER_HOST: tcp://0.0.0.0:2375
2534
+ DOCKER_TLS_CERTDIR: ''
2535
+ DOCKER_DRIVER: overlay2
2536
+ DOCKER_BUILDKIT: '1'
2537
+ KUBERNETES_CPU_REQUEST: '0.45'
2538
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2539
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2540
+ script:
2541
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2542
+ - export APP_DIR="app2"
2543
+ - export DOCKER_BUILD_CONTEXT="."
2544
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2545
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2"
2546
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
2547
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2548
+ - |-
2549
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2550
+ RUN yarn plugin import workspace-tools
2551
+ RUN yarn workspaces focus --production && yarn rebuild"
2552
+ - |-
2553
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app2/package.json /app/app2/package.json
2554
+ COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
2555
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2556
+ COPY --chown=node:node .yarn /app/.yarn"
2557
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2558
+ - ensureNodeDockerfile
2559
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2560
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey")
2561
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
2562
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2563
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2564
+ - 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
2565
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2566
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2567
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2568
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2569
+ - docker push $DOCKER_CACHE_IMAGE
2570
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2571
+ cache:
2572
+ - key: app2-yarn
2573
+ policy: pull
2574
+ paths:
2575
+ - app2/.yarn
2576
+ rules:
2577
+ - if: $CI_COMMIT_TAG
2578
+ needs:
2579
+ - 'app2 🔨 app | prod '
2580
+ retry: *a1
2581
+ interruptible: true
2582
+ 'app2 🧾 sbom | prod ':
2583
+ stage: build
2584
+ image: aquasec/trivy:0.38.3
2585
+ variables: {}
2586
+ script:
2587
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2588
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2589
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
2590
+ artifacts:
2591
+ paths:
2592
+ - __sbom.json
2593
+ rules:
2594
+ - if: $CI_COMMIT_TAG
2595
+ needs: []
2596
+ retry: *a1
2597
+ interruptible: true
2598
+ allow_failure: true
2599
+ 'app2 🚀 Deploy | prod ':
2600
+ stage: deploy prod
2601
+ image: path/to/docker/gcloud:the-version
2602
+ variables:
2603
+ KUBERNETES_CPU_REQUEST: '0.22'
2604
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2605
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2606
+ script:
2607
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2608
+ - export ENV_SHORT="prod"
2609
+ - export APP_DIR="app2"
2610
+ - export ENV_TYPE="prod"
2611
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2612
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2613
+ - 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")"
2614
+ - export HOST="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2615
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2616
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2617
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2618
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2619
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2620
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2621
+ - export SECRET2="$CL_prod_app2_SECRET2"
2622
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey"
2623
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix"
2624
+ - export foo2="foo-value-2"
2625
+ - 'export referencingSecret="secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
2626
+ - 'export foo1="this is from app1: foo-value"'
2627
+ - 'export selfReference="this is from self: foo-value-2"'
2628
+ - 'export selfReference2="this is from self: this is from app1: foo-value"'
2629
+ - export app1Api="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
2630
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2631
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2632
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2"
2633
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
2634
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2635
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2636
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2637
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2638
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey")
2639
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
2640
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2641
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2642
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2643
+ - |
2644
+ cat > ____envvars.yaml <<EOF
2645
+ ENV_SHORT: |-
2646
+ prod
2647
+ APP_DIR: |-
2648
+ app2
2649
+ ENV_TYPE: |-
2650
+ prod
2651
+ BUILD_INFO_BUILD_ID: |-
2652
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2653
+ BUILD_INFO_BUILD_TIME: |-
2654
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2655
+ BUILD_INFO_CURRENT_VERSION: |-
2656
+ $(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 's/^/ /')
2657
+ HOST: |-
2658
+ $(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2659
+ ROOT_URL: |-
2660
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2661
+ HOST_INTERNAL: |-
2662
+ $(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2663
+ HOST_CANONICAL: |-
2664
+ $(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2665
+ ROOT_URL_INTERNAL: |-
2666
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2667
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2668
+ asdf
2669
+ DEPLOY_CLOUD_RUN_REGION: |-
2670
+ asia-east1
2671
+ SECRET2: |-
2672
+ $(printf %s "$CL_prod_app2_SECRET2" | sed 's/^/ /')
2673
+ GCLOUD_RUN_canonicalHostSuffix: |-
2674
+ $(printf %s "$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2675
+ foo2: |-
2676
+ foo-value-2
2677
+ referencingSecret: |-
2678
+ $(printf %s "secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2" | sed 's/^/ /')
2679
+ foo1: |-
2680
+ this is from app1: foo-value
2681
+ selfReference: |-
2682
+ this is from self: foo-value-2
2683
+ selfReference2: |-
2684
+ this is from self: this is from app1: foo-value
2685
+ app1Api: |-
2686
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
2687
+ _ALL_ENV_VAR_KEYS: |-
2688
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2689
+
2690
+ EOF
2691
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2692
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2693
+ - gcloud run deploy pan-test-app-prod-app2 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app2,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-app2 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2694
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2695
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2696
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-app2 --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
2697
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2 --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/app2@$version --quiet --delete-tags; done
2698
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
2699
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2700
+ - echo 'Uploading SBOM to Dependency Track'
2701
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2702
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2703
+ environment:
2704
+ name: prod/app2
2705
+ url: $CL_GITLAB_ENVIRONMENT_URL
2706
+ on_stop: 'app2 🛑 Stop âš ī¸ | prod '
2707
+ artifacts:
2708
+ reports:
2709
+ dotenv: gitlab_environment.env
2710
+ rules:
2711
+ - when: manual
2712
+ if: $CI_COMMIT_TAG
2713
+ needs:
2714
+ - job: 'app2 🔨 app | prod '
2715
+ artifacts: false
2716
+ - job: 'app2 🔨 docker | prod '
2717
+ artifacts: false
2718
+ - job: 'app2 🧾 sbom | prod '
2719
+ artifacts: true
2720
+ retry: *a1
2721
+ interruptible: true
2722
+ allow_failure: true
2723
+ 'app2 🛑 Stop âš ī¸ | prod ':
2724
+ stage: stop prod
2725
+ image: path/to/docker/gcloud:the-version
2726
+ variables:
2727
+ KUBERNETES_CPU_REQUEST: '0.22'
2728
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2729
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2730
+ GIT_STRATEGY: none
2731
+ script:
2732
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2733
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2734
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2735
+ - set +e
2736
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey")
2737
+ - gcloud run services delete pan-test-app-prod-app2 --project=asdf --region=asia-east1
2738
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2 --quiet --delete-tags
2739
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
2740
+ - echo 'Disabling component in Dependency Track'
2741
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app2" "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
2742
+ - set -e
2743
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
2744
+ environment:
2745
+ name: prod/app2
2746
+ url: $CL_GITLAB_ENVIRONMENT_URL
2747
+ action: stop
2748
+ artifacts:
2749
+ reports:
2750
+ dotenv: gitlab_environment.env
2751
+ rules:
2752
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2753
+ when: on_success
2754
+ - when: manual
2755
+ if: $CI_COMMIT_TAG
2756
+ needs: []
2757
+ retry: *a1
2758
+ interruptible: true
2759
+ allow_failure: true
2760
+ app3 🛡 audit:
2761
+ stage: test
2762
+ image: path/to/docker/jobs-default:the-version
2763
+ variables:
2764
+ KUBERNETES_CPU_REQUEST: '0.45'
2765
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2766
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2767
+ script:
2768
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2769
+ - export APP_PATH="kube"
2770
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2771
+ - cd kube
2772
+ - yarn npm audit --environment production
2773
+ rules:
2774
+ - when: never
2775
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2776
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2777
+ - if: $CI_MERGE_REQUEST_ID
2778
+ needs: []
2779
+ retry: *a1
2780
+ interruptible: true
2781
+ allow_failure: true
2782
+ app3 👮 lint:
2783
+ stage: test
2784
+ image: path/to/docker/jobs-default:the-version
2785
+ variables:
2786
+ KUBERNETES_CPU_REQUEST: '0.45'
2787
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2788
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2789
+ script:
2790
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2791
+ - export APP_PATH="kube"
2792
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2793
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2794
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2795
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2796
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2797
+ - cd kube
2798
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2799
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2800
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2801
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2802
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2803
+ - yarn install --immutable
2804
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2805
+ - yarn lint
2806
+ cache:
2807
+ - key: kube-yarn
2808
+ policy: pull-push
2809
+ paths:
2810
+ - kube/.yarn
2811
+ - key: kube-node-modules
2812
+ policy: pull-push
2813
+ paths:
2814
+ - kube/node_modules
2815
+ rules:
2816
+ - when: never
2817
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2818
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2819
+ - if: $CI_MERGE_REQUEST_ID
2820
+ needs: []
2821
+ retry: *a1
2822
+ interruptible: true
2823
+ app3 đŸ§Ē test:
2824
+ stage: test
2825
+ image: path/to/docker/jobs-testing-chrome:the-version
2826
+ variables:
2827
+ KUBERNETES_CPU_REQUEST: '0.45'
2828
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2829
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2830
+ script:
2831
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2832
+ - export APP_PATH="kube"
2833
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2834
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2835
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2836
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2837
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2838
+ - cd kube
2839
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2840
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2841
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2842
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2843
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2844
+ - yarn install --immutable
2845
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2846
+ - yarn test
2847
+ cache:
2848
+ - key: kube-yarn
2849
+ policy: pull-push
2850
+ paths:
2851
+ - kube/.yarn
2852
+ - key: kube-node-modules
2853
+ policy: pull-push
2854
+ paths:
2855
+ - kube/node_modules
2856
+ rules:
2857
+ - when: never
2858
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2859
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2860
+ - if: $CI_MERGE_REQUEST_ID
2861
+ needs: []
2862
+ retry: *a1
2863
+ interruptible: true
2864
+ 'app3 🔨 app | dev ':
2865
+ stage: build
2866
+ image: path/to/docker/jobs-default:the-version
2867
+ variables:
2868
+ KUBERNETES_CPU_REQUEST: '0.45'
2869
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2870
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2871
+ script:
2872
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2873
+ - export ENV_SHORT="dev"
2874
+ - export APP_DIR="kube"
2875
+ - export ENV_TYPE="dev"
2876
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2877
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2878
+ - 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")"
2879
+ - export HOST="app3.dev.test-app.pan.panter.cloud"
2880
+ - export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
2881
+ - export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
2882
+ - export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
2883
+ - export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
2884
+ - export KUBE_NAMESPACE="pan-test-app-dev"
2885
+ - export KUBE_APP_NAME="app3"
2886
+ - export KUBE_APP_NAME_PREFIX=""
2887
+ - export foo3="foo-value-3"
2888
+ - 'export foo2="this is from app2: foo-value-2"'
2889
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
2890
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
2891
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
2892
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
2893
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2894
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
2895
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2896
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2897
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2898
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2899
+ - cd kube
2900
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2901
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2902
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2903
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2904
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2905
+ - yarn install --immutable
2906
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2907
+ - yarn build
2908
+ cache:
2909
+ - key: kube-yarn
2910
+ policy: pull-push
2911
+ paths:
2912
+ - kube/.yarn
2913
+ - key: kube-node-modules
2914
+ policy: pull-push
2915
+ paths:
2916
+ - kube/node_modules
2917
+ - key: app3-next-cache
2918
+ policy: pull-push
2919
+ paths:
2920
+ - kube/.next/cache
2921
+ artifacts:
2922
+ paths:
2923
+ - kube/__build_info.json
2924
+ - kube/.next
2925
+ - kube/dist
2926
+ expire_in: 1 day
2927
+ when: always
2928
+ reports: {}
2929
+ rules:
2930
+ - when: never
2931
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2932
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2933
+ needs: []
2934
+ retry: *a1
2935
+ interruptible: true
2936
+ 'app3 🔨 docker | dev ':
2937
+ stage: build
2938
+ image: path/to/docker/docker-build:the-version
2939
+ services:
2940
+ - name: docker:24.0.6-dind
2941
+ command:
2942
+ - --tls=false
2943
+ - --registry-mirror=https://mirror.gcr.io
2944
+ variables:
2945
+ DOCKER_HOST: tcp://0.0.0.0:2375
2946
+ DOCKER_TLS_CERTDIR: ''
2947
+ DOCKER_DRIVER: overlay2
2948
+ DOCKER_BUILDKIT: '1'
2949
+ KUBERNETES_CPU_REQUEST: '0.45'
2950
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2951
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2952
+ script:
2953
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2954
+ - export APP_DIR="kube"
2955
+ - export DOCKER_BUILD_CONTEXT="."
2956
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
2957
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
2958
+ - export DOCKER_IMAGE_NAME="dev/app3"
2959
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
2960
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2961
+ - |-
2962
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2963
+ RUN yarn plugin import workspace-tools
2964
+ RUN yarn workspaces focus --production && yarn rebuild"
2965
+ - |-
2966
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node kube/package.json /app/kube/package.json
2967
+ COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
2968
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2969
+ COPY --chown=node:node .yarn /app/.yarn"
2970
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2971
+ - ensureNodeDockerfile
2972
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2973
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
2974
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2975
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2976
+ - 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
2977
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2978
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2979
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2980
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2981
+ - docker push $DOCKER_CACHE_IMAGE
2982
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2983
+ cache:
2984
+ - key: kube-yarn
2985
+ policy: pull
2986
+ paths:
2987
+ - kube/.yarn
2988
+ rules:
2989
+ - when: never
2990
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2991
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2992
+ needs:
2993
+ - 'app3 🔨 app | dev '
2994
+ retry: *a1
2995
+ interruptible: true
2996
+ 'app3 🧾 sbom | dev ':
2997
+ stage: build
2998
+ image: aquasec/trivy:0.38.3
2999
+ variables: {}
3000
+ script:
3001
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3002
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3003
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
3004
+ artifacts:
3005
+ paths:
3006
+ - __sbom.json
3007
+ rules:
3008
+ - when: never
3009
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
3010
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3011
+ needs: []
3012
+ retry: *a1
3013
+ interruptible: true
3014
+ allow_failure: true
3015
+ 'app3 🚀 Deploy | dev ':
3016
+ stage: deploy dev
3017
+ image: path/to/docker/kubernetes:the-version
3018
+ variables:
3019
+ KUBERNETES_CPU_REQUEST: '0.22'
3020
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3021
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3022
+ script:
3023
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3024
+ - export ENV_SHORT="dev"
3025
+ - export APP_DIR="kube"
3026
+ - export ENV_TYPE="dev"
3027
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3028
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3029
+ - 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")"
3030
+ - export HOST="app3.dev.test-app.pan.panter.cloud"
3031
+ - export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
3032
+ - export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
3033
+ - export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
3034
+ - export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
3035
+ - export KUBE_NAMESPACE="pan-test-app-dev"
3036
+ - export KUBE_APP_NAME="app3"
3037
+ - export KUBE_APP_NAME_PREFIX=""
3038
+ - export foo3="foo-value-3"
3039
+ - 'export foo2="this is from app2: foo-value-2"'
3040
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
3041
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
3042
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
3043
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3044
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
3045
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
3046
+ - export DOCKER_IMAGE_NAME="dev/app3"
3047
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
3048
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
3049
+ - export RELEASE_NAME="pan-test-app-dev-app3"
3050
+ - export HELM_EXPERIMENTAL_OCI="1"
3051
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3052
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3053
+ - export HELM_ARGS=""
3054
+ - export COMPONENT_NAME="app3"
3055
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3056
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3057
+ - kubectl config set-cluster "kube-pan-test-app-dev-app3" --server="$CL_dev_app3_KUBE_URL" --certificate-authority <(echo $CL_dev_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3058
+ - kubectl config set-credentials "kube-pan-test-app-dev-app3" --token="$CL_dev_app3_KUBE_TOKEN"
3059
+ - kubectl config set-context "kube-pan-test-app-dev-app3" --cluster="kube-pan-test-app-dev-app3" --user="kube-pan-test-app-dev-app3" --namespace="pan-test-app-dev"
3060
+ - kubectl config use-context "kube-pan-test-app-dev-app3"
3061
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
3062
+ - |
3063
+ cat > __all_values.yml <<EOF
3064
+ env:
3065
+ secret:
3066
+ transitiveWithSecret: |-
3067
+ $(printf %s "this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2" | sed 's/^/ /')
3068
+ someJson: |-
3069
+ $(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
3070
+ public:
3071
+ ENV_SHORT: |-
3072
+ dev
3073
+ APP_DIR: |-
3074
+ kube
3075
+ ENV_TYPE: |-
3076
+ dev
3077
+ BUILD_INFO_BUILD_ID: |-
3078
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3079
+ BUILD_INFO_BUILD_TIME: |-
3080
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3081
+ BUILD_INFO_CURRENT_VERSION: |-
3082
+ $(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 's/^/ /')
3083
+ HOST: |-
3084
+ app3.dev.test-app.pan.panter.cloud
3085
+ ROOT_URL: |-
3086
+ https://app3.dev.test-app.pan.panter.cloud
3087
+ HOST_INTERNAL: |-
3088
+ app3.dev.test-app.pan.panter.cloud
3089
+ HOST_CANONICAL: |-
3090
+ app3.dev.test-app.pan.panter.cloud
3091
+ ROOT_URL_INTERNAL: |-
3092
+ https://app3.dev.test-app.pan.panter.cloud
3093
+ KUBE_NAMESPACE: |-
3094
+ pan-test-app-dev
3095
+ KUBE_APP_NAME: |-
3096
+ app3
3097
+ KUBE_APP_NAME_PREFIX: ""
3098
+ foo3: |-
3099
+ foo-value-3
3100
+ foo2: |-
3101
+ this is from app2: foo-value-2
3102
+ transitive: |-
3103
+ this is from app2: this is from app1: foo-value
3104
+ _ALL_ENV_VAR_KEYS: |-
3105
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3106
+ application:
3107
+ host: |-
3108
+ app3.dev.test-app.pan.panter.cloud
3109
+ command: |-
3110
+ yarn start
3111
+ livenessProbe:
3112
+ httpGet:
3113
+ path: |-
3114
+ __health
3115
+ readinessProbe:
3116
+ httpGet:
3117
+ path: |-
3118
+ __health
3119
+ startupProbe:
3120
+ httpGet:
3121
+ path: |-
3122
+ __health
3123
+
3124
+ EOF
3125
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
3126
+ - kubernetesCreateSecret
3127
+ - kubernetesDeploy
3128
+ - echo 'Uploading SBOM to Dependency Track'
3129
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app3" "https://app3.dev.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
3130
+ - echo deployment successful đŸ˜ģ
3131
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
3132
+ environment:
3133
+ name: dev/app3
3134
+ url: $CL_GITLAB_ENVIRONMENT_URL
3135
+ on_stop: 'app3 🛑 Stop âš ī¸ | dev '
3136
+ auto_stop_in: 4 weeks
3137
+ artifacts:
3138
+ reports:
3139
+ dotenv: gitlab_environment.env
3140
+ rules:
3141
+ - when: never
3142
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
3143
+ - when: on_success
3144
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3145
+ needs:
3146
+ - job: app3 👮 lint
3147
+ artifacts: false
3148
+ - job: 'app3 🔨 app | dev '
3149
+ artifacts: false
3150
+ - job: 'app3 🔨 docker | dev '
3151
+ artifacts: false
3152
+ - job: app3 đŸ§Ē test
3153
+ artifacts: false
3154
+ - job: 'app3 🧾 sbom | dev '
3155
+ artifacts: true
3156
+ - job: app3 🛡 audit
3157
+ artifacts: false
3158
+ retry: *a1
3159
+ interruptible: true
3160
+ allow_failure: false
3161
+ 'app3 🛑 Stop âš ī¸ | dev ':
3162
+ stage: stop dev
3163
+ image: path/to/docker/kubernetes:the-version
3164
+ variables:
3165
+ KUBERNETES_CPU_REQUEST: '0.22'
3166
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3167
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3168
+ GIT_STRATEGY: none
3169
+ script:
3170
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3171
+ - export ENV_SHORT="dev"
3172
+ - export APP_DIR="kube"
3173
+ - export ENV_TYPE="dev"
3174
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3175
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3176
+ - 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")"
3177
+ - export HOST="app3.dev.test-app.pan.panter.cloud"
3178
+ - export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
3179
+ - export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
3180
+ - export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
3181
+ - export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
3182
+ - export KUBE_NAMESPACE="pan-test-app-dev"
3183
+ - export KUBE_APP_NAME="app3"
3184
+ - export KUBE_APP_NAME_PREFIX=""
3185
+ - export foo3="foo-value-3"
3186
+ - 'export foo2="this is from app2: foo-value-2"'
3187
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
3188
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
3189
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
3190
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3191
+ - export RELEASE_NAME="pan-test-app-dev-app3"
3192
+ - export HELM_EXPERIMENTAL_OCI="1"
3193
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3194
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3195
+ - export HELM_ARGS=""
3196
+ - export COMPONENT_NAME="app3"
3197
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3198
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3199
+ - kubectl config set-cluster "kube-pan-test-app-dev-app3" --server="$CL_dev_app3_KUBE_URL" --certificate-authority <(echo $CL_dev_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3200
+ - kubectl config set-credentials "kube-pan-test-app-dev-app3" --token="$CL_dev_app3_KUBE_TOKEN"
3201
+ - kubectl config set-context "kube-pan-test-app-dev-app3" --cluster="kube-pan-test-app-dev-app3" --user="kube-pan-test-app-dev-app3" --namespace="pan-test-app-dev"
3202
+ - kubectl config use-context "kube-pan-test-app-dev-app3"
3203
+ - kubernetesDelete
3204
+ - echo 'Disabling component in Dependency Track'
3205
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app3" "https://app3.dev.test-app.pan.panter.cloud" || true
3206
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
3207
+ environment:
3208
+ name: dev/app3
3209
+ url: $CL_GITLAB_ENVIRONMENT_URL
3210
+ action: stop
3211
+ artifacts:
3212
+ reports:
3213
+ dotenv: gitlab_environment.env
3214
+ rules:
3215
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
3216
+ when: on_success
3217
+ - when: never
3218
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
3219
+ - when: manual
3220
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3221
+ needs: []
3222
+ retry: *a1
3223
+ interruptible: true
3224
+ allow_failure: true
3225
+ 'app3 â†Šī¸ Rollback âš ī¸ | dev ':
3226
+ stage: rollback dev
3227
+ image: path/to/docker/kubernetes:the-version
3228
+ variables:
3229
+ KUBERNETES_CPU_REQUEST: '0.22'
3230
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3231
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3232
+ GIT_STRATEGY: none
3233
+ script:
3234
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3235
+ - export ENV_SHORT="dev"
3236
+ - export APP_DIR="kube"
3237
+ - export ENV_TYPE="dev"
3238
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3239
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3240
+ - 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")"
3241
+ - export HOST="app3.dev.test-app.pan.panter.cloud"
3242
+ - export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
3243
+ - export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
3244
+ - export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
3245
+ - export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
3246
+ - export KUBE_NAMESPACE="pan-test-app-dev"
3247
+ - export KUBE_APP_NAME="app3"
3248
+ - export KUBE_APP_NAME_PREFIX=""
3249
+ - export foo3="foo-value-3"
3250
+ - 'export foo2="this is from app2: foo-value-2"'
3251
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
3252
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
3253
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
3254
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3255
+ - export RELEASE_NAME="pan-test-app-dev-app3"
3256
+ - export HELM_EXPERIMENTAL_OCI="1"
3257
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3258
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3259
+ - export HELM_ARGS=""
3260
+ - export COMPONENT_NAME="app3"
3261
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3262
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3263
+ - kubectl config set-cluster "kube-pan-test-app-dev-app3" --server="$CL_dev_app3_KUBE_URL" --certificate-authority <(echo $CL_dev_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3264
+ - kubectl config set-credentials "kube-pan-test-app-dev-app3" --token="$CL_dev_app3_KUBE_TOKEN"
3265
+ - kubectl config set-context "kube-pan-test-app-dev-app3" --cluster="kube-pan-test-app-dev-app3" --user="kube-pan-test-app-dev-app3" --namespace="pan-test-app-dev"
3266
+ - kubectl config use-context "kube-pan-test-app-dev-app3"
3267
+ - kubernetesRollback
3268
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
3269
+ environment:
3270
+ name: dev/app3
3271
+ url: $CL_GITLAB_ENVIRONMENT_URL
3272
+ action: access
3273
+ artifacts:
3274
+ reports:
3275
+ dotenv: gitlab_environment.env
3276
+ rules:
3277
+ - when: never
3278
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
3279
+ - when: manual
3280
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3281
+ needs: []
3282
+ retry: *a1
3283
+ interruptible: true
3284
+ allow_failure: true
3285
+ 'app3 🔨 app | review ':
3286
+ stage: build
3287
+ image: path/to/docker/jobs-default:the-version
3288
+ variables:
3289
+ KUBERNETES_CPU_REQUEST: '0.45'
3290
+ KUBERNETES_MEMORY_REQUEST: 1Gi
3291
+ KUBERNETES_MEMORY_LIMIT: 4Gi
3292
+ script:
3293
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3294
+ - export ENV_SHORT="review"
3295
+ - export APP_DIR="kube"
3296
+ - export ENV_TYPE="review"
3297
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3298
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3299
+ - 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")"
3300
+ - export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3301
+ - export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3302
+ - export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3303
+ - export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3304
+ - export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3305
+ - export KUBE_NAMESPACE="pan-test-app-review"
3306
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
3307
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
3308
+ - export foo3="foo-value-3"
3309
+ - 'export foo2="this is from app2: foo-value-2"'
3310
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
3311
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
3312
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
3313
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3314
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3315
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
3316
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3317
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
3318
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
3319
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3320
+ - cd kube
3321
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3322
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
3323
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
3324
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3325
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
3326
+ - yarn install --immutable
3327
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
3328
+ - yarn build
3329
+ cache:
3330
+ - key: kube-yarn
3331
+ policy: pull-push
3332
+ paths:
3333
+ - kube/.yarn
3334
+ - key: kube-node-modules
3335
+ policy: pull-push
3336
+ paths:
3337
+ - kube/node_modules
3338
+ - key: app3-next-cache
3339
+ policy: pull-push
3340
+ paths:
3341
+ - kube/.next/cache
3342
+ artifacts:
3343
+ paths:
3344
+ - kube/__build_info.json
3345
+ - kube/.next
3346
+ - kube/dist
3347
+ expire_in: 1 day
3348
+ when: always
3349
+ reports: {}
3350
+ rules:
3351
+ - if: $CI_MERGE_REQUEST_ID
3352
+ needs: []
3353
+ retry: *a1
3354
+ interruptible: true
3355
+ 'app3 🔨 docker | review ':
3356
+ stage: build
3357
+ image: path/to/docker/docker-build:the-version
3358
+ services:
3359
+ - name: docker:24.0.6-dind
3360
+ command:
3361
+ - --tls=false
3362
+ - --registry-mirror=https://mirror.gcr.io
3363
+ variables:
3364
+ DOCKER_HOST: tcp://0.0.0.0:2375
3365
+ DOCKER_TLS_CERTDIR: ''
3366
+ DOCKER_DRIVER: overlay2
3367
+ DOCKER_BUILDKIT: '1'
3368
+ KUBERNETES_CPU_REQUEST: '0.45'
3369
+ KUBERNETES_MEMORY_REQUEST: 1Gi
3370
+ KUBERNETES_MEMORY_LIMIT: 2Gi
3371
+ script:
3372
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3373
+ - export APP_DIR="kube"
3374
+ - export DOCKER_BUILD_CONTEXT="."
3375
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
3376
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
3377
+ - export DOCKER_IMAGE_NAME="review/app3"
3378
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
3379
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
3380
+ - |-
3381
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
3382
+ RUN yarn plugin import workspace-tools
3383
+ RUN yarn workspaces focus --production && yarn rebuild"
3384
+ - |-
3385
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node kube/package.json /app/kube/package.json
3386
+ COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
3387
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
3388
+ COPY --chown=node:node .yarn /app/.yarn"
3389
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3390
+ - ensureNodeDockerfile
3391
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
3392
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
3393
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
3394
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
3395
+ - 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
3396
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
3397
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
3398
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
3399
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
3400
+ - docker push $DOCKER_CACHE_IMAGE
3401
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
3402
+ cache:
3403
+ - key: kube-yarn
3404
+ policy: pull
3405
+ paths:
3406
+ - kube/.yarn
3407
+ rules:
3408
+ - if: $CI_MERGE_REQUEST_ID
3409
+ needs:
3410
+ - 'app3 🔨 app | review '
3411
+ retry: *a1
3412
+ interruptible: true
3413
+ 'app3 🧾 sbom | review ':
3414
+ stage: build
3415
+ image: aquasec/trivy:0.38.3
3416
+ variables: {}
3417
+ script:
3418
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3419
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3420
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
3421
+ artifacts:
3422
+ paths:
3423
+ - __sbom.json
3424
+ rules:
3425
+ - if: $CI_MERGE_REQUEST_ID
3426
+ needs: []
3427
+ retry: *a1
3428
+ interruptible: true
3429
+ allow_failure: true
3430
+ 'app3 🚀 Deploy | review ':
3431
+ stage: deploy review
3432
+ image: path/to/docker/kubernetes:the-version
3433
+ variables:
3434
+ KUBERNETES_CPU_REQUEST: '0.22'
3435
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3436
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3437
+ script:
3438
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3439
+ - export ENV_SHORT="review"
3440
+ - export APP_DIR="kube"
3441
+ - export ENV_TYPE="review"
3442
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3443
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3444
+ - 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")"
3445
+ - export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3446
+ - export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3447
+ - export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3448
+ - export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3449
+ - export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3450
+ - export KUBE_NAMESPACE="pan-test-app-review"
3451
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
3452
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
3453
+ - export foo3="foo-value-3"
3454
+ - 'export foo2="this is from app2: foo-value-2"'
3455
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
3456
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
3457
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
3458
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3459
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
3460
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
3461
+ - export DOCKER_IMAGE_NAME="review/app3"
3462
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
3463
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
3464
+ - export RELEASE_NAME="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"; })-app3"
3465
+ - export HELM_EXPERIMENTAL_OCI="1"
3466
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3467
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3468
+ - export HELM_ARGS=""
3469
+ - export COMPONENT_NAME="app3"
3470
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3471
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3472
+ - kubectl config set-cluster "kube-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"; })-app3" --server="$CL_review_app3_KUBE_URL" --certificate-authority <(echo $CL_review_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3473
+ - kubectl config set-credentials "kube-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"; })-app3" --token="$CL_review_app3_KUBE_TOKEN"
3474
+ - kubectl config set-context "kube-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"; })-app3" --cluster="kube-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"; })-app3" --user="kube-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"; })-app3" --namespace="pan-test-app-review"
3475
+ - kubectl config use-context "kube-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"; })-app3"
3476
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
3477
+ - |
3478
+ cat > __all_values.yml <<EOF
3479
+ env:
3480
+ secret:
3481
+ transitiveWithSecret: |-
3482
+ $(printf %s "this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2" | sed 's/^/ /')
3483
+ someJson: |-
3484
+ $(printf %s "[{\\"name\\": \\"app1\\", \\"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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
3485
+ public:
3486
+ ENV_SHORT: |-
3487
+ review
3488
+ APP_DIR: |-
3489
+ kube
3490
+ ENV_TYPE: |-
3491
+ review
3492
+ BUILD_INFO_BUILD_ID: |-
3493
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3494
+ BUILD_INFO_BUILD_TIME: |-
3495
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3496
+ BUILD_INFO_CURRENT_VERSION: |-
3497
+ $(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 's/^/ /')
3498
+ HOST: |-
3499
+ $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3500
+ ROOT_URL: |-
3501
+ $(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3502
+ HOST_INTERNAL: |-
3503
+ $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3504
+ HOST_CANONICAL: |-
3505
+ $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3506
+ ROOT_URL_INTERNAL: |-
3507
+ $(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3508
+ KUBE_NAMESPACE: |-
3509
+ pan-test-app-review
3510
+ KUBE_APP_NAME: |-
3511
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" | sed 's/^/ /')
3512
+ KUBE_APP_NAME_PREFIX: |-
3513
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | sed 's/^/ /')
3514
+ foo3: |-
3515
+ foo-value-3
3516
+ foo2: |-
3517
+ this is from app2: foo-value-2
3518
+ transitive: |-
3519
+ this is from app2: this is from app1: foo-value
3520
+ _ALL_ENV_VAR_KEYS: |-
3521
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3522
+ application:
3523
+ host: |-
3524
+ $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3525
+ command: |-
3526
+ yarn start
3527
+ livenessProbe:
3528
+ httpGet:
3529
+ path: |-
3530
+ __health
3531
+ readinessProbe:
3532
+ httpGet:
3533
+ path: |-
3534
+ __health
3535
+ startupProbe:
3536
+ httpGet:
3537
+ path: |-
3538
+ __health
3539
+
3540
+ EOF
3541
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
3542
+ - kubernetesCreateSecret
3543
+ - kubernetesDeploy
3544
+ - echo 'Uploading SBOM to Dependency Track'
3545
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app3" "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
3546
+ - echo deployment successful đŸ˜ģ
3547
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
3548
+ environment:
3549
+ name: review/$CI_COMMIT_REF_NAME/app3
3550
+ url: $CL_GITLAB_ENVIRONMENT_URL
3551
+ on_stop: 'app3 🛑 Stop âš ī¸ | review '
3552
+ auto_stop_in: 1 week
3553
+ artifacts:
3554
+ reports:
3555
+ dotenv: gitlab_environment.env
3556
+ rules:
3557
+ - when: on_success
3558
+ if: $CI_MERGE_REQUEST_ID
3559
+ needs:
3560
+ - job: app3 👮 lint
3561
+ artifacts: false
3562
+ - job: 'app3 🔨 app | review '
3563
+ artifacts: false
3564
+ - job: 'app3 🔨 docker | review '
3565
+ artifacts: false
3566
+ - job: app3 đŸ§Ē test
3567
+ artifacts: false
3568
+ - job: 'app3 🧾 sbom | review '
3569
+ artifacts: true
3570
+ - job: app3 🛡 audit
3571
+ artifacts: false
3572
+ retry: *a1
3573
+ interruptible: true
3574
+ allow_failure: false
3575
+ 'app3 🛑 Stop âš ī¸ | review ':
3576
+ stage: stop review
3577
+ image: path/to/docker/kubernetes:the-version
3578
+ variables:
3579
+ KUBERNETES_CPU_REQUEST: '0.22'
3580
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3581
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3582
+ GIT_STRATEGY: none
3583
+ script:
3584
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3585
+ - export ENV_SHORT="review"
3586
+ - export APP_DIR="kube"
3587
+ - export ENV_TYPE="review"
3588
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3589
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3590
+ - 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")"
3591
+ - export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3592
+ - export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3593
+ - export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3594
+ - export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3595
+ - export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3596
+ - export KUBE_NAMESPACE="pan-test-app-review"
3597
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
3598
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
3599
+ - export foo3="foo-value-3"
3600
+ - 'export foo2="this is from app2: foo-value-2"'
3601
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
3602
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
3603
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
3604
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3605
+ - export RELEASE_NAME="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"; })-app3"
3606
+ - export HELM_EXPERIMENTAL_OCI="1"
3607
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3608
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3609
+ - export HELM_ARGS=""
3610
+ - export COMPONENT_NAME="app3"
3611
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3612
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3613
+ - kubectl config set-cluster "kube-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"; })-app3" --server="$CL_review_app3_KUBE_URL" --certificate-authority <(echo $CL_review_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3614
+ - kubectl config set-credentials "kube-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"; })-app3" --token="$CL_review_app3_KUBE_TOKEN"
3615
+ - kubectl config set-context "kube-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"; })-app3" --cluster="kube-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"; })-app3" --user="kube-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"; })-app3" --namespace="pan-test-app-review"
3616
+ - kubectl config use-context "kube-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"; })-app3"
3617
+ - kubernetesDelete
3618
+ - echo 'Disabling component in Dependency Track'
3619
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app3" "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" || true
3620
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
3621
+ environment:
3622
+ name: review/$CI_COMMIT_REF_NAME/app3
3623
+ url: $CL_GITLAB_ENVIRONMENT_URL
3624
+ action: stop
3625
+ artifacts:
3626
+ reports:
3627
+ dotenv: gitlab_environment.env
3628
+ rules:
3629
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
3630
+ when: on_success
3631
+ - when: manual
3632
+ if: $CI_MERGE_REQUEST_ID
3633
+ needs: []
3634
+ retry: *a1
3635
+ interruptible: true
3636
+ allow_failure: true
3637
+ 'app3 â†Šī¸ Rollback âš ī¸ | review ':
3638
+ stage: rollback review
3639
+ image: path/to/docker/kubernetes:the-version
3640
+ variables:
3641
+ KUBERNETES_CPU_REQUEST: '0.22'
3642
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3643
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3644
+ GIT_STRATEGY: none
3645
+ script:
3646
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3647
+ - export ENV_SHORT="review"
3648
+ - export APP_DIR="kube"
3649
+ - export ENV_TYPE="review"
3650
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3651
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3652
+ - 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")"
3653
+ - export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3654
+ - export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3655
+ - export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3656
+ - export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3657
+ - export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3658
+ - export KUBE_NAMESPACE="pan-test-app-review"
3659
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
3660
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
3661
+ - export foo3="foo-value-3"
3662
+ - 'export foo2="this is from app2: foo-value-2"'
3663
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
3664
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
3665
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
3666
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3667
+ - export RELEASE_NAME="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"; })-app3"
3668
+ - export HELM_EXPERIMENTAL_OCI="1"
3669
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3670
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3671
+ - export HELM_ARGS=""
3672
+ - export COMPONENT_NAME="app3"
3673
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3674
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3675
+ - kubectl config set-cluster "kube-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"; })-app3" --server="$CL_review_app3_KUBE_URL" --certificate-authority <(echo $CL_review_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3676
+ - kubectl config set-credentials "kube-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"; })-app3" --token="$CL_review_app3_KUBE_TOKEN"
3677
+ - kubectl config set-context "kube-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"; })-app3" --cluster="kube-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"; })-app3" --user="kube-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"; })-app3" --namespace="pan-test-app-review"
3678
+ - kubectl config use-context "kube-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"; })-app3"
3679
+ - kubernetesRollback
3680
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
3681
+ environment:
3682
+ name: review/$CI_COMMIT_REF_NAME/app3
3683
+ url: $CL_GITLAB_ENVIRONMENT_URL
3684
+ action: access
3685
+ artifacts:
3686
+ reports:
3687
+ dotenv: gitlab_environment.env
3688
+ rules:
3689
+ - when: manual
3690
+ if: $CI_MERGE_REQUEST_ID
3691
+ needs: []
3692
+ retry: *a1
3693
+ interruptible: true
3694
+ allow_failure: true
3695
+ 'app3 🔨 app | stage ':
3696
+ stage: build
3697
+ image: path/to/docker/jobs-default:the-version
3698
+ variables:
3699
+ KUBERNETES_CPU_REQUEST: '0.45'
3700
+ KUBERNETES_MEMORY_REQUEST: 1Gi
3701
+ KUBERNETES_MEMORY_LIMIT: 4Gi
3702
+ script:
3703
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3704
+ - export ENV_SHORT="stage"
3705
+ - export APP_DIR="kube"
3706
+ - export ENV_TYPE="stage"
3707
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3708
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3709
+ - 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")"
3710
+ - export HOST="app3.stage.test-app.pan.panter.cloud"
3711
+ - export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
3712
+ - export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
3713
+ - export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
3714
+ - export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
3715
+ - export KUBE_NAMESPACE="pan-test-app-stage"
3716
+ - export KUBE_APP_NAME="app3"
3717
+ - export KUBE_APP_NAME_PREFIX=""
3718
+ - export foo3="foo-value-3"
3719
+ - 'export foo2="this is from app2: foo-value-2"'
3720
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
3721
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
3722
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
3723
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3724
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3725
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
3726
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3727
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
3728
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
3729
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3730
+ - cd kube
3731
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3732
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
3733
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
3734
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3735
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
3736
+ - yarn install --immutable
3737
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
3738
+ - yarn build
3739
+ cache:
3740
+ - key: kube-yarn
3741
+ policy: pull-push
3742
+ paths:
3743
+ - kube/.yarn
3744
+ - key: kube-node-modules
3745
+ policy: pull-push
3746
+ paths:
3747
+ - kube/node_modules
3748
+ - key: app3-next-cache
3749
+ policy: pull-push
3750
+ paths:
3751
+ - kube/.next/cache
3752
+ artifacts:
3753
+ paths:
3754
+ - kube/__build_info.json
3755
+ - kube/.next
3756
+ - kube/dist
3757
+ expire_in: 1 day
3758
+ when: always
3759
+ reports: {}
3760
+ rules:
3761
+ - if: $CI_COMMIT_TAG
3762
+ needs: []
3763
+ retry: *a1
3764
+ interruptible: true
3765
+ 'app3 🔨 docker | stage ':
3766
+ stage: build
3767
+ image: path/to/docker/docker-build:the-version
3768
+ services:
3769
+ - name: docker:24.0.6-dind
3770
+ command:
3771
+ - --tls=false
3772
+ - --registry-mirror=https://mirror.gcr.io
3773
+ variables:
3774
+ DOCKER_HOST: tcp://0.0.0.0:2375
3775
+ DOCKER_TLS_CERTDIR: ''
3776
+ DOCKER_DRIVER: overlay2
3777
+ DOCKER_BUILDKIT: '1'
3778
+ KUBERNETES_CPU_REQUEST: '0.45'
3779
+ KUBERNETES_MEMORY_REQUEST: 1Gi
3780
+ KUBERNETES_MEMORY_LIMIT: 2Gi
3781
+ script:
3782
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3783
+ - export APP_DIR="kube"
3784
+ - export DOCKER_BUILD_CONTEXT="."
3785
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
3786
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
3787
+ - export DOCKER_IMAGE_NAME="stage/app3"
3788
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
3789
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
3790
+ - |-
3791
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
3792
+ RUN yarn plugin import workspace-tools
3793
+ RUN yarn workspaces focus --production && yarn rebuild"
3794
+ - |-
3795
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node kube/package.json /app/kube/package.json
3796
+ COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
3797
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
3798
+ COPY --chown=node:node .yarn /app/.yarn"
3799
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3800
+ - ensureNodeDockerfile
3801
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
3802
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
3803
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
3804
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
3805
+ - 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
3806
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
3807
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
3808
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
3809
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
3810
+ - docker push $DOCKER_CACHE_IMAGE
3811
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
3812
+ cache:
3813
+ - key: kube-yarn
3814
+ policy: pull
3815
+ paths:
3816
+ - kube/.yarn
3817
+ rules:
3818
+ - if: $CI_COMMIT_TAG
3819
+ needs:
3820
+ - 'app3 🔨 app | stage '
3821
+ retry: *a1
3822
+ interruptible: true
3823
+ 'app3 🧾 sbom | stage ':
3824
+ stage: build
3825
+ image: aquasec/trivy:0.38.3
3826
+ variables: {}
3827
+ script:
3828
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3829
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3830
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
3831
+ artifacts:
3832
+ paths:
3833
+ - __sbom.json
3834
+ rules:
3835
+ - if: $CI_COMMIT_TAG
3836
+ needs: []
3837
+ retry: *a1
3838
+ interruptible: true
3839
+ allow_failure: true
3840
+ 'app3 🚀 Deploy | stage ':
3841
+ stage: deploy stage
3842
+ image: path/to/docker/kubernetes:the-version
3843
+ variables:
3844
+ KUBERNETES_CPU_REQUEST: '0.22'
3845
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3846
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3847
+ script:
3848
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3849
+ - export ENV_SHORT="stage"
3850
+ - export APP_DIR="kube"
3851
+ - export ENV_TYPE="stage"
3852
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3853
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3854
+ - 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")"
3855
+ - export HOST="app3.stage.test-app.pan.panter.cloud"
3856
+ - export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
3857
+ - export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
3858
+ - export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
3859
+ - export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
3860
+ - export KUBE_NAMESPACE="pan-test-app-stage"
3861
+ - export KUBE_APP_NAME="app3"
3862
+ - export KUBE_APP_NAME_PREFIX=""
3863
+ - export foo3="foo-value-3"
3864
+ - 'export foo2="this is from app2: foo-value-2"'
3865
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
3866
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
3867
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
3868
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3869
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
3870
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
3871
+ - export DOCKER_IMAGE_NAME="stage/app3"
3872
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
3873
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
3874
+ - export RELEASE_NAME="pan-test-app-stage-app3"
3875
+ - export HELM_EXPERIMENTAL_OCI="1"
3876
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3877
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3878
+ - export HELM_ARGS=""
3879
+ - export COMPONENT_NAME="app3"
3880
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3881
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3882
+ - kubectl config set-cluster "kube-pan-test-app-stage-app3" --server="$CL_stage_app3_KUBE_URL" --certificate-authority <(echo $CL_stage_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3883
+ - kubectl config set-credentials "kube-pan-test-app-stage-app3" --token="$CL_stage_app3_KUBE_TOKEN"
3884
+ - kubectl config set-context "kube-pan-test-app-stage-app3" --cluster="kube-pan-test-app-stage-app3" --user="kube-pan-test-app-stage-app3" --namespace="pan-test-app-stage"
3885
+ - kubectl config use-context "kube-pan-test-app-stage-app3"
3886
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
3887
+ - |
3888
+ cat > __all_values.yml <<EOF
3889
+ env:
3890
+ secret:
3891
+ transitiveWithSecret: |-
3892
+ $(printf %s "this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2" | sed 's/^/ /')
3893
+ someJson: |-
3894
+ $(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
3895
+ public:
3896
+ ENV_SHORT: |-
3897
+ stage
3898
+ APP_DIR: |-
3899
+ kube
3900
+ ENV_TYPE: |-
3901
+ stage
3902
+ BUILD_INFO_BUILD_ID: |-
3903
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3904
+ BUILD_INFO_BUILD_TIME: |-
3905
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3906
+ BUILD_INFO_CURRENT_VERSION: |-
3907
+ $(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 's/^/ /')
3908
+ HOST: |-
3909
+ app3.stage.test-app.pan.panter.cloud
3910
+ ROOT_URL: |-
3911
+ https://app3.stage.test-app.pan.panter.cloud
3912
+ HOST_INTERNAL: |-
3913
+ app3.stage.test-app.pan.panter.cloud
3914
+ HOST_CANONICAL: |-
3915
+ app3.stage.test-app.pan.panter.cloud
3916
+ ROOT_URL_INTERNAL: |-
3917
+ https://app3.stage.test-app.pan.panter.cloud
3918
+ KUBE_NAMESPACE: |-
3919
+ pan-test-app-stage
3920
+ KUBE_APP_NAME: |-
3921
+ app3
3922
+ KUBE_APP_NAME_PREFIX: ""
3923
+ foo3: |-
3924
+ foo-value-3
3925
+ foo2: |-
3926
+ this is from app2: foo-value-2
3927
+ transitive: |-
3928
+ this is from app2: this is from app1: foo-value
3929
+ _ALL_ENV_VAR_KEYS: |-
3930
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3931
+ application:
3932
+ host: |-
3933
+ app3.stage.test-app.pan.panter.cloud
3934
+ command: |-
3935
+ yarn start
3936
+ livenessProbe:
3937
+ httpGet:
3938
+ path: |-
3939
+ __health
3940
+ readinessProbe:
3941
+ httpGet:
3942
+ path: |-
3943
+ __health
3944
+ startupProbe:
3945
+ httpGet:
3946
+ path: |-
3947
+ __health
3948
+
3949
+ EOF
3950
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
3951
+ - kubernetesCreateSecret
3952
+ - kubernetesDeploy
3953
+ - echo 'Uploading SBOM to Dependency Track'
3954
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app3" "https://app3.stage.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
3955
+ - echo deployment successful đŸ˜ģ
3956
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
3957
+ environment:
3958
+ name: stage/app3
3959
+ url: $CL_GITLAB_ENVIRONMENT_URL
3960
+ on_stop: 'app3 🛑 Stop âš ī¸ | stage '
3961
+ artifacts:
3962
+ reports:
3963
+ dotenv: gitlab_environment.env
3964
+ rules:
3965
+ - when: on_success
3966
+ if: $CI_COMMIT_TAG
3967
+ needs:
3968
+ - job: 'app3 🔨 app | stage '
3969
+ artifacts: false
3970
+ - job: 'app3 🔨 docker | stage '
3971
+ artifacts: false
3972
+ - job: 'app3 🧾 sbom | stage '
3973
+ artifacts: true
3974
+ retry: *a1
3975
+ interruptible: true
3976
+ allow_failure: false
3977
+ 'app3 🛑 Stop âš ī¸ | stage ':
3978
+ stage: stop stage
3979
+ image: path/to/docker/kubernetes:the-version
3980
+ variables:
3981
+ KUBERNETES_CPU_REQUEST: '0.22'
3982
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3983
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3984
+ GIT_STRATEGY: none
3985
+ script:
3986
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3987
+ - export ENV_SHORT="stage"
3988
+ - export APP_DIR="kube"
3989
+ - export ENV_TYPE="stage"
3990
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3991
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3992
+ - 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")"
3993
+ - export HOST="app3.stage.test-app.pan.panter.cloud"
3994
+ - export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
3995
+ - export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
3996
+ - export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
3997
+ - export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
3998
+ - export KUBE_NAMESPACE="pan-test-app-stage"
3999
+ - export KUBE_APP_NAME="app3"
4000
+ - export KUBE_APP_NAME_PREFIX=""
4001
+ - export foo3="foo-value-3"
4002
+ - 'export foo2="this is from app2: foo-value-2"'
4003
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
4004
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
4005
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
4006
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4007
+ - export RELEASE_NAME="pan-test-app-stage-app3"
4008
+ - export HELM_EXPERIMENTAL_OCI="1"
4009
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
4010
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
4011
+ - export HELM_ARGS=""
4012
+ - export COMPONENT_NAME="app3"
4013
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4014
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4015
+ - kubectl config set-cluster "kube-pan-test-app-stage-app3" --server="$CL_stage_app3_KUBE_URL" --certificate-authority <(echo $CL_stage_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
4016
+ - kubectl config set-credentials "kube-pan-test-app-stage-app3" --token="$CL_stage_app3_KUBE_TOKEN"
4017
+ - kubectl config set-context "kube-pan-test-app-stage-app3" --cluster="kube-pan-test-app-stage-app3" --user="kube-pan-test-app-stage-app3" --namespace="pan-test-app-stage"
4018
+ - kubectl config use-context "kube-pan-test-app-stage-app3"
4019
+ - kubernetesDelete
4020
+ - echo 'Disabling component in Dependency Track'
4021
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app3" "https://app3.stage.test-app.pan.panter.cloud" || true
4022
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
4023
+ environment:
4024
+ name: stage/app3
4025
+ url: $CL_GITLAB_ENVIRONMENT_URL
4026
+ action: stop
4027
+ artifacts:
4028
+ reports:
4029
+ dotenv: gitlab_environment.env
4030
+ rules:
4031
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
4032
+ when: on_success
4033
+ - when: manual
4034
+ if: $CI_COMMIT_TAG
4035
+ needs: []
4036
+ retry: *a1
4037
+ interruptible: true
4038
+ allow_failure: true
4039
+ 'app3 â†Šī¸ Rollback âš ī¸ | stage ':
4040
+ stage: rollback stage
4041
+ image: path/to/docker/kubernetes:the-version
4042
+ variables:
4043
+ KUBERNETES_CPU_REQUEST: '0.22'
4044
+ KUBERNETES_MEMORY_REQUEST: 200Mi
4045
+ KUBERNETES_MEMORY_LIMIT: 400Mi
4046
+ GIT_STRATEGY: none
4047
+ script:
4048
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4049
+ - export ENV_SHORT="stage"
4050
+ - export APP_DIR="kube"
4051
+ - export ENV_TYPE="stage"
4052
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4053
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
4054
+ - 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")"
4055
+ - export HOST="app3.stage.test-app.pan.panter.cloud"
4056
+ - export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
4057
+ - export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
4058
+ - export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
4059
+ - export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
4060
+ - export KUBE_NAMESPACE="pan-test-app-stage"
4061
+ - export KUBE_APP_NAME="app3"
4062
+ - export KUBE_APP_NAME_PREFIX=""
4063
+ - export foo3="foo-value-3"
4064
+ - 'export foo2="this is from app2: foo-value-2"'
4065
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
4066
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
4067
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
4068
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4069
+ - export RELEASE_NAME="pan-test-app-stage-app3"
4070
+ - export HELM_EXPERIMENTAL_OCI="1"
4071
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
4072
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
4073
+ - export HELM_ARGS=""
4074
+ - export COMPONENT_NAME="app3"
4075
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4076
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4077
+ - kubectl config set-cluster "kube-pan-test-app-stage-app3" --server="$CL_stage_app3_KUBE_URL" --certificate-authority <(echo $CL_stage_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
4078
+ - kubectl config set-credentials "kube-pan-test-app-stage-app3" --token="$CL_stage_app3_KUBE_TOKEN"
4079
+ - kubectl config set-context "kube-pan-test-app-stage-app3" --cluster="kube-pan-test-app-stage-app3" --user="kube-pan-test-app-stage-app3" --namespace="pan-test-app-stage"
4080
+ - kubectl config use-context "kube-pan-test-app-stage-app3"
4081
+ - kubernetesRollback
4082
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
4083
+ environment:
4084
+ name: stage/app3
4085
+ url: $CL_GITLAB_ENVIRONMENT_URL
4086
+ action: access
4087
+ artifacts:
4088
+ reports:
4089
+ dotenv: gitlab_environment.env
4090
+ rules:
4091
+ - when: manual
4092
+ if: $CI_COMMIT_TAG
4093
+ needs: []
4094
+ retry: *a1
4095
+ interruptible: true
4096
+ allow_failure: true
4097
+ 'app3 🔨 app | prod ':
4098
+ stage: build
4099
+ image: path/to/docker/jobs-default:the-version
4100
+ variables:
4101
+ KUBERNETES_CPU_REQUEST: '0.45'
4102
+ KUBERNETES_MEMORY_REQUEST: 1Gi
4103
+ KUBERNETES_MEMORY_LIMIT: 4Gi
4104
+ script:
4105
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4106
+ - export ENV_SHORT="prod"
4107
+ - export APP_DIR="kube"
4108
+ - export ENV_TYPE="prod"
4109
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4110
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
4111
+ - 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")"
4112
+ - export HOST="app3.prod.test-app.pan.panter.cloud"
4113
+ - export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
4114
+ - export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4115
+ - export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
4116
+ - export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
4117
+ - export KUBE_NAMESPACE="pan-test-app-prod"
4118
+ - export KUBE_APP_NAME="app3"
4119
+ - export KUBE_APP_NAME_PREFIX=""
4120
+ - export foo3="foo-value-3"
4121
+ - 'export foo2="this is from app2: foo-value-2"'
4122
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
4123
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
4124
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
4125
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4126
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4127
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
4128
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
4129
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
4130
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
4131
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
4132
+ - cd kube
4133
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
4134
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
4135
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
4136
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
4137
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
4138
+ - yarn install --immutable
4139
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
4140
+ - yarn build
4141
+ cache:
4142
+ - key: kube-yarn
4143
+ policy: pull-push
4144
+ paths:
4145
+ - kube/.yarn
4146
+ - key: kube-node-modules
4147
+ policy: pull-push
4148
+ paths:
4149
+ - kube/node_modules
4150
+ - key: app3-next-cache
4151
+ policy: pull-push
4152
+ paths:
4153
+ - kube/.next/cache
4154
+ artifacts:
4155
+ paths:
4156
+ - kube/__build_info.json
4157
+ - kube/.next
4158
+ - kube/dist
4159
+ expire_in: 1 day
4160
+ when: always
4161
+ reports: {}
4162
+ rules:
4163
+ - if: $CI_COMMIT_TAG
4164
+ needs: []
4165
+ retry: *a1
4166
+ interruptible: true
4167
+ 'app3 🔨 docker | prod ':
4168
+ stage: build
4169
+ image: path/to/docker/docker-build:the-version
4170
+ services:
4171
+ - name: docker:24.0.6-dind
4172
+ command:
4173
+ - --tls=false
4174
+ - --registry-mirror=https://mirror.gcr.io
4175
+ variables:
4176
+ DOCKER_HOST: tcp://0.0.0.0:2375
4177
+ DOCKER_TLS_CERTDIR: ''
4178
+ DOCKER_DRIVER: overlay2
4179
+ DOCKER_BUILDKIT: '1'
4180
+ KUBERNETES_CPU_REQUEST: '0.45'
4181
+ KUBERNETES_MEMORY_REQUEST: 1Gi
4182
+ KUBERNETES_MEMORY_LIMIT: 2Gi
4183
+ script:
4184
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4185
+ - export APP_DIR="kube"
4186
+ - export DOCKER_BUILD_CONTEXT="."
4187
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
4188
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
4189
+ - export DOCKER_IMAGE_NAME="prod/app3"
4190
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
4191
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
4192
+ - |-
4193
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
4194
+ RUN yarn plugin import workspace-tools
4195
+ RUN yarn workspaces focus --production && yarn rebuild"
4196
+ - |-
4197
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node kube/package.json /app/kube/package.json
4198
+ COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
4199
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
4200
+ COPY --chown=node:node .yarn /app/.yarn"
4201
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4202
+ - ensureNodeDockerfile
4203
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
4204
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
4205
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
4206
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
4207
+ - 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
4208
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
4209
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
4210
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
4211
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
4212
+ - docker push $DOCKER_CACHE_IMAGE
4213
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
4214
+ cache:
4215
+ - key: kube-yarn
4216
+ policy: pull
4217
+ paths:
4218
+ - kube/.yarn
4219
+ rules:
4220
+ - if: $CI_COMMIT_TAG
4221
+ needs:
4222
+ - 'app3 🔨 app | prod '
4223
+ retry: *a1
4224
+ interruptible: true
4225
+ 'app3 🧾 sbom | prod ':
4226
+ stage: build
4227
+ image: aquasec/trivy:0.38.3
4228
+ variables: {}
4229
+ script:
4230
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4231
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4232
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
4233
+ artifacts:
4234
+ paths:
4235
+ - __sbom.json
4236
+ rules:
4237
+ - if: $CI_COMMIT_TAG
4238
+ needs: []
4239
+ retry: *a1
4240
+ interruptible: true
4241
+ allow_failure: true
4242
+ 'app3 🚀 Deploy | prod ':
4243
+ stage: deploy prod
4244
+ image: path/to/docker/kubernetes:the-version
4245
+ variables:
4246
+ KUBERNETES_CPU_REQUEST: '0.22'
4247
+ KUBERNETES_MEMORY_REQUEST: 200Mi
4248
+ KUBERNETES_MEMORY_LIMIT: 400Mi
4249
+ script:
4250
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4251
+ - export ENV_SHORT="prod"
4252
+ - export APP_DIR="kube"
4253
+ - export ENV_TYPE="prod"
4254
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4255
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
4256
+ - 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")"
4257
+ - export HOST="app3.prod.test-app.pan.panter.cloud"
4258
+ - export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
4259
+ - export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4260
+ - export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
4261
+ - export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
4262
+ - export KUBE_NAMESPACE="pan-test-app-prod"
4263
+ - export KUBE_APP_NAME="app3"
4264
+ - export KUBE_APP_NAME_PREFIX=""
4265
+ - export foo3="foo-value-3"
4266
+ - 'export foo2="this is from app2: foo-value-2"'
4267
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
4268
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
4269
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
4270
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4271
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
4272
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
4273
+ - export DOCKER_IMAGE_NAME="prod/app3"
4274
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
4275
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
4276
+ - export RELEASE_NAME="pan-test-app-prod-app3"
4277
+ - export HELM_EXPERIMENTAL_OCI="1"
4278
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
4279
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
4280
+ - export HELM_ARGS=""
4281
+ - export COMPONENT_NAME="app3"
4282
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4283
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4284
+ - kubectl config set-cluster "kube-pan-test-app-prod-app3" --server="$CL_prod_app3_KUBE_URL" --certificate-authority <(echo $CL_prod_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
4285
+ - kubectl config set-credentials "kube-pan-test-app-prod-app3" --token="$CL_prod_app3_KUBE_TOKEN"
4286
+ - kubectl config set-context "kube-pan-test-app-prod-app3" --cluster="kube-pan-test-app-prod-app3" --user="kube-pan-test-app-prod-app3" --namespace="pan-test-app-prod"
4287
+ - kubectl config use-context "kube-pan-test-app-prod-app3"
4288
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
4289
+ - |
4290
+ cat > __all_values.yml <<EOF
4291
+ env:
4292
+ secret:
4293
+ transitiveWithSecret: |-
4294
+ $(printf %s "this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2" | sed 's/^/ /')
4295
+ someJson: |-
4296
+ $(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
4297
+ public:
4298
+ ENV_SHORT: |-
4299
+ prod
4300
+ APP_DIR: |-
4301
+ kube
4302
+ ENV_TYPE: |-
4303
+ prod
4304
+ BUILD_INFO_BUILD_ID: |-
4305
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
4306
+ BUILD_INFO_BUILD_TIME: |-
4307
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
4308
+ BUILD_INFO_CURRENT_VERSION: |-
4309
+ $(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 's/^/ /')
4310
+ HOST: |-
4311
+ app3.prod.test-app.pan.panter.cloud
4312
+ ROOT_URL: |-
4313
+ https://app3.prod.test-app.pan.panter.cloud
4314
+ HOST_INTERNAL: |-
4315
+ app3.prod.test-app.pan.panter.cloud
4316
+ HOST_CANONICAL: |-
4317
+ app3.prod.test-app.pan.panter.cloud
4318
+ ROOT_URL_INTERNAL: |-
4319
+ https://app3.prod.test-app.pan.panter.cloud
4320
+ KUBE_NAMESPACE: |-
4321
+ pan-test-app-prod
4322
+ KUBE_APP_NAME: |-
4323
+ app3
4324
+ KUBE_APP_NAME_PREFIX: ""
4325
+ foo3: |-
4326
+ foo-value-3
4327
+ foo2: |-
4328
+ this is from app2: foo-value-2
4329
+ transitive: |-
4330
+ this is from app2: this is from app1: foo-value
4331
+ _ALL_ENV_VAR_KEYS: |-
4332
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
4333
+ application:
4334
+ host: |-
4335
+ app3.prod.test-app.pan.panter.cloud
4336
+ command: |-
4337
+ yarn start
4338
+ livenessProbe:
4339
+ httpGet:
4340
+ path: |-
4341
+ __health
4342
+ readinessProbe:
4343
+ httpGet:
4344
+ path: |-
4345
+ __health
4346
+ startupProbe:
4347
+ httpGet:
4348
+ path: |-
4349
+ __health
4350
+
4351
+ EOF
4352
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
4353
+ - kubernetesCreateSecret
4354
+ - kubernetesDeploy
4355
+ - echo 'Uploading SBOM to Dependency Track'
4356
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app3" "https://app3.prod.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
4357
+ - echo deployment successful đŸ˜ģ
4358
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
4359
+ environment:
4360
+ name: prod/app3
4361
+ url: $CL_GITLAB_ENVIRONMENT_URL
4362
+ on_stop: 'app3 🛑 Stop âš ī¸ | prod '
4363
+ artifacts:
4364
+ reports:
4365
+ dotenv: gitlab_environment.env
4366
+ rules:
4367
+ - when: manual
4368
+ if: $CI_COMMIT_TAG
4369
+ needs:
4370
+ - job: 'app3 🔨 app | prod '
4371
+ artifacts: false
4372
+ - job: 'app3 🔨 docker | prod '
4373
+ artifacts: false
4374
+ - job: 'app3 🧾 sbom | prod '
4375
+ artifacts: true
4376
+ retry: *a1
4377
+ interruptible: true
4378
+ allow_failure: true
4379
+ 'app3 🛑 Stop âš ī¸ | prod ':
4380
+ stage: stop prod
4381
+ image: path/to/docker/kubernetes:the-version
4382
+ variables:
4383
+ KUBERNETES_CPU_REQUEST: '0.22'
4384
+ KUBERNETES_MEMORY_REQUEST: 200Mi
4385
+ KUBERNETES_MEMORY_LIMIT: 400Mi
4386
+ GIT_STRATEGY: none
4387
+ script:
4388
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4389
+ - export ENV_SHORT="prod"
4390
+ - export APP_DIR="kube"
4391
+ - export ENV_TYPE="prod"
4392
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4393
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
4394
+ - 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")"
4395
+ - export HOST="app3.prod.test-app.pan.panter.cloud"
4396
+ - export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
4397
+ - export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4398
+ - export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
4399
+ - export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
4400
+ - export KUBE_NAMESPACE="pan-test-app-prod"
4401
+ - export KUBE_APP_NAME="app3"
4402
+ - export KUBE_APP_NAME_PREFIX=""
4403
+ - export foo3="foo-value-3"
4404
+ - 'export foo2="this is from app2: foo-value-2"'
4405
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
4406
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
4407
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
4408
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4409
+ - export RELEASE_NAME="pan-test-app-prod-app3"
4410
+ - export HELM_EXPERIMENTAL_OCI="1"
4411
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
4412
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
4413
+ - export HELM_ARGS=""
4414
+ - export COMPONENT_NAME="app3"
4415
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4416
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4417
+ - kubectl config set-cluster "kube-pan-test-app-prod-app3" --server="$CL_prod_app3_KUBE_URL" --certificate-authority <(echo $CL_prod_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
4418
+ - kubectl config set-credentials "kube-pan-test-app-prod-app3" --token="$CL_prod_app3_KUBE_TOKEN"
4419
+ - kubectl config set-context "kube-pan-test-app-prod-app3" --cluster="kube-pan-test-app-prod-app3" --user="kube-pan-test-app-prod-app3" --namespace="pan-test-app-prod"
4420
+ - kubectl config use-context "kube-pan-test-app-prod-app3"
4421
+ - kubernetesDelete
4422
+ - echo 'Disabling component in Dependency Track'
4423
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app3" "https://app3.prod.test-app.pan.panter.cloud" || true
4424
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
4425
+ environment:
4426
+ name: prod/app3
4427
+ url: $CL_GITLAB_ENVIRONMENT_URL
4428
+ action: stop
4429
+ artifacts:
4430
+ reports:
4431
+ dotenv: gitlab_environment.env
4432
+ rules:
4433
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
4434
+ when: on_success
4435
+ - when: manual
4436
+ if: $CI_COMMIT_TAG
4437
+ needs: []
4438
+ retry: *a1
4439
+ interruptible: true
4440
+ allow_failure: true
4441
+ 'app3 â†Šī¸ Rollback âš ī¸ | prod ':
4442
+ stage: rollback prod
4443
+ image: path/to/docker/kubernetes:the-version
4444
+ variables:
4445
+ KUBERNETES_CPU_REQUEST: '0.22'
4446
+ KUBERNETES_MEMORY_REQUEST: 200Mi
4447
+ KUBERNETES_MEMORY_LIMIT: 400Mi
4448
+ GIT_STRATEGY: none
4449
+ script:
4450
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4451
+ - export ENV_SHORT="prod"
4452
+ - export APP_DIR="kube"
4453
+ - export ENV_TYPE="prod"
4454
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4455
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
4456
+ - 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")"
4457
+ - export HOST="app3.prod.test-app.pan.panter.cloud"
4458
+ - export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
4459
+ - export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4460
+ - export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
4461
+ - export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
4462
+ - export KUBE_NAMESPACE="pan-test-app-prod"
4463
+ - export KUBE_APP_NAME="app3"
4464
+ - export KUBE_APP_NAME_PREFIX=""
4465
+ - export foo3="foo-value-3"
4466
+ - 'export foo2="this is from app2: foo-value-2"'
4467
+ - 'export transitive="this is from app2: this is from app1: foo-value"'
4468
+ - 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
4469
+ - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
4470
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4471
+ - export RELEASE_NAME="pan-test-app-prod-app3"
4472
+ - export HELM_EXPERIMENTAL_OCI="1"
4473
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
4474
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
4475
+ - export HELM_ARGS=""
4476
+ - export COMPONENT_NAME="app3"
4477
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4478
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4479
+ - kubectl config set-cluster "kube-pan-test-app-prod-app3" --server="$CL_prod_app3_KUBE_URL" --certificate-authority <(echo $CL_prod_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
4480
+ - kubectl config set-credentials "kube-pan-test-app-prod-app3" --token="$CL_prod_app3_KUBE_TOKEN"
4481
+ - kubectl config set-context "kube-pan-test-app-prod-app3" --cluster="kube-pan-test-app-prod-app3" --user="kube-pan-test-app-prod-app3" --namespace="pan-test-app-prod"
4482
+ - kubectl config use-context "kube-pan-test-app-prod-app3"
4483
+ - kubernetesRollback
4484
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
4485
+ environment:
4486
+ name: prod/app3
4487
+ url: $CL_GITLAB_ENVIRONMENT_URL
4488
+ action: access
4489
+ artifacts:
4490
+ reports:
4491
+ dotenv: gitlab_environment.env
4492
+ rules:
4493
+ - when: manual
4494
+ if: $CI_COMMIT_TAG
4495
+ needs: []
4496
+ retry: *a1
4497
+ interruptible: true
4498
+ allow_failure: true
4499
+ create release:
4500
+ stage: release
4501
+ image: path/to/docker/semantic-release:the-version
4502
+ script:
4503
+ - semanticRelease
4504
+ after_script:
4505
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
4506
+ rules:
4507
+ - &a2
4508
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
4509
+ when: never
4510
+ - &a3
4511
+ if: $CI_PIPELINE_SOURCE == "schedule"
4512
+ when: never
4513
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
4514
+ when: on_success
4515
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
4516
+ when: manual
4517
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
4518
+ when: manual
4519
+ âš ī¸ force create release:
4520
+ stage: release
4521
+ image: path/to/docker/semantic-release:the-version
4522
+ script:
4523
+ - semanticRelease
4524
+ after_script:
4525
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
4526
+ rules:
4527
+ - *a2
4528
+ - *a3
4529
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
4530
+ when: manual
4531
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
4532
+ when: manual
4533
+ needs: []
4534
+ "
4535
+ `;