@catladder/pipeline 1.162.0 โ†’ 1.163.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +15 -1
  2. package/dist/build/types.d.ts +6 -0
  3. package/dist/bundles/catladder-gitlab/index.js +2 -2
  4. package/dist/constants.js +1 -1
  5. package/dist/pipeline/generatePipelineFiles.d.ts +38 -0
  6. package/dist/pipeline/generatePipelineFiles.js +44 -23
  7. package/dist/tsconfig.tsbuildinfo +1 -1
  8. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1341 -0
  9. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1325 -0
  10. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1341 -0
  11. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1393 -0
  12. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1341 -0
  13. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1352 -0
  14. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1341 -0
  15. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1341 -0
  16. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1385 -0
  17. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1233 -4
  18. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1349 -4
  19. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2825 -0
  20. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +2572 -0
  21. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1349 -0
  22. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1196 -0
  23. package/examples/__snapshots__/custom-build-job.test.ts.snap +1085 -0
  24. package/examples/__snapshots__/custom-deploy.test.ts.snap +1103 -0
  25. package/examples/__snapshots__/custom-envs.test.ts.snap +709 -0
  26. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1093 -0
  27. package/examples/__snapshots__/git-submodule.test.ts.snap +1342 -0
  28. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1778 -0
  29. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +1790 -0
  30. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1798 -0
  31. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3352 -0
  32. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1902 -0
  33. package/examples/__snapshots__/local-dot-env.test.ts.snap +1341 -0
  34. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1839 -0
  35. package/examples/__snapshots__/multiline-var.test.ts.snap +3376 -0
  36. package/examples/__snapshots__/native-app.test.ts.snap +2149 -0
  37. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1341 -0
  38. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1349 -0
  39. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1470 -0
  40. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1275 -0
  41. package/examples/__utils__/helpers.ts +14 -1
  42. package/examples/cloud-run-memory-limit.test.ts +9 -1
  43. package/examples/cloud-run-meteor-with-worker.test.ts +9 -1
  44. package/examples/cloud-run-no-cpu-throttling.test.ts +9 -1
  45. package/examples/cloud-run-no-service.test.ts +9 -1
  46. package/examples/cloud-run-non-public.test.ts +9 -1
  47. package/examples/cloud-run-post-stop-job.test.ts +9 -1
  48. package/examples/cloud-run-service-gen2.test.ts +9 -1
  49. package/examples/cloud-run-service-increase-timout.test.ts +9 -1
  50. package/examples/cloud-run-service-with-volumes.test.ts +9 -1
  51. package/examples/cloud-run-storybook.test.ts +9 -1
  52. package/examples/cloud-run-storybook.ts +9 -1
  53. package/examples/cloud-run-with-ngnix.test.ts +9 -1
  54. package/examples/cloud-run-with-ngnix.ts +5 -1
  55. package/examples/cloud-run-with-sql-reuse-db.test.ts +9 -1
  56. package/examples/cloud-run-with-sql.test.ts +9 -1
  57. package/examples/cloud-run-with-worker.test.ts +9 -1
  58. package/examples/custom-build-job-with-tests.test.ts +9 -1
  59. package/examples/custom-build-job.test.ts +9 -1
  60. package/examples/custom-deploy.test.ts +9 -1
  61. package/examples/custom-envs.test.ts +9 -1
  62. package/examples/custom-sbom-java.test.ts +9 -1
  63. package/examples/git-submodule.test.ts +9 -1
  64. package/examples/kubernetes-application-customization.test.ts +9 -1
  65. package/examples/kubernetes-with-cloud-sql-legacy.test.ts +9 -1
  66. package/examples/kubernetes-with-cloud-sql.test.ts +9 -1
  67. package/examples/kubernetes-with-jobs.test.ts +9 -1
  68. package/examples/kubernetes-with-mongodb.test.ts +9 -1
  69. package/examples/local-dot-env.test.ts +9 -1
  70. package/examples/meteor-kubernetes.test.ts +9 -1
  71. package/examples/multiline-var.test.ts +9 -1
  72. package/examples/native-app.test.ts +9 -1
  73. package/examples/node-build-with-custom-image.test.ts +9 -1
  74. package/examples/node-build-with-docker-additions.test.ts +9 -1
  75. package/examples/rails-k8s-with-worker.test.ts +9 -1
  76. package/examples/wait-for-other-deploy.test.ts +9 -1
  77. package/package.json +4 -3
  78. package/scripts/generate-examples-test.ts +7 -5
  79. package/src/build/types.ts +6 -0
  80. package/src/pipeline/generatePipelineFiles.ts +61 -36
