@catladder/pipeline 1.163.0 โ†’ 1.163.2

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 (78) hide show
  1. package/README.md +15 -1
  2. package/dist/bundles/catladder-gitlab/index.js +2 -2
  3. package/dist/constants.js +1 -1
  4. package/dist/pipeline/generatePipelineFiles.d.ts +38 -0
  5. package/dist/pipeline/generatePipelineFiles.js +44 -23
  6. package/dist/tsconfig.tsbuildinfo +1 -1
  7. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1335 -1952
  8. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1319 -1928
  9. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1335 -1952
  10. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1387 -2004
  11. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1335 -1952
  12. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1346 -1963
  13. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1335 -1952
  14. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1335 -1952
  15. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1379 -1996
  16. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1219 -1668
  17. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1335 -1952
  18. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2815 -3924
  19. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +2562 -3447
  20. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1343 -1960
  21. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1190 -1780
  22. package/examples/__snapshots__/custom-build-job.test.ts.snap +1079 -1480
  23. package/examples/__snapshots__/custom-deploy.test.ts.snap +1101 -1718
  24. package/examples/__snapshots__/custom-envs.test.ts.snap +707 -1172
  25. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1087 -1488
  26. package/examples/__snapshots__/git-submodule.test.ts.snap +1336 -1955
  27. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1772 -2443
  28. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +1784 -2455
  29. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1792 -2463
  30. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3342 -4547
  31. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1896 -2567
  32. package/examples/__snapshots__/local-dot-env.test.ts.snap +1335 -1952
  33. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1833 -2496
  34. package/examples/__snapshots__/multiline-var.test.ts.snap +3295 -4406
  35. package/examples/__snapshots__/native-app.test.ts.snap +2143 -3160
  36. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1335 -1952
  37. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1343 -1960
  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 +1464 -1988
  40. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1273 -2102
  41. package/examples/__utils__/helpers.ts +14 -1
  42. package/examples/cloud-run-memory-limit.test.ts +4 -3
  43. package/examples/cloud-run-meteor-with-worker.test.ts +4 -3
  44. package/examples/cloud-run-no-cpu-throttling.test.ts +4 -3
  45. package/examples/cloud-run-no-service.test.ts +4 -3
  46. package/examples/cloud-run-non-public.test.ts +4 -3
  47. package/examples/cloud-run-post-stop-job.test.ts +4 -3
  48. package/examples/cloud-run-service-gen2.test.ts +4 -3
  49. package/examples/cloud-run-service-increase-timout.test.ts +4 -3
  50. package/examples/cloud-run-service-with-volumes.test.ts +4 -3
  51. package/examples/cloud-run-storybook.test.ts +4 -3
  52. package/examples/cloud-run-with-ngnix.test.ts +4 -3
  53. package/examples/cloud-run-with-sql-reuse-db.test.ts +4 -3
  54. package/examples/cloud-run-with-sql.test.ts +4 -3
  55. package/examples/cloud-run-with-worker.test.ts +4 -3
  56. package/examples/custom-build-job-with-tests.test.ts +4 -3
  57. package/examples/custom-build-job.test.ts +4 -3
  58. package/examples/custom-deploy.test.ts +4 -3
  59. package/examples/custom-envs.test.ts +4 -3
  60. package/examples/custom-sbom-java.test.ts +4 -3
  61. package/examples/git-submodule.test.ts +4 -3
  62. package/examples/kubernetes-application-customization.test.ts +4 -3
  63. package/examples/kubernetes-with-cloud-sql-legacy.test.ts +4 -3
  64. package/examples/kubernetes-with-cloud-sql.test.ts +4 -3
  65. package/examples/kubernetes-with-jobs.test.ts +4 -3
  66. package/examples/kubernetes-with-mongodb.test.ts +4 -3
  67. package/examples/local-dot-env.test.ts +4 -3
  68. package/examples/meteor-kubernetes.test.ts +4 -3
  69. package/examples/multiline-var.test.ts +4 -3
  70. package/examples/native-app.test.ts +4 -3
  71. package/examples/node-build-with-custom-image.test.ts +4 -3
  72. package/examples/node-build-with-docker-additions.test.ts +4 -3
  73. package/examples/rails-k8s-with-worker-dockerfile.test.ts +2 -2
  74. package/examples/rails-k8s-with-worker.test.ts +4 -3
  75. package/examples/wait-for-other-deploy.test.ts +4 -3
  76. package/package.json +4 -3
  77. package/scripts/generate-examples-test.ts +7 -7
  78. package/src/pipeline/generatePipelineFiles.ts +61 -36
@@ -1,1487 +1,1086 @@
1
1
  // Jest Snapshot v1, https://goo.gl/fbAQLP
2
2
 
