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