@catladder/pipeline 1.163.1 → 1.164.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 (80) hide show
  1. package/dist/bundles/catladder-gitlab/index.js +1 -1
  2. package/dist/constants.js +1 -1
  3. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +2 -0
  4. package/dist/deploy/types/googleCloudRun.d.ts +8 -0
  5. package/dist/tsconfig.tsbuildinfo +1 -1
  6. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +0 -1958
  7. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1 -1935
  8. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1 -1959
  9. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1 -2011
  10. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1 -1959
  11. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1 -1970
  12. package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +1342 -0
  13. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1 -1959
  14. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1 -1959
  15. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1 -2003
  16. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1 -1675
  17. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1 -1959
  18. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +1 -3935
  19. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +1 -3458
  20. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1 -1967
  21. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1 -1787
  22. package/examples/__snapshots__/custom-build-job.test.ts.snap +1 -1487
  23. package/examples/__snapshots__/custom-deploy.test.ts.snap +1 -1721
  24. package/examples/__snapshots__/custom-envs.test.ts.snap +1 -1175
  25. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1 -1495
  26. package/examples/__snapshots__/git-submodule.test.ts.snap +1 -1962
  27. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1 -2450
  28. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +1 -2462
  29. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1 -2470
  30. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +1 -4558
  31. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1 -2574
  32. package/examples/__snapshots__/local-dot-env.test.ts.snap +1 -1959
  33. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1 -2503
  34. package/examples/__snapshots__/multiline-var.test.ts.snap +1 -4488
  35. package/examples/__snapshots__/native-app.test.ts.snap +1 -3167
  36. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1 -1959
  37. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1 -1967
  38. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +1479 -2003
  39. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1 -1995
  40. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1 -2105
  41. package/examples/cloud-run-memory-limit.test.ts +1 -8
  42. package/examples/cloud-run-meteor-with-worker.test.ts +2 -9
  43. package/examples/cloud-run-no-cpu-throttling.test.ts +2 -9
  44. package/examples/cloud-run-no-service.test.ts +2 -9
  45. package/examples/cloud-run-non-public.test.ts +2 -9
  46. package/examples/cloud-run-post-stop-job.test.ts +2 -9
  47. package/examples/cloud-run-service-custom-vpc.test.ts +11 -0
  48. package/examples/cloud-run-service-custom-vpc.ts +30 -0
  49. package/examples/cloud-run-service-gen2.test.ts +2 -9
  50. package/examples/cloud-run-service-increase-timout.test.ts +2 -9
  51. package/examples/cloud-run-service-with-volumes.test.ts +2 -9
  52. package/examples/cloud-run-storybook.test.ts +2 -9
  53. package/examples/cloud-run-with-ngnix.test.ts +2 -9
  54. package/examples/cloud-run-with-sql-reuse-db.test.ts +2 -9
  55. package/examples/cloud-run-with-sql.test.ts +2 -9
  56. package/examples/cloud-run-with-worker.test.ts +2 -9
  57. package/examples/custom-build-job-with-tests.test.ts +2 -9
  58. package/examples/custom-build-job.test.ts +2 -9
  59. package/examples/custom-deploy.test.ts +2 -9
  60. package/examples/custom-envs.test.ts +2 -9
  61. package/examples/custom-sbom-java.test.ts +2 -9
  62. package/examples/git-submodule.test.ts +2 -9
  63. package/examples/kubernetes-application-customization.test.ts +2 -9
  64. package/examples/kubernetes-with-cloud-sql-legacy.test.ts +2 -9
  65. package/examples/kubernetes-with-cloud-sql.test.ts +2 -9
  66. package/examples/kubernetes-with-jobs.test.ts +2 -9
  67. package/examples/kubernetes-with-mongodb.test.ts +2 -9
  68. package/examples/local-dot-env.test.ts +2 -9
  69. package/examples/meteor-kubernetes.test.ts +2 -9
  70. package/examples/multiline-var.test.ts +2 -9
  71. package/examples/native-app.test.ts +2 -9
  72. package/examples/node-build-with-custom-image.test.ts +2 -9
  73. package/examples/node-build-with-docker-additions.test.ts +2 -9
  74. package/examples/rails-k8s-with-worker-dockerfile.test.ts +2 -2
  75. package/examples/rails-k8s-with-worker.test.ts +2 -9
  76. package/examples/wait-for-other-deploy.test.ts +2 -9
  77. package/package.json +1 -1
  78. package/scripts/generate-examples-test.ts +3 -5
  79. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +2 -0
  80. package/src/deploy/types/googleCloudRun.ts +9 -0
@@ -1,6 +1,6 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`matches snapshot for cloud-run-memory-limit local pipeline YAML 1`] = `
3
+ exports[`matches snapshot for native-app local pipeline YAML 1`] = `
4
4
  "image: path/to/docker/jobs-default:the-version
5
5
  stages:
6
6
  - setup
@@ -2148,3169 +2148,3 @@ create release:
2148
2148
  needs: []
2149
2149
  "