3
- exports[`matches snapshot for custom-build-job 1`] = `
4
- {
5
- "mainBranch": {
6
- "image": "path/to/docker/jobs-default:the-version",
7
- "jobs": {
8
- "www ๐Ÿ”จ app | dev ": {
9
- "artifacts": {
10
- "expire_in": "1 day",
11
- "paths": [
12
- "www/__build_info.json",
13
- "www/dist",
14
- ],
15
- "reports": {
16
- "junit": undefined,
17
- },
18
- "when": "always",
19
- },
20
- "cache": [],
21
- "image": "foo",
22
- "interruptible": true,
23
- "needs": [],
24
- "retry": {
25
- "max": 2,
26
- "when": [
27
- "runner_system_failure",
28
- "stuck_or_timeout_failure",
29
- ],
30
- },
31
- "script": [
32
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
33
- "export ENV_SHORT="dev"",
34
- "export APP_DIR="www"",
35
- "export ENV_TYPE="dev"",
36
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
37
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
38
- "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")"",
39
- "export HOST="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
40
- "export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
41
- "export HOST_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
42
- "export HOST_CANONICAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
43
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
44
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
45
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
46
- "export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"",
47
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"",
48
- "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\\"]"",
49
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
50
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json",
51
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
52
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
53
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
54
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
55
- "cd www",
56
- ],
57
- "stage": "build",
58
- "variables": {
59
- "KUBERNETES_CPU_REQUEST": "0.45",
60
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
61
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
62
- },
63
- },
64
- "www ๐Ÿ”จ docker | dev ": {
65
- "image": "path/to/docker/docker-build:the-version",
66
- "interruptible": true,
67
- "needs": [
68
- "www ๐Ÿ”จ app | dev ",
69
- ],
70
- "retry": {
71
- "max": 2,
72
- "when": [
73
- "runner_system_failure",
74
- "stuck_or_timeout_failure",
75
- ],
76
- },
77
- "script": [
78
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
79
- "export APP_DIR="www"",
80
- "export DOCKER_BUILD_CONTEXT="."",
81
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
82
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www"",
83
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
84
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
85
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
86
- "ensureNginxDockerfile",
87
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
88
- "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")",
89
- "gcloud auth configure-docker asia-east1-docker.pkg.dev",
90
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
91
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
92
- "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",
93
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
94
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
95
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
96
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
97
- "docker push $DOCKER_CACHE_IMAGE",
98
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
99
- ],
100
- "services": [
101
- {
102
- "command": [
103
- "--tls=false",
104
- ],
105
- "name": "docker:24.0.6-dind",
106
- },
107
- ],
108
- "stage": "build",
109
- "variables": {
110
- "DOCKER_BUILDKIT": "1",
111
- "DOCKER_DRIVER": "overlay2",
112
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
113
- "DOCKER_TLS_CERTDIR": "",
114
- "KUBERNETES_CPU_REQUEST": "0.45",
115
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
116
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
117
- },
118
- },
119
- "www ๐Ÿš€ Deploy | dev ": {
120
- "allow_failure": false,
121
- "artifacts": {
122
- "reports": {
123
- "dotenv": "gitlab_environment.env",
124
- },
125
- },
126
- "environment": {
127
- "auto_stop_in": "4 weeks",
128
- "name": "dev/www",
129
- "on_stop": "www ๐Ÿ›‘ Stop โš ๏ธ | dev ",
130
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
131
- },
132
- "image": "path/to/docker/gcloud:the-version",
133
- "interruptible": true,
134
- "needs": [
135
- {
136
- "artifacts": false,
137
- "job": "www ๐Ÿ”จ app | dev ",
138
- },
139
- {
140
- "artifacts": false,
141
- "job": "www ๐Ÿ”จ docker | dev ",
142
- },
143
- {
144
- "artifacts": true,
145
- "job": "www ๐Ÿงพ sbom | dev ",
146
- },
147
- ],
148
- "retry": {
149
- "max": 2,
150
- "when": [
151
- "runner_system_failure",
152
- "stuck_or_timeout_failure",
153
- ],
154
- },
155
- "rules": [
156
- {
157
- "when": "on_success",
158
- },
159
- ],
160
- "script": [
161
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
162
- "export ENV_SHORT="dev"",
163
- "export APP_DIR="www"",
164
- "export ENV_TYPE="dev"",
165
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
166
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
167
- "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")"",
168
- "export HOST="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
169
- "export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
170
- "export HOST_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
171
- "export HOST_CANONICAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
172
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
173
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
174
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
175
- "export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"",
176
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"",
177
- "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\\"]"",
178
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
179
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www"",
180
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
181
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
182
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
183
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
184
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
185
- "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")",
186
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
187
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
188
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
189
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
190
- "cat > ____envvars.yaml <<EOF
191
- ENV_SHORT: |-
192
- dev
193
- APP_DIR: |-
194
- www
195
- ENV_TYPE: |-
196
- dev
197
- BUILD_INFO_BUILD_ID: |-
198
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
199
- BUILD_INFO_BUILD_TIME: |-
200
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
201
- BUILD_INFO_CURRENT_VERSION: |-
202
- $(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/^/ /')
203
- HOST: |-
204
- $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
205
- ROOT_URL: |-
206
- $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
207
- HOST_INTERNAL: |-
208
- $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
209
- HOST_CANONICAL: |-
210
- $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
211
- ROOT_URL_INTERNAL: |-
212
- $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
213
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
214
- asdf
215
- DEPLOY_CLOUD_RUN_REGION: |-
216
- asia-east1
217
- GCLOUD_RUN_canonicalHostSuffix: |-
218
- $(printf %s "$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
219
- _ALL_ENV_VAR_KEYS: |-
220
- ["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"]
3
+ exports[`matches snapshot for custom-build-job 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
+ 'www ๐Ÿ”จ app | dev ':
49
+ stage: build
50
+ image: foo
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="www"
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-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
64
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
65
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
66
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
67
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_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_www_GCLOUD_DEPLOY_credentialsKey"
71
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_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"}' > www/__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 www
80
+ cache: []
81
+ artifacts:
82
+ paths:
83
+ - www/__build_info.json
84
+ - www/dist
85
+ expire_in: 1 day
86
+ when: always
87
+ reports: {}
88
+ rules:
89
+ - when: never
90
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
91
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
92
+ needs: []
93
+ retry: &a1
94
+ max: 2
95
+ when:
96
+ - runner_system_failure
97
+ - stuck_or_timeout_failure
98
+ interruptible: true
99
+ 'www ๐Ÿ”จ docker | dev ':
100
+ stage: build
101
+ image: path/to/docker/docker-build:the-version
102
+ services:
103
+ - name: docker:24.0.6-dind
104
+ command:
105
+ - --tls=false
106
+ variables:
107
+ DOCKER_HOST: tcp://0.0.0.0:2375
108
+ DOCKER_TLS_CERTDIR: ''
109
+ DOCKER_DRIVER: overlay2
110
+ DOCKER_BUILDKIT: '1'
111
+ KUBERNETES_CPU_REQUEST: '0.45'
112
+ KUBERNETES_MEMORY_REQUEST: 1Gi
113
+ KUBERNETES_MEMORY_LIMIT: 2Gi
114
+ script:
115
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
116
+ - export APP_DIR="www"
117
+ - export DOCKER_BUILD_CONTEXT="."
118
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
119
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www"
120
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
121
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
122
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
123
+ - ensureNginxDockerfile
124
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
125
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
126
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
127
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
128
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
129
+ - 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
130
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
131
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
132
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
133
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
134
+ - docker push $DOCKER_CACHE_IMAGE
135
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
136
+ rules:
137
+ - when: never
138
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
139
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
140
+ needs:
141
+ - 'www ๐Ÿ”จ app | dev '
142
+ retry: *a1
143
+ interruptible: true
144
+ 'www ๐Ÿงพ sbom | dev ':
145
+ stage: build
146
+ image: aquasec/trivy:0.38.3
147
+ variables: {}
148
+ script:
149
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
150
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
151
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
152
+ artifacts:
153
+ paths:
154
+ - __sbom.json
155
+ rules:
156
+ - when: never
157
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
158
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
159
+ needs: []
160
+ retry: *a1
161
+ interruptible: true
162
+ allow_failure: true
163
+ 'www ๐Ÿš€ Deploy | dev ':
164
+ stage: deploy dev
165
+ image: path/to/docker/gcloud:the-version
166
+ variables:
167
+ KUBERNETES_CPU_REQUEST: '0.22'
168
+ KUBERNETES_MEMORY_REQUEST: 200Mi
169
+ KUBERNETES_MEMORY_LIMIT: 400Mi
170
+ script:
171
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
172
+ - export ENV_SHORT="dev"
173
+ - export APP_DIR="www"
174
+ - export ENV_TYPE="dev"
175
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
176
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
177
+ - 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")"
178
+ - export HOST="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
179
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
180
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
181
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
182
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
183
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
184
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
185
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"
186
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"
187
+ - 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\\"]"
188
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
189
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www"
190
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
191
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
192
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
193
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
194
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
195
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
196
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
197
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
198
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
199
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
200
+ - |
201
+ cat > ____envvars.yaml <<EOF
202
+ ENV_SHORT: |-
203
+ dev
204
+ APP_DIR: |-
205
+ www
206
+ ENV_TYPE: |-
207
+ dev
208
+ BUILD_INFO_BUILD_ID: |-
209
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
210
+ BUILD_INFO_BUILD_TIME: |-
211
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
212
+ BUILD_INFO_CURRENT_VERSION: |-
213
+ $(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/^/ /')
214
+ HOST: |-
215
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
216
+ ROOT_URL: |-
217
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
218
+ HOST_INTERNAL: |-
219
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
220
+ HOST_CANONICAL: |-
221
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
222
+ ROOT_URL_INTERNAL: |-
223
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
224
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
225
+ asdf
226
+ DEPLOY_CLOUD_RUN_REGION: |-
227
+ asia-east1
228
+ GCLOUD_RUN_canonicalHostSuffix: |-
229
+ $(printf %s "$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
230
+ _ALL_ENV_VAR_KEYS: |-
231
+ ["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"]
221
232
 
222
- EOF
223
- ",
224
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
225
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
226
- "gcloud run deploy pan-test-app-dev-www --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=dev,env-name=dev,build-type=custom,cloud-run-service-name=pan-test-app-dev-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
227
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
228
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
229
- "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-www --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",
230
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www --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/www@$version --quiet --delete-tags; done",
231
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done",
232
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
233
- "echo 'Uploading SBOM to Dependency Track'",
234
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
235
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
236
- ],
237
- "stage": "deploy dev",
238
- "variables": {
239
- "KUBERNETES_CPU_REQUEST": "0.22",
240
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
241
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
242
- },
243
- },
244
- "www ๐Ÿ›‘ Stop โš ๏ธ | dev ": {
245
- "allow_failure": true,
246
- "artifacts": {
247
- "reports": {
248
- "dotenv": "gitlab_environment.env",
249
- },
250
- },
251
- "environment": {
252
- "action": "stop",
253
- "name": "dev/www",
254
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
255
- },
256
- "image": "path/to/docker/gcloud:the-version",
257
- "interruptible": true,
258
- "needs": [],
259
- "retry": {
260
- "max": 2,
261
- "when": [
262
- "runner_system_failure",
263
- "stuck_or_timeout_failure",
264
- ],
265
- },
266
- "rules": [
267
- {
268
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
269
- "when": "on_success",
270
- },
271
- {
272
- "when": "manual",
273
- },
274
- ],
275
- "script": [
276
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
277
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
278
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
279
- "set +e",
280
- "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")",
281
- "gcloud run services delete pan-test-app-dev-www --project=asdf --region=asia-east1",
282
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www --quiet --delete-tags",
283
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done",
284
- "echo 'Disabling component in Dependency Track'",
285
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
286
- "set -e",
287
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
288
- ],
289
- "stage": "stop dev",
290
- "variables": {
291
- "GIT_STRATEGY": "none",
292
- "KUBERNETES_CPU_REQUEST": "0.22",
293
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
294
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
295
- },
296
- },
297
- "www ๐Ÿงพ sbom | dev ": {
298
- "allow_failure": true,
299
- "artifacts": {
300
- "paths": [
301
- "__sbom.json",
302
- ],
303
- },
304
- "image": "aquasec/trivy:0.38.3",
305
- "interruptible": true,
306
- "needs": [],
307
- "retry": {
308
- "max": 2,
309
- "when": [
310
- "runner_system_failure",
311
- "stuck_or_timeout_failure",
312
- ],
313
- },
314
- "script": [
315
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
316
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
317
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" www",
318
- ],
319
- "stage": "build",
320
- "variables": {},
321
- },
322
- },
323
- "stages": [
324
- "setup",
325
- "setup dev",
326
- "setup review",
327
- "setup stage",
328
- "setup prod",
329
- "test",
330
- "test dev",
331
- "test review",
332
- "test stage",
333
- "test prod",
334
- "build",
335
- "build dev",
336
- "build review",
337
- "build stage",
338
- "build prod",
339
- "deploy",
340
- "deploy dev",
341
- "deploy review",
342
- "deploy stage",
343
- "deploy prod",
344
- "verify",
345
- "verify dev",
346
- "verify review",
347
- "verify stage",
348
- "verify prod",
349
- "rollback",
350
- "rollback dev",
351
- "rollback review",
352
- "rollback stage",
353
- "rollback prod",
354
- "stop",
355
- "stop dev",
356
- "stop review",
357
- "stop stage",
358
- "stop prod",
359
- ],
360
- "variables": {
361
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
362
- "CACHE_COMPRESSION_LEVEL": "fast",
363
- "FF_USE_FASTZIP": "true",
364
- "GIT_DEPTH": "1",
365
- "TRANSFER_METER_FREQUENCY": "5s",
366
- },
367
- "workflow": {
368
- "rules": [
369
- {
370
- "if": "$CI_COMMIT_TAG",
371
- },
372
- {
373
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
374
- "when": "never",
375
- },
376
- {
377
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
378
- "when": "never",
379
- },
380
- {
381
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
382
- },
383
- {
384
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
385
- },
386
- {
387
- "if": "$CI_MERGE_REQUEST_ID",
388
- },
389
- ],
390
- },
391
- },
392
- "mr": {
393
- "image": "path/to/docker/jobs-default:the-version",
394
- "jobs": {
395
- "www ๐Ÿ”จ app | review ": {
396
- "artifacts": {
397
- "expire_in": "1 day",
398
- "paths": [
399
- "www/__build_info.json",
400
- "www/dist",
401
- ],
402
- "reports": {
403
- "junit": undefined,
404
- },
405
- "when": "always",
406
- },
407
- "cache": [],
408
- "image": "foo",
409
- "interruptible": true,
410
- "needs": [],
411
- "retry": {
412
- "max": 2,
413
- "when": [
414
- "runner_system_failure",
415
- "stuck_or_timeout_failure",
416
- ],
417
- },
418
- "script": [
419
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
420
- "export ENV_SHORT="review"",
421
- "export APP_DIR="www"",
422
- "export ENV_TYPE="review"",
423
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
424
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
425
- "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")"",
426
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
427
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
428
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
429
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
430
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
431
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
432
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
433
- "export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"",
434
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"",
435
- "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\\"]"",
436
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
437
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json",
438
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
439
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
440
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
441
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
442
- "cd www",
443
- ],
444
- "stage": "build",
445
- "variables": {
446
- "KUBERNETES_CPU_REQUEST": "0.45",
447
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
448
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
449
- },
450
- },
451
- "www ๐Ÿ”จ docker | review ": {
452
- "image": "path/to/docker/docker-build:the-version",
453
- "interruptible": true,
454
- "needs": [
455
- "www ๐Ÿ”จ app | review ",
456
- ],
457
- "retry": {
458
- "max": 2,
459
- "when": [
460
- "runner_system_failure",
461
- "stuck_or_timeout_failure",
462
- ],
463
- },
464
- "script": [
465
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
466
- "export APP_DIR="www"",
467
- "export DOCKER_BUILD_CONTEXT="."",
468
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
469
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"",
470
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
471
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
472
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
473
- "ensureNginxDockerfile",
474
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
475
- "gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")",
476
- "gcloud auth configure-docker asia-east1-docker.pkg.dev",
477
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
478
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
479
- "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",
480
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
481
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
482
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
483
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
484
- "docker push $DOCKER_CACHE_IMAGE",
485
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
486
- ],
487
- "services": [
488
- {
489
- "command": [
490
- "--tls=false",
491
- ],
492
- "name": "docker:24.0.6-dind",
493
- },
494
- ],
495
- "stage": "build",
496
- "variables": {
497
- "DOCKER_BUILDKIT": "1",
498
- "DOCKER_DRIVER": "overlay2",
499
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
500
- "DOCKER_TLS_CERTDIR": "",
501
- "KUBERNETES_CPU_REQUEST": "0.45",
502
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
503
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
504
- },
505
- },
506
- "www ๐Ÿš€ Deploy | review ": {
507
- "allow_failure": false,
508
- "artifacts": {
509
- "reports": {
510
- "dotenv": "gitlab_environment.env",
511
- },
512
- },
513
- "environment": {
514
- "auto_stop_in": "1 week",
515
- "name": "review/$CI_COMMIT_REF_NAME/www",
516
- "on_stop": "www ๐Ÿ›‘ Stop โš ๏ธ | review ",
517
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
518
- },
519
- "image": "path/to/docker/gcloud:the-version",
520
- "interruptible": true,
521
- "needs": [
522
- {
523
- "artifacts": false,
524
- "job": "www ๐Ÿ”จ app | review ",
525
- },
526
- {
527
- "artifacts": false,
528
- "job": "www ๐Ÿ”จ docker | review ",
529
- },
530
- {
531
- "artifacts": true,
532
- "job": "www ๐Ÿงพ sbom | review ",
533
- },
534
- ],
535
- "retry": {
536
- "max": 2,
537
- "when": [
538
- "runner_system_failure",
539
- "stuck_or_timeout_failure",
540
- ],
541
- },
542
- "rules": [
543
- {
544
- "when": "on_success",
545
- },
546
- ],
547
- "script": [
548
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
549
- "export ENV_SHORT="review"",
550
- "export APP_DIR="www"",
551
- "export ENV_TYPE="review"",
552
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
553
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
554
- "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")"",
555
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
556
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
557
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
558
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
559
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
560
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
561
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
562
- "export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"",
563
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"",
564
- "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\\"]"",
565
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
566
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"",
567
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
568
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
569
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
570
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
571
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
572
- "gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")",
573
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
574
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
575
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
576
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
577
- "cat > ____envvars.yaml <<EOF
578
- ENV_SHORT: |-
579
- review
580
- APP_DIR: |-
581
- www
582
- ENV_TYPE: |-
583
- review
584
- BUILD_INFO_BUILD_ID: |-
585
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
586
- BUILD_INFO_BUILD_TIME: |-
587
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
588
- BUILD_INFO_CURRENT_VERSION: |-
589
- $(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/^/ /')
590
- HOST: |-
591
- $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
592
- ROOT_URL: |-
593
- $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
594
- HOST_INTERNAL: |-
595
- $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
596
- HOST_CANONICAL: |-
597
- $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
598
- ROOT_URL_INTERNAL: |-
599
- $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
600
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
601
- asdf
602
- DEPLOY_CLOUD_RUN_REGION: |-
603
- asia-east1
604
- GCLOUD_RUN_canonicalHostSuffix: |-
605
- $(printf %s "$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
606
- _ALL_ENV_VAR_KEYS: |-
607
- ["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"]
233
+ EOF
234
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
235
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
236
+ - gcloud run deploy pan-test-app-dev-www --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=dev,env-name=dev,build-type=custom,cloud-run-service-name=pan-test-app-dev-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
237
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
238
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
239
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-www --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
240
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www --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/www@$version --quiet --delete-tags; done
241
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
242
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
243
+ - echo 'Uploading SBOM to Dependency Track'
244
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
245
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
246
+ environment:
247
+ name: dev/www
248
+ url: $CL_GITLAB_ENVIRONMENT_URL
249
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | dev '
250
+ auto_stop_in: 4 weeks
251
+ artifacts:
252
+ reports:
253
+ dotenv: gitlab_environment.env
254
+ rules:
255
+ - when: never
256
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
257
+ - when: on_success
258
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
259
+ needs:
260
+ - job: 'www ๐Ÿ”จ app | dev '
261
+ artifacts: false
262
+ - job: 'www ๐Ÿ”จ docker | dev '
263
+ artifacts: false
264
+ - job: 'www ๐Ÿงพ sbom | dev '
265
+ artifacts: true
266
+ retry: *a1
267
+ interruptible: true
268
+ allow_failure: false
269
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | dev ':
270
+ stage: stop dev
271
+ image: path/to/docker/gcloud:the-version
272
+ variables:
273
+ KUBERNETES_CPU_REQUEST: '0.22'
274
+ KUBERNETES_MEMORY_REQUEST: 200Mi
275
+ KUBERNETES_MEMORY_LIMIT: 400Mi
276
+ GIT_STRATEGY: none
277
+ script:
278
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
279
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
280
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
281
+ - set +e
282
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
283
+ - gcloud run services delete pan-test-app-dev-www --project=asdf --region=asia-east1
284
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www --quiet --delete-tags
285
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
286
+ - echo 'Disabling component in Dependency Track'
287
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
288
+ - set -e
289
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
290
+ environment:
291
+ name: dev/www
292
+ url: $CL_GITLAB_ENVIRONMENT_URL
293
+ action: stop
294
+ artifacts:
295
+ reports:
296
+ dotenv: gitlab_environment.env
297
+ rules:
298
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
299
+ when: on_success
300
+ - when: never
301
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
302
+ - when: manual
303
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
304
+ needs: []
305
+ retry: *a1
306
+ interruptible: true
307
+ allow_failure: true
308
+ 'www ๐Ÿ”จ app | review ':
309
+ stage: build
310
+ image: foo
311
+ variables:
312
+ KUBERNETES_CPU_REQUEST: '0.45'
313
+ KUBERNETES_MEMORY_REQUEST: 1Gi
314
+ KUBERNETES_MEMORY_LIMIT: 4Gi
315
+ script:
316
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
317
+ - export ENV_SHORT="review"
318
+ - export APP_DIR="www"
319
+ - export ENV_TYPE="review"
320
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
321
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
322
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
323
+ - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
324
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
325
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
326
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
327
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
328
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
329
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
330
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"
331
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"
332
+ - 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\\"]"
333
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
334
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
335
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
336
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
337
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
338
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
339
+ - cd www
340
+ cache: []
341
+ artifacts:
342
+ paths:
343
+ - www/__build_info.json
344
+ - www/dist
345
+ expire_in: 1 day
346
+ when: always
347
+ reports: {}
348
+ rules:
349
+ - if: $CI_MERGE_REQUEST_ID
350
+ needs: []
351
+ retry: *a1
352
+ interruptible: true
353
+ 'www ๐Ÿ”จ docker | review ':
354
+ stage: build
355
+ image: path/to/docker/docker-build:the-version
356
+ services:
357
+ - name: docker:24.0.6-dind
358
+ command:
359
+ - --tls=false
360
+ variables:
361
+ DOCKER_HOST: tcp://0.0.0.0:2375
362
+ DOCKER_TLS_CERTDIR: ''
363
+ DOCKER_DRIVER: overlay2
364
+ DOCKER_BUILDKIT: '1'
365
+ KUBERNETES_CPU_REQUEST: '0.45'
366
+ KUBERNETES_MEMORY_REQUEST: 1Gi
367
+ KUBERNETES_MEMORY_LIMIT: 2Gi
368
+ script:
369
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
370
+ - export APP_DIR="www"
371
+ - export DOCKER_BUILD_CONTEXT="."
372
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
373
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
374
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
375
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
376
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
377
+ - ensureNginxDockerfile
378
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
379
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
380
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
381
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
382
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
383
+ - 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
384
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
385
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
386
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
387
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
388
+ - docker push $DOCKER_CACHE_IMAGE
389
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
390
+ rules:
391
+ - if: $CI_MERGE_REQUEST_ID
392
+ needs:
393
+ - 'www ๐Ÿ”จ app | review '
394
+ retry: *a1
395
+ interruptible: true
396
+ 'www ๐Ÿงพ sbom | review ':
397
+ stage: build
398
+ image: aquasec/trivy:0.38.3
399
+ variables: {}
400
+ script:
401
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
402
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
403
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
404
+ artifacts:
405
+ paths:
406
+ - __sbom.json
407
+ rules:
408
+ - if: $CI_MERGE_REQUEST_ID
409
+ needs: []
410
+ retry: *a1
411
+ interruptible: true
412
+ allow_failure: true
413
+ 'www ๐Ÿš€ Deploy | review ':
414
+ stage: deploy review
415
+ image: path/to/docker/gcloud:the-version
416
+ variables:
417
+ KUBERNETES_CPU_REQUEST: '0.22'
418
+ KUBERNETES_MEMORY_REQUEST: 200Mi
419
+ KUBERNETES_MEMORY_LIMIT: 400Mi
420
+ script:
421
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
422
+ - export ENV_SHORT="review"
423
+ - export APP_DIR="www"
424
+ - export ENV_TYPE="review"
425
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
426
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
427
+ - 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")"
428
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
429
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
430
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
431
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
432
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
433
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
434
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
435
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"
436
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"
437
+ - 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\\"]"
438
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
439
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
440
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
441
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
442
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
443
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
444
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
445
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
446
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
447
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
448
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
449
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
450
+ - |
451
+ cat > ____envvars.yaml <<EOF
452
+ ENV_SHORT: |-
453
+ review
454
+ APP_DIR: |-
455
+ www
456
+ ENV_TYPE: |-
457
+ review
458
+ BUILD_INFO_BUILD_ID: |-
459
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
460
+ BUILD_INFO_BUILD_TIME: |-
461
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
462
+ BUILD_INFO_CURRENT_VERSION: |-
463
+ $(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/^/ /')
464
+ HOST: |-
465
+ $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
466
+ ROOT_URL: |-
467
+ $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
468
+ HOST_INTERNAL: |-
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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
470
+ HOST_CANONICAL: |-
471
+ $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
472
+ ROOT_URL_INTERNAL: |-
473
+ $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
474
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
475
+ asdf
476
+ DEPLOY_CLOUD_RUN_REGION: |-
477
+ asia-east1
478
+ GCLOUD_RUN_canonicalHostSuffix: |-
479
+ $(printf %s "$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
480
+ _ALL_ENV_VAR_KEYS: |-
481
+ ["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"]
608
482
 
609
- EOF
610
- ",
611
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
612
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
613
- "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"; })-www" | awk '{print tolower($0)}') --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/$([ -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=www,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"; })-www" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
614
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
615
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
616
- "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"; })-www" | 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",
617
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/$([ -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/www/$([ -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",
618
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done",
619
- "set +e",
620
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags",
621
- "set -e",
622
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
623
- "echo 'Uploading SBOM to Dependency Track'",
624
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
625
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
626
- ],
627
- "stage": "deploy review",
628
- "variables": {
629
- "KUBERNETES_CPU_REQUEST": "0.22",
630
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
631
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
632
- },
633
- },
634
- "www ๐Ÿ›‘ Stop โš ๏ธ | review ": {
635
- "allow_failure": true,
636
- "artifacts": {
637
- "reports": {
638
- "dotenv": "gitlab_environment.env",
639
- },
640
- },
641
- "environment": {
642
- "action": "stop",
643
- "name": "review/$CI_COMMIT_REF_NAME/www",
644
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
645
- },
646
- "image": "path/to/docker/gcloud:the-version",
647
- "interruptible": true,
648
- "needs": [],
649
- "retry": {
650
- "max": 2,
651
- "when": [
652
- "runner_system_failure",
653
- "stuck_or_timeout_failure",
654
- ],
655
- },
656
- "rules": [
657
- {
658
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
659
- "when": "on_success",
660
- },
661
- {
662
- "when": "manual",
663
- },
664
- ],
665
- "script": [
666
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
667
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
668
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
669
- "set +e",
670
- "gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")",
671
- "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"; })-www" | awk '{print tolower($0)}') --project=asdf --region=asia-east1",
672
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/$([ -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",
673
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done",
674
- "set +e",
675
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags",
676
- "set -e",
677
- "echo 'Disabling component in Dependency Track'",
678
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
679
- "set -e",
680
- "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
681
- ],
682
- "stage": "stop review",
683
- "variables": {
684
- "GIT_STRATEGY": "none",
685
- "KUBERNETES_CPU_REQUEST": "0.22",
686
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
687
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
688
- },
689
- },
690
- "www ๐Ÿงพ sbom | review ": {
691
- "allow_failure": true,
692
- "artifacts": {
693
- "paths": [
694
- "__sbom.json",
695
- ],
696
- },
697
- "image": "aquasec/trivy:0.38.3",
698
- "interruptible": true,
699
- "needs": [],
700
- "retry": {
701
- "max": 2,
702
- "when": [
703
- "runner_system_failure",
704
- "stuck_or_timeout_failure",
705
- ],
706
- },
707
- "script": [
708
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
709
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
710
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" www",
711
- ],
712
- "stage": "build",
713
- "variables": {},
714
- },
715
- },
716
- "stages": [
717
- "setup",
718
- "setup dev",
719
- "setup review",
720
- "setup stage",
721
- "setup prod",
722
- "test",
723
- "test dev",
724
- "test review",
725
- "test stage",
726
- "test prod",
727
- "build",
728
- "build dev",
729
- "build review",
730
- "build stage",
731
- "build prod",
732
- "deploy",
733
- "deploy dev",
734
- "deploy review",
735
- "deploy stage",
736
- "deploy prod",
737
- "verify",
738
- "verify dev",
739
- "verify review",
740
- "verify stage",
741
- "verify prod",
742
- "rollback",
743
- "rollback dev",
744
- "rollback review",
745
- "rollback stage",
746
- "rollback prod",
747
- "stop",
748
- "stop dev",
749
- "stop review",
750
- "stop stage",
751
- "stop prod",
752
- ],
753
- "variables": {
754
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
755
- "CACHE_COMPRESSION_LEVEL": "fast",
756
- "FF_USE_FASTZIP": "true",
757
- "GIT_DEPTH": "1",
758
- "TRANSFER_METER_FREQUENCY": "5s",
759
- },
760
- "workflow": {
761
- "rules": [
762
- {
763
- "if": "$CI_COMMIT_TAG",
764
- },
765
- {
766
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
767
- "when": "never",
768
- },
769
- {
770
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
771
- "when": "never",
772
- },
773
- {
774
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
775
- },
776
- {
777
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
778
- },
779
- {
780
- "if": "$CI_MERGE_REQUEST_ID",
781
- },
782
- ],
783
- },
784
- },
785
- "taggedRelease": {
786
- "image": "path/to/docker/jobs-default:the-version",
787
- "jobs": {
788
- "www ๐Ÿ”จ app | prod ": {
789
- "artifacts": {
790
- "expire_in": "1 day",
791
- "paths": [
792
- "www/__build_info.json",
793
- "www/dist",
794
- ],
795
- "reports": {
796
- "junit": undefined,
797
- },
798
- "when": "always",
799
- },
800
- "cache": [],
801
- "image": "foo",
802
- "interruptible": true,
803
- "needs": [],
804
- "retry": {
805
- "max": 2,
806
- "when": [
807
- "runner_system_failure",
808
- "stuck_or_timeout_failure",
809
- ],
810
- },
811
- "script": [
812
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
813
- "export ENV_SHORT="prod"",
814
- "export APP_DIR="www"",
815
- "export ENV_TYPE="prod"",
816
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
817
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
818
- "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")"",
819
- "export HOST="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
820
- "export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
821
- "export HOST_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
822
- "export HOST_CANONICAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
823
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
824
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
825
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
826
- "export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"",
827
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"",
828
- "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\\"]"",
829
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
830
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json",
831
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
832
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
833
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
834
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
835
- "cd www",
836
- ],
837
- "stage": "build",
838
- "variables": {
839
- "KUBERNETES_CPU_REQUEST": "0.45",
840
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
841
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
842
- },
843
- },
844
- "www ๐Ÿ”จ app | stage ": {
845
- "artifacts": {
846
- "expire_in": "1 day",
847
- "paths": [
848
- "www/__build_info.json",
849
- "www/dist",
850
- ],
851
- "reports": {
852
- "junit": undefined,
853
- },
854
- "when": "always",
855
- },
856
- "cache": [],
857
- "image": "foo",
858
- "interruptible": true,
859
- "needs": [],
860
- "retry": {
861
- "max": 2,
862
- "when": [
863
- "runner_system_failure",
864
- "stuck_or_timeout_failure",
865
- ],
866
- },
867
- "script": [
868
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
869
- "export ENV_SHORT="stage"",
870
- "export APP_DIR="www"",
871
- "export ENV_TYPE="stage"",
872
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
873
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
874
- "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")"",
875
- "export HOST="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
876
- "export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
877
- "export HOST_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
878
- "export HOST_CANONICAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
879
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
880
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
881
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
882
- "export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"",
883
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"",
884
- "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\\"]"",
885
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
886
- "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json",
887
- "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
888
- "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
889
- "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
890
- "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
891
- "cd www",
892
- ],
893
- "stage": "build",
894
- "variables": {
895
- "KUBERNETES_CPU_REQUEST": "0.45",
896
- "KUBERNETES_MEMORY_LIMIT": "4Gi",
897
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
898
- },
899
- },
900
- "www ๐Ÿ”จ docker | prod ": {
901
- "image": "path/to/docker/docker-build:the-version",
902
- "interruptible": true,
903
- "needs": [
904
- "www ๐Ÿ”จ app | prod ",
905
- ],
906
- "retry": {
907
- "max": 2,
908
- "when": [
909
- "runner_system_failure",
910
- "stuck_or_timeout_failure",
911
- ],
912
- },
913
- "script": [
914
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
915
- "export APP_DIR="www"",
916
- "export DOCKER_BUILD_CONTEXT="."",
917
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
918
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www"",
919
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
920
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
921
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
922
- "ensureNginxDockerfile",
923
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
924
- "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")",
925
- "gcloud auth configure-docker asia-east1-docker.pkg.dev",
926
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
927
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
928
- "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",
929
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
930
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
931
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
932
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
933
- "docker push $DOCKER_CACHE_IMAGE",
934
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
935
- ],
936
- "services": [
937
- {
938
- "command": [
939
- "--tls=false",
940
- ],
941
- "name": "docker:24.0.6-dind",
942
- },
943
- ],
944
- "stage": "build",
945
- "variables": {
946
- "DOCKER_BUILDKIT": "1",
947
- "DOCKER_DRIVER": "overlay2",
948
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
949
- "DOCKER_TLS_CERTDIR": "",
950
- "KUBERNETES_CPU_REQUEST": "0.45",
951
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
952
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
953
- },
954
- },
955
- "www ๐Ÿ”จ docker | stage ": {
956
- "image": "path/to/docker/docker-build:the-version",
957
- "interruptible": true,
958
- "needs": [
959
- "www ๐Ÿ”จ app | stage ",
960
- ],
961
- "retry": {
962
- "max": 2,
963
- "when": [
964
- "runner_system_failure",
965
- "stuck_or_timeout_failure",
966
- ],
967
- },
968
- "script": [
969
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
970
- "export APP_DIR="www"",
971
- "export DOCKER_BUILD_CONTEXT="."",
972
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
973
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www"",
974
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
975
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
976
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
977
- "ensureNginxDockerfile",
978
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
979
- "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")",
980
- "gcloud auth configure-docker asia-east1-docker.pkg.dev",
981
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
982
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
983
- "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",
984
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
985
- "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
986
- "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
987
- "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
988
- "docker push $DOCKER_CACHE_IMAGE",
989
- "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
990
- ],
991
- "services": [
992
- {
993
- "command": [
994
- "--tls=false",
995
- ],
996
- "name": "docker:24.0.6-dind",
997
- },
998
- ],
999
- "stage": "build",
1000
- "variables": {
1001
- "DOCKER_BUILDKIT": "1",
1002
- "DOCKER_DRIVER": "overlay2",
1003
- "DOCKER_HOST": "tcp://0.0.0.0:2375",
1004
- "DOCKER_TLS_CERTDIR": "",
1005
- "KUBERNETES_CPU_REQUEST": "0.45",
1006
- "KUBERNETES_MEMORY_LIMIT": "2Gi",
1007
- "KUBERNETES_MEMORY_REQUEST": "1Gi",
1008
- },
1009
- },
1010
- "www ๐Ÿš€ Deploy | prod ": {
1011
- "allow_failure": true,
1012
- "artifacts": {
1013
- "reports": {
1014
- "dotenv": "gitlab_environment.env",
1015
- },
1016
- },
1017
- "environment": {
1018
- "auto_stop_in": undefined,
1019
- "name": "prod/www",
1020
- "on_stop": "www ๐Ÿ›‘ Stop โš ๏ธ | prod ",
1021
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
1022
- },
1023
- "image": "path/to/docker/gcloud:the-version",
1024
- "interruptible": true,
1025
- "needs": [
1026
- {
1027
- "artifacts": false,
1028
- "job": "www ๐Ÿ”จ app | prod ",
1029
- },
1030
- {
1031
- "artifacts": false,
1032
- "job": "www ๐Ÿ”จ docker | prod ",
1033
- },
1034
- {
1035
- "artifacts": true,
1036
- "job": "www ๐Ÿงพ sbom | prod ",
1037
- },
1038
- ],
1039
- "retry": {
1040
- "max": 2,
1041
- "when": [
1042
- "runner_system_failure",
1043
- "stuck_or_timeout_failure",
1044
- ],
1045
- },
1046
- "rules": [
1047
- {
1048
- "when": "manual",
1049
- },
1050
- ],
1051
- "script": [
1052
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1053
- "export ENV_SHORT="prod"",
1054
- "export APP_DIR="www"",
1055
- "export ENV_TYPE="prod"",
1056
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1057
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1058
- "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")"",
1059
- "export HOST="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1060
- "export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1061
- "export HOST_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1062
- "export HOST_CANONICAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1063
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1064
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1065
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1066
- "export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"",
1067
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"",
1068
- "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\\"]"",
1069
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
1070
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www"",
1071
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
1072
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1073
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1074
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1075
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1076
- "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")",
1077
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
1078
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1079
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1080
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
1081
- "cat > ____envvars.yaml <<EOF
1082
- ENV_SHORT: |-
1083
- prod
1084
- APP_DIR: |-
1085
- www
1086
- ENV_TYPE: |-
1087
- prod
1088
- BUILD_INFO_BUILD_ID: |-
1089
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1090
- BUILD_INFO_BUILD_TIME: |-
1091
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1092
- BUILD_INFO_CURRENT_VERSION: |-
1093
- $(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/^/ /')
1094
- HOST: |-
1095
- $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1096
- ROOT_URL: |-
1097
- $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1098
- HOST_INTERNAL: |-
1099
- $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1100
- HOST_CANONICAL: |-
1101
- $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1102
- ROOT_URL_INTERNAL: |-
1103
- $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1104
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1105
- asdf
1106
- DEPLOY_CLOUD_RUN_REGION: |-
1107
- asia-east1
1108
- GCLOUD_RUN_canonicalHostSuffix: |-
1109
- $(printf %s "$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1110
- _ALL_ENV_VAR_KEYS: |-
1111
- ["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"]
483
+ EOF
484
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
485
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
486
+ - 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"; })-www" | awk '{print tolower($0)}') --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/$([ -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=www,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"; })-www" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
487
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
488
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
489
+ - 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"; })-www" | 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
490
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/$([ -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/www/$([ -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
491
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
492
+ - set +e
493
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags
494
+ - set -e
495
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
496
+ - echo 'Uploading SBOM to Dependency Track'
497
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
498
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
499
+ environment:
500
+ name: review/$CI_COMMIT_REF_NAME/www
501
+ url: $CL_GITLAB_ENVIRONMENT_URL
502
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | review '
503
+ auto_stop_in: 1 week
504
+ artifacts:
505
+ reports:
506
+ dotenv: gitlab_environment.env
507
+ rules:
508
+ - when: on_success
509
+ if: $CI_MERGE_REQUEST_ID
510
+ needs:
511
+ - job: 'www ๐Ÿ”จ app | review '
512
+ artifacts: false
513
+ - job: 'www ๐Ÿ”จ docker | review '
514
+ artifacts: false
515
+ - job: 'www ๐Ÿงพ sbom | review '
516
+ artifacts: true
517
+ retry: *a1
518
+ interruptible: true
519
+ allow_failure: false
520
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | review ':
521
+ stage: stop review
522
+ image: path/to/docker/gcloud:the-version
523
+ variables:
524
+ KUBERNETES_CPU_REQUEST: '0.22'
525
+ KUBERNETES_MEMORY_REQUEST: 200Mi
526
+ KUBERNETES_MEMORY_LIMIT: 400Mi
527
+ GIT_STRATEGY: none
528
+ script:
529
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
530
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
531
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
532
+ - set +e
533
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
534
+ - 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"; })-www" | awk '{print tolower($0)}') --project=asdf --region=asia-east1
535
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www/$([ -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
536
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
537
+ - set +e
538
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags
539
+ - set -e
540
+ - echo 'Disabling component in Dependency Track'
541
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
542
+ - set -e
543
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
544
+ environment:
545
+ name: review/$CI_COMMIT_REF_NAME/www
546
+ url: $CL_GITLAB_ENVIRONMENT_URL
547
+ action: stop
548
+ artifacts:
549
+ reports:
550
+ dotenv: gitlab_environment.env
551
+ rules:
552
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
553
+ when: on_success
554
+ - when: manual
555
+ if: $CI_MERGE_REQUEST_ID
556
+ needs: []
557
+ retry: *a1
558
+ interruptible: true
559
+ allow_failure: true
560
+ 'www ๐Ÿ”จ app | stage ':
561
+ stage: build
562
+ image: foo
563
+ variables:
564
+ KUBERNETES_CPU_REQUEST: '0.45'
565
+ KUBERNETES_MEMORY_REQUEST: 1Gi
566
+ KUBERNETES_MEMORY_LIMIT: 4Gi
567
+ script:
568
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
569
+ - export ENV_SHORT="stage"
570
+ - export APP_DIR="www"
571
+ - export ENV_TYPE="stage"
572
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
573
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
574
+ - 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")"
575
+ - export HOST="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
576
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
577
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
578
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
579
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
580
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
581
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
582
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"
583
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"
584
+ - 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\\"]"
585
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
586
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
587
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
588
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
589
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
590
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
591
+ - cd www
592
+ cache: []
593
+ artifacts:
594
+ paths:
595
+ - www/__build_info.json
596
+ - www/dist
597
+ expire_in: 1 day
598
+ when: always
599
+ reports: {}
600
+ rules:
601
+ - if: $CI_COMMIT_TAG
602
+ needs: []
603
+ retry: *a1
604
+ interruptible: true
605
+ 'www ๐Ÿ”จ docker | stage ':
606
+ stage: build
607
+ image: path/to/docker/docker-build:the-version
608
+ services:
609
+ - name: docker:24.0.6-dind
610
+ command:
611
+ - --tls=false
612
+ variables:
613
+ DOCKER_HOST: tcp://0.0.0.0:2375
614
+ DOCKER_TLS_CERTDIR: ''
615
+ DOCKER_DRIVER: overlay2
616
+ DOCKER_BUILDKIT: '1'
617
+ KUBERNETES_CPU_REQUEST: '0.45'
618
+ KUBERNETES_MEMORY_REQUEST: 1Gi
619
+ KUBERNETES_MEMORY_LIMIT: 2Gi
620
+ script:
621
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
622
+ - export APP_DIR="www"
623
+ - export DOCKER_BUILD_CONTEXT="."
624
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
625
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www"
626
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
627
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
628
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
629
+ - ensureNginxDockerfile
630
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
631
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
632
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
633
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
634
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
635
+ - 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
636
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
637
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
638
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
639
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
640
+ - docker push $DOCKER_CACHE_IMAGE
641
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
642
+ rules:
643
+ - if: $CI_COMMIT_TAG
644
+ needs:
645
+ - 'www ๐Ÿ”จ app | stage '
646
+ retry: *a1
647
+ interruptible: true
648
+ 'www ๐Ÿงพ sbom | stage ':
649
+ stage: build
650
+ image: aquasec/trivy:0.38.3
651
+ variables: {}
652
+ script:
653
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
654
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
655
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
656
+ artifacts:
657
+ paths:
658
+ - __sbom.json
659
+ rules:
660
+ - if: $CI_COMMIT_TAG
661
+ needs: []
662
+ retry: *a1
663
+ interruptible: true
664
+ allow_failure: true
665
+ 'www ๐Ÿš€ Deploy | stage ':
666
+ stage: deploy stage
667
+ image: path/to/docker/gcloud:the-version
668
+ variables:
669
+ KUBERNETES_CPU_REQUEST: '0.22'
670
+ KUBERNETES_MEMORY_REQUEST: 200Mi
671
+ KUBERNETES_MEMORY_LIMIT: 400Mi
672
+ script:
673
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
674
+ - export ENV_SHORT="stage"
675
+ - export APP_DIR="www"
676
+ - export ENV_TYPE="stage"
677
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
678
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
679
+ - 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")"
680
+ - export HOST="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
681
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
682
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
683
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
684
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
685
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
686
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
687
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"
688
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"
689
+ - 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\\"]"
690
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
691
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www"
692
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
693
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
694
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
695
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
696
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
697
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
698
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
699
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
700
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
701
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
702
+ - |
703
+ cat > ____envvars.yaml <<EOF
704
+ ENV_SHORT: |-
705
+ stage
706
+ APP_DIR: |-
707
+ www
708
+ ENV_TYPE: |-
709
+ stage
710
+ BUILD_INFO_BUILD_ID: |-
711
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
712
+ BUILD_INFO_BUILD_TIME: |-
713
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
714
+ BUILD_INFO_CURRENT_VERSION: |-
715
+ $(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/^/ /')
716
+ HOST: |-
717
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
718
+ ROOT_URL: |-
719
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
720
+ HOST_INTERNAL: |-
721
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
722
+ HOST_CANONICAL: |-
723
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
724
+ ROOT_URL_INTERNAL: |-
725
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
726
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
727
+ asdf
728
+ DEPLOY_CLOUD_RUN_REGION: |-
729
+ asia-east1
730
+ GCLOUD_RUN_canonicalHostSuffix: |-
731
+ $(printf %s "$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
732
+ _ALL_ENV_VAR_KEYS: |-
733
+ ["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"]
1112
734
 
1113
- EOF
1114
- ",
1115
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
1116
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1117
- "gcloud run deploy pan-test-app-prod-www --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=prod,env-name=prod,build-type=custom,cloud-run-service-name=pan-test-app-prod-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1118
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1119
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1120
- "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-www --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",
1121
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www --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/www@$version --quiet --delete-tags; done",
1122
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done",
1123
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1124
- "echo 'Uploading SBOM to Dependency Track'",
1125
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
1126
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1127
- ],
1128
- "stage": "deploy prod",
1129
- "variables": {
1130
- "KUBERNETES_CPU_REQUEST": "0.22",
1131
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1132
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1133
- },
1134
- },
1135
- "www ๐Ÿš€ Deploy | stage ": {
1136
- "allow_failure": false,
1137
- "artifacts": {
1138
- "reports": {
1139
- "dotenv": "gitlab_environment.env",
1140
- },
1141
- },
1142
- "environment": {
1143
- "auto_stop_in": undefined,
1144
- "name": "stage/www",
1145
- "on_stop": "www ๐Ÿ›‘ Stop โš ๏ธ | stage ",
1146
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
1147
- },
1148
- "image": "path/to/docker/gcloud:the-version",
1149
- "interruptible": true,
1150
- "needs": [
1151
- {
1152
- "artifacts": false,
1153
- "job": "www ๐Ÿ”จ app | stage ",
1154
- },
1155
- {
1156
- "artifacts": false,
1157
- "job": "www ๐Ÿ”จ docker | stage ",
1158
- },
1159
- {
1160
- "artifacts": true,
1161
- "job": "www ๐Ÿงพ sbom | stage ",
1162
- },
1163
- ],
1164
- "retry": {
1165
- "max": 2,
1166
- "when": [
1167
- "runner_system_failure",
1168
- "stuck_or_timeout_failure",
1169
- ],
1170
- },
1171
- "rules": [
1172
- {
1173
- "when": "on_success",
1174
- },
1175
- ],
1176
- "script": [
1177
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1178
- "export ENV_SHORT="stage"",
1179
- "export APP_DIR="www"",
1180
- "export ENV_TYPE="stage"",
1181
- "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1182
- "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1183
- "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")"",
1184
- "export HOST="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1185
- "export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1186
- "export HOST_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1187
- "export HOST_CANONICAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1188
- "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1189
- "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1190
- "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1191
- "export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"",
1192
- "export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"",
1193
- "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\\"]"",
1194
- "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
1195
- "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www"",
1196
- "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
1197
- "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1198
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1199
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1200
- "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1201
- "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")",
1202
- "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
1203
- "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1204
- "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1205
- "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
1206
- "cat > ____envvars.yaml <<EOF
1207
- ENV_SHORT: |-
1208
- stage
1209
- APP_DIR: |-
1210
- www
1211
- ENV_TYPE: |-
1212
- stage
1213
- BUILD_INFO_BUILD_ID: |-
1214
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1215
- BUILD_INFO_BUILD_TIME: |-
1216
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1217
- BUILD_INFO_CURRENT_VERSION: |-
1218
- $(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/^/ /')
1219
- HOST: |-
1220
- $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1221
- ROOT_URL: |-
1222
- $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1223
- HOST_INTERNAL: |-
1224
- $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1225
- HOST_CANONICAL: |-
1226
- $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1227
- ROOT_URL_INTERNAL: |-
1228
- $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1229
- DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1230
- asdf
1231
- DEPLOY_CLOUD_RUN_REGION: |-
1232
- asia-east1
1233
- GCLOUD_RUN_canonicalHostSuffix: |-
1234
- $(printf %s "$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1235
- _ALL_ENV_VAR_KEYS: |-
1236
- ["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"]
735
+ EOF
736
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
737
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
738
+ - gcloud run deploy pan-test-app-stage-www --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=stage,env-name=stage,build-type=custom,cloud-run-service-name=pan-test-app-stage-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
739
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
740
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
741
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-www --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
742
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www --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/www@$version --quiet --delete-tags; done
743
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
744
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
745
+ - echo 'Uploading SBOM to Dependency Track'
746
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
747
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
748
+ environment:
749
+ name: stage/www
750
+ url: $CL_GITLAB_ENVIRONMENT_URL
751
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | stage '
752
+ artifacts:
753
+ reports:
754
+ dotenv: gitlab_environment.env
755
+ rules:
756
+ - when: on_success
757
+ if: $CI_COMMIT_TAG
758
+ needs:
759
+ - job: 'www ๐Ÿ”จ app | stage '
760
+ artifacts: false
761
+ - job: 'www ๐Ÿ”จ docker | stage '
762
+ artifacts: false
763
+ - job: 'www ๐Ÿงพ sbom | stage '
764
+ artifacts: true
765
+ retry: *a1
766
+ interruptible: true
767
+ allow_failure: false
768
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | stage ':
769
+ stage: stop stage
770
+ image: path/to/docker/gcloud:the-version
771
+ variables:
772
+ KUBERNETES_CPU_REQUEST: '0.22'
773
+ KUBERNETES_MEMORY_REQUEST: 200Mi
774
+ KUBERNETES_MEMORY_LIMIT: 400Mi
775
+ GIT_STRATEGY: none
776
+ script:
777
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
778
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
779
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
780
+ - set +e
781
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
782
+ - gcloud run services delete pan-test-app-stage-www --project=asdf --region=asia-east1
783
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www --quiet --delete-tags
784
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
785
+ - echo 'Disabling component in Dependency Track'
786
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
787
+ - set -e
788
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
789
+ environment:
790
+ name: stage/www
791
+ url: $CL_GITLAB_ENVIRONMENT_URL
792
+ action: stop
793
+ artifacts:
794
+ reports:
795
+ dotenv: gitlab_environment.env
796
+ rules:
797
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
798
+ when: on_success
799
+ - when: manual
800
+ if: $CI_COMMIT_TAG
801
+ needs: []
802
+ retry: *a1
803
+ interruptible: true
804
+ allow_failure: true
805
+ 'www ๐Ÿ”จ app | prod ':
806
+ stage: build
807
+ image: foo
808
+ variables:
809
+ KUBERNETES_CPU_REQUEST: '0.45'
810
+ KUBERNETES_MEMORY_REQUEST: 1Gi
811
+ KUBERNETES_MEMORY_LIMIT: 4Gi
812
+ script:
813
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
814
+ - export ENV_SHORT="prod"
815
+ - export APP_DIR="www"
816
+ - export ENV_TYPE="prod"
817
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
818
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
819
+ - 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")"
820
+ - export HOST="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
821
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
822
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
823
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
824
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
825
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
826
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
827
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"
828
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"
829
+ - 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\\"]"
830
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
831
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
832
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
833
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
834
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
835
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
836
+ - cd www
837
+ cache: []
838
+ artifacts:
839
+ paths:
840
+ - www/__build_info.json
841
+ - www/dist
842
+ expire_in: 1 day
843
+ when: always
844
+ reports: {}
845
+ rules:
846
+ - if: $CI_COMMIT_TAG
847
+ needs: []
848
+ retry: *a1
849
+ interruptible: true
850
+ 'www ๐Ÿ”จ docker | prod ':
851
+ stage: build
852
+ image: path/to/docker/docker-build:the-version
853
+ services:
854
+ - name: docker:24.0.6-dind
855
+ command:
856
+ - --tls=false
857
+ variables:
858
+ DOCKER_HOST: tcp://0.0.0.0:2375
859
+ DOCKER_TLS_CERTDIR: ''
860
+ DOCKER_DRIVER: overlay2
861
+ DOCKER_BUILDKIT: '1'
862
+ KUBERNETES_CPU_REQUEST: '0.45'
863
+ KUBERNETES_MEMORY_REQUEST: 1Gi
864
+ KUBERNETES_MEMORY_LIMIT: 2Gi
865
+ script:
866
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
867
+ - export APP_DIR="www"
868
+ - export DOCKER_BUILD_CONTEXT="."
869
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
870
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www"
871
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
872
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
873
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
874
+ - ensureNginxDockerfile
875
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
876
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
877
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
878
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
879
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
880
+ - 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
881
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
882
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
883
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
884
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
885
+ - docker push $DOCKER_CACHE_IMAGE
886
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
887
+ rules:
888
+ - if: $CI_COMMIT_TAG
889
+ needs:
890
+ - 'www ๐Ÿ”จ app | prod '
891
+ retry: *a1
892
+ interruptible: true
893
+ 'www ๐Ÿงพ sbom | prod ':
894
+ stage: build
895
+ image: aquasec/trivy:0.38.3
896
+ variables: {}
897
+ script:
898
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
899
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
900
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
901
+ artifacts:
902
+ paths:
903
+ - __sbom.json
904
+ rules:
905
+ - if: $CI_COMMIT_TAG
906
+ needs: []
907
+ retry: *a1
908
+ interruptible: true
909
+ allow_failure: true
910
+ 'www ๐Ÿš€ Deploy | prod ':
911
+ stage: deploy prod
912
+ image: path/to/docker/gcloud:the-version
913
+ variables:
914
+ KUBERNETES_CPU_REQUEST: '0.22'
915
+ KUBERNETES_MEMORY_REQUEST: 200Mi
916
+ KUBERNETES_MEMORY_LIMIT: 400Mi
917
+ script:
918
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
919
+ - export ENV_SHORT="prod"
920
+ - export APP_DIR="www"
921
+ - export ENV_TYPE="prod"
922
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
923
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
924
+ - 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")"
925
+ - export HOST="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
926
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
927
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
928
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
929
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
930
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
931
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
932
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"
933
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"
934
+ - 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\\"]"
935
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
936
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www"
937
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
938
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
939
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
940
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
941
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
942
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
943
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
944
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
945
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
946
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
947
+ - |
948
+ cat > ____envvars.yaml <<EOF
949
+ ENV_SHORT: |-
950
+ prod
951
+ APP_DIR: |-
952
+ www
953
+ ENV_TYPE: |-
954
+ prod
955
+ BUILD_INFO_BUILD_ID: |-
956
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
957
+ BUILD_INFO_BUILD_TIME: |-
958
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
959
+ BUILD_INFO_CURRENT_VERSION: |-
960
+ $(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/^/ /')
961
+ HOST: |-
962
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
963
+ ROOT_URL: |-
964
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
965
+ HOST_INTERNAL: |-
966
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
967
+ HOST_CANONICAL: |-
968
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
969
+ ROOT_URL_INTERNAL: |-
970
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
971
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
972
+ asdf
973
+ DEPLOY_CLOUD_RUN_REGION: |-
974
+ asia-east1
975
+ GCLOUD_RUN_canonicalHostSuffix: |-
976
+ $(printf %s "$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
977
+ _ALL_ENV_VAR_KEYS: |-
978
+ ["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"]
1237
979
 
1238
- EOF
1239
- ",
1240
- "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
1241
- "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1242
- "gcloud run deploy pan-test-app-stage-www --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=stage,env-name=stage,build-type=custom,cloud-run-service-name=pan-test-app-stage-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost",
1243
- "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1244
- "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1245
- "gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-www --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",
1246
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www --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/www@$version --quiet --delete-tags; done",
1247
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done",
1248
- "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1249
- "echo 'Uploading SBOM to Dependency Track'",
1250
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true",
1251
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1252
- ],
1253
- "stage": "deploy stage",
1254
- "variables": {
1255
- "KUBERNETES_CPU_REQUEST": "0.22",
1256
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1257
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1258
- },
1259
- },
1260
- "www ๐Ÿ›‘ Stop โš ๏ธ | prod ": {
1261
- "allow_failure": true,
1262
- "artifacts": {
1263
- "reports": {
1264
- "dotenv": "gitlab_environment.env",
1265
- },
1266
- },
1267
- "environment": {
1268
- "action": "stop",
1269
- "name": "prod/www",
1270
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
1271
- },
1272
- "image": "path/to/docker/gcloud:the-version",
1273
- "interruptible": true,
1274
- "needs": [],
1275
- "retry": {
1276
- "max": 2,
1277
- "when": [
1278
- "runner_system_failure",
1279
- "stuck_or_timeout_failure",
1280
- ],
1281
- },
1282
- "rules": [
1283
- {
1284
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1285
- "when": "on_success",
1286
- },
1287
- {
1288
- "when": "manual",
1289
- },
1290
- ],
1291
- "script": [
1292
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1293
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1294
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1295
- "set +e",
1296
- "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")",
1297
- "gcloud run services delete pan-test-app-prod-www --project=asdf --region=asia-east1",
1298
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www --quiet --delete-tags",
1299
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done",
1300
- "echo 'Disabling component in Dependency Track'",
1301
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
1302
- "set -e",
1303
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1304
- ],
1305
- "stage": "stop prod",
1306
- "variables": {
1307
- "GIT_STRATEGY": "none",
1308
- "KUBERNETES_CPU_REQUEST": "0.22",
1309
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1310
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1311
- },
1312
- },
1313
- "www ๐Ÿ›‘ Stop โš ๏ธ | stage ": {
1314
- "allow_failure": true,
1315
- "artifacts": {
1316
- "reports": {
1317
- "dotenv": "gitlab_environment.env",
1318
- },
1319
- },
1320
- "environment": {
1321
- "action": "stop",
1322
- "name": "stage/www",
1323
- "url": "$CL_GITLAB_ENVIRONMENT_URL",
1324
- },
1325
- "image": "path/to/docker/gcloud:the-version",
1326
- "interruptible": true,
1327
- "needs": [],
1328
- "retry": {
1329
- "max": 2,
1330
- "when": [
1331
- "runner_system_failure",
1332
- "stuck_or_timeout_failure",
1333
- ],
1334
- },
1335
- "rules": [
1336
- {
1337
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1338
- "when": "on_success",
1339
- },
1340
- {
1341
- "when": "manual",
1342
- },
1343
- ],
1344
- "script": [
1345
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1346
- "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1347
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1348
- "set +e",
1349
- "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")",
1350
- "gcloud run services delete pan-test-app-stage-www --project=asdf --region=asia-east1",
1351
- "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www --quiet --delete-tags",
1352
- "gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done",
1353
- "echo 'Disabling component in Dependency Track'",
1354
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true",
1355
- "set -e",
1356
- "echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env",
1357
- ],
1358
- "stage": "stop stage",
1359
- "variables": {
1360
- "GIT_STRATEGY": "none",
1361
- "KUBERNETES_CPU_REQUEST": "0.22",
1362
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1363
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1364
- },
1365
- },
1366
- "www ๐Ÿงพ sbom | prod ": {
1367
- "allow_failure": true,
1368
- "artifacts": {
1369
- "paths": [
1370
- "__sbom.json",
1371
- ],
1372
- },
1373
- "image": "aquasec/trivy:0.38.3",
1374
- "interruptible": true,
1375
- "needs": [],
1376
- "retry": {
1377
- "max": 2,
1378
- "when": [
1379
- "runner_system_failure",
1380
- "stuck_or_timeout_failure",
1381
- ],
1382
- },
1383
- "script": [
1384
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1385
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1386
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" www",
1387
- ],
1388
- "stage": "build",
1389
- "variables": {},
1390
- },
1391
- "www ๐Ÿงพ sbom | stage ": {
1392
- "allow_failure": true,
1393
- "artifacts": {
1394
- "paths": [
1395
- "__sbom.json",
1396
- ],
1397
- },
1398
- "image": "aquasec/trivy:0.38.3",
1399
- "interruptible": true,
1400
- "needs": [],
1401
- "retry": {
1402
- "max": 2,
1403
- "when": [
1404
- "runner_system_failure",
1405
- "stuck_or_timeout_failure",
1406
- ],
1407
- },
1408
- "script": [
1409
- "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1410
- "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1411
- "trivy fs --quiet --format cyclonedx --output "__sbom.json" www",
1412
- ],
1413
- "stage": "build",
1414
- "variables": {},
1415
- },
1416
- },
1417
- "stages": [
1418
- "setup",
1419
- "setup dev",
1420
- "setup review",
1421
- "setup stage",
1422
- "setup prod",
1423
- "test",
1424
- "test dev",
1425
- "test review",
1426
- "test stage",
1427
- "test prod",
1428
- "build",
1429
- "build dev",
1430
- "build review",
1431
- "build stage",
1432
- "build prod",
1433
- "deploy",
1434
- "deploy dev",
1435
- "deploy review",
1436
- "deploy stage",
1437
- "deploy prod",
1438
- "verify",
1439
- "verify dev",
1440
- "verify review",
1441
- "verify stage",
1442
- "verify prod",
1443
- "rollback",
1444
- "rollback dev",
1445
- "rollback review",
1446
- "rollback stage",
1447
- "rollback prod",
1448
- "stop",
1449
- "stop dev",
1450
- "stop review",
1451
- "stop stage",
1452
- "stop prod",
1453
- ],
1454
- "variables": {
1455
- "ARTIFACT_COMPRESSION_LEVEL": "fast",
1456
- "CACHE_COMPRESSION_LEVEL": "fast",
1457
- "FF_USE_FASTZIP": "true",
1458
- "GIT_DEPTH": "1",
1459
- "TRANSFER_METER_FREQUENCY": "5s",
1460
- },
1461
- "workflow": {
1462
- "rules": [
1463
- {
1464
- "if": "$CI_COMMIT_TAG",
1465
- },
1466
- {
1467
- "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1468
- "when": "never",
1469
- },
1470
- {
1471
- "if": "$CI_PIPELINE_SOURCE == "schedule"",
1472
- "when": "never",
1473
- },
1474
- {
1475
- "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1476
- },
1477
- {
1478
- "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1479
- },
1480
- {
1481
- "if": "$CI_MERGE_REQUEST_ID",
1482
- },
1483
- ],
1484
- },
1485
- },
1486
- }
980
+ EOF
981
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
982
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
983
+ - gcloud run deploy pan-test-app-prod-www --command="" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=prod,env-name=prod,build-type=custom,cloud-run-service-name=pan-test-app-prod-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
984
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
985
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
986
+ - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-www --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
987
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www --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/www@$version --quiet --delete-tags; done
988
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
989
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
990
+ - echo 'Uploading SBOM to Dependency Track'
991
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
992
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
993
+ environment:
994
+ name: prod/www
995
+ url: $CL_GITLAB_ENVIRONMENT_URL
996
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | prod '
997
+ artifacts:
998
+ reports:
999
+ dotenv: gitlab_environment.env
1000
+ rules:
1001
+ - when: manual
1002
+ if: $CI_COMMIT_TAG
1003
+ needs:
1004
+ - job: 'www ๐Ÿ”จ app | prod '
1005
+ artifacts: false
1006
+ - job: 'www ๐Ÿ”จ docker | prod '
1007
+ artifacts: false
1008
+ - job: 'www ๐Ÿงพ sbom | prod '
1009
+ artifacts: true
1010
+ retry: *a1
1011
+ interruptible: true
1012
+ allow_failure: true
1013
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1014
+ stage: stop prod
1015
+ image: path/to/docker/gcloud:the-version
1016
+ variables:
1017
+ KUBERNETES_CPU_REQUEST: '0.22'
1018
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1019
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1020
+ GIT_STRATEGY: none
1021
+ script:
1022
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1023
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1024
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1025
+ - set +e
1026
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
1027
+ - gcloud run services delete pan-test-app-prod-www --project=asdf --region=asia-east1
1028
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www --quiet --delete-tags
1029
+ - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
1030
+ - echo 'Disabling component in Dependency Track'
1031
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1032
+ - set -e
1033
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1034
+ environment:
1035
+ name: prod/www
1036
+ url: $CL_GITLAB_ENVIRONMENT_URL
1037
+ action: stop
1038
+ artifacts:
1039
+ reports:
1040
+ dotenv: gitlab_environment.env
1041
+ rules:
1042
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1043
+ when: on_success
1044
+ - when: manual
1045
+ if: $CI_COMMIT_TAG
1046
+ needs: []
1047
+ retry: *a1
1048
+ interruptible: true
1049
+ allow_failure: true
1050
+ create release:
1051
+ stage: release
1052
+ image: path/to/docker/semantic-release:the-version
1053
+ script:
1054
+ - semanticRelease
1055
+ after_script:
1056
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1057
+ rules:
1058
+ - &a2
1059
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1060
+ when: never
1061
+ - &a3
1062
+ if: $CI_PIPELINE_SOURCE == "schedule"
1063
+ when: never
1064
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1065
+ when: on_success
1066
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1067
+ when: manual
1068
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1069
+ when: manual
1070
+ โš ๏ธ force create release:
1071
+ stage: release
1072
+ image: path/to/docker/semantic-release:the-version
1073
+ script:
1074
+ - semanticRelease
1075
+ after_script:
1076
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1077
+ rules:
1078
+ - *a2
1079
+ - *a3
1080
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1081
+ when: manual
1082
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1083
+ when: manual
1084
+ needs: []
1085
+ "
1487
1086
  `;