@@ -1,5 +1,1098 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
+ exports[`matches snapshot for cloud-run-memory-limit local pipeline YAML 1`] = `
4
+ "image: path/to/docker/jobs-default:the-version
5
+ stages:
6
+ - setup
7
+ - setup dev
8
+ - setup review
9
+ - setup stage
10
+ - setup prod
11
+ - test
12
+ - test dev
13
+ - test review
14
+ - test stage
15
+ - test prod
16
+ - build
17
+ - build dev
18
+ - build review
19
+ - build stage
20
+ - build prod
21
+ - deploy
22
+ - deploy dev
23
+ - deploy review
24
+ - deploy stage
25
+ - deploy prod
26
+ - verify
27
+ - verify dev
28
+ - verify review
29
+ - verify stage
30
+ - verify prod
31
+ - rollback
32
+ - rollback dev
33
+ - rollback review
34
+ - rollback stage
35
+ - rollback prod
36
+ - stop
37
+ - stop dev
38
+ - stop review
39
+ - stop stage
40
+ - stop prod
41
+ - release
42
+ variables:
43
+ FF_USE_FASTZIP: 'true'
44
+ ARTIFACT_COMPRESSION_LEVEL: fast
45
+ CACHE_COMPRESSION_LEVEL: fast
46
+ TRANSFER_METER_FREQUENCY: 5s
47
+ GIT_DEPTH: '1'
48
+ 'app ๐Ÿ”จ app | dev ':
49
+ stage: build
50
+ image: maven:3-eclipse-temurin-11
51
+ variables:
52
+ KUBERNETES_CPU_REQUEST: '0.45'
53
+ KUBERNETES_MEMORY_REQUEST: 1Gi
54
+ KUBERNETES_MEMORY_LIMIT: 4Gi
55
+ script:
56
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
57
+ - export ENV_SHORT="dev"
58
+ - export APP_DIR="app"
59
+ - export ENV_TYPE="dev"
60
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
61
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
62
+ - 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")"
63
+ - export HOST="$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
64
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
65
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
66
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
67
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
68
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
69
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
70
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_app_GCLOUD_DEPLOY_credentialsKey"
71
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix"
72
+ - 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\\"]"
73
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
74
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json
75
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
76
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
77
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
78
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
79
+ - cd app
80
+ - mvn package
81
+ - cp -r target dist
82
+ cache: []
83
+ artifacts:
84
+ paths:
85
+ - app/__build_info.json
86
+ - app/dist
87
+ expire_in: 1 day
88
+ when: always
89
+ reports: {}
90
+ rules:
91
+ - when: never
92
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
93
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
94
+ needs: []
95
+ retry: &a1
96
+ max: 2
97
+ when:
98
+ - runner_system_failure
99
+ - stuck_or_timeout_failure
100
+ interruptible: true
101
+ 'app ๐Ÿ”จ docker | dev ':
102
+ stage: build
103
+ image: path/to/docker/docker-build:the-version
104
+ services:
105
+ - name: docker:24.0.6-dind
106
+ command:
107
+ - --tls=false
108
+ variables:
109
+ DOCKER_HOST: tcp://0.0.0.0:2375
110
+ DOCKER_TLS_CERTDIR: ''
111
+ DOCKER_DRIVER: overlay2
112
+ DOCKER_BUILDKIT: '1'
113
+ KUBERNETES_CPU_REQUEST: '0.45'
114
+ KUBERNETES_MEMORY_REQUEST: 1Gi
115
+ KUBERNETES_MEMORY_LIMIT: 2Gi
116
+ script:
117
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
118
+ - export APP_DIR="app"
119
+ - export DOCKER_BUILD_CONTEXT="app"
120
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
121
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app"
122
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app"
123
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
124
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
125
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
126
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app_GCLOUD_DEPLOY_credentialsKey")
127
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
128
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
129
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
130
+ - 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
131
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
132
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
133
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
134
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
135
+ - docker push $DOCKER_CACHE_IMAGE
136
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
137
+ rules:
138
+ - when: never
139
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
140
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
141
+ needs:
142
+ - 'app ๐Ÿ”จ app | dev '
143
+ retry: *a1
144
+ interruptible: true
145
+ 'app ๐Ÿงพ sbom | dev ':
146
+ stage: build
147
+ image: maven:3-eclipse-temurin-11
148
+ variables: {}
149
+ script:
150
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
151
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
152
+ - mvn org.cyclonedx:cyclonedx-maven-plugin:2.7.4:makeBom
153
+ - mv target/bom.json __sbom.json
154
+ artifacts:
155
+ paths:
156
+ - __sbom.json
157
+ rules:
158
+ - when: never
159
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
160
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
161
+ needs: []
162
+ retry: *a1
163
+ interruptible: true
164
+ allow_failure: true
165
+ 'app ๐Ÿš€ Deploy | dev ':
166
+ stage: deploy dev
167
+ image: path/to/docker/gcloud:the-version
168
+ variables:
169
+ KUBERNETES_CPU_REQUEST: '0.22'
170
+ KUBERNETES_MEMORY_REQUEST: 200Mi
171
+ KUBERNETES_MEMORY_LIMIT: 400Mi
172
+ script:
173
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
174
+ - export ENV_SHORT="dev"
175
+ - export APP_DIR="app"
176
+ - export ENV_TYPE="dev"
177
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
178
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
179
+ - 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")"
180
+ - export HOST="$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
181
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
182
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
183
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
184
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
185
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
186
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
187
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_app_GCLOUD_DEPLOY_credentialsKey"
188
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix"
189
+ - 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\\"]"
190
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
191
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app"
192
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app"
193
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
194
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
195
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
196
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
197
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app_GCLOUD_DEPLOY_credentialsKey")
198
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
199
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
200
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
201
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
202
+ - |
203
+ cat > ____envvars.yaml <<EOF
204
+ ENV_SHORT: |-
205
+ dev
206
+ APP_DIR: |-
207
+ app
208
+ ENV_TYPE: |-
209
+ dev
210
+ BUILD_INFO_BUILD_ID: |-
211
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
212
+ BUILD_INFO_BUILD_TIME: |-
213
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
214
+ BUILD_INFO_CURRENT_VERSION: |-
215
+ $(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/^/ /')
216
+ HOST: |-
217
+ $(printf %s "$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
218
+ ROOT_URL: |-
219
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
220
+ HOST_INTERNAL: |-
221
+ $(printf %s "$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
222
+ HOST_CANONICAL: |-
223
+ $(printf %s "$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
224
+ ROOT_URL_INTERNAL: |-
225
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
226
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
227
+ asdf
228
+ DEPLOY_CLOUD_RUN_REGION: |-
229
+ asia-east1
230
+ GCLOUD_RUN_canonicalHostSuffix: |-
231
+ $(printf %s "$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
232
+ _ALL_ENV_VAR_KEYS: |-
233
+ ["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"]
234
+
235
+ EOF
236
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
237
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
238
+ - gcloud run deploy pan-test-app-dev-app --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app,app-name=test-app,env-type=dev,env-name=dev,build-type=custom,cloud-run-service-name=pan-test-app-dev-app --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
239
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
240
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
241
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-app --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
242
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app --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/app@$version --quiet --delete-tags; done
243
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app --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/app@$version --quiet --delete-tags; done
244
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
245
+ - echo 'Uploading SBOM to Dependency Track'
246
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
247
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
248
+ environment:
249
+ name: dev/app
250
+ url: $CL_GITLAB_ENVIRONMENT_URL
251
+ on_stop: 'app ๐Ÿ›‘ Stop โš ๏ธ | dev '
252
+ auto_stop_in: 4 weeks
253
+ artifacts:
254
+ reports:
255
+ dotenv: gitlab_environment.env
256
+ rules:
257
+ - when: never
258
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
259
+ - when: on_success
260
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
261
+ needs:
262
+ - job: 'app ๐Ÿ”จ app | dev '
263
+ artifacts: false
264
+ - job: 'app ๐Ÿ”จ docker | dev '
265
+ artifacts: false
266
+ - job: 'app ๐Ÿงพ sbom | dev '
267
+ artifacts: true
268
+ retry: *a1
269
+ interruptible: true
270
+ allow_failure: false
271
+ 'app ๐Ÿ›‘ Stop โš ๏ธ | dev ':
272
+ stage: stop dev
273
+ image: path/to/docker/gcloud:the-version
274
+ variables:
275
+ KUBERNETES_CPU_REQUEST: '0.22'
276
+ KUBERNETES_MEMORY_REQUEST: 200Mi
277
+ KUBERNETES_MEMORY_LIMIT: 400Mi
278
+ GIT_STRATEGY: none
279
+ script:
280
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
281
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
282
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
283
+ - set +e
284
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app_GCLOUD_DEPLOY_credentialsKey")
285
+ - gcloud run services delete pan-test-app-dev-app --project=asdf --region=asia-east1
286
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app --quiet --delete-tags
287
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app --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/app@$version --quiet --delete-tags; done
288
+ - echo 'Disabling component in Dependency Track'
289
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
290
+ - set -e
291
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app-$CL_dev_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
292
+ environment:
293
+ name: dev/app
294
+ url: $CL_GITLAB_ENVIRONMENT_URL
295
+ action: stop
296
+ artifacts:
297
+ reports:
298
+ dotenv: gitlab_environment.env
299
+ rules:
300
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
301
+ when: on_success
302
+ - when: never
303
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
304
+ - when: manual
305
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
306
+ needs: []
307
+ retry: *a1
308
+ interruptible: true
309
+ allow_failure: true
310
+ 'app ๐Ÿ”จ app | review ':
311
+ stage: build
312
+ image: maven:3-eclipse-temurin-11
313
+ variables:
314
+ KUBERNETES_CPU_REQUEST: '0.45'
315
+ KUBERNETES_MEMORY_REQUEST: 1Gi
316
+ KUBERNETES_MEMORY_LIMIT: 4Gi
317
+ script:
318
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
319
+ - export ENV_SHORT="review"
320
+ - export APP_DIR="app"
321
+ - export ENV_TYPE="review"
322
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
323
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
324
+ - 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")"
325
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
326
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
327
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
328
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
329
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
330
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
331
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
332
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_app_GCLOUD_DEPLOY_credentialsKey"
333
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_app_GCLOUD_RUN_canonicalHostSuffix"
334
+ - 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\\"]"
335
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
336
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json
337
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
338
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
339
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
340
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
341
+ - cd app
342
+ - mvn package
343
+ - cp -r target dist
344
+ cache: []
345
+ artifacts:
346
+ paths:
347
+ - app/__build_info.json
348
+ - app/dist
349
+ expire_in: 1 day
350
+ when: always
351
+ reports: {}
352
+ rules:
353
+ - if: $CI_MERGE_REQUEST_ID
354
+ needs: []
355
+ retry: *a1
356
+ interruptible: true
357
+ 'app ๐Ÿ”จ docker | review ':
358
+ stage: build
359
+ image: path/to/docker/docker-build:the-version
360
+ services:
361
+ - name: docker:24.0.6-dind
362
+ command:
363
+ - --tls=false
364
+ variables:
365
+ DOCKER_HOST: tcp://0.0.0.0:2375
366
+ DOCKER_TLS_CERTDIR: ''
367
+ DOCKER_DRIVER: overlay2
368
+ DOCKER_BUILDKIT: '1'
369
+ KUBERNETES_CPU_REQUEST: '0.45'
370
+ KUBERNETES_MEMORY_REQUEST: 1Gi
371
+ KUBERNETES_MEMORY_LIMIT: 2Gi
372
+ script:
373
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
374
+ - export APP_DIR="app"
375
+ - export DOCKER_BUILD_CONTEXT="app"
376
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
377
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
378
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app"
379
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
380
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
381
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
382
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app_GCLOUD_DEPLOY_credentialsKey")
383
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
384
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
385
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
386
+ - 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
387
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
388
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
389
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
390
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
391
+ - docker push $DOCKER_CACHE_IMAGE
392
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
393
+ rules:
394
+ - if: $CI_MERGE_REQUEST_ID
395
+ needs:
396
+ - 'app ๐Ÿ”จ app | review '
397
+ retry: *a1
398
+ interruptible: true
399
+ 'app ๐Ÿงพ sbom | review ':
400
+ stage: build
401
+ image: maven:3-eclipse-temurin-11
402
+ variables: {}
403
+ script:
404
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
405
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
406
+ - mvn org.cyclonedx:cyclonedx-maven-plugin:2.7.4:makeBom
407
+ - mv target/bom.json __sbom.json
408
+ artifacts:
409
+ paths:
410
+ - __sbom.json
411
+ rules:
412
+ - if: $CI_MERGE_REQUEST_ID
413
+ needs: []
414
+ retry: *a1
415
+ interruptible: true
416
+ allow_failure: true
417
+ 'app ๐Ÿš€ Deploy | review ':
418
+ stage: deploy review
419
+ image: path/to/docker/gcloud:the-version
420
+ variables:
421
+ KUBERNETES_CPU_REQUEST: '0.22'
422
+ KUBERNETES_MEMORY_REQUEST: 200Mi
423
+ KUBERNETES_MEMORY_LIMIT: 400Mi
424
+ script:
425
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
426
+ - export ENV_SHORT="review"
427
+ - export APP_DIR="app"
428
+ - export ENV_TYPE="review"
429
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
430
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
431
+ - 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")"
432
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
433
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
434
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
435
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
436
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
437
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
438
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
439
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_app_GCLOUD_DEPLOY_credentialsKey"
440
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_app_GCLOUD_RUN_canonicalHostSuffix"
441
+ - 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\\"]"
442
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
443
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
444
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app"
445
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
446
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
447
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
448
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
449
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app_GCLOUD_DEPLOY_credentialsKey")
450
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
451
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
452
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
453
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
454
+ - |
455
+ cat > ____envvars.yaml <<EOF
456
+ ENV_SHORT: |-
457
+ review
458
+ APP_DIR: |-
459
+ app
460
+ ENV_TYPE: |-
461
+ review
462
+ BUILD_INFO_BUILD_ID: |-
463
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
464
+ BUILD_INFO_BUILD_TIME: |-
465
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
466
+ BUILD_INFO_CURRENT_VERSION: |-
467
+ $(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/^/ /')
468
+ HOST: |-
469
+ $(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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
470
+ ROOT_URL: |-
471
+ $(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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
472
+ HOST_INTERNAL: |-
473
+ $(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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
474
+ HOST_CANONICAL: |-
475
+ $(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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
476
+ ROOT_URL_INTERNAL: |-
477
+ $(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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
478
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
479
+ asdf
480
+ DEPLOY_CLOUD_RUN_REGION: |-
481
+ asia-east1
482
+ GCLOUD_RUN_canonicalHostSuffix: |-
483
+ $(printf %s "$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
484
+ _ALL_ENV_VAR_KEYS: |-
485
+ ["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"]
486
+
487
+ EOF
488
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
489
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
490
+ - 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"; })-app" | awk '{print tolower($0)}') --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app/$([ -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=app,app-name=test-app,env-type=review,env-name=review,build-type=custom,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"; })-app" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
491
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
492
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
493
+ - 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"; })-app" | 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
494
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app/$([ -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/app/$([ -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
495
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app --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/app@$version --quiet --delete-tags; done
496
+ - set +e
497
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app --quiet --delete-tags
498
+ - set -e
499
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
500
+ - echo 'Uploading SBOM to Dependency Track'
501
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
502
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
503
+ environment:
504
+ name: review/$CI_COMMIT_REF_NAME/app
505
+ url: $CL_GITLAB_ENVIRONMENT_URL
506
+ on_stop: 'app ๐Ÿ›‘ Stop โš ๏ธ | review '
507
+ auto_stop_in: 1 week
508
+ artifacts:
509
+ reports:
510
+ dotenv: gitlab_environment.env
511
+ rules:
512
+ - when: on_success
513
+ if: $CI_MERGE_REQUEST_ID
514
+ needs:
515
+ - job: 'app ๐Ÿ”จ app | review '
516
+ artifacts: false
517
+ - job: 'app ๐Ÿ”จ docker | review '
518
+ artifacts: false
519
+ - job: 'app ๐Ÿงพ sbom | review '
520
+ artifacts: true
521
+ retry: *a1
522
+ interruptible: true
523
+ allow_failure: false
524
+ 'app ๐Ÿ›‘ Stop โš ๏ธ | review ':
525
+ stage: stop review
526
+ image: path/to/docker/gcloud:the-version
527
+ variables:
528
+ KUBERNETES_CPU_REQUEST: '0.22'
529
+ KUBERNETES_MEMORY_REQUEST: 200Mi
530
+ KUBERNETES_MEMORY_LIMIT: 400Mi
531
+ GIT_STRATEGY: none
532
+ script:
533
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
534
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
535
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
536
+ - set +e
537
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app_GCLOUD_DEPLOY_credentialsKey")
538
+ - 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"; })-app" | awk '{print tolower($0)}') --project=asdf --region=asia-east1
539
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app/$([ -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
540
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app --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/app@$version --quiet --delete-tags; done
541
+ - set +e
542
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app --quiet --delete-tags
543
+ - set -e
544
+ - echo 'Disabling component in Dependency Track'
545
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
546
+ - set -e
547
+ - 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"; })-app-$CL_review_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
548
+ environment:
549
+ name: review/$CI_COMMIT_REF_NAME/app
550
+ url: $CL_GITLAB_ENVIRONMENT_URL
551
+ action: stop
552
+ artifacts:
553
+ reports:
554
+ dotenv: gitlab_environment.env
555
+ rules:
556
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
557
+ when: on_success
558
+ - when: manual
559
+ if: $CI_MERGE_REQUEST_ID
560
+ needs: []
561
+ retry: *a1
562
+ interruptible: true
563
+ allow_failure: true
564
+ 'app ๐Ÿ”จ app | stage ':
565
+ stage: build
566
+ image: maven:3-eclipse-temurin-11
567
+ variables:
568
+ KUBERNETES_CPU_REQUEST: '0.45'
569
+ KUBERNETES_MEMORY_REQUEST: 1Gi
570
+ KUBERNETES_MEMORY_LIMIT: 4Gi
571
+ script:
572
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
573
+ - export ENV_SHORT="stage"
574
+ - export APP_DIR="app"
575
+ - export ENV_TYPE="stage"
576
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
577
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
578
+ - 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")"
579
+ - export HOST="$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
580
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
581
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
582
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
583
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
584
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
585
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
586
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_app_GCLOUD_DEPLOY_credentialsKey"
587
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix"
588
+ - 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\\"]"
589
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
590
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json
591
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
592
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
593
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
594
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
595
+ - cd app
596
+ - mvn package
597
+ - cp -r target dist
598
+ cache: []
599
+ artifacts:
600
+ paths:
601
+ - app/__build_info.json
602
+ - app/dist
603
+ expire_in: 1 day
604
+ when: always
605
+ reports: {}
606
+ rules:
607
+ - if: $CI_COMMIT_TAG
608
+ needs: []
609
+ retry: *a1
610
+ interruptible: true
611
+ 'app ๐Ÿ”จ docker | stage ':
612
+ stage: build
613
+ image: path/to/docker/docker-build:the-version
614
+ services:
615
+ - name: docker:24.0.6-dind
616
+ command:
617
+ - --tls=false
618
+ variables:
619
+ DOCKER_HOST: tcp://0.0.0.0:2375
620
+ DOCKER_TLS_CERTDIR: ''
621
+ DOCKER_DRIVER: overlay2
622
+ DOCKER_BUILDKIT: '1'
623
+ KUBERNETES_CPU_REQUEST: '0.45'
624
+ KUBERNETES_MEMORY_REQUEST: 1Gi
625
+ KUBERNETES_MEMORY_LIMIT: 2Gi
626
+ script:
627
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
628
+ - export APP_DIR="app"
629
+ - export DOCKER_BUILD_CONTEXT="app"
630
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
631
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app"
632
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app"
633
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
634
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
635
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
636
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app_GCLOUD_DEPLOY_credentialsKey")
637
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
638
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
639
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
640
+ - 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
641
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
642
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
643
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
644
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
645
+ - docker push $DOCKER_CACHE_IMAGE
646
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
647
+ rules:
648
+ - if: $CI_COMMIT_TAG
649
+ needs:
650
+ - 'app ๐Ÿ”จ app | stage '
651
+ retry: *a1
652
+ interruptible: true
653
+ 'app ๐Ÿงพ sbom | stage ':
654
+ stage: build
655
+ image: maven:3-eclipse-temurin-11
656
+ variables: {}
657
+ script:
658
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
659
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
660
+ - mvn org.cyclonedx:cyclonedx-maven-plugin:2.7.4:makeBom
661
+ - mv target/bom.json __sbom.json
662
+ artifacts:
663
+ paths:
664
+ - __sbom.json
665
+ rules:
666
+ - if: $CI_COMMIT_TAG
667
+ needs: []
668
+ retry: *a1
669
+ interruptible: true
670
+ allow_failure: true
671
+ 'app ๐Ÿš€ Deploy | stage ':
672
+ stage: deploy stage
673
+ image: path/to/docker/gcloud:the-version
674
+ variables:
675
+ KUBERNETES_CPU_REQUEST: '0.22'
676
+ KUBERNETES_MEMORY_REQUEST: 200Mi
677
+ KUBERNETES_MEMORY_LIMIT: 400Mi
678
+ script:
679
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
680
+ - export ENV_SHORT="stage"
681
+ - export APP_DIR="app"
682
+ - export ENV_TYPE="stage"
683
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
684
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
685
+ - 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")"
686
+ - export HOST="$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
687
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
688
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
689
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
690
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
691
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
692
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
693
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_app_GCLOUD_DEPLOY_credentialsKey"
694
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix"
695
+ - 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\\"]"
696
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
697
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app"
698
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app"
699
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
700
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
701
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
702
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
703
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app_GCLOUD_DEPLOY_credentialsKey")
704
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
705
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
706
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
707
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
708
+ - |
709
+ cat > ____envvars.yaml <<EOF
710
+ ENV_SHORT: |-
711
+ stage
712
+ APP_DIR: |-
713
+ app
714
+ ENV_TYPE: |-
715
+ stage
716
+ BUILD_INFO_BUILD_ID: |-
717
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
718
+ BUILD_INFO_BUILD_TIME: |-
719
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
720
+ BUILD_INFO_CURRENT_VERSION: |-
721
+ $(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/^/ /')
722
+ HOST: |-
723
+ $(printf %s "$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
724
+ ROOT_URL: |-
725
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
726
+ HOST_INTERNAL: |-
727
+ $(printf %s "$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
728
+ HOST_CANONICAL: |-
729
+ $(printf %s "$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
730
+ ROOT_URL_INTERNAL: |-
731
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
732
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
733
+ asdf
734
+ DEPLOY_CLOUD_RUN_REGION: |-
735
+ asia-east1
736
+ GCLOUD_RUN_canonicalHostSuffix: |-
737
+ $(printf %s "$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
738
+ _ALL_ENV_VAR_KEYS: |-
739
+ ["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"]
740
+
741
+ EOF
742
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
743
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
744
+ - gcloud run deploy pan-test-app-stage-app --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app,app-name=test-app,env-type=stage,env-name=stage,build-type=custom,cloud-run-service-name=pan-test-app-stage-app --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
745
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
746
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
747
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-app --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
748
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app --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/app@$version --quiet --delete-tags; done
749
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app --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/app@$version --quiet --delete-tags; done
750
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
751
+ - echo 'Uploading SBOM to Dependency Track'
752
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
753
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
754
+ environment:
755
+ name: stage/app
756
+ url: $CL_GITLAB_ENVIRONMENT_URL
757
+ on_stop: 'app ๐Ÿ›‘ Stop โš ๏ธ | stage '
758
+ artifacts:
759
+ reports:
760
+ dotenv: gitlab_environment.env
761
+ rules:
762
+ - when: on_success
763
+ if: $CI_COMMIT_TAG
764
+ needs:
765
+ - job: 'app ๐Ÿ”จ app | stage '
766
+ artifacts: false
767
+ - job: 'app ๐Ÿ”จ docker | stage '
768
+ artifacts: false
769
+ - job: 'app ๐Ÿงพ sbom | stage '
770
+ artifacts: true
771
+ retry: *a1
772
+ interruptible: true
773
+ allow_failure: false
774
+ 'app ๐Ÿ›‘ Stop โš ๏ธ | stage ':
775
+ stage: stop stage
776
+ image: path/to/docker/gcloud:the-version
777
+ variables:
778
+ KUBERNETES_CPU_REQUEST: '0.22'
779
+ KUBERNETES_MEMORY_REQUEST: 200Mi
780
+ KUBERNETES_MEMORY_LIMIT: 400Mi
781
+ GIT_STRATEGY: none
782
+ script:
783
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
784
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
785
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
786
+ - set +e
787
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app_GCLOUD_DEPLOY_credentialsKey")
788
+ - gcloud run services delete pan-test-app-stage-app --project=asdf --region=asia-east1
789
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app --quiet --delete-tags
790
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app --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/app@$version --quiet --delete-tags; done
791
+ - echo 'Disabling component in Dependency Track'
792
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
793
+ - set -e
794
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app-$CL_stage_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
795
+ environment:
796
+ name: stage/app
797
+ url: $CL_GITLAB_ENVIRONMENT_URL
798
+ action: stop
799
+ artifacts:
800
+ reports:
801
+ dotenv: gitlab_environment.env
802
+ rules:
803
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
804
+ when: on_success
805
+ - when: manual
806
+ if: $CI_COMMIT_TAG
807
+ needs: []
808
+ retry: *a1
809
+ interruptible: true
810
+ allow_failure: true
811
+ 'app ๐Ÿ”จ app | prod ':
812
+ stage: build
813
+ image: maven:3-eclipse-temurin-11
814
+ variables:
815
+ KUBERNETES_CPU_REQUEST: '0.45'
816
+ KUBERNETES_MEMORY_REQUEST: 1Gi
817
+ KUBERNETES_MEMORY_LIMIT: 4Gi
818
+ script:
819
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
820
+ - export ENV_SHORT="prod"
821
+ - export APP_DIR="app"
822
+ - export ENV_TYPE="prod"
823
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
824
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
825
+ - 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")"
826
+ - export HOST="$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
827
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
828
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
829
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
830
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
831
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
832
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
833
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_app_GCLOUD_DEPLOY_credentialsKey"
834
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix"
835
+ - 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\\"]"
836
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
837
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json
838
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
839
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
840
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
841
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
842
+ - cd app
843
+ - mvn package
844
+ - cp -r target dist
845
+ cache: []
846
+ artifacts:
847
+ paths:
848
+ - app/__build_info.json
849
+ - app/dist
850
+ expire_in: 1 day
851
+ when: always
852
+ reports: {}
853
+ rules:
854
+ - if: $CI_COMMIT_TAG
855
+ needs: []
856
+ retry: *a1
857
+ interruptible: true
858
+ 'app ๐Ÿ”จ docker | prod ':
859
+ stage: build
860
+ image: path/to/docker/docker-build:the-version
861
+ services:
862
+ - name: docker:24.0.6-dind
863
+ command:
864
+ - --tls=false
865
+ variables:
866
+ DOCKER_HOST: tcp://0.0.0.0:2375
867
+ DOCKER_TLS_CERTDIR: ''
868
+ DOCKER_DRIVER: overlay2
869
+ DOCKER_BUILDKIT: '1'
870
+ KUBERNETES_CPU_REQUEST: '0.45'
871
+ KUBERNETES_MEMORY_REQUEST: 1Gi
872
+ KUBERNETES_MEMORY_LIMIT: 2Gi
873
+ script:
874
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
875
+ - export APP_DIR="app"
876
+ - export DOCKER_BUILD_CONTEXT="app"
877
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
878
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app"
879
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app"
880
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
881
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
882
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
883
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app_GCLOUD_DEPLOY_credentialsKey")
884
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
885
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
886
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
887
+ - 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
888
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
889
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
890
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
891
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
892
+ - docker push $DOCKER_CACHE_IMAGE
893
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
894
+ rules:
895
+ - if: $CI_COMMIT_TAG
896
+ needs:
897
+ - 'app ๐Ÿ”จ app | prod '
898
+ retry: *a1
899
+ interruptible: true
900
+ 'app ๐Ÿงพ sbom | prod ':
901
+ stage: build
902
+ image: maven:3-eclipse-temurin-11
903
+ variables: {}
904
+ script:
905
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
906
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
907
+ - mvn org.cyclonedx:cyclonedx-maven-plugin:2.7.4:makeBom
908
+ - mv target/bom.json __sbom.json
909
+ artifacts:
910
+ paths:
911
+ - __sbom.json
912
+ rules:
913
+ - if: $CI_COMMIT_TAG
914
+ needs: []
915
+ retry: *a1
916
+ interruptible: true
917
+ allow_failure: true
918
+ 'app ๐Ÿš€ Deploy | prod ':
919
+ stage: deploy prod
920
+ image: path/to/docker/gcloud:the-version
921
+ variables:
922
+ KUBERNETES_CPU_REQUEST: '0.22'
923
+ KUBERNETES_MEMORY_REQUEST: 200Mi
924
+ KUBERNETES_MEMORY_LIMIT: 400Mi
925
+ script:
926
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
927
+ - export ENV_SHORT="prod"
928
+ - export APP_DIR="app"
929
+ - export ENV_TYPE="prod"
930
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
931
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
932
+ - 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")"
933
+ - export HOST="$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
934
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
935
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
936
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
937
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
938
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
939
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
940
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_app_GCLOUD_DEPLOY_credentialsKey"
941
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix"
942
+ - 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\\"]"
943
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
944
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app"
945
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app"
946
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
947
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
948
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
949
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
950
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app_GCLOUD_DEPLOY_credentialsKey")
951
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
952
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
953
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
954
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
955
+ - |
956
+ cat > ____envvars.yaml <<EOF
957
+ ENV_SHORT: |-
958
+ prod
959
+ APP_DIR: |-
960
+ app
961
+ ENV_TYPE: |-
962
+ prod
963
+ BUILD_INFO_BUILD_ID: |-
964
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
965
+ BUILD_INFO_BUILD_TIME: |-
966
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
967
+ BUILD_INFO_CURRENT_VERSION: |-
968
+ $(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/^/ /')
969
+ HOST: |-
970
+ $(printf %s "$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
971
+ ROOT_URL: |-
972
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
973
+ HOST_INTERNAL: |-
974
+ $(printf %s "$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
975
+ HOST_CANONICAL: |-
976
+ $(printf %s "$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
977
+ ROOT_URL_INTERNAL: |-
978
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
979
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
980
+ asdf
981
+ DEPLOY_CLOUD_RUN_REGION: |-
982
+ asia-east1
983
+ GCLOUD_RUN_canonicalHostSuffix: |-
984
+ $(printf %s "$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
985
+ _ALL_ENV_VAR_KEYS: |-
986
+ ["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"]
987
+
988
+ EOF
989
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
990
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
991
+ - gcloud run deploy pan-test-app-prod-app --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app,app-name=test-app,env-type=prod,env-name=prod,build-type=custom,cloud-run-service-name=pan-test-app-prod-app --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
992
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
993
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
994
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-app --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
995
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app --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/app@$version --quiet --delete-tags; done
996
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app --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/app@$version --quiet --delete-tags; done
997
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
998
+ - echo 'Uploading SBOM to Dependency Track'
999
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1000
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1001
+ environment:
1002
+ name: prod/app
1003
+ url: $CL_GITLAB_ENVIRONMENT_URL
1004
+ on_stop: 'app ๐Ÿ›‘ Stop โš ๏ธ | prod '
1005
+ artifacts:
1006
+ reports:
1007
+ dotenv: gitlab_environment.env
1008
+ rules:
1009
+ - when: manual
1010
+ if: $CI_COMMIT_TAG
1011
+ needs:
1012
+ - job: 'app ๐Ÿ”จ app | prod '
1013
+ artifacts: false
1014
+ - job: 'app ๐Ÿ”จ docker | prod '
1015
+ artifacts: false
1016
+ - job: 'app ๐Ÿงพ sbom | prod '
1017
+ artifacts: true
1018
+ retry: *a1
1019
+ interruptible: true
1020
+ allow_failure: true
1021
+ 'app ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1022
+ stage: stop prod
1023
+ image: path/to/docker/gcloud:the-version
1024
+ variables:
1025
+ KUBERNETES_CPU_REQUEST: '0.22'
1026
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1027
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1028
+ GIT_STRATEGY: none
1029
+ script:
1030
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1031
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1032
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1033
+ - set +e
1034
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app_GCLOUD_DEPLOY_credentialsKey")
1035
+ - gcloud run services delete pan-test-app-prod-app --project=asdf --region=asia-east1
1036
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app --quiet --delete-tags
1037
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app --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/app@$version --quiet --delete-tags; done
1038
+ - echo 'Disabling component in Dependency Track'
1039
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "https://$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1040
+ - set -e
1041
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app-$CL_prod_app_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1042
+ environment:
1043
+ name: prod/app
1044
+ url: $CL_GITLAB_ENVIRONMENT_URL
1045
+ action: stop
1046
+ artifacts:
1047
+ reports:
1048
+ dotenv: gitlab_environment.env
1049
+ rules:
1050
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1051
+ when: on_success
1052
+ - when: manual
1053
+ if: $CI_COMMIT_TAG
1054
+ needs: []
1055
+ retry: *a1
1056
+ interruptible: true
1057
+ allow_failure: true
1058
+ create release:
1059
+ stage: release
1060
+ image: path/to/docker/semantic-release:the-version
1061
+ script:
1062
+ - semanticRelease
1063
+ after_script:
1064
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1065
+ rules:
1066
+ - &a2
1067
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1068
+ when: never
1069
+ - &a3
1070
+ if: $CI_PIPELINE_SOURCE == "schedule"
1071
+ when: never
1072
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1073
+ when: on_success
1074
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1075
+ when: manual
1076
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1077
+ when: manual
1078
+ โš ๏ธ force create release:
1079
+ stage: release
1080
+ image: path/to/docker/semantic-release:the-version
1081
+ script:
1082
+ - semanticRelease
1083
+ after_script:
1084
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1085
+ rules:
1086
+ - *a2
1087
+ - *a3
1088
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1089
+ when: manual
1090
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1091
+ when: manual
1092
+ needs: []
1093
+ "
1094
+ `;
1095
+
3
1096
  exports[`matches snapshot for custom-sbom-java 1`] = `
4
1097
  {
5
1098
  "mainBranch": {