2150
2150
  `;
2151
-
2152
- exports[`matches snapshot for native-app 1`] = `
2153
- {
2154
- "mainBranch": {
2155
- "image": "path/to/docker/jobs-default:the-version",
2156
- "jobs": {
2157
- "api 👮 lint": {
2158
- "cache": [
2159
- {
2160
- "key": "api-yarn",
2161
- "paths": [
2162
- "api/.yarn",
2163
- ],
2164
- "policy": "pull-push",
2165
- },
2166
- {
2167
- "key": "api-node-modules",
2168
- "paths": [
2169
- "api/node_modules",
2170
- ],
2171
- "policy": "pull-push",
2172
- },
2173
- ],
2174
- "image": "path/to/docker/jobs-default:the-version",
2175
- "interruptible": true,
2176
- "needs": [],
2177
- "retry": {
2178
- "max": 2,
2179
- "when": [
2180
- "runner_system_failure",
2181
- "stuck_or_timeout_failure",
2182
- ],
2183
- },
2184
- "script": [
2185
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2186
- "export APP_PATH="api"",
2187
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2188
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2189
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2190
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2191
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2192
- "cd api",
2193
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2194
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2195
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2196
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2197
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2198
- "yarn install --immutable",
2199
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2200
- "yarn lint",
2201
- ],
2202
- "stage": "test",
2203
- "variables": {
2204
- "KUBERNETES_CPU_REQUEST": "0.45",
2205
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2206
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2207
- },
2208
- },
2209
- "api 🔨 app | dev ": {
2210
- "artifacts": {
2211
- "expire_in": "1 day",
2212
- "paths": [
2213
- "api/__build_info.json",
2214
- "api/.next",
2215
- "api/dist",
2216
- ],
2217
- "reports": {
2218
- "junit": undefined,
2219
- },
2220
- "when": "always",
2221
- },
2222
- "cache": [
2223
- {
2224
- "key": "api-yarn",
2225
- "paths": [
2226
- "api/.yarn",
2227
- ],
2228
- "policy": "pull-push",
2229
- },
2230
- {
2231
- "key": "api-node-modules",
2232
- "paths": [
2233
- "api/node_modules",
2234
- ],
2235
- "policy": "pull-push",
2236
- },
2237
- {
2238
- "key": "api-next-cache",
2239
- "paths": [
2240
- "api/.next/cache",
2241
- ],
2242
- "policy": "pull-push",
2243
- },
2244
- ],
2245
- "image": "path/to/docker/jobs-default:the-version",
2246
- "interruptible": true,
2247
- "needs": [],
2248
- "retry": {
2249
- "max": 2,
2250
- "when": [
2251
- "runner_system_failure",
2252
- "stuck_or_timeout_failure",
2253
- ],
2254
- },
2255
- "script": [
2256
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2257
- "export ENV_SHORT="dev"",
2258
- "export APP_DIR="api"",
2259
- "export ENV_TYPE="dev"",
2260
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2261
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2262
- "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")"",
2263
- "export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2264
- "export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2265
- "export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2266
- "export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2267
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2268
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
2269
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
2270
- "export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"",
2271
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"",
2272
- "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\\"]"",
2273
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2274
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
2275
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2276
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2277
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2278
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2279
- "cd api",
2280
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2281
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2282
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2283
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2284
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2285
- "yarn install --immutable",
2286
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2287
- "yarn build",
2288
- ],
2289
- "stage": "build",
2290
- "variables": {
2291
- "KUBERNETES_CPU_REQUEST": "0.45",
2292
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2293
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2294
- },
2295
- },
2296
- "api 🔨 docker | dev ": {
2297
- "cache": [
2298
- {
2299
- "key": "api-yarn",
2300
- "paths": [
2301
- "api/.yarn",
2302
- ],
2303
- "policy": "pull",
2304
- },
2305
- ],
2306
- "image": "path/to/docker/docker-build:the-version",
2307
- "interruptible": true,
2308
- "needs": [
2309
- "api 🔨 app | dev ",
2310
- ],
2311
- "retry": {
2312
- "max": 2,
2313
- "when": [
2314
- "runner_system_failure",
2315
- "stuck_or_timeout_failure",
2316
- ],
2317
- },
2318
- "script": [
2319
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2320
- "export APP_DIR="api"",
2321
- "export DOCKER_BUILD_CONTEXT="."",
2322
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
2323
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api"",
2324
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
2325
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2326
- "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2327
- RUN yarn plugin import workspace-tools
2328
- RUN yarn workspaces focus --production && yarn rebuild"",
2329
- "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
2330
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2331
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2332
- COPY --chown=node:node .yarn /app/.yarn"",
2333
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2334
- "ensureNodeDockerfile",
2335
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
2336
- "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")",
2337
- "gcloud auth configure-docker asia-east1-docker.pkg.dev",
2338
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
2339
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
2340
- "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",
2341
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
2342
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
2343
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2344
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2345
- "docker push $DOCKER_CACHE_IMAGE",
2346
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
2347
- ],
2348
- "services": [
2349
- {
2350
- "command": [
2351
- "--tls=false",
2352
- ],
2353
- "name": "docker:24.0.6-dind",
2354
- },
2355
- ],
2356
- "stage": "build",
2357
- "variables": {
2358
- "DOCKER_BUILDKIT": "1",
2359
- "DOCKER_DRIVER": "overlay2",
2360
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
2361
- "DOCKER_TLS_CERTDIR": "",
2362
- "KUBERNETES_CPU_REQUEST": "0.45",
2363
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
2364
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2365
- },
2366
- },
2367
- "api 🚀 Deploy | dev ": {
2368
- "allow_failure": false,
2369
- "artifacts": {
2370
- "reports": {
2371
- "dotenv": "gitlab_environment.env",
2372
- },
2373
- },
2374
- "environment": {
2375
- "auto_stop_in": "4 weeks",
2376
- "name": "dev/api",
2377
- "on_stop": "api 🛑 Stop ⚠️ | dev ",
2378
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
2379
- },
2380
- "image": "path/to/docker/gcloud:the-version",
2381
- "interruptible": true,
2382
- "needs": [
2383
- {
2384
- "artifacts": false,
2385
- "job": "api 👮 lint",
2386
- },
2387
- {
2388
- "artifacts": false,
2389
- "job": "api 🔨 app | dev ",
2390
- },
2391
- {
2392
- "artifacts": false,
2393
- "job": "api 🔨 docker | dev ",
2394
- },
2395
- {
2396
- "artifacts": false,
2397
- "job": "api 🧪 test",
2398
- },
2399
- {
2400
- "artifacts": true,
2401
- "job": "api 🧾 sbom | dev ",
2402
- },
2403
- {
2404
- "artifacts": false,
2405
- "job": "api 🛡 audit",
2406
- },
2407
- ],
2408
- "retry": {
2409
- "max": 2,
2410
- "when": [
2411
- "runner_system_failure",
2412
- "stuck_or_timeout_failure",
2413
- ],
2414
- },
2415
- "rules": [
2416
- {
2417
- "when": "on_success",
2418
- },
2419
- ],
2420
- "script": [
2421
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2422
- "export ENV_SHORT="dev"",
2423
- "export APP_DIR="api"",
2424
- "export ENV_TYPE="dev"",
2425
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2426
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2427
- "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")"",
2428
- "export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2429
- "export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2430
- "export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2431
- "export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2432
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2433
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
2434
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
2435
- "export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"",
2436
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"",
2437
- "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\\"]"",
2438
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
2439
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api"",
2440
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
2441
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2442
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
2443
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2444
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
2445
- "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")",
2446
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
2447
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2448
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
2449
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
2450
- "cat > ____envvars.yaml <<EOF
2451
- ENV_SHORT: |-
2452
- dev
2453
- APP_DIR: |-
2454
- api
2455
- ENV_TYPE: |-
2456
- dev
2457
- BUILD_INFO_BUILD_ID: |-
2458
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2459
- BUILD_INFO_BUILD_TIME: |-
2460
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2461
- BUILD_INFO_CURRENT_VERSION: |-
2462
- $(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/^/ /')
2463
- HOST: |-
2464
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2465
- ROOT_URL: |-
2466
- $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2467
- HOST_INTERNAL: |-
2468
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2469
- HOST_CANONICAL: |-
2470
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2471
- ROOT_URL_INTERNAL: |-
2472
- $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2473
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2474
- asdf
2475
- DEPLOY_CLOUD_RUN_REGION: |-
2476
- asia-east1
2477
- GCLOUD_RUN_canonicalHostSuffix: |-
2478
- $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2479
- _ALL_ENV_VAR_KEYS: |-
2480
- ["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"]
2481
-
2482
- EOF
2483
- ",
2484
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
2485
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
2486
- "gcloud run deploy pan-test-app-dev-api --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
2487
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
2488
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
2489
- "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",
2490
- "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",
2491
- "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",
2492
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
2493
- "echo 'Uploading SBOM to Dependency Track'",
2494
- "/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",
2495
- "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",
2496
- ],
2497
- "stage": "deploy dev",
2498
- "variables": {
2499
- "KUBERNETES_CPU_REQUEST": "0.22",
2500
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2501
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2502
- },
2503
- },
2504
- "api 🛑 Stop ⚠️ | dev ": {
2505
- "allow_failure": true,
2506
- "artifacts": {
2507
- "reports": {
2508
- "dotenv": "gitlab_environment.env",
2509
- },
2510
- },
2511
- "environment": {
2512
- "action": "stop",
2513
- "name": "dev/api",
2514
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
2515
- },
2516
- "image": "path/to/docker/gcloud:the-version",
2517
- "interruptible": true,
2518
- "needs": [],
2519
- "retry": {
2520
- "max": 2,
2521
- "when": [
2522
- "runner_system_failure",
2523
- "stuck_or_timeout_failure",
2524
- ],
2525
- },
2526
- "rules": [
2527
- {
2528
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2529
- "when": "on_success",
2530
- },
2531
- {
2532
- "when": "manual",
2533
- },
2534
- ],
2535
- "script": [
2536
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2537
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
2538
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2539
- "set +e",
2540
- "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")",
2541
- "gcloud run services delete pan-test-app-dev-api --project=asdf --region=asia-east1",
2542
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags",
2543
- "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",
2544
- "echo 'Disabling component in Dependency Track'",
2545
- "/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",
2546
- "set -e",
2547
- "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",
2548
- ],
2549
- "stage": "stop dev",
2550
- "variables": {
2551
- "GIT_STRATEGY": "none",
2552
- "KUBERNETES_CPU_REQUEST": "0.22",
2553
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2554
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2555
- },
2556
- },
2557
- "api 🛡 audit": {
2558
- "allow_failure": true,
2559
- "image": "path/to/docker/jobs-default:the-version",
2560
- "interruptible": true,
2561
- "needs": [],
2562
- "retry": {
2563
- "max": 2,
2564
- "when": [
2565
- "runner_system_failure",
2566
- "stuck_or_timeout_failure",
2567
- ],
2568
- },
2569
- "script": [
2570
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2571
- "export APP_PATH="api"",
2572
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2573
- "cd api",
2574
- "yarn npm audit --environment production",
2575
- ],
2576
- "stage": "test",
2577
- "variables": {
2578
- "KUBERNETES_CPU_REQUEST": "0.45",
2579
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2580
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2581
- },
2582
- },
2583
- "api 🧪 test": {
2584
- "cache": [
2585
- {
2586
- "key": "api-yarn",
2587
- "paths": [
2588
- "api/.yarn",
2589
- ],
2590
- "policy": "pull-push",
2591
- },
2592
- {
2593
- "key": "api-node-modules",
2594
- "paths": [
2595
- "api/node_modules",
2596
- ],
2597
- "policy": "pull-push",
2598
- },
2599
- ],
2600
- "image": "path/to/docker/jobs-testing-chrome:the-version",
2601
- "interruptible": true,
2602
- "needs": [],
2603
- "retry": {
2604
- "max": 2,
2605
- "when": [
2606
- "runner_system_failure",
2607
- "stuck_or_timeout_failure",
2608
- ],
2609
- },
2610
- "script": [
2611
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2612
- "export APP_PATH="api"",
2613
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2614
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2615
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2616
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2617
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2618
- "cd api",
2619
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2620
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2621
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2622
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2623
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2624
- "yarn install --immutable",
2625
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2626
- "yarn test",
2627
- ],
2628
- "stage": "test",
2629
- "variables": {
2630
- "KUBERNETES_CPU_REQUEST": "0.45",
2631
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2632
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2633
- },
2634
- },
2635
- "api 🧾 sbom | dev ": {
2636
- "allow_failure": true,
2637
- "artifacts": {
2638
- "paths": [
2639
- "__sbom.json",
2640
- ],
2641
- },
2642
- "image": "aquasec/trivy:0.38.3",
2643
- "interruptible": true,
2644
- "needs": [],
2645
- "retry": {
2646
- "max": 2,
2647
- "when": [
2648
- "runner_system_failure",
2649
- "stuck_or_timeout_failure",
2650
- ],
2651
- },
2652
- "script": [
2653
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2654
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2655
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
2656
- ],
2657
- "stage": "build",
2658
- "variables": {},
2659
- },
2660
- "app 👮 lint": {
2661
- "cache": [
2662
- {
2663
- "key": "app-yarn",
2664
- "paths": [
2665
- "app/.yarn",
2666
- ],
2667
- "policy": "pull-push",
2668
- },
2669
- {
2670
- "key": "app-node-modules",
2671
- "paths": [
2672
- "app/node_modules",
2673
- ],
2674
- "policy": "pull-push",
2675
- },
2676
- ],
2677
- "image": "path/to/docker/jobs-default:the-version",
2678
- "interruptible": true,
2679
- "needs": [],
2680
- "retry": {
2681
- "max": 2,
2682
- "when": [
2683
- "runner_system_failure",
2684
- "stuck_or_timeout_failure",
2685
- ],
2686
- },
2687
- "script": [
2688
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2689
- "export APP_PATH="app"",
2690
- "export LC_A="L=en_US.UTF-8"",
2691
- "export LANG="en_US.UTF-8"",
2692
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2693
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2694
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2695
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2696
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2697
- "cd app",
2698
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2699
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2700
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2701
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2702
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2703
- "yarn install --immutable",
2704
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2705
- "yarn lint",
2706
- ],
2707
- "stage": "test",
2708
- "variables": {
2709
- "KUBERNETES_CPU_REQUEST": "0.45",
2710
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2711
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2712
- },
2713
- },
2714
- "app 🔨 app | dev ": {
2715
- "artifacts": {
2716
- "exclude": [
2717
- "app/.env",
2718
- ],
2719
- "expire_in": "1 day",
2720
- "paths": [
2721
- "app/__build_info.json",
2722
- "app/.next",
2723
- "app/dist",
2724
- ],
2725
- "reports": {
2726
- "junit": undefined,
2727
- },
2728
- "when": "always",
2729
- },
2730
- "cache": [
2731
- {
2732
- "key": {
2733
- "files": [
2734
- "app/Gemfile.lock",
2735
- ],
2736
- },
2737
- "paths": [
2738
- "app/vendor",
2739
- ],
2740
- },
2741
- {
2742
- "key": "app-yarn",
2743
- "paths": [
2744
- "app/.yarn",
2745
- ],
2746
- "policy": "pull-push",
2747
- },
2748
- {
2749
- "key": "app-node-modules",
2750
- "paths": [
2751
- "app/node_modules",
2752
- ],
2753
- "policy": "pull-push",
2754
- },
2755
- {
2756
- "key": "app-next-cache",
2757
- "paths": [
2758
- "app/.next/cache",
2759
- ],
2760
- "policy": "pull-push",
2761
- },
2762
- ],
2763
- "image": "path/to/docker/jobs-default:the-version",
2764
- "interruptible": true,
2765
- "needs": [],
2766
- "retry": {
2767
- "max": 2,
2768
- "when": [
2769
- "runner_system_failure",
2770
- "stuck_or_timeout_failure",
2771
- ],
2772
- },
2773
- "script": [
2774
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2775
- "export ENV_SHORT="dev"",
2776
- "export APP_DIR="app"",
2777
- "export ENV_TYPE="dev"",
2778
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2779
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2780
- "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")"",
2781
- "export HOST="unknown-host.example.com"",
2782
- "export ROOT_URL="https://unknown-host.example.com"",
2783
- "export HOST_INTERNAL="unknown-host.example.com"",
2784
- "export HOST_CANONICAL="unknown-host.example.com"",
2785
- "export ROOT_URL_INTERNAL="https://unknown-host.example.com"",
2786
- "export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_dev_app_APP_STORE_CONNECT_API_KEY_CONTENT"",
2787
- "export APP_STORE_CONNECT_ISSUER_ID="$CL_dev_app_APP_STORE_CONNECT_ISSUER_ID"",
2788
- "export APP_STORE_CONNECT_API_KEY_ID="$CL_dev_app_APP_STORE_CONNECT_API_KEY_ID"",
2789
- "export GRAPHQL_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"",
2790
- "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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"",
2791
- "export LC_A="L=en_US.UTF-8"",
2792
- "export LANG="en_US.UTF-8"",
2793
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2794
- "echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-app[collapsed=true]\\r\\e[0Kwrite dot env"",
2795
- "cat <<EOF > app/.env
2796
- ENV_SHORT=dev
2797
- APP_DIR=app
2798
- ENV_TYPE=dev
2799
- HOST=unknown-host.example.com
2800
- ROOT_URL=https://unknown-host.example.com
2801
- HOST_INTERNAL=unknown-host.example.com
2802
- HOST_CANONICAL=unknown-host.example.com
2803
- ROOT_URL_INTERNAL=https://unknown-host.example.com
2804
- APP_STORE_CONNECT_API_KEY_CONTENT=$CL_dev_app_APP_STORE_CONNECT_API_KEY_CONTENT
2805
- APP_STORE_CONNECT_ISSUER_ID=$CL_dev_app_APP_STORE_CONNECT_ISSUER_ID
2806
- APP_STORE_CONNECT_API_KEY_ID=$CL_dev_app_APP_STORE_CONNECT_API_KEY_ID
2807
- GRAPHQL_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql
2808
- _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","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
2809
- EOF",
2810
- "echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-app\\r\\e[0K"",
2811
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
2812
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2813
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2814
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2815
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2816
- "cd app",
2817
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2818
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2819
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2820
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2821
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2822
- "yarn install --immutable",
2823
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2824
- "bundle config set --local path 'vendor/ruby'",
2825
- "gem install bundler",
2826
- "bundle install",
2827
- "bundle exec pod install --project-directory=ios",
2828
- "bundle exec fastlane build",
2829
- ],
2830
- "stage": "build",
2831
- "tags": [
2832
- "mac-runner",
2833
- ],
2834
- "variables": {
2835
- "KUBERNETES_CPU_REQUEST": "0.45",
2836
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2837
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2838
- },
2839
- },
2840
- "app 🚀 Deploy | dev ": {
2841
- "allow_failure": false,
2842
- "cache": [
2843
- {
2844
- "key": {
2845
- "files": [
2846
- "app/Gemfile.lock",
2847
- ],
2848
- },
2849
- "paths": [
2850
- "app/vendor",
2851
- ],
2852
- },
2853
- ],
2854
- "image": "path/to/docker/jobs-default:the-version",
2855
- "interruptible": true,
2856
- "needs": [
2857
- {
2858
- "artifacts": false,
2859
- "job": "app 👮 lint",
2860
- },
2861
- {
2862
- "artifacts": true,
2863
- "job": "app 🔨 app | dev ",
2864
- },
2865
- {
2866
- "artifacts": false,
2867
- "job": "app 🧪 test",
2868
- },
2869
- {
2870
- "artifacts": true,
2871
- "job": "app 🧾 sbom | dev ",
2872
- },
2873
- {
2874
- "artifacts": false,
2875
- "job": "app 🛡 audit",
2876
- },
2877
- ],
2878
- "retry": {
2879
- "max": 2,
2880
- "when": [
2881
- "runner_system_failure",
2882
- "stuck_or_timeout_failure",
2883
- ],
2884
- },
2885
- "rules": [
2886
- {
2887
- "when": "on_success",
2888
- },
2889
- ],
2890
- "script": [
2891
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2892
- "export ENV_SHORT="dev"",
2893
- "export APP_DIR="app"",
2894
- "export ENV_TYPE="dev"",
2895
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2896
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2897
- "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")"",
2898
- "export HOST="unknown-host.example.com"",
2899
- "export ROOT_URL="https://unknown-host.example.com"",
2900
- "export HOST_INTERNAL="unknown-host.example.com"",
2901
- "export HOST_CANONICAL="unknown-host.example.com"",
2902
- "export ROOT_URL_INTERNAL="https://unknown-host.example.com"",
2903
- "export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_dev_app_APP_STORE_CONNECT_API_KEY_CONTENT"",
2904
- "export APP_STORE_CONNECT_ISSUER_ID="$CL_dev_app_APP_STORE_CONNECT_ISSUER_ID"",
2905
- "export APP_STORE_CONNECT_API_KEY_ID="$CL_dev_app_APP_STORE_CONNECT_API_KEY_ID"",
2906
- "export GRAPHQL_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"",
2907
- "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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"",
2908
- "export LC_A="L=en_US.UTF-8"",
2909
- "export LANG="en_US.UTF-8"",
2910
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2911
- "cd app",
2912
- "bundle config set --local path 'vendor/ruby'",
2913
- "gem install bundler",
2914
- "bundle install",
2915
- "bundle exec fastlane deploy_test",
2916
- "echo 'Uploading SBOM to Dependency Track'",
2917
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://unknown-host.example.com" "__sbom.json" vex.json || true",
2918
- ],
2919
- "stage": "deploy dev",
2920
- "tags": [
2921
- "mac-runner",
2922
- ],
2923
- "variables": {
2924
- "KUBERNETES_CPU_REQUEST": "0.22",
2925
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2926
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2927
- },
2928
- },
2929
- "app 🛡 audit": {
2930
- "allow_failure": true,
2931
- "image": "path/to/docker/jobs-default:the-version",
2932
- "interruptible": true,
2933
- "needs": [],
2934
- "retry": {
2935
- "max": 2,
2936
- "when": [
2937
- "runner_system_failure",
2938
- "stuck_or_timeout_failure",
2939
- ],
2940
- },
2941
- "script": [
2942
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2943
- "export APP_PATH="app"",
2944
- "export LC_A="L=en_US.UTF-8"",
2945
- "export LANG="en_US.UTF-8"",
2946
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2947
- "cd app",
2948
- "yarn npm audit --environment production",
2949
- ],
2950
- "stage": "test",
2951
- "variables": {
2952
- "KUBERNETES_CPU_REQUEST": "0.45",
2953
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
2954
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
2955
- },
2956
- },
2957
- "app 🧪 test": {
2958
- "cache": [
2959
- {
2960
- "key": "app-yarn",
2961
- "paths": [
2962
- "app/.yarn",
2963
- ],
2964
- "policy": "pull-push",
2965
- },
2966
- {
2967
- "key": "app-node-modules",
2968
- "paths": [
2969
- "app/node_modules",
2970
- ],
2971
- "policy": "pull-push",
2972
- },
2973
- ],
2974
- "image": "path/to/docker/jobs-testing-chrome:the-version",
2975
- "interruptible": true,
2976
- "needs": [],
2977
- "retry": {
2978
- "max": 2,
2979
- "when": [
2980
- "runner_system_failure",
2981
- "stuck_or_timeout_failure",
2982
- ],
2983
- },
2984
- "script": [
2985
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2986
- "export APP_PATH="app"",
2987
- "export LC_A="L=en_US.UTF-8"",
2988
- "export LANG="en_US.UTF-8"",
2989
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2990
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2991
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2992
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2993
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2994
- "cd app",
2995
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2996
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2997
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2998
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2999
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3000
- "yarn install --immutable",
3001
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3002
- "yarn test",
3003
- ],
3004
- "stage": "test",
3005
- "variables": {
3006
- "KUBERNETES_CPU_REQUEST": "0.45",
3007
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3008
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3009
- },
3010
- },
3011
- "app 🧾 sbom | dev ": {
3012
- "allow_failure": true,
3013
- "artifacts": {
3014
- "paths": [
3015
- "__sbom.json",
3016
- ],
3017
- },
3018
- "image": "aquasec/trivy:0.38.3",
3019
- "interruptible": true,
3020
- "needs": [],
3021
- "retry": {
3022
- "max": 2,
3023
- "when": [
3024
- "runner_system_failure",
3025
- "stuck_or_timeout_failure",
3026
- ],
3027
- },
3028
- "script": [
3029
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3030
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3031
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
3032
- ],
3033
- "stage": "build",
3034
- "variables": {},
3035
- },
3036
- },
3037
- "stages": [
3038
- "setup",
3039
- "setup dev",
3040
- "setup review",
3041
- "setup stage",
3042
- "setup prod",
3043
- "test",
3044
- "test dev",
3045
- "test review",
3046
- "test stage",
3047
- "test prod",
3048
- "build",
3049
- "build dev",
3050
- "build review",
3051
- "build stage",
3052
- "build prod",
3053
- "deploy",
3054
- "deploy dev",
3055
- "deploy review",
3056
- "deploy stage",
3057
- "deploy prod",
3058
- "verify",
3059
- "verify dev",
3060
- "verify review",
3061
- "verify stage",
3062
- "verify prod",
3063
- "rollback",
3064
- "rollback dev",
3065
- "rollback review",
3066
- "rollback stage",
3067
- "rollback prod",
3068
- "stop",
3069
- "stop dev",
3070
- "stop review",
3071
- "stop stage",
3072
- "stop prod",
3073
- ],
3074
- "variables": {
3075
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
3076
- "CACHE_COMPRESSION_LEVEL": "fast",
3077
- "FF_USE_FASTZIP": "true",
3078
- "GIT_DEPTH": "1",
3079
- "TRANSFER_METER_FREQUENCY": "5s",
3080
- },
3081
- "workflow": {
3082
- "rules": [
3083
- {
3084
- "if": "$CI_COMMIT_TAG",
3085
- },
3086
- {
3087
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
3088
- "when": "never",
3089
- },
3090
- {
3091
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
3092
- "when": "never",
3093
- },
3094
- {
3095
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
3096
- },
3097
- {
3098
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
3099
- },
3100
- {
3101
- "if": "$CI_MERGE_REQUEST_ID",
3102
- },
3103
- ],
3104
- },
3105
- },
3106
- "mr": {
3107
- "image": "path/to/docker/jobs-default:the-version",
3108
- "jobs": {
3109
- "api 👮 lint": {
3110
- "cache": [
3111
- {
3112
- "key": "api-yarn",
3113
- "paths": [
3114
- "api/.yarn",
3115
- ],
3116
- "policy": "pull-push",
3117
- },
3118
- {
3119
- "key": "api-node-modules",
3120
- "paths": [
3121
- "api/node_modules",
3122
- ],
3123
- "policy": "pull-push",
3124
- },
3125
- ],
3126
- "image": "path/to/docker/jobs-default:the-version",
3127
- "interruptible": true,
3128
- "needs": [],
3129
- "retry": {
3130
- "max": 2,
3131
- "when": [
3132
- "runner_system_failure",
3133
- "stuck_or_timeout_failure",
3134
- ],
3135
- },
3136
- "script": [
3137
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3138
- "export APP_PATH="api"",
3139
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3140
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3141
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3142
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3143
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3144
- "cd api",
3145
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3146
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3147
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3148
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3149
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3150
- "yarn install --immutable",
3151
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3152
- "yarn lint",
3153
- ],
3154
- "stage": "test",
3155
- "variables": {
3156
- "KUBERNETES_CPU_REQUEST": "0.45",
3157
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3158
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3159
- },
3160
- },
3161
- "api 🔨 app | review ": {
3162
- "artifacts": {
3163
- "expire_in": "1 day",
3164
- "paths": [
3165
- "api/__build_info.json",
3166
- "api/.next",
3167
- "api/dist",
3168
- ],
3169
- "reports": {
3170
- "junit": undefined,
3171
- },
3172
- "when": "always",
3173
- },
3174
- "cache": [
3175
- {
3176
- "key": "api-yarn",
3177
- "paths": [
3178
- "api/.yarn",
3179
- ],
3180
- "policy": "pull-push",
3181
- },
3182
- {
3183
- "key": "api-node-modules",
3184
- "paths": [
3185
- "api/node_modules",
3186
- ],
3187
- "policy": "pull-push",
3188
- },
3189
- {
3190
- "key": "api-next-cache",
3191
- "paths": [
3192
- "api/.next/cache",
3193
- ],
3194
- "policy": "pull-push",
3195
- },
3196
- ],
3197
- "image": "path/to/docker/jobs-default:the-version",
3198
- "interruptible": true,
3199
- "needs": [],
3200
- "retry": {
3201
- "max": 2,
3202
- "when": [
3203
- "runner_system_failure",
3204
- "stuck_or_timeout_failure",
3205
- ],
3206
- },
3207
- "script": [
3208
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3209
- "export ENV_SHORT="review"",
3210
- "export APP_DIR="api"",
3211
- "export ENV_TYPE="review"",
3212
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3213
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3214
- "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")"",
3215
- "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)}')"",
3216
- "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)}')"",
3217
- "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)}')"",
3218
- "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)}')"",
3219
- "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)}')"",
3220
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
3221
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
3222
- "export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"",
3223
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"",
3224
- "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\\"]"",
3225
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3226
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
3227
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3228
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3229
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3230
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3231
- "cd api",
3232
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3233
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3234
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3235
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3236
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3237
- "yarn install --immutable",
3238
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3239
- "yarn build",
3240
- ],
3241
- "stage": "build",
3242
- "variables": {
3243
- "KUBERNETES_CPU_REQUEST": "0.45",
3244
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3245
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3246
- },
3247
- },
3248
- "api 🔨 docker | review ": {
3249
- "cache": [
3250
- {
3251
- "key": "api-yarn",
3252
- "paths": [
3253
- "api/.yarn",
3254
- ],
3255
- "policy": "pull",
3256
- },
3257
- ],
3258
- "image": "path/to/docker/docker-build:the-version",
3259
- "interruptible": true,
3260
- "needs": [
3261
- "api 🔨 app | review ",
3262
- ],
3263
- "retry": {
3264
- "max": 2,
3265
- "when": [
3266
- "runner_system_failure",
3267
- "stuck_or_timeout_failure",
3268
- ],
3269
- },
3270
- "script": [
3271
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3272
- "export APP_DIR="api"",
3273
- "export DOCKER_BUILD_CONTEXT="."",
3274
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
3275
- "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"; })"",
3276
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
3277
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
3278
- "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
3279
- RUN yarn plugin import workspace-tools
3280
- RUN yarn workspaces focus --production && yarn rebuild"",
3281
- "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
3282
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
3283
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
3284
- COPY --chown=node:node .yarn /app/.yarn"",
3285
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3286
- "ensureNodeDockerfile",
3287
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
3288
- "gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")",
3289
- "gcloud auth configure-docker asia-east1-docker.pkg.dev",
3290
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
3291
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
3292
- "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",
3293
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
3294
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
3295
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
3296
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
3297
- "docker push $DOCKER_CACHE_IMAGE",
3298
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
3299
- ],
3300
- "services": [
3301
- {
3302
- "command": [
3303
- "--tls=false",
3304
- ],
3305
- "name": "docker:24.0.6-dind",
3306
- },
3307
- ],
3308
- "stage": "build",
3309
- "variables": {
3310
- "DOCKER_BUILDKIT": "1",
3311
- "DOCKER_DRIVER": "overlay2",
3312
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
3313
- "DOCKER_TLS_CERTDIR": "",
3314
- "KUBERNETES_CPU_REQUEST": "0.45",
3315
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
3316
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3317
- },
3318
- },
3319
- "api 🚀 Deploy | review ": {
3320
- "allow_failure": false,
3321
- "artifacts": {
3322
- "reports": {
3323
- "dotenv": "gitlab_environment.env",
3324
- },
3325
- },
3326
- "environment": {
3327
- "auto_stop_in": "1 week",
3328
- "name": "review/$CI_COMMIT_REF_NAME/api",
3329
- "on_stop": "api 🛑 Stop ⚠️ | review ",
3330
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
3331
- },
3332
- "image": "path/to/docker/gcloud:the-version",
3333
- "interruptible": true,
3334
- "needs": [
3335
- {
3336
- "artifacts": false,
3337
- "job": "api 👮 lint",
3338
- },
3339
- {
3340
- "artifacts": false,
3341
- "job": "api 🔨 app | review ",
3342
- },
3343
- {
3344
- "artifacts": false,
3345
- "job": "api 🔨 docker | review ",
3346
- },
3347
- {
3348
- "artifacts": false,
3349
- "job": "api 🧪 test",
3350
- },
3351
- {
3352
- "artifacts": true,
3353
- "job": "api 🧾 sbom | review ",
3354
- },
3355
- {
3356
- "artifacts": false,
3357
- "job": "api 🛡 audit",
3358
- },
3359
- ],
3360
- "retry": {
3361
- "max": 2,
3362
- "when": [
3363
- "runner_system_failure",
3364
- "stuck_or_timeout_failure",
3365
- ],
3366
- },
3367
- "rules": [
3368
- {
3369
- "when": "on_success",
3370
- },
3371
- ],
3372
- "script": [
3373
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3374
- "export ENV_SHORT="review"",
3375
- "export APP_DIR="api"",
3376
- "export ENV_TYPE="review"",
3377
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3378
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3379
- "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")"",
3380
- "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)}')"",
3381
- "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)}')"",
3382
- "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)}')"",
3383
- "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)}')"",
3384
- "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)}')"",
3385
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
3386
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
3387
- "export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"",
3388
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"",
3389
- "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\\"]"",
3390
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
3391
- "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"; })"",
3392
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
3393
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
3394
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
3395
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3396
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
3397
- "gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")",
3398
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
3399
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
3400
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
3401
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
3402
- "cat > ____envvars.yaml <<EOF
3403
- ENV_SHORT: |-
3404
- review
3405
- APP_DIR: |-
3406
- api
3407
- ENV_TYPE: |-
3408
- review
3409
- BUILD_INFO_BUILD_ID: |-
3410
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3411
- BUILD_INFO_BUILD_TIME: |-
3412
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3413
- BUILD_INFO_CURRENT_VERSION: |-
3414
- $(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/^/ /')
3415
- HOST: |-
3416
- $(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/^/ /')
3417
- ROOT_URL: |-
3418
- $(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/^/ /')
3419
- HOST_INTERNAL: |-
3420
- $(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/^/ /')
3421
- HOST_CANONICAL: |-
3422
- $(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/^/ /')
3423
- ROOT_URL_INTERNAL: |-
3424
- $(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/^/ /')
3425
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
3426
- asdf
3427
- DEPLOY_CLOUD_RUN_REGION: |-
3428
- asia-east1
3429
- GCLOUD_RUN_canonicalHostSuffix: |-
3430
- $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
3431
- _ALL_ENV_VAR_KEYS: |-
3432
- ["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"]
3433
-
3434
- EOF
3435
- ",
3436
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
3437
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
3438
- "gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
3439
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
3440
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
3441
- "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",
3442
- "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",
3443
- "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",
3444
- "set +e",
3445
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api --quiet --delete-tags",
3446
- "set -e",
3447
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
3448
- "echo 'Uploading SBOM to Dependency Track'",
3449
- "/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",
3450
- "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",
3451
- ],
3452
- "stage": "deploy review",
3453
- "variables": {
3454
- "KUBERNETES_CPU_REQUEST": "0.22",
3455
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
3456
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
3457
- },
3458
- },
3459
- "api 🛑 Stop ⚠️ | review ": {
3460
- "allow_failure": true,
3461
- "artifacts": {
3462
- "reports": {
3463
- "dotenv": "gitlab_environment.env",
3464
- },
3465
- },
3466
- "environment": {
3467
- "action": "stop",
3468
- "name": "review/$CI_COMMIT_REF_NAME/api",
3469
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
3470
- },
3471
- "image": "path/to/docker/gcloud:the-version",
3472
- "interruptible": true,
3473
- "needs": [],
3474
- "retry": {
3475
- "max": 2,
3476
- "when": [
3477
- "runner_system_failure",
3478
- "stuck_or_timeout_failure",
3479
- ],
3480
- },
3481
- "rules": [
3482
- {
3483
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
3484
- "when": "on_success",
3485
- },
3486
- {
3487
- "when": "manual",
3488
- },
3489
- ],
3490
- "script": [
3491
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3492
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
3493
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3494
- "set +e",
3495
- "gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")",
3496
- "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",
3497
- "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",
3498
- "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",
3499
- "set +e",
3500
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api --quiet --delete-tags",
3501
- "set -e",
3502
- "echo 'Disabling component in Dependency Track'",
3503
- "/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",
3504
- "set -e",
3505
- "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",
3506
- ],
3507
- "stage": "stop review",
3508
- "variables": {
3509
- "GIT_STRATEGY": "none",
3510
- "KUBERNETES_CPU_REQUEST": "0.22",
3511
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
3512
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
3513
- },
3514
- },
3515
- "api 🛡 audit": {
3516
- "allow_failure": true,
3517
- "image": "path/to/docker/jobs-default:the-version",
3518
- "interruptible": true,
3519
- "needs": [],
3520
- "retry": {
3521
- "max": 2,
3522
- "when": [
3523
- "runner_system_failure",
3524
- "stuck_or_timeout_failure",
3525
- ],
3526
- },
3527
- "script": [
3528
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3529
- "export APP_PATH="api"",
3530
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3531
- "cd api",
3532
- "yarn npm audit --environment production",
3533
- ],
3534
- "stage": "test",
3535
- "variables": {
3536
- "KUBERNETES_CPU_REQUEST": "0.45",
3537
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3538
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3539
- },
3540
- },
3541
- "api 🧪 test": {
3542
- "cache": [
3543
- {
3544
- "key": "api-yarn",
3545
- "paths": [
3546
- "api/.yarn",
3547
- ],
3548
- "policy": "pull-push",
3549
- },
3550
- {
3551
- "key": "api-node-modules",
3552
- "paths": [
3553
- "api/node_modules",
3554
- ],
3555
- "policy": "pull-push",
3556
- },
3557
- ],
3558
- "image": "path/to/docker/jobs-testing-chrome:the-version",
3559
- "interruptible": true,
3560
- "needs": [],
3561
- "retry": {
3562
- "max": 2,
3563
- "when": [
3564
- "runner_system_failure",
3565
- "stuck_or_timeout_failure",
3566
- ],
3567
- },
3568
- "script": [
3569
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3570
- "export APP_PATH="api"",
3571
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3572
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3573
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3574
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3575
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3576
- "cd api",
3577
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3578
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3579
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3580
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3581
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3582
- "yarn install --immutable",
3583
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3584
- "yarn test",
3585
- ],
3586
- "stage": "test",
3587
- "variables": {
3588
- "KUBERNETES_CPU_REQUEST": "0.45",
3589
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3590
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3591
- },
3592
- },
3593
- "api 🧾 sbom | review ": {
3594
- "allow_failure": true,
3595
- "artifacts": {
3596
- "paths": [
3597
- "__sbom.json",
3598
- ],
3599
- },
3600
- "image": "aquasec/trivy:0.38.3",
3601
- "interruptible": true,
3602
- "needs": [],
3603
- "retry": {
3604
- "max": 2,
3605
- "when": [
3606
- "runner_system_failure",
3607
- "stuck_or_timeout_failure",
3608
- ],
3609
- },
3610
- "script": [
3611
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3612
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3613
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
3614
- ],
3615
- "stage": "build",
3616
- "variables": {},
3617
- },
3618
- "app 👮 lint": {
3619
- "cache": [
3620
- {
3621
- "key": "app-yarn",
3622
- "paths": [
3623
- "app/.yarn",
3624
- ],
3625
- "policy": "pull-push",
3626
- },
3627
- {
3628
- "key": "app-node-modules",
3629
- "paths": [
3630
- "app/node_modules",
3631
- ],
3632
- "policy": "pull-push",
3633
- },
3634
- ],
3635
- "image": "path/to/docker/jobs-default:the-version",
3636
- "interruptible": true,
3637
- "needs": [],
3638
- "retry": {
3639
- "max": 2,
3640
- "when": [
3641
- "runner_system_failure",
3642
- "stuck_or_timeout_failure",
3643
- ],
3644
- },
3645
- "script": [
3646
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3647
- "export APP_PATH="app"",
3648
- "export LC_A="L=en_US.UTF-8"",
3649
- "export LANG="en_US.UTF-8"",
3650
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3651
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3652
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3653
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3654
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3655
- "cd app",
3656
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3657
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3658
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3659
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3660
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3661
- "yarn install --immutable",
3662
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3663
- "yarn lint",
3664
- ],
3665
- "stage": "test",
3666
- "variables": {
3667
- "KUBERNETES_CPU_REQUEST": "0.45",
3668
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3669
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3670
- },
3671
- },
3672
- "app 🔨 app | review ": {
3673
- "artifacts": {
3674
- "exclude": [
3675
- "app/.env",
3676
- ],
3677
- "expire_in": "1 day",
3678
- "paths": [
3679
- "app/__build_info.json",
3680
- "app/.next",
3681
- "app/dist",
3682
- ],
3683
- "reports": {
3684
- "junit": undefined,
3685
- },
3686
- "when": "always",
3687
- },
3688
- "cache": [
3689
- {
3690
- "key": {
3691
- "files": [
3692
- "app/Gemfile.lock",
3693
- ],
3694
- },
3695
- "paths": [
3696
- "app/vendor",
3697
- ],
3698
- },
3699
- {
3700
- "key": "app-yarn",
3701
- "paths": [
3702
- "app/.yarn",
3703
- ],
3704
- "policy": "pull-push",
3705
- },
3706
- {
3707
- "key": "app-node-modules",
3708
- "paths": [
3709
- "app/node_modules",
3710
- ],
3711
- "policy": "pull-push",
3712
- },
3713
- {
3714
- "key": "app-next-cache",
3715
- "paths": [
3716
- "app/.next/cache",
3717
- ],
3718
- "policy": "pull-push",
3719
- },
3720
- ],
3721
- "image": "path/to/docker/jobs-default:the-version",
3722
- "interruptible": true,
3723
- "needs": [],
3724
- "retry": {
3725
- "max": 2,
3726
- "when": [
3727
- "runner_system_failure",
3728
- "stuck_or_timeout_failure",
3729
- ],
3730
- },
3731
- "script": [
3732
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3733
- "export ENV_SHORT="review"",
3734
- "export APP_DIR="app"",
3735
- "export ENV_TYPE="review"",
3736
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3737
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3738
- "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")"",
3739
- "export HOST="unknown-host.example.com"",
3740
- "export ROOT_URL="https://unknown-host.example.com"",
3741
- "export HOST_INTERNAL="unknown-host.example.com"",
3742
- "export HOST_CANONICAL="unknown-host.example.com"",
3743
- "export ROOT_URL_INTERNAL="https://unknown-host.example.com"",
3744
- "export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_review_app_APP_STORE_CONNECT_API_KEY_CONTENT"",
3745
- "export APP_STORE_CONNECT_ISSUER_ID="$CL_review_app_APP_STORE_CONNECT_ISSUER_ID"",
3746
- "export APP_STORE_CONNECT_API_KEY_ID="$CL_review_app_APP_STORE_CONNECT_API_KEY_ID"",
3747
- "export GRAPHQL_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)}')/graphql"",
3748
- "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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"",
3749
- "export LC_A="L=en_US.UTF-8"",
3750
- "export LANG="en_US.UTF-8"",
3751
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3752
- "echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-app[collapsed=true]\\r\\e[0Kwrite dot env"",
3753
- "cat <<EOF > app/.env
3754
- ENV_SHORT=review
3755
- APP_DIR=app
3756
- ENV_TYPE=review
3757
- HOST=unknown-host.example.com
3758
- ROOT_URL=https://unknown-host.example.com
3759
- HOST_INTERNAL=unknown-host.example.com
3760
- HOST_CANONICAL=unknown-host.example.com
3761
- ROOT_URL_INTERNAL=https://unknown-host.example.com
3762
- APP_STORE_CONNECT_API_KEY_CONTENT=$CL_review_app_APP_STORE_CONNECT_API_KEY_CONTENT
3763
- APP_STORE_CONNECT_ISSUER_ID=$CL_review_app_APP_STORE_CONNECT_ISSUER_ID
3764
- APP_STORE_CONNECT_API_KEY_ID=$CL_review_app_APP_STORE_CONNECT_API_KEY_ID
3765
- GRAPHQL_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)}')/graphql
3766
- _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","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
3767
- EOF",
3768
- "echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-app\\r\\e[0K"",
3769
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
3770
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3771
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3772
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3773
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3774
- "cd app",
3775
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3776
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3777
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3778
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3779
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3780
- "yarn install --immutable",
3781
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3782
- "bundle config set --local path 'vendor/ruby'",
3783
- "gem install bundler",
3784
- "bundle install",
3785
- "bundle exec pod install --project-directory=ios",
3786
- "bundle exec fastlane build",
3787
- ],
3788
- "stage": "build",
3789
- "tags": [
3790
- "mac-runner",
3791
- ],
3792
- "variables": {
3793
- "KUBERNETES_CPU_REQUEST": "0.45",
3794
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3795
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3796
- },
3797
- },
3798
- "app 🚀 Deploy | review ": {
3799
- "allow_failure": false,
3800
- "cache": [
3801
- {
3802
- "key": {
3803
- "files": [
3804
- "app/Gemfile.lock",
3805
- ],
3806
- },
3807
- "paths": [
3808
- "app/vendor",
3809
- ],
3810
- },
3811
- ],
3812
- "image": "path/to/docker/jobs-default:the-version",
3813
- "interruptible": true,
3814
- "needs": [
3815
- {
3816
- "artifacts": false,
3817
- "job": "app 👮 lint",
3818
- },
3819
- {
3820
- "artifacts": true,
3821
- "job": "app 🔨 app | review ",
3822
- },
3823
- {
3824
- "artifacts": false,
3825
- "job": "app 🧪 test",
3826
- },
3827
- {
3828
- "artifacts": true,
3829
- "job": "app 🧾 sbom | review ",
3830
- },
3831
- {
3832
- "artifacts": false,
3833
- "job": "app 🛡 audit",
3834
- },
3835
- ],
3836
- "retry": {
3837
- "max": 2,
3838
- "when": [
3839
- "runner_system_failure",
3840
- "stuck_or_timeout_failure",
3841
- ],
3842
- },
3843
- "rules": [
3844
- {
3845
- "when": "on_success",
3846
- },
3847
- ],
3848
- "script": [
3849
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3850
- "export ENV_SHORT="review"",
3851
- "export APP_DIR="app"",
3852
- "export ENV_TYPE="review"",
3853
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3854
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3855
- "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")"",
3856
- "export HOST="unknown-host.example.com"",
3857
- "export ROOT_URL="https://unknown-host.example.com"",
3858
- "export HOST_INTERNAL="unknown-host.example.com"",
3859
- "export HOST_CANONICAL="unknown-host.example.com"",
3860
- "export ROOT_URL_INTERNAL="https://unknown-host.example.com"",
3861
- "export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_review_app_APP_STORE_CONNECT_API_KEY_CONTENT"",
3862
- "export APP_STORE_CONNECT_ISSUER_ID="$CL_review_app_APP_STORE_CONNECT_ISSUER_ID"",
3863
- "export APP_STORE_CONNECT_API_KEY_ID="$CL_review_app_APP_STORE_CONNECT_API_KEY_ID"",
3864
- "export GRAPHQL_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)}')/graphql"",
3865
- "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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"",
3866
- "export LC_A="L=en_US.UTF-8"",
3867
- "export LANG="en_US.UTF-8"",
3868
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3869
- "cd app",
3870
- "bundle config set --local path 'vendor/ruby'",
3871
- "gem install bundler",
3872
- "bundle install",
3873
- "bundle exec fastlane deploy_test",
3874
- "echo 'Uploading SBOM to Dependency Track'",
3875
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://unknown-host.example.com" "__sbom.json" vex.json || true",
3876
- ],
3877
- "stage": "deploy review",
3878
- "tags": [
3879
- "mac-runner",
3880
- ],
3881
- "variables": {
3882
- "KUBERNETES_CPU_REQUEST": "0.22",
3883
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
3884
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
3885
- },
3886
- },
3887
- "app 🛡 audit": {
3888
- "allow_failure": true,
3889
- "image": "path/to/docker/jobs-default:the-version",
3890
- "interruptible": true,
3891
- "needs": [],
3892
- "retry": {
3893
- "max": 2,
3894
- "when": [
3895
- "runner_system_failure",
3896
- "stuck_or_timeout_failure",
3897
- ],
3898
- },
3899
- "script": [
3900
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3901
- "export APP_PATH="app"",
3902
- "export LC_A="L=en_US.UTF-8"",
3903
- "export LANG="en_US.UTF-8"",
3904
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3905
- "cd app",
3906
- "yarn npm audit --environment production",
3907
- ],
3908
- "stage": "test",
3909
- "variables": {
3910
- "KUBERNETES_CPU_REQUEST": "0.45",
3911
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3912
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3913
- },
3914
- },
3915
- "app 🧪 test": {
3916
- "cache": [
3917
- {
3918
- "key": "app-yarn",
3919
- "paths": [
3920
- "app/.yarn",
3921
- ],
3922
- "policy": "pull-push",
3923
- },
3924
- {
3925
- "key": "app-node-modules",
3926
- "paths": [
3927
- "app/node_modules",
3928
- ],
3929
- "policy": "pull-push",
3930
- },
3931
- ],
3932
- "image": "path/to/docker/jobs-testing-chrome:the-version",
3933
- "interruptible": true,
3934
- "needs": [],
3935
- "retry": {
3936
- "max": 2,
3937
- "when": [
3938
- "runner_system_failure",
3939
- "stuck_or_timeout_failure",
3940
- ],
3941
- },
3942
- "script": [
3943
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3944
- "export APP_PATH="app"",
3945
- "export LC_A="L=en_US.UTF-8"",
3946
- "export LANG="en_US.UTF-8"",
3947
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3948
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3949
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3950
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3951
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3952
- "cd app",
3953
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3954
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3955
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3956
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3957
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3958
- "yarn install --immutable",
3959
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3960
- "yarn test",
3961
- ],
3962
- "stage": "test",
3963
- "variables": {
3964
- "KUBERNETES_CPU_REQUEST": "0.45",
3965
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
3966
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
3967
- },
3968
- },
3969
- "app 🧾 sbom | review ": {
3970
- "allow_failure": true,
3971
- "artifacts": {
3972
- "paths": [
3973
- "__sbom.json",
3974
- ],
3975
- },
3976
- "image": "aquasec/trivy:0.38.3",
3977
- "interruptible": true,
3978
- "needs": [],
3979
- "retry": {
3980
- "max": 2,
3981
- "when": [
3982
- "runner_system_failure",
3983
- "stuck_or_timeout_failure",
3984
- ],
3985
- },
3986
- "script": [
3987
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3988
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3989
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
3990
- ],
3991
- "stage": "build",
3992
- "variables": {},
3993
- },
3994
- },
3995
- "stages": [
3996
- "setup",
3997
- "setup dev",
3998
- "setup review",
3999
- "setup stage",
4000
- "setup prod",
4001
- "test",
4002
- "test dev",
4003
- "test review",
4004
- "test stage",
4005
- "test prod",
4006
- "build",
4007
- "build dev",
4008
- "build review",
4009
- "build stage",
4010
- "build prod",
4011
- "deploy",
4012
- "deploy dev",
4013
- "deploy review",
4014
- "deploy stage",
4015
- "deploy prod",
4016
- "verify",
4017
- "verify dev",
4018
- "verify review",
4019
- "verify stage",
4020
- "verify prod",
4021
- "rollback",
4022
- "rollback dev",
4023
- "rollback review",
4024
- "rollback stage",
4025
- "rollback prod",
4026
- "stop",
4027
- "stop dev",
4028
- "stop review",
4029
- "stop stage",
4030
- "stop prod",
4031
- ],
4032
- "variables": {
4033
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
4034
- "CACHE_COMPRESSION_LEVEL": "fast",
4035
- "FF_USE_FASTZIP": "true",
4036
- "GIT_DEPTH": "1",
4037
- "TRANSFER_METER_FREQUENCY": "5s",
4038
- },
4039
- "workflow": {
4040
- "rules": [
4041
- {
4042
- "if": "$CI_COMMIT_TAG",
4043
- },
4044
- {
4045
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
4046
- "when": "never",
4047
- },
4048
- {
4049
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
4050
- "when": "never",
4051
- },
4052
- {
4053
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
4054
- },
4055
- {
4056
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
4057
- },
4058
- {
4059
- "if": "$CI_MERGE_REQUEST_ID",
4060
- },
4061
- ],
4062
- },
4063
- },
4064
- "taggedRelease": {
4065
- "image": "path/to/docker/jobs-default:the-version",
4066
- "jobs": {
4067
- "api 🔨 app | prod ": {
4068
- "artifacts": {
4069
- "expire_in": "1 day",
4070
- "paths": [
4071
- "api/__build_info.json",
4072
- "api/.next",
4073
- "api/dist",
4074
- ],
4075
- "reports": {
4076
- "junit": undefined,
4077
- },
4078
- "when": "always",
4079
- },
4080
- "cache": [
4081
- {
4082
- "key": "api-yarn",
4083
- "paths": [
4084
- "api/.yarn",
4085
- ],
4086
- "policy": "pull-push",
4087
- },
4088
- {
4089
- "key": "api-node-modules",
4090
- "paths": [
4091
- "api/node_modules",
4092
- ],
4093
- "policy": "pull-push",
4094
- },
4095
- {
4096
- "key": "api-next-cache",
4097
- "paths": [
4098
- "api/.next/cache",
4099
- ],
4100
- "policy": "pull-push",
4101
- },
4102
- ],
4103
- "image": "path/to/docker/jobs-default:the-version",
4104
- "interruptible": true,
4105
- "needs": [],
4106
- "retry": {
4107
- "max": 2,
4108
- "when": [
4109
- "runner_system_failure",
4110
- "stuck_or_timeout_failure",
4111
- ],
4112
- },
4113
- "script": [
4114
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4115
- "export ENV_SHORT="prod"",
4116
- "export APP_DIR="api"",
4117
- "export ENV_TYPE="prod"",
4118
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4119
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4120
- "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")"",
4121
- "export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4122
- "export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4123
- "export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4124
- "export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4125
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4126
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
4127
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
4128
- "export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"",
4129
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"",
4130
- "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\\"]"",
4131
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4132
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
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
- "cd api",
4138
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
4139
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
4140
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
4141
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
4142
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
4143
- "yarn install --immutable",
4144
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
4145
- "yarn build",
4146
- ],
4147
- "stage": "build",
4148
- "variables": {
4149
- "KUBERNETES_CPU_REQUEST": "0.45",
4150
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
4151
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
4152
- },
4153
- },
4154
- "api 🔨 app | stage ": {
4155
- "artifacts": {
4156
- "expire_in": "1 day",
4157
- "paths": [
4158
- "api/__build_info.json",
4159
- "api/.next",
4160
- "api/dist",
4161
- ],
4162
- "reports": {
4163
- "junit": undefined,
4164
- },
4165
- "when": "always",
4166
- },
4167
- "cache": [
4168
- {
4169
- "key": "api-yarn",
4170
- "paths": [
4171
- "api/.yarn",
4172
- ],
4173
- "policy": "pull-push",
4174
- },
4175
- {
4176
- "key": "api-node-modules",
4177
- "paths": [
4178
- "api/node_modules",
4179
- ],
4180
- "policy": "pull-push",
4181
- },
4182
- {
4183
- "key": "api-next-cache",
4184
- "paths": [
4185
- "api/.next/cache",
4186
- ],
4187
- "policy": "pull-push",
4188
- },
4189
- ],
4190
- "image": "path/to/docker/jobs-default:the-version",
4191
- "interruptible": true,
4192
- "needs": [],
4193
- "retry": {
4194
- "max": 2,
4195
- "when": [
4196
- "runner_system_failure",
4197
- "stuck_or_timeout_failure",
4198
- ],
4199
- },
4200
- "script": [
4201
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4202
- "export ENV_SHORT="stage"",
4203
- "export APP_DIR="api"",
4204
- "export ENV_TYPE="stage"",
4205
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4206
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4207
- "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")"",
4208
- "export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4209
- "export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4210
- "export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4211
- "export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4212
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4213
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
4214
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
4215
- "export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"",
4216
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"",
4217
- "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\\"]"",
4218
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4219
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
4220
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
4221
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
4222
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
4223
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
4224
- "cd api",
4225
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
4226
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
4227
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
4228
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
4229
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
4230
- "yarn install --immutable",
4231
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
4232
- "yarn build",
4233
- ],
4234
- "stage": "build",
4235
- "variables": {
4236
- "KUBERNETES_CPU_REQUEST": "0.45",
4237
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
4238
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
4239
- },
4240
- },
4241
- "api 🔨 docker | prod ": {
4242
- "cache": [
4243
- {
4244
- "key": "api-yarn",
4245
- "paths": [
4246
- "api/.yarn",
4247
- ],
4248
- "policy": "pull",
4249
- },
4250
- ],
4251
- "image": "path/to/docker/docker-build:the-version",
4252
- "interruptible": true,
4253
- "needs": [
4254
- "api 🔨 app | prod ",
4255
- ],
4256
- "retry": {
4257
- "max": 2,
4258
- "when": [
4259
- "runner_system_failure",
4260
- "stuck_or_timeout_failure",
4261
- ],
4262
- },
4263
- "script": [
4264
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4265
- "export APP_DIR="api"",
4266
- "export DOCKER_BUILD_CONTEXT="."",
4267
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
4268
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api"",
4269
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
4270
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
4271
- "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
4272
- RUN yarn plugin import workspace-tools
4273
- RUN yarn workspaces focus --production && yarn rebuild"",
4274
- "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
4275
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
4276
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
4277
- COPY --chown=node:node .yarn /app/.yarn"",
4278
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4279
- "ensureNodeDockerfile",
4280
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
4281
- "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")",
4282
- "gcloud auth configure-docker asia-east1-docker.pkg.dev",
4283
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
4284
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
4285
- "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",
4286
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
4287
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
4288
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
4289
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
4290
- "docker push $DOCKER_CACHE_IMAGE",
4291
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
4292
- ],
4293
- "services": [
4294
- {
4295
- "command": [
4296
- "--tls=false",
4297
- ],
4298
- "name": "docker:24.0.6-dind",
4299
- },
4300
- ],
4301
- "stage": "build",
4302
- "variables": {
4303
- "DOCKER_BUILDKIT": "1",
4304
- "DOCKER_DRIVER": "overlay2",
4305
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
4306
- "DOCKER_TLS_CERTDIR": "",
4307
- "KUBERNETES_CPU_REQUEST": "0.45",
4308
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
4309
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
4310
- },
4311
- },
4312
- "api 🔨 docker | stage ": {
4313
- "cache": [
4314
- {
4315
- "key": "api-yarn",
4316
- "paths": [
4317
- "api/.yarn",
4318
- ],
4319
- "policy": "pull",
4320
- },
4321
- ],
4322
- "image": "path/to/docker/docker-build:the-version",
4323
- "interruptible": true,
4324
- "needs": [
4325
- "api 🔨 app | stage ",
4326
- ],
4327
- "retry": {
4328
- "max": 2,
4329
- "when": [
4330
- "runner_system_failure",
4331
- "stuck_or_timeout_failure",
4332
- ],
4333
- },
4334
- "script": [
4335
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4336
- "export APP_DIR="api"",
4337
- "export DOCKER_BUILD_CONTEXT="."",
4338
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
4339
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api"",
4340
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
4341
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
4342
- "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
4343
- RUN yarn plugin import workspace-tools
4344
- RUN yarn workspaces focus --production && yarn rebuild"",
4345
- "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
4346
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
4347
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
4348
- COPY --chown=node:node .yarn /app/.yarn"",
4349
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4350
- "ensureNodeDockerfile",
4351
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
4352
- "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")",
4353
- "gcloud auth configure-docker asia-east1-docker.pkg.dev",
4354
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
4355
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
4356
- "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",
4357
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
4358
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
4359
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
4360
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
4361
- "docker push $DOCKER_CACHE_IMAGE",
4362
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
4363
- ],
4364
- "services": [
4365
- {
4366
- "command": [
4367
- "--tls=false",
4368
- ],
4369
- "name": "docker:24.0.6-dind",
4370
- },
4371
- ],
4372
- "stage": "build",
4373
- "variables": {
4374
- "DOCKER_BUILDKIT": "1",
4375
- "DOCKER_DRIVER": "overlay2",
4376
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
4377
- "DOCKER_TLS_CERTDIR": "",
4378
- "KUBERNETES_CPU_REQUEST": "0.45",
4379
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
4380
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
4381
- },
4382
- },
4383
- "api 🚀 Deploy | prod ": {
4384
- "allow_failure": true,
4385
- "artifacts": {
4386
- "reports": {
4387
- "dotenv": "gitlab_environment.env",
4388
- },
4389
- },
4390
- "environment": {
4391
- "auto_stop_in": undefined,
4392
- "name": "prod/api",
4393
- "on_stop": "api 🛑 Stop ⚠️ | prod ",
4394
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
4395
- },
4396
- "image": "path/to/docker/gcloud:the-version",
4397
- "interruptible": true,
4398
- "needs": [
4399
- {
4400
- "artifacts": false,
4401
- "job": "api 🔨 app | prod ",
4402
- },
4403
- {
4404
- "artifacts": false,
4405
- "job": "api 🔨 docker | prod ",
4406
- },
4407
- {
4408
- "artifacts": true,
4409
- "job": "api 🧾 sbom | prod ",
4410
- },
4411
- ],
4412
- "retry": {
4413
- "max": 2,
4414
- "when": [
4415
- "runner_system_failure",
4416
- "stuck_or_timeout_failure",
4417
- ],
4418
- },
4419
- "rules": [
4420
- {
4421
- "when": "manual",
4422
- },
4423
- ],
4424
- "script": [
4425
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4426
- "export ENV_SHORT="prod"",
4427
- "export APP_DIR="api"",
4428
- "export ENV_TYPE="prod"",
4429
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4430
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4431
- "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")"",
4432
- "export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4433
- "export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4434
- "export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4435
- "export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4436
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4437
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
4438
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
4439
- "export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"",
4440
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"",
4441
- "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\\"]"",
4442
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
4443
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api"",
4444
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
4445
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
4446
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
4447
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4448
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
4449
- "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")",
4450
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
4451
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
4452
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
4453
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
4454
- "cat > ____envvars.yaml <<EOF
4455
- ENV_SHORT: |-
4456
- prod
4457
- APP_DIR: |-
4458
- api
4459
- ENV_TYPE: |-
4460
- prod
4461
- BUILD_INFO_BUILD_ID: |-
4462
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
4463
- BUILD_INFO_BUILD_TIME: |-
4464
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
4465
- BUILD_INFO_CURRENT_VERSION: |-
4466
- $(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/^/ /')
4467
- HOST: |-
4468
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
4469
- ROOT_URL: |-
4470
- $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
4471
- HOST_INTERNAL: |-
4472
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
4473
- HOST_CANONICAL: |-
4474
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
4475
- ROOT_URL_INTERNAL: |-
4476
- $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
4477
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
4478
- asdf
4479
- DEPLOY_CLOUD_RUN_REGION: |-
4480
- asia-east1
4481
- GCLOUD_RUN_canonicalHostSuffix: |-
4482
- $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
4483
- _ALL_ENV_VAR_KEYS: |-
4484
- ["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"]
4485
-
4486
- EOF
4487
- ",
4488
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
4489
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
4490
- "gcloud run deploy pan-test-app-prod-api --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
4491
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
4492
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
4493
- "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",
4494
- "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",
4495
- "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",
4496
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
4497
- "echo 'Uploading SBOM to Dependency Track'",
4498
- "/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",
4499
- "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",
4500
- ],
4501
- "stage": "deploy prod",
4502
- "variables": {
4503
- "KUBERNETES_CPU_REQUEST": "0.22",
4504
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
4505
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
4506
- },
4507
- },
4508
- "api 🚀 Deploy | stage ": {
4509
- "allow_failure": false,
4510
- "artifacts": {
4511
- "reports": {
4512
- "dotenv": "gitlab_environment.env",
4513
- },
4514
- },
4515
- "environment": {
4516
- "auto_stop_in": undefined,
4517
- "name": "stage/api",
4518
- "on_stop": "api 🛑 Stop ⚠️ | stage ",
4519
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
4520
- },
4521
- "image": "path/to/docker/gcloud:the-version",
4522
- "interruptible": true,
4523
- "needs": [
4524
- {
4525
- "artifacts": false,
4526
- "job": "api 🔨 app | stage ",
4527
- },
4528
- {
4529
- "artifacts": false,
4530
- "job": "api 🔨 docker | stage ",
4531
- },
4532
- {
4533
- "artifacts": true,
4534
- "job": "api 🧾 sbom | stage ",
4535
- },
4536
- ],
4537
- "retry": {
4538
- "max": 2,
4539
- "when": [
4540
- "runner_system_failure",
4541
- "stuck_or_timeout_failure",
4542
- ],
4543
- },
4544
- "rules": [
4545
- {
4546
- "when": "on_success",
4547
- },
4548
- ],
4549
- "script": [
4550
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4551
- "export ENV_SHORT="stage"",
4552
- "export APP_DIR="api"",
4553
- "export ENV_TYPE="stage"",
4554
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4555
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4556
- "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")"",
4557
- "export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4558
- "export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4559
- "export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4560
- "export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4561
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
4562
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
4563
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
4564
- "export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"",
4565
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"",
4566
- "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\\"]"",
4567
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
4568
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api"",
4569
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"",
4570
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
4571
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
4572
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4573
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
4574
- "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")",
4575
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
4576
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
4577
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
4578
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
4579
- "cat > ____envvars.yaml <<EOF
4580
- ENV_SHORT: |-
4581
- stage
4582
- APP_DIR: |-
4583
- api
4584
- ENV_TYPE: |-
4585
- stage
4586
- BUILD_INFO_BUILD_ID: |-
4587
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
4588
- BUILD_INFO_BUILD_TIME: |-
4589
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
4590
- BUILD_INFO_CURRENT_VERSION: |-
4591
- $(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/^/ /')
4592
- HOST: |-
4593
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
4594
- ROOT_URL: |-
4595
- $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
4596
- HOST_INTERNAL: |-
4597
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
4598
- HOST_CANONICAL: |-
4599
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
4600
- ROOT_URL_INTERNAL: |-
4601
- $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
4602
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
4603
- asdf
4604
- DEPLOY_CLOUD_RUN_REGION: |-
4605
- asia-east1
4606
- GCLOUD_RUN_canonicalHostSuffix: |-
4607
- $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
4608
- _ALL_ENV_VAR_KEYS: |-
4609
- ["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"]
4610
-
4611
- EOF
4612
- ",
4613
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
4614
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
4615
- "gcloud run deploy pan-test-app-stage-api --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
4616
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
4617
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
4618
- "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",
4619
- "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",
4620
- "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",
4621
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
4622
- "echo 'Uploading SBOM to Dependency Track'",
4623
- "/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",
4624
- "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",
4625
- ],
4626
- "stage": "deploy stage",
4627
- "variables": {
4628
- "KUBERNETES_CPU_REQUEST": "0.22",
4629
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
4630
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
4631
- },
4632
- },
4633
- "api 🛑 Stop ⚠️ | prod ": {
4634
- "allow_failure": true,
4635
- "artifacts": {
4636
- "reports": {
4637
- "dotenv": "gitlab_environment.env",
4638
- },
4639
- },
4640
- "environment": {
4641
- "action": "stop",
4642
- "name": "prod/api",
4643
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
4644
- },
4645
- "image": "path/to/docker/gcloud:the-version",
4646
- "interruptible": true,
4647
- "needs": [],
4648
- "retry": {
4649
- "max": 2,
4650
- "when": [
4651
- "runner_system_failure",
4652
- "stuck_or_timeout_failure",
4653
- ],
4654
- },
4655
- "rules": [
4656
- {
4657
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
4658
- "when": "on_success",
4659
- },
4660
- {
4661
- "when": "manual",
4662
- },
4663
- ],
4664
- "script": [
4665
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4666
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
4667
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4668
- "set +e",
4669
- "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")",
4670
- "gcloud run services delete pan-test-app-prod-api --project=asdf --region=asia-east1",
4671
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags",
4672
- "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",
4673
- "echo 'Disabling component in Dependency Track'",
4674
- "/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",
4675
- "set -e",
4676
- "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",
4677
- ],
4678
- "stage": "stop prod",
4679
- "variables": {
4680
- "GIT_STRATEGY": "none",
4681
- "KUBERNETES_CPU_REQUEST": "0.22",
4682
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
4683
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
4684
- },
4685
- },
4686
- "api 🛑 Stop ⚠️ | stage ": {
4687
- "allow_failure": true,
4688
- "artifacts": {
4689
- "reports": {
4690
- "dotenv": "gitlab_environment.env",
4691
- },
4692
- },
4693
- "environment": {
4694
- "action": "stop",
4695
- "name": "stage/api",
4696
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
4697
- },
4698
- "image": "path/to/docker/gcloud:the-version",
4699
- "interruptible": true,
4700
- "needs": [],
4701
- "retry": {
4702
- "max": 2,
4703
- "when": [
4704
- "runner_system_failure",
4705
- "stuck_or_timeout_failure",
4706
- ],
4707
- },
4708
- "rules": [
4709
- {
4710
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
4711
- "when": "on_success",
4712
- },
4713
- {
4714
- "when": "manual",
4715
- },
4716
- ],
4717
- "script": [
4718
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4719
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
4720
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4721
- "set +e",
4722
- "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")",
4723
- "gcloud run services delete pan-test-app-stage-api --project=asdf --region=asia-east1",
4724
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags",
4725
- "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",
4726
- "echo 'Disabling component in Dependency Track'",
4727
- "/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",
4728
- "set -e",
4729
- "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",
4730
- ],
4731
- "stage": "stop stage",
4732
- "variables": {
4733
- "GIT_STRATEGY": "none",
4734
- "KUBERNETES_CPU_REQUEST": "0.22",
4735
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
4736
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
4737
- },
4738
- },
4739
- "api 🧾 sbom | prod ": {
4740
- "allow_failure": true,
4741
- "artifacts": {
4742
- "paths": [
4743
- "__sbom.json",
4744
- ],
4745
- },
4746
- "image": "aquasec/trivy:0.38.3",
4747
- "interruptible": true,
4748
- "needs": [],
4749
- "retry": {
4750
- "max": 2,
4751
- "when": [
4752
- "runner_system_failure",
4753
- "stuck_or_timeout_failure",
4754
- ],
4755
- },
4756
- "script": [
4757
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4758
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4759
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
4760
- ],
4761
- "stage": "build",
4762
- "variables": {},
4763
- },
4764
- "api 🧾 sbom | stage ": {
4765
- "allow_failure": true,
4766
- "artifacts": {
4767
- "paths": [
4768
- "__sbom.json",
4769
- ],
4770
- },
4771
- "image": "aquasec/trivy:0.38.3",
4772
- "interruptible": true,
4773
- "needs": [],
4774
- "retry": {
4775
- "max": 2,
4776
- "when": [
4777
- "runner_system_failure",
4778
- "stuck_or_timeout_failure",
4779
- ],
4780
- },
4781
- "script": [
4782
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4783
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4784
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
4785
- ],
4786
- "stage": "build",
4787
- "variables": {},
4788
- },
4789
- "app 🔨 app | prod ": {
4790
- "artifacts": {
4791
- "exclude": [
4792
- "app/.env",
4793
- ],
4794
- "expire_in": "1 day",
4795
- "paths": [
4796
- "app/__build_info.json",
4797
- "app/.next",
4798
- "app/dist",
4799
- ],
4800
- "reports": {
4801
- "junit": undefined,
4802
- },
4803
- "when": "always",
4804
- },
4805
- "cache": [
4806
- {
4807
- "key": {
4808
- "files": [
4809
- "app/Gemfile.lock",
4810
- ],
4811
- },
4812
- "paths": [
4813
- "app/vendor",
4814
- ],
4815
- },
4816
- {
4817
- "key": "app-yarn",
4818
- "paths": [
4819
- "app/.yarn",
4820
- ],
4821
- "policy": "pull-push",
4822
- },
4823
- {
4824
- "key": "app-node-modules",
4825
- "paths": [
4826
- "app/node_modules",
4827
- ],
4828
- "policy": "pull-push",
4829
- },
4830
- {
4831
- "key": "app-next-cache",
4832
- "paths": [
4833
- "app/.next/cache",
4834
- ],
4835
- "policy": "pull-push",
4836
- },
4837
- ],
4838
- "image": "path/to/docker/jobs-default:the-version",
4839
- "interruptible": true,
4840
- "needs": [],
4841
- "retry": {
4842
- "max": 2,
4843
- "when": [
4844
- "runner_system_failure",
4845
- "stuck_or_timeout_failure",
4846
- ],
4847
- },
4848
- "script": [
4849
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4850
- "export ENV_SHORT="prod"",
4851
- "export APP_DIR="app"",
4852
- "export ENV_TYPE="prod"",
4853
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4854
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4855
- "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")"",
4856
- "export HOST="unknown-host.example.com"",
4857
- "export ROOT_URL="https://unknown-host.example.com"",
4858
- "export HOST_INTERNAL="unknown-host.example.com"",
4859
- "export HOST_CANONICAL="unknown-host.example.com"",
4860
- "export ROOT_URL_INTERNAL="https://unknown-host.example.com"",
4861
- "export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_prod_app_APP_STORE_CONNECT_API_KEY_CONTENT"",
4862
- "export APP_STORE_CONNECT_ISSUER_ID="$CL_prod_app_APP_STORE_CONNECT_ISSUER_ID"",
4863
- "export APP_STORE_CONNECT_API_KEY_ID="$CL_prod_app_APP_STORE_CONNECT_API_KEY_ID"",
4864
- "export GRAPHQL_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"",
4865
- "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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"",
4866
- "export LC_A="L=en_US.UTF-8"",
4867
- "export LANG="en_US.UTF-8"",
4868
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4869
- "echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-app[collapsed=true]\\r\\e[0Kwrite dot env"",
4870
- "cat <<EOF > app/.env
4871
- ENV_SHORT=prod
4872
- APP_DIR=app
4873
- ENV_TYPE=prod
4874
- HOST=unknown-host.example.com
4875
- ROOT_URL=https://unknown-host.example.com
4876
- HOST_INTERNAL=unknown-host.example.com
4877
- HOST_CANONICAL=unknown-host.example.com
4878
- ROOT_URL_INTERNAL=https://unknown-host.example.com
4879
- APP_STORE_CONNECT_API_KEY_CONTENT=$CL_prod_app_APP_STORE_CONNECT_API_KEY_CONTENT
4880
- APP_STORE_CONNECT_ISSUER_ID=$CL_prod_app_APP_STORE_CONNECT_ISSUER_ID
4881
- APP_STORE_CONNECT_API_KEY_ID=$CL_prod_app_APP_STORE_CONNECT_API_KEY_ID
4882
- GRAPHQL_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql
4883
- _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","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
4884
- EOF",
4885
- "echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-app\\r\\e[0K"",
4886
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
4887
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
4888
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
4889
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
4890
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
4891
- "cd app",
4892
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
4893
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
4894
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
4895
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
4896
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
4897
- "yarn install --immutable",
4898
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
4899
- "bundle config set --local path 'vendor/ruby'",
4900
- "gem install bundler",
4901
- "bundle install",
4902
- "bundle exec pod install --project-directory=ios",
4903
- "bundle exec fastlane build",
4904
- ],
4905
- "stage": "build",
4906
- "tags": [
4907
- "mac-runner",
4908
- ],
4909
- "variables": {
4910
- "KUBERNETES_CPU_REQUEST": "0.45",
4911
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
4912
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
4913
- },
4914
- },
4915
- "app 🔨 app | stage ": {
4916
- "artifacts": {
4917
- "exclude": [
4918
- "app/.env",
4919
- ],
4920
- "expire_in": "1 day",
4921
- "paths": [
4922
- "app/__build_info.json",
4923
- "app/.next",
4924
- "app/dist",
4925
- ],
4926
- "reports": {
4927
- "junit": undefined,
4928
- },
4929
- "when": "always",
4930
- },
4931
- "cache": [
4932
- {
4933
- "key": {
4934
- "files": [
4935
- "app/Gemfile.lock",
4936
- ],
4937
- },
4938
- "paths": [
4939
- "app/vendor",
4940
- ],
4941
- },
4942
- {
4943
- "key": "app-yarn",
4944
- "paths": [
4945
- "app/.yarn",
4946
- ],
4947
- "policy": "pull-push",
4948
- },
4949
- {
4950
- "key": "app-node-modules",
4951
- "paths": [
4952
- "app/node_modules",
4953
- ],
4954
- "policy": "pull-push",
4955
- },
4956
- {
4957
- "key": "app-next-cache",
4958
- "paths": [
4959
- "app/.next/cache",
4960
- ],
4961
- "policy": "pull-push",
4962
- },
4963
- ],
4964
- "image": "path/to/docker/jobs-default:the-version",
4965
- "interruptible": true,
4966
- "needs": [],
4967
- "retry": {
4968
- "max": 2,
4969
- "when": [
4970
- "runner_system_failure",
4971
- "stuck_or_timeout_failure",
4972
- ],
4973
- },
4974
- "script": [
4975
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4976
- "export ENV_SHORT="stage"",
4977
- "export APP_DIR="app"",
4978
- "export ENV_TYPE="stage"",
4979
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4980
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4981
- "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")"",
4982
- "export HOST="unknown-host.example.com"",
4983
- "export ROOT_URL="https://unknown-host.example.com"",
4984
- "export HOST_INTERNAL="unknown-host.example.com"",
4985
- "export HOST_CANONICAL="unknown-host.example.com"",
4986
- "export ROOT_URL_INTERNAL="https://unknown-host.example.com"",
4987
- "export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_stage_app_APP_STORE_CONNECT_API_KEY_CONTENT"",
4988
- "export APP_STORE_CONNECT_ISSUER_ID="$CL_stage_app_APP_STORE_CONNECT_ISSUER_ID"",
4989
- "export APP_STORE_CONNECT_API_KEY_ID="$CL_stage_app_APP_STORE_CONNECT_API_KEY_ID"",
4990
- "export GRAPHQL_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"",
4991
- "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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"",
4992
- "export LC_A="L=en_US.UTF-8"",
4993
- "export LANG="en_US.UTF-8"",
4994
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4995
- "echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-app[collapsed=true]\\r\\e[0Kwrite dot env"",
4996
- "cat <<EOF > app/.env
4997
- ENV_SHORT=stage
4998
- APP_DIR=app
4999
- ENV_TYPE=stage
5000
- HOST=unknown-host.example.com
5001
- ROOT_URL=https://unknown-host.example.com
5002
- HOST_INTERNAL=unknown-host.example.com
5003
- HOST_CANONICAL=unknown-host.example.com
5004
- ROOT_URL_INTERNAL=https://unknown-host.example.com
5005
- APP_STORE_CONNECT_API_KEY_CONTENT=$CL_stage_app_APP_STORE_CONNECT_API_KEY_CONTENT
5006
- APP_STORE_CONNECT_ISSUER_ID=$CL_stage_app_APP_STORE_CONNECT_ISSUER_ID
5007
- APP_STORE_CONNECT_API_KEY_ID=$CL_stage_app_APP_STORE_CONNECT_API_KEY_ID
5008
- GRAPHQL_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql
5009
- _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","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
5010
- EOF",
5011
- "echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-app\\r\\e[0K"",
5012
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json",
5013
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
5014
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
5015
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
5016
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
5017
- "cd app",
5018
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
5019
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
5020
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
5021
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
5022
- "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
5023
- "yarn install --immutable",
5024
- "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
5025
- "bundle config set --local path 'vendor/ruby'",
5026
- "gem install bundler",
5027
- "bundle install",
5028
- "bundle exec pod install --project-directory=ios",
5029
- "bundle exec fastlane build",
5030
- ],
5031
- "stage": "build",
5032
- "tags": [
5033
- "mac-runner",
5034
- ],
5035
- "variables": {
5036
- "KUBERNETES_CPU_REQUEST": "0.45",
5037
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
5038
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
5039
- },
5040
- },
5041
- "app 🚀 Deploy | prod ": {
5042
- "allow_failure": true,
5043
- "cache": [
5044
- {
5045
- "key": {
5046
- "files": [
5047
- "app/Gemfile.lock",
5048
- ],
5049
- },
5050
- "paths": [
5051
- "app/vendor",
5052
- ],
5053
- },
5054
- ],
5055
- "image": "path/to/docker/jobs-default:the-version",
5056
- "interruptible": true,
5057
- "needs": [
5058
- {
5059
- "artifacts": true,
5060
- "job": "app 🔨 app | prod ",
5061
- },
5062
- {
5063
- "artifacts": true,
5064
- "job": "app 🧾 sbom | prod ",
5065
- },
5066
- ],
5067
- "retry": {
5068
- "max": 2,
5069
- "when": [
5070
- "runner_system_failure",
5071
- "stuck_or_timeout_failure",
5072
- ],
5073
- },
5074
- "rules": [
5075
- {
5076
- "when": "manual",
5077
- },
5078
- ],
5079
- "script": [
5080
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
5081
- "export ENV_SHORT="prod"",
5082
- "export APP_DIR="app"",
5083
- "export ENV_TYPE="prod"",
5084
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
5085
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
5086
- "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")"",
5087
- "export HOST="unknown-host.example.com"",
5088
- "export ROOT_URL="https://unknown-host.example.com"",
5089
- "export HOST_INTERNAL="unknown-host.example.com"",
5090
- "export HOST_CANONICAL="unknown-host.example.com"",
5091
- "export ROOT_URL_INTERNAL="https://unknown-host.example.com"",
5092
- "export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_prod_app_APP_STORE_CONNECT_API_KEY_CONTENT"",
5093
- "export APP_STORE_CONNECT_ISSUER_ID="$CL_prod_app_APP_STORE_CONNECT_ISSUER_ID"",
5094
- "export APP_STORE_CONNECT_API_KEY_ID="$CL_prod_app_APP_STORE_CONNECT_API_KEY_ID"",
5095
- "export GRAPHQL_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"",
5096
- "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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"",
5097
- "export LC_A="L=en_US.UTF-8"",
5098
- "export LANG="en_US.UTF-8"",
5099
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
5100
- "cd app",
5101
- "bundle config set --local path 'vendor/ruby'",
5102
- "gem install bundler",
5103
- "bundle install",
5104
- "bundle exec fastlane deploy_test",
5105
- "echo 'Uploading SBOM to Dependency Track'",
5106
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://unknown-host.example.com" "__sbom.json" vex.json || true",
5107
- ],
5108
- "stage": "deploy prod",
5109
- "tags": [
5110
- "mac-runner",
5111
- ],
5112
- "variables": {
5113
- "KUBERNETES_CPU_REQUEST": "0.22",
5114
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
5115
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
5116
- },
5117
- },
5118
- "app 🚀 Deploy | stage ": {
5119
- "allow_failure": false,
5120
- "cache": [
5121
- {
5122
- "key": {
5123
- "files": [
5124
- "app/Gemfile.lock",
5125
- ],
5126
- },
5127
- "paths": [
5128
- "app/vendor",
5129
- ],
5130
- },
5131
- ],
5132
- "image": "path/to/docker/jobs-default:the-version",
5133
- "interruptible": true,
5134
- "needs": [
5135
- {
5136
- "artifacts": true,
5137
- "job": "app 🔨 app | stage ",
5138
- },
5139
- {
5140
- "artifacts": true,
5141
- "job": "app 🧾 sbom | stage ",
5142
- },
5143
- ],
5144
- "retry": {
5145
- "max": 2,
5146
- "when": [
5147
- "runner_system_failure",
5148
- "stuck_or_timeout_failure",
5149
- ],
5150
- },
5151
- "rules": [
5152
- {
5153
- "when": "on_success",
5154
- },
5155
- ],
5156
- "script": [
5157
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
5158
- "export ENV_SHORT="stage"",
5159
- "export APP_DIR="app"",
5160
- "export ENV_TYPE="stage"",
5161
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
5162
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
5163
- "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")"",
5164
- "export HOST="unknown-host.example.com"",
5165
- "export ROOT_URL="https://unknown-host.example.com"",
5166
- "export HOST_INTERNAL="unknown-host.example.com"",
5167
- "export HOST_CANONICAL="unknown-host.example.com"",
5168
- "export ROOT_URL_INTERNAL="https://unknown-host.example.com"",
5169
- "export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_stage_app_APP_STORE_CONNECT_API_KEY_CONTENT"",
5170
- "export APP_STORE_CONNECT_ISSUER_ID="$CL_stage_app_APP_STORE_CONNECT_ISSUER_ID"",
5171
- "export APP_STORE_CONNECT_API_KEY_ID="$CL_stage_app_APP_STORE_CONNECT_API_KEY_ID"",
5172
- "export GRAPHQL_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"",
5173
- "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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"",
5174
- "export LC_A="L=en_US.UTF-8"",
5175
- "export LANG="en_US.UTF-8"",
5176
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
5177
- "cd app",
5178
- "bundle config set --local path 'vendor/ruby'",
5179
- "gem install bundler",
5180
- "bundle install",
5181
- "bundle exec fastlane deploy_test",
5182
- "echo 'Uploading SBOM to Dependency Track'",
5183
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://unknown-host.example.com" "__sbom.json" vex.json || true",
5184
- ],
5185
- "stage": "deploy stage",
5186
- "tags": [
5187
- "mac-runner",
5188
- ],
5189
- "variables": {
5190
- "KUBERNETES_CPU_REQUEST": "0.22",
5191
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
5192
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
5193
- },
5194
- },
5195
- "app 🧾 sbom | prod ": {
5196
- "allow_failure": true,
5197
- "artifacts": {
5198
- "paths": [
5199
- "__sbom.json",
5200
- ],
5201
- },
5202
- "image": "aquasec/trivy:0.38.3",
5203
- "interruptible": true,
5204
- "needs": [],
5205
- "retry": {
5206
- "max": 2,
5207
- "when": [
5208
- "runner_system_failure",
5209
- "stuck_or_timeout_failure",
5210
- ],
5211
- },
5212
- "script": [
5213
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
5214
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
5215
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
5216
- ],
5217
- "stage": "build",
5218
- "variables": {},
5219
- },
5220
- "app 🧾 sbom | stage ": {
5221
- "allow_failure": true,
5222
- "artifacts": {
5223
- "paths": [
5224
- "__sbom.json",
5225
- ],
5226
- },
5227
- "image": "aquasec/trivy:0.38.3",
5228
- "interruptible": true,
5229
- "needs": [],
5230
- "retry": {
5231
- "max": 2,
5232
- "when": [
5233
- "runner_system_failure",
5234
- "stuck_or_timeout_failure",
5235
- ],
5236
- },
5237
- "script": [
5238
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
5239
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
5240
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" app",
5241
- ],
5242
- "stage": "build",
5243
- "variables": {},
5244
- },
5245
- },
5246
- "stages": [
5247
- "setup",
5248
- "setup dev",
5249
- "setup review",
5250
- "setup stage",
5251
- "setup prod",
5252
- "test",
5253
- "test dev",
5254
- "test review",
5255
- "test stage",
5256
- "test prod",
5257
- "build",
5258
- "build dev",
5259
- "build review",
5260
- "build stage",
5261
- "build prod",
5262
- "deploy",
5263
- "deploy dev",
5264
- "deploy review",
5265
- "deploy stage",
5266
- "deploy prod",
5267
- "verify",
5268
- "verify dev",
5269
- "verify review",
5270
- "verify stage",
5271
- "verify prod",
5272
- "rollback",
5273
- "rollback dev",
5274
- "rollback review",
5275
- "rollback stage",
5276
- "rollback prod",
5277
- "stop",
5278
- "stop dev",
5279
- "stop review",
5280
- "stop stage",
5281
- "stop prod",
5282
- ],
5283
- "variables": {
5284
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
5285
- "CACHE_COMPRESSION_LEVEL": "fast",
5286
- "FF_USE_FASTZIP": "true",
5287
- "GIT_DEPTH": "1",
5288
- "TRANSFER_METER_FREQUENCY": "5s",
5289
- },
5290
- "workflow": {
5291
- "rules": [
5292
- {
5293
- "if": "$CI_COMMIT_TAG",
5294
- },
5295
- {
5296
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
5297
- "when": "never",
5298
- },
5299
- {
5300
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
5301
- "when": "never",
5302
- },
5303
- {
5304
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
5305
- },
5306
- {
5307
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
5308
- },
5309
- {
5310
- "if": "$CI_MERGE_REQUEST_ID",
5311
- },
5312
- ],
5313
- },
5314
- },
5315
- }
5316
- `;