@catladder/pipeline 1.146.2 → 1.148.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/dist/build/base/createAppBuildJob.js +6 -6
  2. package/dist/build/base/writeBuildInfo.js +1 -1
  3. package/dist/build/base/writeDotEnv.js +1 -1
  4. package/dist/build/custom/__tests__/testJob.test.js +11 -14
  5. package/dist/build/custom/buildJob.js +5 -5
  6. package/dist/build/custom/testJob.js +5 -5
  7. package/dist/build/docker.d.ts +26 -9
  8. package/dist/build/docker.js +41 -20
  9. package/dist/build/node/buildJob.js +8 -8
  10. package/dist/build/node/cache.js +1 -1
  11. package/dist/build/node/meteor.js +6 -6
  12. package/dist/build/node/testJob.js +11 -11
  13. package/dist/build/rails/build.js +3 -3
  14. package/dist/build/rails/test.js +4 -4
  15. package/dist/build/sbom.js +2 -2
  16. package/dist/build/types.d.ts +34 -26
  17. package/dist/bundles/catladder-gitlab/index.js +2 -2
  18. package/dist/constants.js +1 -1
  19. package/dist/context/getLabels.js +1 -1
  20. package/dist/context/index.js +34 -12
  21. package/dist/deploy/base/deploy.js +9 -8
  22. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +1 -5
  23. package/dist/deploy/cloudRun/artifactsRegistry.js +8 -9
  24. package/dist/deploy/cloudRun/cloudRunRevisions.js +4 -5
  25. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +1 -1
  26. package/dist/deploy/cloudRun/createJobs/common.d.ts +4 -4
  27. package/dist/deploy/cloudRun/createJobs/common.js +2 -1
  28. package/dist/deploy/cloudRun/createJobs/index.js +2 -4
  29. package/dist/deploy/custom/deployJob.js +7 -10
  30. package/dist/deploy/dockerTag/deployJob.js +3 -5
  31. package/dist/deploy/kubernetes/cloudSql/index.js +11 -9
  32. package/dist/deploy/kubernetes/deployJob.js +4 -7
  33. package/dist/deploy/kubernetes/kubeEnv.js +2 -1
  34. package/dist/deploy/kubernetes/kubeValues.js +10 -10
  35. package/dist/deploy/kubernetes/mongodb.js +11 -11
  36. package/dist/deploy/sbom.js +1 -1
  37. package/dist/deploy/types/index.d.ts +1 -1
  38. package/dist/deploy/types/index.js +1 -1
  39. package/dist/deploy/utils.js +2 -1
  40. package/dist/pipeline/createJobsForComponent.js +5 -5
  41. package/dist/pipeline/generatePipelineFiles.js +40 -9
  42. package/dist/pipeline/gitlab/createGitlabJobs.js +2 -9
  43. package/dist/pipeline/gitlab/sortGitLabJobDefProps.d.ts +7 -0
  44. package/dist/pipeline/gitlab/sortGitLabJobDefProps.js +27 -0
  45. package/dist/tsconfig.tsbuildinfo +1 -1
  46. package/dist/types/config.d.ts +1 -1
  47. package/dist/types/context.d.ts +13 -1
  48. package/dist/utils/removeUndefined.d.ts +1 -0
  49. package/dist/utils/removeUndefined.js +36 -0
  50. package/examples/__snapshots__/cloud-run-storybook.ts.snap +1687 -0
  51. package/examples/__snapshots__/cloud-run-with-ngnix.ts.snap +1971 -0
  52. package/examples/cloud-run-storybook.ts +24 -0
  53. package/examples/cloud-run-with-ngnix.ts +24 -0
  54. package/package.json +1 -1
  55. package/src/build/base/createAppBuildJob.ts +7 -7
  56. package/src/build/base/writeBuildInfo.ts +1 -1
  57. package/src/build/base/writeDotEnv.ts +1 -1
  58. package/src/build/custom/__tests__/testJob.test.ts +5 -8
  59. package/src/build/custom/buildJob.ts +6 -9
  60. package/src/build/custom/testJob.ts +5 -5
  61. package/src/build/docker.ts +68 -24
  62. package/src/build/node/buildJob.ts +12 -12
  63. package/src/build/node/cache.ts +1 -1
  64. package/src/build/node/meteor.ts +11 -17
  65. package/src/build/node/testJob.ts +14 -14
  66. package/src/build/rails/build.ts +3 -3
  67. package/src/build/rails/test.ts +4 -4
  68. package/src/build/sbom.ts +3 -3
  69. package/src/build/types.ts +53 -38
  70. package/src/context/getLabels.ts +1 -1
  71. package/src/context/index.ts +21 -5
  72. package/src/deploy/base/deploy.ts +8 -14
  73. package/src/deploy/cloudRun/artifactsRegistry.ts +5 -10
  74. package/src/deploy/cloudRun/cloudRunRevisions.ts +3 -5
  75. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +1 -1
  76. package/src/deploy/cloudRun/createJobs/common.ts +5 -5
  77. package/src/deploy/cloudRun/createJobs/index.ts +1 -4
  78. package/src/deploy/custom/deployJob.ts +4 -6
  79. package/src/deploy/dockerTag/deployJob.ts +2 -5
  80. package/src/deploy/kubernetes/cloudSql/index.ts +7 -4
  81. package/src/deploy/kubernetes/deployJob.ts +1 -4
  82. package/src/deploy/kubernetes/kubeEnv.ts +1 -1
  83. package/src/deploy/kubernetes/kubeValues.ts +3 -3
  84. package/src/deploy/kubernetes/mongodb.ts +6 -6
  85. package/src/deploy/sbom.ts +1 -2
  86. package/src/deploy/types/index.ts +2 -2
  87. package/src/deploy/utils.ts +1 -1
  88. package/src/pipeline/createJobsForComponent.ts +6 -10
  89. package/src/pipeline/generatePipelineFiles.ts +21 -8
  90. package/src/pipeline/gitlab/createGitlabJobs.ts +2 -7
  91. package/src/pipeline/gitlab/sortGitLabJobDefProps.ts +59 -0
  92. package/src/types/config.ts +3 -1
  93. package/src/types/context.ts +16 -1
  94. package/src/utils/removeUndefined.ts +4 -0
@@ -0,0 +1,1687 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot 1`] = `
4
+ {
5
+ "mainBranch": {
6
+ "image": "path/to/docker/jobs-default:the-version",
7
+ "jobs": {
8
+ "api 🔨 app | dev ": {
9
+ "artifacts": {
10
+ "expire_in": "1 day",
11
+ "paths": [
12
+ "app/__build_info.json",
13
+ "app/dist",
14
+ "app/.next",
15
+ ],
16
+ "reports": {
17
+ "junit": undefined,
18
+ },
19
+ "when": "always",
20
+ },
21
+ "cache": [
22
+ {
23
+ "key": "app-yarn",
24
+ "paths": [
25
+ "app/.yarn",
26
+ ],
27
+ "policy": "pull-push",
28
+ },
29
+ {
30
+ "key": "app-node-modules",
31
+ "paths": [
32
+ "app/node_modules",
33
+ ],
34
+ "policy": "pull-push",
35
+ },
36
+ {
37
+ "key": "api-next-cache",
38
+ "paths": [
39
+ "app/.next/cache/",
40
+ ],
41
+ "policy": "pull-push",
42
+ },
43
+ ],
44
+ "image": "path/to/docker/jobs-default:the-version",
45
+ "interruptible": true,
46
+ "needs": [],
47
+ "retry": {
48
+ "max": 2,
49
+ "when": [
50
+ "runner_system_failure",
51
+ "stuck_or_timeout_failure",
52
+ ],
53
+ },
54
+ "script": [
55
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
56
+ "export ENV_SHORT="dev"",
57
+ "export APP_DIR="app"",
58
+ "export ENV_TYPE="dev"",
59
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
60
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
61
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
62
+ "export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
63
+ "export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
64
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
65
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
66
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
67
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
68
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
69
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"",
70
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"",
71
+ "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\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
72
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
73
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
74
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
75
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
76
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
77
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
78
+ "cd app",
79
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
80
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
81
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
82
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
83
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
84
+ "yarn install --immutable",
85
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
86
+ "yarn build-storybook --quiet -o ./dist",
87
+ ],
88
+ "stage": "build",
89
+ "variables": {
90
+ "KUBERNETES_CPU_REQUEST": "0.5",
91
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
92
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
93
+ },
94
+ },
95
+ "api 🔨 docker | dev ": {
96
+ "cache": [
97
+ {
98
+ "key": "app-yarn",
99
+ "paths": [
100
+ "app/.yarn",
101
+ ],
102
+ "policy": "pull",
103
+ },
104
+ ],
105
+ "image": "path/to/docker/docker-build:the-version",
106
+ "interruptible": true,
107
+ "needs": [
108
+ "api 🔨 app | dev ",
109
+ ],
110
+ "retry": {
111
+ "max": 2,
112
+ "when": [
113
+ "runner_system_failure",
114
+ "stuck_or_timeout_failure",
115
+ ],
116
+ },
117
+ "script": [
118
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
119
+ "export APP_DIR="app"",
120
+ "export DOCKER_DIR="."",
121
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
122
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api"",
123
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
124
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
125
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
126
+ RUN yarn plugin import workspace-tools
127
+ RUN yarn workspaces focus --production && yarn rebuild"",
128
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app/package.json /app/app/package.json
129
+ COPY --chown=node:node app/yarn.lock /app/app/yarn.lock
130
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
131
+ COPY --chown=node:node .yarn /app/.yarn"",
132
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
133
+ "ensureNginxDockerfile",
134
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
135
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")",
136
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
137
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
138
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
139
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
140
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
141
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
142
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
143
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
144
+ "docker push $DOCKER_CACHE_IMAGE",
145
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
146
+ ],
147
+ "services": [
148
+ {
149
+ "command": [
150
+ "--tls=false",
151
+ ],
152
+ "name": "docker:24.0.6-dind",
153
+ },
154
+ ],
155
+ "stage": "build",
156
+ "variables": {
157
+ "DOCKER_BUILDKIT": "1",
158
+ "DOCKER_DRIVER": "overlay2",
159
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
160
+ "DOCKER_TLS_CERTDIR": "",
161
+ "KUBERNETES_CPU_REQUEST": "0.5",
162
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
163
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
164
+ },
165
+ },
166
+ "api 🚀 Deploy | dev ": {
167
+ "allow_failure": false,
168
+ "artifacts": {
169
+ "reports": {
170
+ "dotenv": "gitlab_environment.env",
171
+ },
172
+ },
173
+ "environment": {
174
+ "auto_stop_in": "4 weeks",
175
+ "name": "dev/api",
176
+ "on_stop": "api 🛑 Stop ⚠️ | dev ",
177
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
178
+ },
179
+ "image": "path/to/docker/gcloud:the-version",
180
+ "interruptible": true,
181
+ "needs": [
182
+ {
183
+ "artifacts": false,
184
+ "job": "api 🔨 app | dev ",
185
+ },
186
+ {
187
+ "artifacts": false,
188
+ "job": "api 🔨 docker | dev ",
189
+ },
190
+ {
191
+ "artifacts": true,
192
+ "job": "api 🧾 sbom | dev ",
193
+ },
194
+ ],
195
+ "retry": {
196
+ "max": 2,
197
+ "when": [
198
+ "runner_system_failure",
199
+ "stuck_or_timeout_failure",
200
+ ],
201
+ },
202
+ "rules": [
203
+ {
204
+ "when": "on_success",
205
+ },
206
+ ],
207
+ "script": [
208
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
209
+ "export ENV_SHORT="dev"",
210
+ "export APP_DIR="app"",
211
+ "export ENV_TYPE="dev"",
212
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
213
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
214
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
215
+ "export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
216
+ "export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
217
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
218
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
219
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
220
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
221
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
222
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"",
223
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"",
224
+ "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\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
225
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
226
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api"",
227
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
228
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
229
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
230
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
231
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
232
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")",
233
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
234
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
235
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
236
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
237
+ "cat > ____envvars.yaml <<EOF
238
+ ENV_SHORT: |-
239
+ dev
240
+ APP_DIR: |-
241
+ app
242
+ ENV_TYPE: |-
243
+ dev
244
+ BUILD_INFO_BUILD_ID: |-
245
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
246
+ BUILD_INFO_BUILD_TIME: |-
247
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
248
+ BUILD_INFO_CURRENT_VERSION: |-
249
+ $(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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")" | sed 's/^/ /')
250
+ HOST: |-
251
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
252
+ ROOT_URL: |-
253
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
254
+ HOST_INTERNAL: |-
255
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
256
+ HOST_CANONICAL: |-
257
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
258
+ ROOT_URL_INTERNAL: |-
259
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
260
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
261
+ asdf
262
+ DEPLOY_CLOUD_RUN_REGION: |-
263
+ asia-east1
264
+ GCLOUD_RUN_canonicalHostSuffix: |-
265
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
266
+ _ALL_ENV_VAR_KEYS: |-
267
+ ["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","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
268
+
269
+ EOF
270
+ ",
271
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
272
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
273
+ "gcloud run deploy pan-test-app-dev-api --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=storybook,cloud-run-service-name=pan-test-app-dev-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
274
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
275
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
276
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done",
277
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api@$version --quiet --delete-tags; done",
278
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
279
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
280
+ "echo Uploading SBOM to Dependency Track",
281
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
282
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
283
+ ],
284
+ "stage": "deploy dev",
285
+ "variables": {
286
+ "KUBERNETES_CPU_REQUEST": "0.5",
287
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
288
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
289
+ },
290
+ },
291
+ "api 🛑 Stop ⚠️ | dev ": {
292
+ "allow_failure": true,
293
+ "artifacts": {
294
+ "reports": {
295
+ "dotenv": "gitlab_environment.env",
296
+ },
297
+ },
298
+ "environment": {
299
+ "action": "stop",
300
+ "name": "dev/api",
301
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
302
+ },
303
+ "image": "path/to/docker/gcloud:the-version",
304
+ "interruptible": true,
305
+ "needs": [],
306
+ "retry": {
307
+ "max": 2,
308
+ "when": [
309
+ "runner_system_failure",
310
+ "stuck_or_timeout_failure",
311
+ ],
312
+ },
313
+ "rules": [
314
+ {
315
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
316
+ "when": "on_success",
317
+ },
318
+ {
319
+ "when": "manual",
320
+ },
321
+ ],
322
+ "script": [
323
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
324
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
325
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
326
+ "set +e",
327
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")",
328
+ "gcloud run services delete pan-test-app-dev-api --project=asdf --region=asia-east1",
329
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags",
330
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
331
+ "echo Disabling component in Dependency Track",
332
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
333
+ "set -e",
334
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
335
+ ],
336
+ "stage": "stop dev",
337
+ "variables": {
338
+ "GIT_STRATEGY": "none",
339
+ "KUBERNETES_CPU_REQUEST": "0.5",
340
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
341
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
342
+ },
343
+ },
344
+ "api 🧾 sbom | dev ": {
345
+ "allow_failure": true,
346
+ "artifacts": {
347
+ "paths": [
348
+ "__sbom.json",
349
+ ],
350
+ },
351
+ "image": "aquasec/trivy:0.38.3",
352
+ "interruptible": true,
353
+ "needs": [],
354
+ "retry": {
355
+ "max": 2,
356
+ "when": [
357
+ "runner_system_failure",
358
+ "stuck_or_timeout_failure",
359
+ ],
360
+ },
361
+ "script": [
362
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
363
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
364
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
365
+ ],
366
+ "stage": "build",
367
+ "variables": {},
368
+ },
369
+ },
370
+ "stages": [
371
+ "setup",
372
+ "setup dev",
373
+ "setup review",
374
+ "setup stage",
375
+ "setup prod",
376
+ "setup local",
377
+ "test",
378
+ "test dev",
379
+ "test review",
380
+ "test stage",
381
+ "test prod",
382
+ "test local",
383
+ "build",
384
+ "build dev",
385
+ "build review",
386
+ "build stage",
387
+ "build prod",
388
+ "build local",
389
+ "deploy",
390
+ "deploy dev",
391
+ "deploy review",
392
+ "deploy stage",
393
+ "deploy prod",
394
+ "deploy local",
395
+ "verify",
396
+ "verify dev",
397
+ "verify review",
398
+ "verify stage",
399
+ "verify prod",
400
+ "verify local",
401
+ "rollback",
402
+ "rollback dev",
403
+ "rollback review",
404
+ "rollback stage",
405
+ "rollback prod",
406
+ "rollback local",
407
+ "stop",
408
+ "stop dev",
409
+ "stop review",
410
+ "stop stage",
411
+ "stop prod",
412
+ "stop local",
413
+ ],
414
+ "variables": {
415
+ "FF_USE_FASTZIP": "true",
416
+ "GIT_DEPTH": "1",
417
+ },
418
+ "workflow": {
419
+ "rules": [
420
+ {
421
+ "if": "$CI_COMMIT_TAG",
422
+ },
423
+ {
424
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
425
+ "when": "never",
426
+ },
427
+ {
428
+ "if": "$CI_PIPELINE_SOURCE == "schedule"",
429
+ "when": "never",
430
+ },
431
+ {
432
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
433
+ },
434
+ {
435
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
436
+ },
437
+ {
438
+ "if": "$CI_MERGE_REQUEST_ID",
439
+ },
440
+ ],
441
+ },
442
+ },
443
+ "mr": {
444
+ "image": "path/to/docker/jobs-default:the-version",
445
+ "jobs": {
446
+ "api 🔨 app | review ": {
447
+ "artifacts": {
448
+ "expire_in": "1 day",
449
+ "paths": [
450
+ "app/__build_info.json",
451
+ "app/dist",
452
+ "app/.next",
453
+ ],
454
+ "reports": {
455
+ "junit": undefined,
456
+ },
457
+ "when": "always",
458
+ },
459
+ "cache": [
460
+ {
461
+ "key": "app-yarn",
462
+ "paths": [
463
+ "app/.yarn",
464
+ ],
465
+ "policy": "pull-push",
466
+ },
467
+ {
468
+ "key": "app-node-modules",
469
+ "paths": [
470
+ "app/node_modules",
471
+ ],
472
+ "policy": "pull-push",
473
+ },
474
+ {
475
+ "key": "api-next-cache",
476
+ "paths": [
477
+ "app/.next/cache/",
478
+ ],
479
+ "policy": "pull-push",
480
+ },
481
+ ],
482
+ "image": "path/to/docker/jobs-default:the-version",
483
+ "interruptible": true,
484
+ "needs": [],
485
+ "retry": {
486
+ "max": 2,
487
+ "when": [
488
+ "runner_system_failure",
489
+ "stuck_or_timeout_failure",
490
+ ],
491
+ },
492
+ "script": [
493
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
494
+ "export ENV_SHORT="review"",
495
+ "export APP_DIR="app"",
496
+ "export ENV_TYPE="review"",
497
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
498
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
499
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
500
+ "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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
501
+ "export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
502
+ "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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
503
+ "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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
504
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
505
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
506
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
507
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"",
508
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"",
509
+ "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\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
510
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
511
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
512
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
513
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
514
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
515
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
516
+ "cd app",
517
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
518
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
519
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
520
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
521
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
522
+ "yarn install --immutable",
523
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
524
+ "yarn build-storybook --quiet -o ./dist",
525
+ ],
526
+ "stage": "build",
527
+ "variables": {
528
+ "KUBERNETES_CPU_REQUEST": "0.5",
529
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
530
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
531
+ },
532
+ },
533
+ "api 🔨 docker | review ": {
534
+ "cache": [
535
+ {
536
+ "key": "app-yarn",
537
+ "paths": [
538
+ "app/.yarn",
539
+ ],
540
+ "policy": "pull",
541
+ },
542
+ ],
543
+ "image": "path/to/docker/docker-build:the-version",
544
+ "interruptible": true,
545
+ "needs": [
546
+ "api 🔨 app | review ",
547
+ ],
548
+ "retry": {
549
+ "max": 2,
550
+ "when": [
551
+ "runner_system_failure",
552
+ "stuck_or_timeout_failure",
553
+ ],
554
+ },
555
+ "script": [
556
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
557
+ "export APP_DIR="app"",
558
+ "export DOCKER_DIR="."",
559
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
560
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"",
561
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
562
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
563
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
564
+ RUN yarn plugin import workspace-tools
565
+ RUN yarn workspaces focus --production && yarn rebuild"",
566
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app/package.json /app/app/package.json
567
+ COPY --chown=node:node app/yarn.lock /app/app/yarn.lock
568
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
569
+ COPY --chown=node:node .yarn /app/.yarn"",
570
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
571
+ "ensureNginxDockerfile",
572
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
573
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")",
574
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
575
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
576
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
577
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
578
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
579
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
580
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
581
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
582
+ "docker push $DOCKER_CACHE_IMAGE",
583
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
584
+ ],
585
+ "services": [
586
+ {
587
+ "command": [
588
+ "--tls=false",
589
+ ],
590
+ "name": "docker:24.0.6-dind",
591
+ },
592
+ ],
593
+ "stage": "build",
594
+ "variables": {
595
+ "DOCKER_BUILDKIT": "1",
596
+ "DOCKER_DRIVER": "overlay2",
597
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
598
+ "DOCKER_TLS_CERTDIR": "",
599
+ "KUBERNETES_CPU_REQUEST": "0.5",
600
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
601
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
602
+ },
603
+ },
604
+ "api 🚀 Deploy | review ": {
605
+ "allow_failure": false,
606
+ "artifacts": {
607
+ "reports": {
608
+ "dotenv": "gitlab_environment.env",
609
+ },
610
+ },
611
+ "environment": {
612
+ "auto_stop_in": "1 week",
613
+ "name": "review/$CI_COMMIT_REF_NAME/api",
614
+ "on_stop": "api 🛑 Stop ⚠️ | review ",
615
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
616
+ },
617
+ "image": "path/to/docker/gcloud:the-version",
618
+ "interruptible": true,
619
+ "needs": [
620
+ {
621
+ "artifacts": false,
622
+ "job": "api 🔨 app | review ",
623
+ },
624
+ {
625
+ "artifacts": false,
626
+ "job": "api 🔨 docker | review ",
627
+ },
628
+ {
629
+ "artifacts": true,
630
+ "job": "api 🧾 sbom | review ",
631
+ },
632
+ ],
633
+ "retry": {
634
+ "max": 2,
635
+ "when": [
636
+ "runner_system_failure",
637
+ "stuck_or_timeout_failure",
638
+ ],
639
+ },
640
+ "rules": [
641
+ {
642
+ "when": "on_success",
643
+ },
644
+ ],
645
+ "script": [
646
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
647
+ "export ENV_SHORT="review"",
648
+ "export APP_DIR="app"",
649
+ "export ENV_TYPE="review"",
650
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
651
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
652
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
653
+ "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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
654
+ "export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
655
+ "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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
656
+ "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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
657
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
658
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
659
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
660
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"",
661
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"",
662
+ "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\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
663
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
664
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"",
665
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
666
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
667
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
668
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
669
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
670
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")",
671
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
672
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
673
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
674
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
675
+ "cat > ____envvars.yaml <<EOF
676
+ ENV_SHORT: |-
677
+ review
678
+ APP_DIR: |-
679
+ app
680
+ ENV_TYPE: |-
681
+ review
682
+ BUILD_INFO_BUILD_ID: |-
683
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
684
+ BUILD_INFO_BUILD_TIME: |-
685
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
686
+ BUILD_INFO_CURRENT_VERSION: |-
687
+ $(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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")" | sed 's/^/ /')
688
+ HOST: |-
689
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
690
+ ROOT_URL: |-
691
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
692
+ HOST_INTERNAL: |-
693
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
694
+ HOST_CANONICAL: |-
695
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
696
+ ROOT_URL_INTERNAL: |-
697
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
698
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
699
+ asdf
700
+ DEPLOY_CLOUD_RUN_REGION: |-
701
+ asia-east1
702
+ GCLOUD_RUN_canonicalHostSuffix: |-
703
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
704
+ _ALL_ENV_VAR_KEYS: |-
705
+ ["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","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
706
+
707
+ EOF
708
+ ",
709
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
710
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
711
+ "gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=storybook,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
712
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
713
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
714
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done",
715
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done",
716
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
717
+ "set +e",
718
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api --quiet --delete-tags",
719
+ "set -e",
720
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
721
+ "echo Uploading SBOM to Dependency Track",
722
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
723
+ "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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
724
+ ],
725
+ "stage": "deploy review",
726
+ "variables": {
727
+ "KUBERNETES_CPU_REQUEST": "0.5",
728
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
729
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
730
+ },
731
+ },
732
+ "api 🛑 Stop ⚠️ | review ": {
733
+ "allow_failure": true,
734
+ "artifacts": {
735
+ "reports": {
736
+ "dotenv": "gitlab_environment.env",
737
+ },
738
+ },
739
+ "environment": {
740
+ "action": "stop",
741
+ "name": "review/$CI_COMMIT_REF_NAME/api",
742
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
743
+ },
744
+ "image": "path/to/docker/gcloud:the-version",
745
+ "interruptible": true,
746
+ "needs": [],
747
+ "retry": {
748
+ "max": 2,
749
+ "when": [
750
+ "runner_system_failure",
751
+ "stuck_or_timeout_failure",
752
+ ],
753
+ },
754
+ "rules": [
755
+ {
756
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
757
+ "when": "on_success",
758
+ },
759
+ {
760
+ "when": "manual",
761
+ },
762
+ ],
763
+ "script": [
764
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
765
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
766
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
767
+ "set +e",
768
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")",
769
+ "gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --project=asdf --region=asia-east1",
770
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags",
771
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
772
+ "set +e",
773
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api --quiet --delete-tags",
774
+ "set -e",
775
+ "echo Disabling component in Dependency Track",
776
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
777
+ "set -e",
778
+ "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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
779
+ ],
780
+ "stage": "stop review",
781
+ "variables": {
782
+ "GIT_STRATEGY": "none",
783
+ "KUBERNETES_CPU_REQUEST": "0.5",
784
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
785
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
786
+ },
787
+ },
788
+ "api 🧾 sbom | review ": {
789
+ "allow_failure": true,
790
+ "artifacts": {
791
+ "paths": [
792
+ "__sbom.json",
793
+ ],
794
+ },
795
+ "image": "aquasec/trivy:0.38.3",
796
+ "interruptible": true,
797
+ "needs": [],
798
+ "retry": {
799
+ "max": 2,
800
+ "when": [
801
+ "runner_system_failure",
802
+ "stuck_or_timeout_failure",
803
+ ],
804
+ },
805
+ "script": [
806
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
807
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
808
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
809
+ ],
810
+ "stage": "build",
811
+ "variables": {},
812
+ },
813
+ },
814
+ "stages": [
815
+ "setup",
816
+ "setup dev",
817
+ "setup review",
818
+ "setup stage",
819
+ "setup prod",
820
+ "setup local",
821
+ "test",
822
+ "test dev",
823
+ "test review",
824
+ "test stage",
825
+ "test prod",
826
+ "test local",
827
+ "build",
828
+ "build dev",
829
+ "build review",
830
+ "build stage",
831
+ "build prod",
832
+ "build local",
833
+ "deploy",
834
+ "deploy dev",
835
+ "deploy review",
836
+ "deploy stage",
837
+ "deploy prod",
838
+ "deploy local",
839
+ "verify",
840
+ "verify dev",
841
+ "verify review",
842
+ "verify stage",
843
+ "verify prod",
844
+ "verify local",
845
+ "rollback",
846
+ "rollback dev",
847
+ "rollback review",
848
+ "rollback stage",
849
+ "rollback prod",
850
+ "rollback local",
851
+ "stop",
852
+ "stop dev",
853
+ "stop review",
854
+ "stop stage",
855
+ "stop prod",
856
+ "stop local",
857
+ ],
858
+ "variables": {
859
+ "FF_USE_FASTZIP": "true",
860
+ "GIT_DEPTH": "1",
861
+ },
862
+ "workflow": {
863
+ "rules": [
864
+ {
865
+ "if": "$CI_COMMIT_TAG",
866
+ },
867
+ {
868
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
869
+ "when": "never",
870
+ },
871
+ {
872
+ "if": "$CI_PIPELINE_SOURCE == "schedule"",
873
+ "when": "never",
874
+ },
875
+ {
876
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
877
+ },
878
+ {
879
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
880
+ },
881
+ {
882
+ "if": "$CI_MERGE_REQUEST_ID",
883
+ },
884
+ ],
885
+ },
886
+ },
887
+ "taggedRelease": {
888
+ "image": "path/to/docker/jobs-default:the-version",
889
+ "jobs": {
890
+ "api 🔨 app | prod ": {
891
+ "artifacts": {
892
+ "expire_in": "1 day",
893
+ "paths": [
894
+ "app/__build_info.json",
895
+ "app/dist",
896
+ "app/.next",
897
+ ],
898
+ "reports": {
899
+ "junit": undefined,
900
+ },
901
+ "when": "always",
902
+ },
903
+ "cache": [
904
+ {
905
+ "key": "app-yarn",
906
+ "paths": [
907
+ "app/.yarn",
908
+ ],
909
+ "policy": "pull-push",
910
+ },
911
+ {
912
+ "key": "app-node-modules",
913
+ "paths": [
914
+ "app/node_modules",
915
+ ],
916
+ "policy": "pull-push",
917
+ },
918
+ {
919
+ "key": "api-next-cache",
920
+ "paths": [
921
+ "app/.next/cache/",
922
+ ],
923
+ "policy": "pull-push",
924
+ },
925
+ ],
926
+ "image": "path/to/docker/jobs-default:the-version",
927
+ "interruptible": true,
928
+ "needs": [],
929
+ "retry": {
930
+ "max": 2,
931
+ "when": [
932
+ "runner_system_failure",
933
+ "stuck_or_timeout_failure",
934
+ ],
935
+ },
936
+ "script": [
937
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
938
+ "export ENV_SHORT="prod"",
939
+ "export APP_DIR="app"",
940
+ "export ENV_TYPE="prod"",
941
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
942
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
943
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
944
+ "export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
945
+ "export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
946
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
947
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
948
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
949
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
950
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
951
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"",
952
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"",
953
+ "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\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
954
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
955
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
956
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
957
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
958
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
959
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
960
+ "cd app",
961
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
962
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
963
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
964
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
965
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
966
+ "yarn install --immutable",
967
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
968
+ "yarn build-storybook --quiet -o ./dist",
969
+ ],
970
+ "stage": "build",
971
+ "variables": {
972
+ "KUBERNETES_CPU_REQUEST": "0.5",
973
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
974
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
975
+ },
976
+ },
977
+ "api 🔨 app | stage ": {
978
+ "artifacts": {
979
+ "expire_in": "1 day",
980
+ "paths": [
981
+ "app/__build_info.json",
982
+ "app/dist",
983
+ "app/.next",
984
+ ],
985
+ "reports": {
986
+ "junit": undefined,
987
+ },
988
+ "when": "always",
989
+ },
990
+ "cache": [
991
+ {
992
+ "key": "app-yarn",
993
+ "paths": [
994
+ "app/.yarn",
995
+ ],
996
+ "policy": "pull-push",
997
+ },
998
+ {
999
+ "key": "app-node-modules",
1000
+ "paths": [
1001
+ "app/node_modules",
1002
+ ],
1003
+ "policy": "pull-push",
1004
+ },
1005
+ {
1006
+ "key": "api-next-cache",
1007
+ "paths": [
1008
+ "app/.next/cache/",
1009
+ ],
1010
+ "policy": "pull-push",
1011
+ },
1012
+ ],
1013
+ "image": "path/to/docker/jobs-default:the-version",
1014
+ "interruptible": true,
1015
+ "needs": [],
1016
+ "retry": {
1017
+ "max": 2,
1018
+ "when": [
1019
+ "runner_system_failure",
1020
+ "stuck_or_timeout_failure",
1021
+ ],
1022
+ },
1023
+ "script": [
1024
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1025
+ "export ENV_SHORT="stage"",
1026
+ "export APP_DIR="app"",
1027
+ "export ENV_TYPE="stage"",
1028
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1029
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1030
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
1031
+ "export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1032
+ "export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1033
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1034
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1035
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1036
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1037
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1038
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"",
1039
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"",
1040
+ "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\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1041
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1042
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
1043
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1044
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1045
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1046
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1047
+ "cd app",
1048
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1049
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1050
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1051
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1052
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
1053
+ "yarn install --immutable",
1054
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
1055
+ "yarn build-storybook --quiet -o ./dist",
1056
+ ],
1057
+ "stage": "build",
1058
+ "variables": {
1059
+ "KUBERNETES_CPU_REQUEST": "0.5",
1060
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1061
+ "KUBERNETES_MEMORY_REQUEST": "2Gi",
1062
+ },
1063
+ },
1064
+ "api 🔨 docker | prod ": {
1065
+ "cache": [
1066
+ {
1067
+ "key": "app-yarn",
1068
+ "paths": [
1069
+ "app/.yarn",
1070
+ ],
1071
+ "policy": "pull",
1072
+ },
1073
+ ],
1074
+ "image": "path/to/docker/docker-build:the-version",
1075
+ "interruptible": true,
1076
+ "needs": [
1077
+ "api 🔨 app | prod ",
1078
+ ],
1079
+ "retry": {
1080
+ "max": 2,
1081
+ "when": [
1082
+ "runner_system_failure",
1083
+ "stuck_or_timeout_failure",
1084
+ ],
1085
+ },
1086
+ "script": [
1087
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1088
+ "export APP_DIR="app"",
1089
+ "export DOCKER_DIR="."",
1090
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
1091
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api"",
1092
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
1093
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1094
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1095
+ RUN yarn plugin import workspace-tools
1096
+ RUN yarn workspaces focus --production && yarn rebuild"",
1097
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app/package.json /app/app/package.json
1098
+ COPY --chown=node:node app/yarn.lock /app/app/yarn.lock
1099
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1100
+ COPY --chown=node:node .yarn /app/.yarn"",
1101
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1102
+ "ensureNginxDockerfile",
1103
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1104
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")",
1105
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
1106
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
1107
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
1108
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
1109
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
1110
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
1111
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1112
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1113
+ "docker push $DOCKER_CACHE_IMAGE",
1114
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
1115
+ ],
1116
+ "services": [
1117
+ {
1118
+ "command": [
1119
+ "--tls=false",
1120
+ ],
1121
+ "name": "docker:24.0.6-dind",
1122
+ },
1123
+ ],
1124
+ "stage": "build",
1125
+ "variables": {
1126
+ "DOCKER_BUILDKIT": "1",
1127
+ "DOCKER_DRIVER": "overlay2",
1128
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1129
+ "DOCKER_TLS_CERTDIR": "",
1130
+ "KUBERNETES_CPU_REQUEST": "0.5",
1131
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1132
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1133
+ },
1134
+ },
1135
+ "api 🔨 docker | stage ": {
1136
+ "cache": [
1137
+ {
1138
+ "key": "app-yarn",
1139
+ "paths": [
1140
+ "app/.yarn",
1141
+ ],
1142
+ "policy": "pull",
1143
+ },
1144
+ ],
1145
+ "image": "path/to/docker/docker-build:the-version",
1146
+ "interruptible": true,
1147
+ "needs": [
1148
+ "api 🔨 app | stage ",
1149
+ ],
1150
+ "retry": {
1151
+ "max": 2,
1152
+ "when": [
1153
+ "runner_system_failure",
1154
+ "stuck_or_timeout_failure",
1155
+ ],
1156
+ },
1157
+ "script": [
1158
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1159
+ "export APP_DIR="app"",
1160
+ "export DOCKER_DIR="."",
1161
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
1162
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api"",
1163
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
1164
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1165
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1166
+ RUN yarn plugin import workspace-tools
1167
+ RUN yarn workspaces focus --production && yarn rebuild"",
1168
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app/package.json /app/app/package.json
1169
+ COPY --chown=node:node app/yarn.lock /app/app/yarn.lock
1170
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1171
+ COPY --chown=node:node .yarn /app/.yarn"",
1172
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1173
+ "ensureNginxDockerfile",
1174
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1175
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")",
1176
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
1177
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
1178
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
1179
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile . --build-arg BUILDKIT_INLINE_CACHE=1",
1180
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
1181
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
1182
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1183
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1184
+ "docker push $DOCKER_CACHE_IMAGE",
1185
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
1186
+ ],
1187
+ "services": [
1188
+ {
1189
+ "command": [
1190
+ "--tls=false",
1191
+ ],
1192
+ "name": "docker:24.0.6-dind",
1193
+ },
1194
+ ],
1195
+ "stage": "build",
1196
+ "variables": {
1197
+ "DOCKER_BUILDKIT": "1",
1198
+ "DOCKER_DRIVER": "overlay2",
1199
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1200
+ "DOCKER_TLS_CERTDIR": "",
1201
+ "KUBERNETES_CPU_REQUEST": "0.5",
1202
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1203
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1204
+ },
1205
+ },
1206
+ "api 🚀 Deploy | prod ": {
1207
+ "allow_failure": true,
1208
+ "artifacts": {
1209
+ "reports": {
1210
+ "dotenv": "gitlab_environment.env",
1211
+ },
1212
+ },
1213
+ "environment": {
1214
+ "auto_stop_in": undefined,
1215
+ "name": "prod/api",
1216
+ "on_stop": "api 🛑 Stop ⚠️ | prod ",
1217
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1218
+ },
1219
+ "image": "path/to/docker/gcloud:the-version",
1220
+ "interruptible": true,
1221
+ "needs": [
1222
+ {
1223
+ "artifacts": false,
1224
+ "job": "api 🔨 app | prod ",
1225
+ },
1226
+ {
1227
+ "artifacts": false,
1228
+ "job": "api 🔨 docker | prod ",
1229
+ },
1230
+ {
1231
+ "artifacts": true,
1232
+ "job": "api 🧾 sbom | prod ",
1233
+ },
1234
+ ],
1235
+ "retry": {
1236
+ "max": 2,
1237
+ "when": [
1238
+ "runner_system_failure",
1239
+ "stuck_or_timeout_failure",
1240
+ ],
1241
+ },
1242
+ "rules": [
1243
+ {
1244
+ "when": "manual",
1245
+ },
1246
+ ],
1247
+ "script": [
1248
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1249
+ "export ENV_SHORT="prod"",
1250
+ "export APP_DIR="app"",
1251
+ "export ENV_TYPE="prod"",
1252
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1253
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1254
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
1255
+ "export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1256
+ "export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1257
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1258
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1259
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1260
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1261
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1262
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"",
1263
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"",
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\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
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/api"",
1267
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
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_api_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
+ "cat > ____envvars.yaml <<EOF
1278
+ ENV_SHORT: |-
1279
+ prod
1280
+ APP_DIR: |-
1281
+ app
1282
+ ENV_TYPE: |-
1283
+ prod
1284
+ BUILD_INFO_BUILD_ID: |-
1285
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1286
+ BUILD_INFO_BUILD_TIME: |-
1287
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1288
+ BUILD_INFO_CURRENT_VERSION: |-
1289
+ $(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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")" | sed 's/^/ /')
1290
+ HOST: |-
1291
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1292
+ ROOT_URL: |-
1293
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1294
+ HOST_INTERNAL: |-
1295
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1296
+ HOST_CANONICAL: |-
1297
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1298
+ ROOT_URL_INTERNAL: |-
1299
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1300
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1301
+ asdf
1302
+ DEPLOY_CLOUD_RUN_REGION: |-
1303
+ asia-east1
1304
+ GCLOUD_RUN_canonicalHostSuffix: |-
1305
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1306
+ _ALL_ENV_VAR_KEYS: |-
1307
+ ["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","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1308
+
1309
+ EOF
1310
+ ",
1311
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
1312
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1313
+ "gcloud run deploy pan-test-app-prod-api --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=storybook,cloud-run-service-name=pan-test-app-prod-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1314
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1315
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1316
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done",
1317
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api@$version --quiet --delete-tags; done",
1318
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1319
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1320
+ "echo Uploading SBOM to Dependency Track",
1321
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
1322
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1323
+ ],
1324
+ "stage": "deploy prod",
1325
+ "variables": {
1326
+ "KUBERNETES_CPU_REQUEST": "0.5",
1327
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1328
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1329
+ },
1330
+ },
1331
+ "api 🚀 Deploy | stage ": {
1332
+ "allow_failure": false,
1333
+ "artifacts": {
1334
+ "reports": {
1335
+ "dotenv": "gitlab_environment.env",
1336
+ },
1337
+ },
1338
+ "environment": {
1339
+ "auto_stop_in": undefined,
1340
+ "name": "stage/api",
1341
+ "on_stop": "api 🛑 Stop ⚠️ | stage ",
1342
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1343
+ },
1344
+ "image": "path/to/docker/gcloud:the-version",
1345
+ "interruptible": true,
1346
+ "needs": [
1347
+ {
1348
+ "artifacts": false,
1349
+ "job": "api 🔨 app | stage ",
1350
+ },
1351
+ {
1352
+ "artifacts": false,
1353
+ "job": "api 🔨 docker | stage ",
1354
+ },
1355
+ {
1356
+ "artifacts": true,
1357
+ "job": "api 🧾 sbom | stage ",
1358
+ },
1359
+ ],
1360
+ "retry": {
1361
+ "max": 2,
1362
+ "when": [
1363
+ "runner_system_failure",
1364
+ "stuck_or_timeout_failure",
1365
+ ],
1366
+ },
1367
+ "rules": [
1368
+ {
1369
+ "when": "on_success",
1370
+ },
1371
+ ],
1372
+ "script": [
1373
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1374
+ "export ENV_SHORT="stage"",
1375
+ "export APP_DIR="app"",
1376
+ "export ENV_TYPE="stage"",
1377
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1378
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1379
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
1380
+ "export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1381
+ "export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1382
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1383
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1384
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1385
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1386
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1387
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"",
1388
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"",
1389
+ "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\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1390
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
1391
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api"",
1392
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
1393
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1394
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1395
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1396
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1397
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")",
1398
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
1399
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1400
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1401
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
1402
+ "cat > ____envvars.yaml <<EOF
1403
+ ENV_SHORT: |-
1404
+ stage
1405
+ APP_DIR: |-
1406
+ app
1407
+ ENV_TYPE: |-
1408
+ stage
1409
+ BUILD_INFO_BUILD_ID: |-
1410
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1411
+ BUILD_INFO_BUILD_TIME: |-
1412
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1413
+ BUILD_INFO_CURRENT_VERSION: |-
1414
+ $(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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")" | sed 's/^/ /')
1415
+ HOST: |-
1416
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1417
+ ROOT_URL: |-
1418
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1419
+ HOST_INTERNAL: |-
1420
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1421
+ HOST_CANONICAL: |-
1422
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1423
+ ROOT_URL_INTERNAL: |-
1424
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1425
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1426
+ asdf
1427
+ DEPLOY_CLOUD_RUN_REGION: |-
1428
+ asia-east1
1429
+ GCLOUD_RUN_canonicalHostSuffix: |-
1430
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1431
+ _ALL_ENV_VAR_KEYS: |-
1432
+ ["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","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1433
+
1434
+ EOF
1435
+ ",
1436
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
1437
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1438
+ "gcloud run deploy pan-test-app-stage-api --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=storybook,cloud-run-service-name=pan-test-app-stage-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1439
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1440
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1441
+ "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done",
1442
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api@$version --quiet --delete-tags; done",
1443
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1444
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1445
+ "echo Uploading SBOM to Dependency Track",
1446
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
1447
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1448
+ ],
1449
+ "stage": "deploy stage",
1450
+ "variables": {
1451
+ "KUBERNETES_CPU_REQUEST": "0.5",
1452
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1453
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1454
+ },
1455
+ },
1456
+ "api 🛑 Stop ⚠️ | prod ": {
1457
+ "allow_failure": true,
1458
+ "artifacts": {
1459
+ "reports": {
1460
+ "dotenv": "gitlab_environment.env",
1461
+ },
1462
+ },
1463
+ "environment": {
1464
+ "action": "stop",
1465
+ "name": "prod/api",
1466
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1467
+ },
1468
+ "image": "path/to/docker/gcloud:the-version",
1469
+ "interruptible": true,
1470
+ "needs": [],
1471
+ "retry": {
1472
+ "max": 2,
1473
+ "when": [
1474
+ "runner_system_failure",
1475
+ "stuck_or_timeout_failure",
1476
+ ],
1477
+ },
1478
+ "rules": [
1479
+ {
1480
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1481
+ "when": "on_success",
1482
+ },
1483
+ {
1484
+ "when": "manual",
1485
+ },
1486
+ ],
1487
+ "script": [
1488
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1489
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1490
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1491
+ "set +e",
1492
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")",
1493
+ "gcloud run services delete pan-test-app-prod-api --project=asdf --region=asia-east1",
1494
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags",
1495
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1496
+ "echo Disabling component in Dependency Track",
1497
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
1498
+ "set -e",
1499
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1500
+ ],
1501
+ "stage": "stop prod",
1502
+ "variables": {
1503
+ "GIT_STRATEGY": "none",
1504
+ "KUBERNETES_CPU_REQUEST": "0.5",
1505
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1506
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1507
+ },
1508
+ },
1509
+ "api 🛑 Stop ⚠️ | stage ": {
1510
+ "allow_failure": true,
1511
+ "artifacts": {
1512
+ "reports": {
1513
+ "dotenv": "gitlab_environment.env",
1514
+ },
1515
+ },
1516
+ "environment": {
1517
+ "action": "stop",
1518
+ "name": "stage/api",
1519
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1520
+ },
1521
+ "image": "path/to/docker/gcloud:the-version",
1522
+ "interruptible": true,
1523
+ "needs": [],
1524
+ "retry": {
1525
+ "max": 2,
1526
+ "when": [
1527
+ "runner_system_failure",
1528
+ "stuck_or_timeout_failure",
1529
+ ],
1530
+ },
1531
+ "rules": [
1532
+ {
1533
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1534
+ "when": "on_success",
1535
+ },
1536
+ {
1537
+ "when": "manual",
1538
+ },
1539
+ ],
1540
+ "script": [
1541
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1542
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1543
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1544
+ "set +e",
1545
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")",
1546
+ "gcloud run services delete pan-test-app-stage-api --project=asdf --region=asia-east1",
1547
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags",
1548
+ "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done",
1549
+ "echo Disabling component in Dependency Track",
1550
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
1551
+ "set -e",
1552
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1553
+ ],
1554
+ "stage": "stop stage",
1555
+ "variables": {
1556
+ "GIT_STRATEGY": "none",
1557
+ "KUBERNETES_CPU_REQUEST": "0.5",
1558
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1559
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1560
+ },
1561
+ },
1562
+ "api 🧾 sbom | prod ": {
1563
+ "allow_failure": true,
1564
+ "artifacts": {
1565
+ "paths": [
1566
+ "__sbom.json",
1567
+ ],
1568
+ },
1569
+ "image": "aquasec/trivy:0.38.3",
1570
+ "interruptible": true,
1571
+ "needs": [],
1572
+ "retry": {
1573
+ "max": 2,
1574
+ "when": [
1575
+ "runner_system_failure",
1576
+ "stuck_or_timeout_failure",
1577
+ ],
1578
+ },
1579
+ "script": [
1580
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1581
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1582
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
1583
+ ],
1584
+ "stage": "build",
1585
+ "variables": {},
1586
+ },
1587
+ "api 🧾 sbom | stage ": {
1588
+ "allow_failure": true,
1589
+ "artifacts": {
1590
+ "paths": [
1591
+ "__sbom.json",
1592
+ ],
1593
+ },
1594
+ "image": "aquasec/trivy:0.38.3",
1595
+ "interruptible": true,
1596
+ "needs": [],
1597
+ "retry": {
1598
+ "max": 2,
1599
+ "when": [
1600
+ "runner_system_failure",
1601
+ "stuck_or_timeout_failure",
1602
+ ],
1603
+ },
1604
+ "script": [
1605
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1606
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1607
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
1608
+ ],
1609
+ "stage": "build",
1610
+ "variables": {},
1611
+ },
1612
+ },
1613
+ "stages": [
1614
+ "setup",
1615
+ "setup dev",
1616
+ "setup review",
1617
+ "setup stage",
1618
+ "setup prod",
1619
+ "setup local",
1620
+ "test",
1621
+ "test dev",
1622
+ "test review",
1623
+ "test stage",
1624
+ "test prod",
1625
+ "test local",
1626
+ "build",
1627
+ "build dev",
1628
+ "build review",
1629
+ "build stage",
1630
+ "build prod",
1631
+ "build local",
1632
+ "deploy",
1633
+ "deploy dev",
1634
+ "deploy review",
1635
+ "deploy stage",
1636
+ "deploy prod",
1637
+ "deploy local",
1638
+ "verify",
1639
+ "verify dev",
1640
+ "verify review",
1641
+ "verify stage",
1642
+ "verify prod",
1643
+ "verify local",
1644
+ "rollback",
1645
+ "rollback dev",
1646
+ "rollback review",
1647
+ "rollback stage",
1648
+ "rollback prod",
1649
+ "rollback local",
1650
+ "stop",
1651
+ "stop dev",
1652
+ "stop review",
1653
+ "stop stage",
1654
+ "stop prod",
1655
+ "stop local",
1656
+ ],
1657
+ "variables": {
1658
+ "FF_USE_FASTZIP": "true",
1659
+ "GIT_DEPTH": "1",
1660
+ },
1661
+ "workflow": {
1662
+ "rules": [
1663
+ {
1664
+ "if": "$CI_COMMIT_TAG",
1665
+ },
1666
+ {
1667
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1668
+ "when": "never",
1669
+ },
1670
+ {
1671
+ "if": "$CI_PIPELINE_SOURCE == "schedule"",
1672
+ "when": "never",
1673
+ },
1674
+ {
1675
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1676
+ },
1677
+ {
1678
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1679
+ },
1680
+ {
1681
+ "if": "$CI_MERGE_REQUEST_ID",
1682
+ },
1683
+ ],
1684
+ },
1685
+ },
1686
+ }
1687
+ `;