@catladder/pipeline 1.170.0 โ 1.170.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/dist/bash/BashExpression.d.ts +1 -0
- package/dist/bash/BashExpression.js +3 -0
- package/dist/bash/replaceAsync.d.ts +1 -1
- package/dist/bash/replaceAsync.js +3 -4
- package/dist/bundles/catladder-gitlab/index.js +1 -1
- package/dist/constants.js +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/examples/__snapshots__/referencing-other-vars.test.ts.snap +4535 -0
- package/examples/referencing-other-vars.test.ts +11 -0
- package/examples/referencing-other-vars.ts +83 -0
- package/package.json +1 -1
- package/src/bash/BashExpression.ts +10 -0
- package/src/bash/replaceAsync.ts +6 -11
|
@@ -0,0 +1,4535 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`matches snapshot for referencing-other-vars 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
|
+
app1 ๐ก 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="app1"
|
|
58
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
59
|
+
- cd app1
|
|
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
|
+
app1 ๐ฎ 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="app1"
|
|
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 app1
|
|
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: app1-yarn
|
|
100
|
+
policy: pull-push
|
|
101
|
+
paths:
|
|
102
|
+
- app1/.yarn
|
|
103
|
+
- key: app1-node-modules
|
|
104
|
+
policy: pull-push
|
|
105
|
+
paths:
|
|
106
|
+
- app1/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
|
+
app1 ๐งช 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="app1"
|
|
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 app1
|
|
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: app1-yarn
|
|
141
|
+
policy: pull-push
|
|
142
|
+
paths:
|
|
143
|
+
- app1/.yarn
|
|
144
|
+
- key: app1-node-modules
|
|
145
|
+
policy: pull-push
|
|
146
|
+
paths:
|
|
147
|
+
- app1/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
|
+
'app1 ๐จ 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="app1"
|
|
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-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
172
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
173
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
174
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
175
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_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 SECRET1="$CL_dev_app1_SECRET1"
|
|
179
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey"
|
|
180
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix"
|
|
181
|
+
- export foo="foo-value"
|
|
182
|
+
- export bar="bar-value"
|
|
183
|
+
- 'export foo3="from app3: foo-value-3"'
|
|
184
|
+
- 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
|
|
185
|
+
- 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
|
|
186
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
187
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
|
|
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
|
+
- cd app1
|
|
193
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
194
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
195
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
196
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
197
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
198
|
+
- yarn install --immutable
|
|
199
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
200
|
+
- yarn build
|
|
201
|
+
cache:
|
|
202
|
+
- key: app1-yarn
|
|
203
|
+
policy: pull-push
|
|
204
|
+
paths:
|
|
205
|
+
- app1/.yarn
|
|
206
|
+
- key: app1-node-modules
|
|
207
|
+
policy: pull-push
|
|
208
|
+
paths:
|
|
209
|
+
- app1/node_modules
|
|
210
|
+
- key: app1-next-cache
|
|
211
|
+
policy: pull-push
|
|
212
|
+
paths:
|
|
213
|
+
- app1/.next/cache
|
|
214
|
+
artifacts:
|
|
215
|
+
paths:
|
|
216
|
+
- app1/__build_info.json
|
|
217
|
+
- app1/.next
|
|
218
|
+
- app1/dist
|
|
219
|
+
expire_in: 1 day
|
|
220
|
+
when: always
|
|
221
|
+
reports: {}
|
|
222
|
+
rules:
|
|
223
|
+
- when: never
|
|
224
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
225
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
226
|
+
needs: []
|
|
227
|
+
retry: *a1
|
|
228
|
+
interruptible: true
|
|
229
|
+
'app1 ๐จ docker | dev ':
|
|
230
|
+
stage: build
|
|
231
|
+
image: path/to/docker/docker-build:the-version
|
|
232
|
+
services:
|
|
233
|
+
- name: docker:24.0.6-dind
|
|
234
|
+
command:
|
|
235
|
+
- --tls=false
|
|
236
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
237
|
+
variables:
|
|
238
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
239
|
+
DOCKER_TLS_CERTDIR: ''
|
|
240
|
+
DOCKER_DRIVER: overlay2
|
|
241
|
+
DOCKER_BUILDKIT: '1'
|
|
242
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
243
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
244
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
245
|
+
script:
|
|
246
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
247
|
+
- export APP_DIR="app1"
|
|
248
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
249
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
250
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1"
|
|
251
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
|
|
252
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
253
|
+
- |-
|
|
254
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
255
|
+
RUN yarn plugin import workspace-tools
|
|
256
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
257
|
+
- |-
|
|
258
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app1/package.json /app/app1/package.json
|
|
259
|
+
COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
|
|
260
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
261
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
262
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
263
|
+
- ensureNodeDockerfile
|
|
264
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
265
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
266
|
+
- gcloud auth configure-docker asia-east1-docker.pkg.dev
|
|
267
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
268
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
269
|
+
- 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
|
|
270
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
271
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
272
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
273
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
274
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
275
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
276
|
+
cache:
|
|
277
|
+
- key: app1-yarn
|
|
278
|
+
policy: pull
|
|
279
|
+
paths:
|
|
280
|
+
- app1/.yarn
|
|
281
|
+
rules:
|
|
282
|
+
- when: never
|
|
283
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
284
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
285
|
+
needs:
|
|
286
|
+
- 'app1 ๐จ app | dev '
|
|
287
|
+
retry: *a1
|
|
288
|
+
interruptible: true
|
|
289
|
+
'app1 ๐งพ sbom | dev ':
|
|
290
|
+
stage: build
|
|
291
|
+
image: aquasec/trivy:0.38.3
|
|
292
|
+
variables: {}
|
|
293
|
+
script:
|
|
294
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
295
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
296
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
|
|
297
|
+
artifacts:
|
|
298
|
+
paths:
|
|
299
|
+
- __sbom.json
|
|
300
|
+
rules:
|
|
301
|
+
- when: never
|
|
302
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
303
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
304
|
+
needs: []
|
|
305
|
+
retry: *a1
|
|
306
|
+
interruptible: true
|
|
307
|
+
allow_failure: true
|
|
308
|
+
'app1 ๐ Deploy | dev ':
|
|
309
|
+
stage: deploy dev
|
|
310
|
+
image: path/to/docker/gcloud:the-version
|
|
311
|
+
variables:
|
|
312
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
313
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
314
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
315
|
+
script:
|
|
316
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
317
|
+
- export ENV_SHORT="dev"
|
|
318
|
+
- export APP_DIR="app1"
|
|
319
|
+
- export ENV_TYPE="dev"
|
|
320
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
321
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
322
|
+
- export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
|
|
323
|
+
- export HOST="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
324
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
325
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
326
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
327
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
328
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
329
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
330
|
+
- export SECRET1="$CL_dev_app1_SECRET1"
|
|
331
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey"
|
|
332
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix"
|
|
333
|
+
- export foo="foo-value"
|
|
334
|
+
- export bar="bar-value"
|
|
335
|
+
- 'export foo3="from app3: foo-value-3"'
|
|
336
|
+
- 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
|
|
337
|
+
- 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
|
|
338
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
339
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1"
|
|
340
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
|
|
341
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
342
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
343
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
344
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
|
|
345
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
346
|
+
- export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
|
|
347
|
+
- 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
|
|
348
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
|
|
349
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
|
|
350
|
+
- |
|
|
351
|
+
cat > ____envvars.yaml <<EOF
|
|
352
|
+
ENV_SHORT: |-
|
|
353
|
+
dev
|
|
354
|
+
APP_DIR: |-
|
|
355
|
+
app1
|
|
356
|
+
ENV_TYPE: |-
|
|
357
|
+
dev
|
|
358
|
+
BUILD_INFO_BUILD_ID: |-
|
|
359
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
360
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
361
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
362
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
363
|
+
$(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/^/ /')
|
|
364
|
+
HOST: |-
|
|
365
|
+
$(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
366
|
+
ROOT_URL: |-
|
|
367
|
+
$(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
368
|
+
HOST_INTERNAL: |-
|
|
369
|
+
$(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
370
|
+
HOST_CANONICAL: |-
|
|
371
|
+
$(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
372
|
+
ROOT_URL_INTERNAL: |-
|
|
373
|
+
$(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
374
|
+
DEPLOY_CLOUD_RUN_PROJECT_ID: |-
|
|
375
|
+
asdf
|
|
376
|
+
DEPLOY_CLOUD_RUN_REGION: |-
|
|
377
|
+
asia-east1
|
|
378
|
+
SECRET1: |-
|
|
379
|
+
$(printf %s "$CL_dev_app1_SECRET1" | sed 's/^/ /')
|
|
380
|
+
GCLOUD_RUN_canonicalHostSuffix: |-
|
|
381
|
+
$(printf %s "$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
|
|
382
|
+
foo: |-
|
|
383
|
+
foo-value
|
|
384
|
+
bar: |-
|
|
385
|
+
bar-value
|
|
386
|
+
foo3: |-
|
|
387
|
+
from app3: foo-value-3
|
|
388
|
+
circle: |-
|
|
389
|
+
this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
|
|
390
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
391
|
+
["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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
|
|
392
|
+
|
|
393
|
+
EOF
|
|
394
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
|
|
395
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
|
|
396
|
+
- gcloud run deploy pan-test-app-dev-app1 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app1,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-app1 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
|
|
397
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
|
|
398
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
|
|
399
|
+
- gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-app1 --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
|
|
400
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1 --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/app1@$version --quiet --delete-tags; done
|
|
401
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
|
|
402
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
|
|
403
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
404
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
|
|
405
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
406
|
+
environment:
|
|
407
|
+
name: dev/app1
|
|
408
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
409
|
+
on_stop: 'app1 ๐ Stop โ ๏ธ | dev '
|
|
410
|
+
auto_stop_in: 4 weeks
|
|
411
|
+
artifacts:
|
|
412
|
+
reports:
|
|
413
|
+
dotenv: gitlab_environment.env
|
|
414
|
+
rules:
|
|
415
|
+
- when: never
|
|
416
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
417
|
+
- when: on_success
|
|
418
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
419
|
+
needs:
|
|
420
|
+
- job: app1 ๐ฎ lint
|
|
421
|
+
artifacts: false
|
|
422
|
+
- job: 'app1 ๐จ app | dev '
|
|
423
|
+
artifacts: false
|
|
424
|
+
- job: 'app1 ๐จ docker | dev '
|
|
425
|
+
artifacts: false
|
|
426
|
+
- job: app1 ๐งช test
|
|
427
|
+
artifacts: false
|
|
428
|
+
- job: 'app1 ๐งพ sbom | dev '
|
|
429
|
+
artifacts: true
|
|
430
|
+
- job: app1 ๐ก audit
|
|
431
|
+
artifacts: false
|
|
432
|
+
retry: *a1
|
|
433
|
+
interruptible: true
|
|
434
|
+
allow_failure: false
|
|
435
|
+
'app1 ๐ Stop โ ๏ธ | dev ':
|
|
436
|
+
stage: stop dev
|
|
437
|
+
image: path/to/docker/gcloud:the-version
|
|
438
|
+
variables:
|
|
439
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
440
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
441
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
442
|
+
GIT_STRATEGY: none
|
|
443
|
+
script:
|
|
444
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
445
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
446
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
447
|
+
- set +e
|
|
448
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
449
|
+
- gcloud run services delete pan-test-app-dev-app1 --project=asdf --region=asia-east1
|
|
450
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1 --quiet --delete-tags
|
|
451
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
|
|
452
|
+
- echo 'Disabling component in Dependency Track'
|
|
453
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app1" "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
|
|
454
|
+
- set -e
|
|
455
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
456
|
+
environment:
|
|
457
|
+
name: dev/app1
|
|
458
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
459
|
+
action: stop
|
|
460
|
+
artifacts:
|
|
461
|
+
reports:
|
|
462
|
+
dotenv: gitlab_environment.env
|
|
463
|
+
rules:
|
|
464
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
465
|
+
when: on_success
|
|
466
|
+
- when: never
|
|
467
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
468
|
+
- when: manual
|
|
469
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
470
|
+
needs: []
|
|
471
|
+
retry: *a1
|
|
472
|
+
interruptible: true
|
|
473
|
+
allow_failure: true
|
|
474
|
+
'app1 ๐จ app | review ':
|
|
475
|
+
stage: build
|
|
476
|
+
image: path/to/docker/jobs-default:the-version
|
|
477
|
+
variables:
|
|
478
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
479
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
480
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
481
|
+
script:
|
|
482
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
483
|
+
- export ENV_SHORT="review"
|
|
484
|
+
- export APP_DIR="app1"
|
|
485
|
+
- export ENV_TYPE="review"
|
|
486
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
487
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
488
|
+
- 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")"
|
|
489
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
490
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
491
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
492
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
493
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
494
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
495
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
496
|
+
- export SECRET1="$CL_review_app1_SECRET1"
|
|
497
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_review_app1_GCLOUD_DEPLOY_credentialsKey"
|
|
498
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix"
|
|
499
|
+
- export foo="foo-value"
|
|
500
|
+
- export bar="bar-value"
|
|
501
|
+
- 'export foo3="from app3: foo-value-3"'
|
|
502
|
+
- 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
|
|
503
|
+
- 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
|
|
504
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
505
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
|
|
506
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
507
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
508
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
509
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
510
|
+
- cd app1
|
|
511
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
512
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
513
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
514
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
515
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
516
|
+
- yarn install --immutable
|
|
517
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
518
|
+
- yarn build
|
|
519
|
+
cache:
|
|
520
|
+
- key: app1-yarn
|
|
521
|
+
policy: pull-push
|
|
522
|
+
paths:
|
|
523
|
+
- app1/.yarn
|
|
524
|
+
- key: app1-node-modules
|
|
525
|
+
policy: pull-push
|
|
526
|
+
paths:
|
|
527
|
+
- app1/node_modules
|
|
528
|
+
- key: app1-next-cache
|
|
529
|
+
policy: pull-push
|
|
530
|
+
paths:
|
|
531
|
+
- app1/.next/cache
|
|
532
|
+
artifacts:
|
|
533
|
+
paths:
|
|
534
|
+
- app1/__build_info.json
|
|
535
|
+
- app1/.next
|
|
536
|
+
- app1/dist
|
|
537
|
+
expire_in: 1 day
|
|
538
|
+
when: always
|
|
539
|
+
reports: {}
|
|
540
|
+
rules:
|
|
541
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
542
|
+
needs: []
|
|
543
|
+
retry: *a1
|
|
544
|
+
interruptible: true
|
|
545
|
+
'app1 ๐จ docker | review ':
|
|
546
|
+
stage: build
|
|
547
|
+
image: path/to/docker/docker-build:the-version
|
|
548
|
+
services:
|
|
549
|
+
- name: docker:24.0.6-dind
|
|
550
|
+
command:
|
|
551
|
+
- --tls=false
|
|
552
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
553
|
+
variables:
|
|
554
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
555
|
+
DOCKER_TLS_CERTDIR: ''
|
|
556
|
+
DOCKER_DRIVER: overlay2
|
|
557
|
+
DOCKER_BUILDKIT: '1'
|
|
558
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
559
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
560
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
561
|
+
script:
|
|
562
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
563
|
+
- export APP_DIR="app1"
|
|
564
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
565
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
566
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
|
|
567
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
|
|
568
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
569
|
+
- |-
|
|
570
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
571
|
+
RUN yarn plugin import workspace-tools
|
|
572
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
573
|
+
- |-
|
|
574
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app1/package.json /app/app1/package.json
|
|
575
|
+
COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
|
|
576
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
577
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
578
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
579
|
+
- ensureNodeDockerfile
|
|
580
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
581
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_review_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
582
|
+
- gcloud auth configure-docker asia-east1-docker.pkg.dev
|
|
583
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
584
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
585
|
+
- 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
|
|
586
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
587
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
588
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
589
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
590
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
591
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
592
|
+
cache:
|
|
593
|
+
- key: app1-yarn
|
|
594
|
+
policy: pull
|
|
595
|
+
paths:
|
|
596
|
+
- app1/.yarn
|
|
597
|
+
rules:
|
|
598
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
599
|
+
needs:
|
|
600
|
+
- 'app1 ๐จ app | review '
|
|
601
|
+
retry: *a1
|
|
602
|
+
interruptible: true
|
|
603
|
+
'app1 ๐งพ sbom | review ':
|
|
604
|
+
stage: build
|
|
605
|
+
image: aquasec/trivy:0.38.3
|
|
606
|
+
variables: {}
|
|
607
|
+
script:
|
|
608
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
609
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
610
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
|
|
611
|
+
artifacts:
|
|
612
|
+
paths:
|
|
613
|
+
- __sbom.json
|
|
614
|
+
rules:
|
|
615
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
616
|
+
needs: []
|
|
617
|
+
retry: *a1
|
|
618
|
+
interruptible: true
|
|
619
|
+
allow_failure: true
|
|
620
|
+
'app1 ๐ Deploy | review ':
|
|
621
|
+
stage: deploy review
|
|
622
|
+
image: path/to/docker/gcloud:the-version
|
|
623
|
+
variables:
|
|
624
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
625
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
626
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
627
|
+
script:
|
|
628
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
629
|
+
- export ENV_SHORT="review"
|
|
630
|
+
- export APP_DIR="app1"
|
|
631
|
+
- export ENV_TYPE="review"
|
|
632
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
633
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
634
|
+
- 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")"
|
|
635
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
636
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
637
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
638
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
639
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
640
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
641
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
642
|
+
- export SECRET1="$CL_review_app1_SECRET1"
|
|
643
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_review_app1_GCLOUD_DEPLOY_credentialsKey"
|
|
644
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix"
|
|
645
|
+
- export foo="foo-value"
|
|
646
|
+
- export bar="bar-value"
|
|
647
|
+
- 'export foo3="from app3: foo-value-3"'
|
|
648
|
+
- 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
|
|
649
|
+
- 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
|
|
650
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
651
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
|
|
652
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
|
|
653
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
654
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
655
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
656
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
|
|
657
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_review_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
658
|
+
- export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
|
|
659
|
+
- 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
|
|
660
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
|
|
661
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
|
|
662
|
+
- |
|
|
663
|
+
cat > ____envvars.yaml <<EOF
|
|
664
|
+
ENV_SHORT: |-
|
|
665
|
+
review
|
|
666
|
+
APP_DIR: |-
|
|
667
|
+
app1
|
|
668
|
+
ENV_TYPE: |-
|
|
669
|
+
review
|
|
670
|
+
BUILD_INFO_BUILD_ID: |-
|
|
671
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
672
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
673
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
674
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
675
|
+
$(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/^/ /')
|
|
676
|
+
HOST: |-
|
|
677
|
+
$(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
678
|
+
ROOT_URL: |-
|
|
679
|
+
$(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
680
|
+
HOST_INTERNAL: |-
|
|
681
|
+
$(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
682
|
+
HOST_CANONICAL: |-
|
|
683
|
+
$(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
684
|
+
ROOT_URL_INTERNAL: |-
|
|
685
|
+
$(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
686
|
+
DEPLOY_CLOUD_RUN_PROJECT_ID: |-
|
|
687
|
+
asdf
|
|
688
|
+
DEPLOY_CLOUD_RUN_REGION: |-
|
|
689
|
+
asia-east1
|
|
690
|
+
SECRET1: |-
|
|
691
|
+
$(printf %s "$CL_review_app1_SECRET1" | sed 's/^/ /')
|
|
692
|
+
GCLOUD_RUN_canonicalHostSuffix: |-
|
|
693
|
+
$(printf %s "$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
|
|
694
|
+
foo: |-
|
|
695
|
+
foo-value
|
|
696
|
+
bar: |-
|
|
697
|
+
bar-value
|
|
698
|
+
foo3: |-
|
|
699
|
+
from app3: foo-value-3
|
|
700
|
+
circle: |-
|
|
701
|
+
this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
|
|
702
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
703
|
+
["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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
|
|
704
|
+
|
|
705
|
+
EOF
|
|
706
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
|
|
707
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
|
|
708
|
+
- 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"; })-app1" | awk '{print tolower($0)}') --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -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=app1,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"; })-app1" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
|
|
709
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
|
|
710
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
|
|
711
|
+
- 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"; })-app1" | 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
|
|
712
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -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/app1/$([ -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
|
|
713
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
|
|
714
|
+
- set +e
|
|
715
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1 --quiet --delete-tags
|
|
716
|
+
- set -e
|
|
717
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
|
|
718
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
719
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
|
|
720
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
721
|
+
environment:
|
|
722
|
+
name: review/$CI_COMMIT_REF_NAME/app1
|
|
723
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
724
|
+
on_stop: 'app1 ๐ Stop โ ๏ธ | review '
|
|
725
|
+
auto_stop_in: 1 week
|
|
726
|
+
artifacts:
|
|
727
|
+
reports:
|
|
728
|
+
dotenv: gitlab_environment.env
|
|
729
|
+
rules:
|
|
730
|
+
- when: on_success
|
|
731
|
+
if: $CI_MERGE_REQUEST_ID
|
|
732
|
+
needs:
|
|
733
|
+
- job: app1 ๐ฎ lint
|
|
734
|
+
artifacts: false
|
|
735
|
+
- job: 'app1 ๐จ app | review '
|
|
736
|
+
artifacts: false
|
|
737
|
+
- job: 'app1 ๐จ docker | review '
|
|
738
|
+
artifacts: false
|
|
739
|
+
- job: app1 ๐งช test
|
|
740
|
+
artifacts: false
|
|
741
|
+
- job: 'app1 ๐งพ sbom | review '
|
|
742
|
+
artifacts: true
|
|
743
|
+
- job: app1 ๐ก audit
|
|
744
|
+
artifacts: false
|
|
745
|
+
retry: *a1
|
|
746
|
+
interruptible: true
|
|
747
|
+
allow_failure: false
|
|
748
|
+
'app1 ๐ Stop โ ๏ธ | review ':
|
|
749
|
+
stage: stop review
|
|
750
|
+
image: path/to/docker/gcloud:the-version
|
|
751
|
+
variables:
|
|
752
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
753
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
754
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
755
|
+
GIT_STRATEGY: none
|
|
756
|
+
script:
|
|
757
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
758
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
759
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
760
|
+
- set +e
|
|
761
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_review_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
762
|
+
- 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"; })-app1" | awk '{print tolower($0)}') --project=asdf --region=asia-east1
|
|
763
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -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
|
|
764
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
|
|
765
|
+
- set +e
|
|
766
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1 --quiet --delete-tags
|
|
767
|
+
- set -e
|
|
768
|
+
- echo 'Disabling component in Dependency Track'
|
|
769
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app1" "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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
|
|
770
|
+
- set -e
|
|
771
|
+
- 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
772
|
+
environment:
|
|
773
|
+
name: review/$CI_COMMIT_REF_NAME/app1
|
|
774
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
775
|
+
action: stop
|
|
776
|
+
artifacts:
|
|
777
|
+
reports:
|
|
778
|
+
dotenv: gitlab_environment.env
|
|
779
|
+
rules:
|
|
780
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
781
|
+
when: on_success
|
|
782
|
+
- when: manual
|
|
783
|
+
if: $CI_MERGE_REQUEST_ID
|
|
784
|
+
needs: []
|
|
785
|
+
retry: *a1
|
|
786
|
+
interruptible: true
|
|
787
|
+
allow_failure: true
|
|
788
|
+
'app1 ๐จ app | stage ':
|
|
789
|
+
stage: build
|
|
790
|
+
image: path/to/docker/jobs-default:the-version
|
|
791
|
+
variables:
|
|
792
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
793
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
794
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
795
|
+
script:
|
|
796
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
797
|
+
- export ENV_SHORT="stage"
|
|
798
|
+
- export APP_DIR="app1"
|
|
799
|
+
- export ENV_TYPE="stage"
|
|
800
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
801
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
802
|
+
- 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")"
|
|
803
|
+
- export HOST="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
804
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
805
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
806
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
807
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
808
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
809
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
810
|
+
- export SECRET1="$CL_stage_app1_SECRET1"
|
|
811
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey"
|
|
812
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix"
|
|
813
|
+
- export foo="foo-value"
|
|
814
|
+
- export bar="bar-value"
|
|
815
|
+
- 'export foo3="from app3: foo-value-3"'
|
|
816
|
+
- 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
|
|
817
|
+
- 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
|
|
818
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
819
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
|
|
820
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
821
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
822
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
823
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
824
|
+
- cd app1
|
|
825
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
826
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
827
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
828
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
829
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
830
|
+
- yarn install --immutable
|
|
831
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
832
|
+
- yarn build
|
|
833
|
+
cache:
|
|
834
|
+
- key: app1-yarn
|
|
835
|
+
policy: pull-push
|
|
836
|
+
paths:
|
|
837
|
+
- app1/.yarn
|
|
838
|
+
- key: app1-node-modules
|
|
839
|
+
policy: pull-push
|
|
840
|
+
paths:
|
|
841
|
+
- app1/node_modules
|
|
842
|
+
- key: app1-next-cache
|
|
843
|
+
policy: pull-push
|
|
844
|
+
paths:
|
|
845
|
+
- app1/.next/cache
|
|
846
|
+
artifacts:
|
|
847
|
+
paths:
|
|
848
|
+
- app1/__build_info.json
|
|
849
|
+
- app1/.next
|
|
850
|
+
- app1/dist
|
|
851
|
+
expire_in: 1 day
|
|
852
|
+
when: always
|
|
853
|
+
reports: {}
|
|
854
|
+
rules:
|
|
855
|
+
- if: $CI_COMMIT_TAG
|
|
856
|
+
needs: []
|
|
857
|
+
retry: *a1
|
|
858
|
+
interruptible: true
|
|
859
|
+
'app1 ๐จ docker | stage ':
|
|
860
|
+
stage: build
|
|
861
|
+
image: path/to/docker/docker-build:the-version
|
|
862
|
+
services:
|
|
863
|
+
- name: docker:24.0.6-dind
|
|
864
|
+
command:
|
|
865
|
+
- --tls=false
|
|
866
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
867
|
+
variables:
|
|
868
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
869
|
+
DOCKER_TLS_CERTDIR: ''
|
|
870
|
+
DOCKER_DRIVER: overlay2
|
|
871
|
+
DOCKER_BUILDKIT: '1'
|
|
872
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
873
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
874
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
875
|
+
script:
|
|
876
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
877
|
+
- export APP_DIR="app1"
|
|
878
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
879
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
880
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1"
|
|
881
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
|
|
882
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
883
|
+
- |-
|
|
884
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
885
|
+
RUN yarn plugin import workspace-tools
|
|
886
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
887
|
+
- |-
|
|
888
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app1/package.json /app/app1/package.json
|
|
889
|
+
COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
|
|
890
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
891
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
892
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
893
|
+
- ensureNodeDockerfile
|
|
894
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
895
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
896
|
+
- gcloud auth configure-docker asia-east1-docker.pkg.dev
|
|
897
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
898
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
899
|
+
- 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
|
|
900
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
901
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
902
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
903
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
904
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
905
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
906
|
+
cache:
|
|
907
|
+
- key: app1-yarn
|
|
908
|
+
policy: pull
|
|
909
|
+
paths:
|
|
910
|
+
- app1/.yarn
|
|
911
|
+
rules:
|
|
912
|
+
- if: $CI_COMMIT_TAG
|
|
913
|
+
needs:
|
|
914
|
+
- 'app1 ๐จ app | stage '
|
|
915
|
+
retry: *a1
|
|
916
|
+
interruptible: true
|
|
917
|
+
'app1 ๐งพ sbom | stage ':
|
|
918
|
+
stage: build
|
|
919
|
+
image: aquasec/trivy:0.38.3
|
|
920
|
+
variables: {}
|
|
921
|
+
script:
|
|
922
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
923
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
924
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
|
|
925
|
+
artifacts:
|
|
926
|
+
paths:
|
|
927
|
+
- __sbom.json
|
|
928
|
+
rules:
|
|
929
|
+
- if: $CI_COMMIT_TAG
|
|
930
|
+
needs: []
|
|
931
|
+
retry: *a1
|
|
932
|
+
interruptible: true
|
|
933
|
+
allow_failure: true
|
|
934
|
+
'app1 ๐ Deploy | stage ':
|
|
935
|
+
stage: deploy stage
|
|
936
|
+
image: path/to/docker/gcloud:the-version
|
|
937
|
+
variables:
|
|
938
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
939
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
940
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
941
|
+
script:
|
|
942
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
943
|
+
- export ENV_SHORT="stage"
|
|
944
|
+
- export APP_DIR="app1"
|
|
945
|
+
- export ENV_TYPE="stage"
|
|
946
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
947
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
948
|
+
- 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")"
|
|
949
|
+
- export HOST="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
950
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
951
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
952
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
953
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
954
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
955
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
956
|
+
- export SECRET1="$CL_stage_app1_SECRET1"
|
|
957
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey"
|
|
958
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix"
|
|
959
|
+
- export foo="foo-value"
|
|
960
|
+
- export bar="bar-value"
|
|
961
|
+
- 'export foo3="from app3: foo-value-3"'
|
|
962
|
+
- 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
|
|
963
|
+
- 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
|
|
964
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
965
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1"
|
|
966
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
|
|
967
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
968
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
969
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
970
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
|
|
971
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
972
|
+
- export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
|
|
973
|
+
- 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
|
|
974
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
|
|
975
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
|
|
976
|
+
- |
|
|
977
|
+
cat > ____envvars.yaml <<EOF
|
|
978
|
+
ENV_SHORT: |-
|
|
979
|
+
stage
|
|
980
|
+
APP_DIR: |-
|
|
981
|
+
app1
|
|
982
|
+
ENV_TYPE: |-
|
|
983
|
+
stage
|
|
984
|
+
BUILD_INFO_BUILD_ID: |-
|
|
985
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
986
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
987
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
988
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
989
|
+
$(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/^/ /')
|
|
990
|
+
HOST: |-
|
|
991
|
+
$(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
992
|
+
ROOT_URL: |-
|
|
993
|
+
$(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
994
|
+
HOST_INTERNAL: |-
|
|
995
|
+
$(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
996
|
+
HOST_CANONICAL: |-
|
|
997
|
+
$(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
998
|
+
ROOT_URL_INTERNAL: |-
|
|
999
|
+
$(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1000
|
+
DEPLOY_CLOUD_RUN_PROJECT_ID: |-
|
|
1001
|
+
asdf
|
|
1002
|
+
DEPLOY_CLOUD_RUN_REGION: |-
|
|
1003
|
+
asia-east1
|
|
1004
|
+
SECRET1: |-
|
|
1005
|
+
$(printf %s "$CL_stage_app1_SECRET1" | sed 's/^/ /')
|
|
1006
|
+
GCLOUD_RUN_canonicalHostSuffix: |-
|
|
1007
|
+
$(printf %s "$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
|
|
1008
|
+
foo: |-
|
|
1009
|
+
foo-value
|
|
1010
|
+
bar: |-
|
|
1011
|
+
bar-value
|
|
1012
|
+
foo3: |-
|
|
1013
|
+
from app3: foo-value-3
|
|
1014
|
+
circle: |-
|
|
1015
|
+
this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
|
|
1016
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
1017
|
+
["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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
|
|
1018
|
+
|
|
1019
|
+
EOF
|
|
1020
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
|
|
1021
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
|
|
1022
|
+
- gcloud run deploy pan-test-app-stage-app1 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app1,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-app1 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
|
|
1023
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
|
|
1024
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
|
|
1025
|
+
- gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-app1 --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
|
|
1026
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1 --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/app1@$version --quiet --delete-tags; done
|
|
1027
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
|
|
1028
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
|
|
1029
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
1030
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
|
|
1031
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
1032
|
+
environment:
|
|
1033
|
+
name: stage/app1
|
|
1034
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
1035
|
+
on_stop: 'app1 ๐ Stop โ ๏ธ | stage '
|
|
1036
|
+
artifacts:
|
|
1037
|
+
reports:
|
|
1038
|
+
dotenv: gitlab_environment.env
|
|
1039
|
+
rules:
|
|
1040
|
+
- when: on_success
|
|
1041
|
+
if: $CI_COMMIT_TAG
|
|
1042
|
+
needs:
|
|
1043
|
+
- job: 'app1 ๐จ app | stage '
|
|
1044
|
+
artifacts: false
|
|
1045
|
+
- job: 'app1 ๐จ docker | stage '
|
|
1046
|
+
artifacts: false
|
|
1047
|
+
- job: 'app1 ๐งพ sbom | stage '
|
|
1048
|
+
artifacts: true
|
|
1049
|
+
retry: *a1
|
|
1050
|
+
interruptible: true
|
|
1051
|
+
allow_failure: false
|
|
1052
|
+
'app1 ๐ Stop โ ๏ธ | stage ':
|
|
1053
|
+
stage: stop stage
|
|
1054
|
+
image: path/to/docker/gcloud:the-version
|
|
1055
|
+
variables:
|
|
1056
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1057
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1058
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1059
|
+
GIT_STRATEGY: none
|
|
1060
|
+
script:
|
|
1061
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1062
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
1063
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1064
|
+
- set +e
|
|
1065
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
1066
|
+
- gcloud run services delete pan-test-app-stage-app1 --project=asdf --region=asia-east1
|
|
1067
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1 --quiet --delete-tags
|
|
1068
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
|
|
1069
|
+
- echo 'Disabling component in Dependency Track'
|
|
1070
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app1" "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
|
|
1071
|
+
- set -e
|
|
1072
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
1073
|
+
environment:
|
|
1074
|
+
name: stage/app1
|
|
1075
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
1076
|
+
action: stop
|
|
1077
|
+
artifacts:
|
|
1078
|
+
reports:
|
|
1079
|
+
dotenv: gitlab_environment.env
|
|
1080
|
+
rules:
|
|
1081
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
1082
|
+
when: on_success
|
|
1083
|
+
- when: manual
|
|
1084
|
+
if: $CI_COMMIT_TAG
|
|
1085
|
+
needs: []
|
|
1086
|
+
retry: *a1
|
|
1087
|
+
interruptible: true
|
|
1088
|
+
allow_failure: true
|
|
1089
|
+
'app1 ๐จ app | prod ':
|
|
1090
|
+
stage: build
|
|
1091
|
+
image: path/to/docker/jobs-default:the-version
|
|
1092
|
+
variables:
|
|
1093
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1094
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1095
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1096
|
+
script:
|
|
1097
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1098
|
+
- export ENV_SHORT="prod"
|
|
1099
|
+
- export APP_DIR="app1"
|
|
1100
|
+
- export ENV_TYPE="prod"
|
|
1101
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1102
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1103
|
+
- 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")"
|
|
1104
|
+
- export HOST="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1105
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1106
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1107
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1108
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1109
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
1110
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
1111
|
+
- export SECRET1="$CL_prod_app1_SECRET1"
|
|
1112
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey"
|
|
1113
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix"
|
|
1114
|
+
- export foo="foo-value"
|
|
1115
|
+
- export bar="bar-value"
|
|
1116
|
+
- 'export foo3="from app3: foo-value-3"'
|
|
1117
|
+
- 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
|
|
1118
|
+
- 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
|
|
1119
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1120
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
|
|
1121
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
1122
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1123
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1124
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
1125
|
+
- cd app1
|
|
1126
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
1127
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1128
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1129
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
1130
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
1131
|
+
- yarn install --immutable
|
|
1132
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
1133
|
+
- yarn build
|
|
1134
|
+
cache:
|
|
1135
|
+
- key: app1-yarn
|
|
1136
|
+
policy: pull-push
|
|
1137
|
+
paths:
|
|
1138
|
+
- app1/.yarn
|
|
1139
|
+
- key: app1-node-modules
|
|
1140
|
+
policy: pull-push
|
|
1141
|
+
paths:
|
|
1142
|
+
- app1/node_modules
|
|
1143
|
+
- key: app1-next-cache
|
|
1144
|
+
policy: pull-push
|
|
1145
|
+
paths:
|
|
1146
|
+
- app1/.next/cache
|
|
1147
|
+
artifacts:
|
|
1148
|
+
paths:
|
|
1149
|
+
- app1/__build_info.json
|
|
1150
|
+
- app1/.next
|
|
1151
|
+
- app1/dist
|
|
1152
|
+
expire_in: 1 day
|
|
1153
|
+
when: always
|
|
1154
|
+
reports: {}
|
|
1155
|
+
rules:
|
|
1156
|
+
- if: $CI_COMMIT_TAG
|
|
1157
|
+
needs: []
|
|
1158
|
+
retry: *a1
|
|
1159
|
+
interruptible: true
|
|
1160
|
+
'app1 ๐จ docker | prod ':
|
|
1161
|
+
stage: build
|
|
1162
|
+
image: path/to/docker/docker-build:the-version
|
|
1163
|
+
services:
|
|
1164
|
+
- name: docker:24.0.6-dind
|
|
1165
|
+
command:
|
|
1166
|
+
- --tls=false
|
|
1167
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
1168
|
+
variables:
|
|
1169
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
1170
|
+
DOCKER_TLS_CERTDIR: ''
|
|
1171
|
+
DOCKER_DRIVER: overlay2
|
|
1172
|
+
DOCKER_BUILDKIT: '1'
|
|
1173
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1174
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1175
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
1176
|
+
script:
|
|
1177
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1178
|
+
- export APP_DIR="app1"
|
|
1179
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
1180
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
1181
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1"
|
|
1182
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
|
|
1183
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1184
|
+
- |-
|
|
1185
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
1186
|
+
RUN yarn plugin import workspace-tools
|
|
1187
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
1188
|
+
- |-
|
|
1189
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app1/package.json /app/app1/package.json
|
|
1190
|
+
COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
|
|
1191
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
1192
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
1193
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1194
|
+
- ensureNodeDockerfile
|
|
1195
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
1196
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
1197
|
+
- gcloud auth configure-docker asia-east1-docker.pkg.dev
|
|
1198
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
1199
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
1200
|
+
- 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
|
|
1201
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
1202
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
1203
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
1204
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
1205
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
1206
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
1207
|
+
cache:
|
|
1208
|
+
- key: app1-yarn
|
|
1209
|
+
policy: pull
|
|
1210
|
+
paths:
|
|
1211
|
+
- app1/.yarn
|
|
1212
|
+
rules:
|
|
1213
|
+
- if: $CI_COMMIT_TAG
|
|
1214
|
+
needs:
|
|
1215
|
+
- 'app1 ๐จ app | prod '
|
|
1216
|
+
retry: *a1
|
|
1217
|
+
interruptible: true
|
|
1218
|
+
'app1 ๐งพ sbom | prod ':
|
|
1219
|
+
stage: build
|
|
1220
|
+
image: aquasec/trivy:0.38.3
|
|
1221
|
+
variables: {}
|
|
1222
|
+
script:
|
|
1223
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1224
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1225
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
|
|
1226
|
+
artifacts:
|
|
1227
|
+
paths:
|
|
1228
|
+
- __sbom.json
|
|
1229
|
+
rules:
|
|
1230
|
+
- if: $CI_COMMIT_TAG
|
|
1231
|
+
needs: []
|
|
1232
|
+
retry: *a1
|
|
1233
|
+
interruptible: true
|
|
1234
|
+
allow_failure: true
|
|
1235
|
+
'app1 ๐ Deploy | prod ':
|
|
1236
|
+
stage: deploy prod
|
|
1237
|
+
image: path/to/docker/gcloud:the-version
|
|
1238
|
+
variables:
|
|
1239
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1240
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1241
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1242
|
+
script:
|
|
1243
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1244
|
+
- export ENV_SHORT="prod"
|
|
1245
|
+
- export APP_DIR="app1"
|
|
1246
|
+
- export ENV_TYPE="prod"
|
|
1247
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1248
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1249
|
+
- 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")"
|
|
1250
|
+
- export HOST="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1251
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1252
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1253
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1254
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1255
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
1256
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
1257
|
+
- export SECRET1="$CL_prod_app1_SECRET1"
|
|
1258
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey"
|
|
1259
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix"
|
|
1260
|
+
- export foo="foo-value"
|
|
1261
|
+
- export bar="bar-value"
|
|
1262
|
+
- 'export foo3="from app3: foo-value-3"'
|
|
1263
|
+
- 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
|
|
1264
|
+
- export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
|
|
1265
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
1266
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1"
|
|
1267
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
|
|
1268
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1269
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
1270
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1271
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
|
|
1272
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
1273
|
+
- export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
|
|
1274
|
+
- 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
|
|
1275
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
|
|
1276
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
|
|
1277
|
+
- |
|
|
1278
|
+
cat > ____envvars.yaml <<EOF
|
|
1279
|
+
ENV_SHORT: |-
|
|
1280
|
+
prod
|
|
1281
|
+
APP_DIR: |-
|
|
1282
|
+
app1
|
|
1283
|
+
ENV_TYPE: |-
|
|
1284
|
+
prod
|
|
1285
|
+
BUILD_INFO_BUILD_ID: |-
|
|
1286
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
1287
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
1288
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
1289
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
1290
|
+
$(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/^/ /')
|
|
1291
|
+
HOST: |-
|
|
1292
|
+
$(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1293
|
+
ROOT_URL: |-
|
|
1294
|
+
$(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1295
|
+
HOST_INTERNAL: |-
|
|
1296
|
+
$(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1297
|
+
HOST_CANONICAL: |-
|
|
1298
|
+
$(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1299
|
+
ROOT_URL_INTERNAL: |-
|
|
1300
|
+
$(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1301
|
+
DEPLOY_CLOUD_RUN_PROJECT_ID: |-
|
|
1302
|
+
asdf
|
|
1303
|
+
DEPLOY_CLOUD_RUN_REGION: |-
|
|
1304
|
+
asia-east1
|
|
1305
|
+
SECRET1: |-
|
|
1306
|
+
$(printf %s "$CL_prod_app1_SECRET1" | sed 's/^/ /')
|
|
1307
|
+
GCLOUD_RUN_canonicalHostSuffix: |-
|
|
1308
|
+
$(printf %s "$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
|
|
1309
|
+
foo: |-
|
|
1310
|
+
foo-value
|
|
1311
|
+
bar: |-
|
|
1312
|
+
bar-value
|
|
1313
|
+
foo3: |-
|
|
1314
|
+
from app3: foo-value-3
|
|
1315
|
+
circle: |-
|
|
1316
|
+
this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
|
|
1317
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
1318
|
+
["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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
|
|
1319
|
+
|
|
1320
|
+
EOF
|
|
1321
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
|
|
1322
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
|
|
1323
|
+
- gcloud run deploy pan-test-app-prod-app1 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app1,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-app1 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
|
|
1324
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
|
|
1325
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
|
|
1326
|
+
- gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-app1 --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
|
|
1327
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1 --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/app1@$version --quiet --delete-tags; done
|
|
1328
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
|
|
1329
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
|
|
1330
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
1331
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
|
|
1332
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
1333
|
+
environment:
|
|
1334
|
+
name: prod/app1
|
|
1335
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
1336
|
+
on_stop: 'app1 ๐ Stop โ ๏ธ | prod '
|
|
1337
|
+
artifacts:
|
|
1338
|
+
reports:
|
|
1339
|
+
dotenv: gitlab_environment.env
|
|
1340
|
+
rules:
|
|
1341
|
+
- when: manual
|
|
1342
|
+
if: $CI_COMMIT_TAG
|
|
1343
|
+
needs:
|
|
1344
|
+
- job: 'app1 ๐จ app | prod '
|
|
1345
|
+
artifacts: false
|
|
1346
|
+
- job: 'app1 ๐จ docker | prod '
|
|
1347
|
+
artifacts: false
|
|
1348
|
+
- job: 'app1 ๐งพ sbom | prod '
|
|
1349
|
+
artifacts: true
|
|
1350
|
+
retry: *a1
|
|
1351
|
+
interruptible: true
|
|
1352
|
+
allow_failure: true
|
|
1353
|
+
'app1 ๐ Stop โ ๏ธ | prod ':
|
|
1354
|
+
stage: stop prod
|
|
1355
|
+
image: path/to/docker/gcloud:the-version
|
|
1356
|
+
variables:
|
|
1357
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1358
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1359
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1360
|
+
GIT_STRATEGY: none
|
|
1361
|
+
script:
|
|
1362
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1363
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
1364
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1365
|
+
- set +e
|
|
1366
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey")
|
|
1367
|
+
- gcloud run services delete pan-test-app-prod-app1 --project=asdf --region=asia-east1
|
|
1368
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1 --quiet --delete-tags
|
|
1369
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --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/app1@$version --quiet --delete-tags; done
|
|
1370
|
+
- echo 'Disabling component in Dependency Track'
|
|
1371
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app1" "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
|
|
1372
|
+
- set -e
|
|
1373
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
1374
|
+
environment:
|
|
1375
|
+
name: prod/app1
|
|
1376
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
1377
|
+
action: stop
|
|
1378
|
+
artifacts:
|
|
1379
|
+
reports:
|
|
1380
|
+
dotenv: gitlab_environment.env
|
|
1381
|
+
rules:
|
|
1382
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
1383
|
+
when: on_success
|
|
1384
|
+
- when: manual
|
|
1385
|
+
if: $CI_COMMIT_TAG
|
|
1386
|
+
needs: []
|
|
1387
|
+
retry: *a1
|
|
1388
|
+
interruptible: true
|
|
1389
|
+
allow_failure: true
|
|
1390
|
+
app2 ๐ก audit:
|
|
1391
|
+
stage: test
|
|
1392
|
+
image: path/to/docker/jobs-default:the-version
|
|
1393
|
+
variables:
|
|
1394
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1395
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1396
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1397
|
+
script:
|
|
1398
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1399
|
+
- export APP_PATH="app2"
|
|
1400
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1401
|
+
- cd app2
|
|
1402
|
+
- yarn npm audit --environment production
|
|
1403
|
+
rules:
|
|
1404
|
+
- when: never
|
|
1405
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
1406
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
1407
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
1408
|
+
needs: []
|
|
1409
|
+
retry: *a1
|
|
1410
|
+
interruptible: true
|
|
1411
|
+
allow_failure: true
|
|
1412
|
+
app2 ๐ฎ lint:
|
|
1413
|
+
stage: test
|
|
1414
|
+
image: path/to/docker/jobs-default:the-version
|
|
1415
|
+
variables:
|
|
1416
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1417
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1418
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1419
|
+
script:
|
|
1420
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1421
|
+
- export APP_PATH="app2"
|
|
1422
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1423
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
1424
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1425
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1426
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
1427
|
+
- cd app2
|
|
1428
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
1429
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1430
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1431
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
1432
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
1433
|
+
- yarn install --immutable
|
|
1434
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
1435
|
+
- yarn lint
|
|
1436
|
+
cache:
|
|
1437
|
+
- key: app2-yarn
|
|
1438
|
+
policy: pull-push
|
|
1439
|
+
paths:
|
|
1440
|
+
- app2/.yarn
|
|
1441
|
+
- key: app2-node-modules
|
|
1442
|
+
policy: pull-push
|
|
1443
|
+
paths:
|
|
1444
|
+
- app2/node_modules
|
|
1445
|
+
rules:
|
|
1446
|
+
- when: never
|
|
1447
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
1448
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
1449
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
1450
|
+
needs: []
|
|
1451
|
+
retry: *a1
|
|
1452
|
+
interruptible: true
|
|
1453
|
+
app2 ๐งช test:
|
|
1454
|
+
stage: test
|
|
1455
|
+
image: path/to/docker/jobs-testing-chrome:the-version
|
|
1456
|
+
variables:
|
|
1457
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1458
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1459
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1460
|
+
script:
|
|
1461
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1462
|
+
- export APP_PATH="app2"
|
|
1463
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1464
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
1465
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1466
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1467
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
1468
|
+
- cd app2
|
|
1469
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
1470
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1471
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1472
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
1473
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
1474
|
+
- yarn install --immutable
|
|
1475
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
1476
|
+
- yarn test
|
|
1477
|
+
cache:
|
|
1478
|
+
- key: app2-yarn
|
|
1479
|
+
policy: pull-push
|
|
1480
|
+
paths:
|
|
1481
|
+
- app2/.yarn
|
|
1482
|
+
- key: app2-node-modules
|
|
1483
|
+
policy: pull-push
|
|
1484
|
+
paths:
|
|
1485
|
+
- app2/node_modules
|
|
1486
|
+
rules:
|
|
1487
|
+
- when: never
|
|
1488
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
1489
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
1490
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
1491
|
+
needs: []
|
|
1492
|
+
retry: *a1
|
|
1493
|
+
interruptible: true
|
|
1494
|
+
'app2 ๐จ app | dev ':
|
|
1495
|
+
stage: build
|
|
1496
|
+
image: path/to/docker/jobs-default:the-version
|
|
1497
|
+
variables:
|
|
1498
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1499
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1500
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1501
|
+
script:
|
|
1502
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1503
|
+
- export ENV_SHORT="dev"
|
|
1504
|
+
- export APP_DIR="app2"
|
|
1505
|
+
- export ENV_TYPE="dev"
|
|
1506
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1507
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1508
|
+
- 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")"
|
|
1509
|
+
- export HOST="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1510
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1511
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1512
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1513
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1514
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
1515
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
1516
|
+
- export SECRET2="$CL_dev_app2_SECRET2"
|
|
1517
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey"
|
|
1518
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix"
|
|
1519
|
+
- export foo2="foo-value-2"
|
|
1520
|
+
- 'export referencingSecret="secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
|
|
1521
|
+
- 'export foo1="this is from app1: foo-value"'
|
|
1522
|
+
- 'export selfReference="this is from self: foo-value-2"'
|
|
1523
|
+
- 'export selfReference2="this is from self: this is from app1: foo-value"'
|
|
1524
|
+
- export app1Api="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
|
|
1525
|
+
- 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
|
|
1526
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1527
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
|
|
1528
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
1529
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1530
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1531
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
1532
|
+
- cd app2
|
|
1533
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
1534
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1535
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1536
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
1537
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
1538
|
+
- yarn install --immutable
|
|
1539
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
1540
|
+
- yarn build
|
|
1541
|
+
cache:
|
|
1542
|
+
- key: app2-yarn
|
|
1543
|
+
policy: pull-push
|
|
1544
|
+
paths:
|
|
1545
|
+
- app2/.yarn
|
|
1546
|
+
- key: app2-node-modules
|
|
1547
|
+
policy: pull-push
|
|
1548
|
+
paths:
|
|
1549
|
+
- app2/node_modules
|
|
1550
|
+
- key: app2-next-cache
|
|
1551
|
+
policy: pull-push
|
|
1552
|
+
paths:
|
|
1553
|
+
- app2/.next/cache
|
|
1554
|
+
artifacts:
|
|
1555
|
+
paths:
|
|
1556
|
+
- app2/__build_info.json
|
|
1557
|
+
- app2/.next
|
|
1558
|
+
- app2/dist
|
|
1559
|
+
expire_in: 1 day
|
|
1560
|
+
when: always
|
|
1561
|
+
reports: {}
|
|
1562
|
+
rules:
|
|
1563
|
+
- when: never
|
|
1564
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
1565
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
1566
|
+
needs: []
|
|
1567
|
+
retry: *a1
|
|
1568
|
+
interruptible: true
|
|
1569
|
+
'app2 ๐จ docker | dev ':
|
|
1570
|
+
stage: build
|
|
1571
|
+
image: path/to/docker/docker-build:the-version
|
|
1572
|
+
services:
|
|
1573
|
+
- name: docker:24.0.6-dind
|
|
1574
|
+
command:
|
|
1575
|
+
- --tls=false
|
|
1576
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
1577
|
+
variables:
|
|
1578
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
1579
|
+
DOCKER_TLS_CERTDIR: ''
|
|
1580
|
+
DOCKER_DRIVER: overlay2
|
|
1581
|
+
DOCKER_BUILDKIT: '1'
|
|
1582
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1583
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1584
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
1585
|
+
script:
|
|
1586
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1587
|
+
- export APP_DIR="app2"
|
|
1588
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
1589
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
1590
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2"
|
|
1591
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
|
|
1592
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1593
|
+
- |-
|
|
1594
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
1595
|
+
RUN yarn plugin import workspace-tools
|
|
1596
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
1597
|
+
- |-
|
|
1598
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app2/package.json /app/app2/package.json
|
|
1599
|
+
COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
|
|
1600
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
1601
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
1602
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1603
|
+
- ensureNodeDockerfile
|
|
1604
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
1605
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
1606
|
+
- gcloud auth configure-docker asia-east1-docker.pkg.dev
|
|
1607
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
1608
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
1609
|
+
- 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
|
|
1610
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
1611
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
1612
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
1613
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
1614
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
1615
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
1616
|
+
cache:
|
|
1617
|
+
- key: app2-yarn
|
|
1618
|
+
policy: pull
|
|
1619
|
+
paths:
|
|
1620
|
+
- app2/.yarn
|
|
1621
|
+
rules:
|
|
1622
|
+
- when: never
|
|
1623
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
1624
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
1625
|
+
needs:
|
|
1626
|
+
- 'app2 ๐จ app | dev '
|
|
1627
|
+
retry: *a1
|
|
1628
|
+
interruptible: true
|
|
1629
|
+
'app2 ๐งพ sbom | dev ':
|
|
1630
|
+
stage: build
|
|
1631
|
+
image: aquasec/trivy:0.38.3
|
|
1632
|
+
variables: {}
|
|
1633
|
+
script:
|
|
1634
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1635
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1636
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
|
|
1637
|
+
artifacts:
|
|
1638
|
+
paths:
|
|
1639
|
+
- __sbom.json
|
|
1640
|
+
rules:
|
|
1641
|
+
- when: never
|
|
1642
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
1643
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
1644
|
+
needs: []
|
|
1645
|
+
retry: *a1
|
|
1646
|
+
interruptible: true
|
|
1647
|
+
allow_failure: true
|
|
1648
|
+
'app2 ๐ Deploy | dev ':
|
|
1649
|
+
stage: deploy dev
|
|
1650
|
+
image: path/to/docker/gcloud:the-version
|
|
1651
|
+
variables:
|
|
1652
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1653
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1654
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1655
|
+
script:
|
|
1656
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1657
|
+
- export ENV_SHORT="dev"
|
|
1658
|
+
- export APP_DIR="app2"
|
|
1659
|
+
- export ENV_TYPE="dev"
|
|
1660
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1661
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1662
|
+
- 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")"
|
|
1663
|
+
- export HOST="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1664
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1665
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1666
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1667
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1668
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
1669
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
1670
|
+
- export SECRET2="$CL_dev_app2_SECRET2"
|
|
1671
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey"
|
|
1672
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix"
|
|
1673
|
+
- export foo2="foo-value-2"
|
|
1674
|
+
- 'export referencingSecret="secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
|
|
1675
|
+
- 'export foo1="this is from app1: foo-value"'
|
|
1676
|
+
- 'export selfReference="this is from self: foo-value-2"'
|
|
1677
|
+
- 'export selfReference2="this is from self: this is from app1: foo-value"'
|
|
1678
|
+
- export app1Api="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
|
|
1679
|
+
- 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
|
|
1680
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
1681
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2"
|
|
1682
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
|
|
1683
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1684
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
1685
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1686
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
|
|
1687
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
1688
|
+
- export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
|
|
1689
|
+
- 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
|
|
1690
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
|
|
1691
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
|
|
1692
|
+
- |
|
|
1693
|
+
cat > ____envvars.yaml <<EOF
|
|
1694
|
+
ENV_SHORT: |-
|
|
1695
|
+
dev
|
|
1696
|
+
APP_DIR: |-
|
|
1697
|
+
app2
|
|
1698
|
+
ENV_TYPE: |-
|
|
1699
|
+
dev
|
|
1700
|
+
BUILD_INFO_BUILD_ID: |-
|
|
1701
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
1702
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
1703
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
1704
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
1705
|
+
$(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/^/ /')
|
|
1706
|
+
HOST: |-
|
|
1707
|
+
$(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1708
|
+
ROOT_URL: |-
|
|
1709
|
+
$(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1710
|
+
HOST_INTERNAL: |-
|
|
1711
|
+
$(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1712
|
+
HOST_CANONICAL: |-
|
|
1713
|
+
$(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1714
|
+
ROOT_URL_INTERNAL: |-
|
|
1715
|
+
$(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
1716
|
+
DEPLOY_CLOUD_RUN_PROJECT_ID: |-
|
|
1717
|
+
asdf
|
|
1718
|
+
DEPLOY_CLOUD_RUN_REGION: |-
|
|
1719
|
+
asia-east1
|
|
1720
|
+
SECRET2: |-
|
|
1721
|
+
$(printf %s "$CL_dev_app2_SECRET2" | sed 's/^/ /')
|
|
1722
|
+
GCLOUD_RUN_canonicalHostSuffix: |-
|
|
1723
|
+
$(printf %s "$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
|
|
1724
|
+
foo2: |-
|
|
1725
|
+
foo-value-2
|
|
1726
|
+
referencingSecret: |-
|
|
1727
|
+
$(printf %s "secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2" | sed 's/^/ /')
|
|
1728
|
+
foo1: |-
|
|
1729
|
+
this is from app1: foo-value
|
|
1730
|
+
selfReference: |-
|
|
1731
|
+
this is from self: foo-value-2
|
|
1732
|
+
selfReference2: |-
|
|
1733
|
+
this is from self: this is from app1: foo-value
|
|
1734
|
+
app1Api: |-
|
|
1735
|
+
$(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
|
|
1736
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
1737
|
+
["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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
|
|
1738
|
+
|
|
1739
|
+
EOF
|
|
1740
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
|
|
1741
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
|
|
1742
|
+
- gcloud run deploy pan-test-app-dev-app2 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app2,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-app2 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
|
|
1743
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
|
|
1744
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
|
|
1745
|
+
- gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-app2 --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
|
|
1746
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2 --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/app2@$version --quiet --delete-tags; done
|
|
1747
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
|
|
1748
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
|
|
1749
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
1750
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
|
|
1751
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
1752
|
+
environment:
|
|
1753
|
+
name: dev/app2
|
|
1754
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
1755
|
+
on_stop: 'app2 ๐ Stop โ ๏ธ | dev '
|
|
1756
|
+
auto_stop_in: 4 weeks
|
|
1757
|
+
artifacts:
|
|
1758
|
+
reports:
|
|
1759
|
+
dotenv: gitlab_environment.env
|
|
1760
|
+
rules:
|
|
1761
|
+
- when: never
|
|
1762
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
1763
|
+
- when: on_success
|
|
1764
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
1765
|
+
needs:
|
|
1766
|
+
- job: app2 ๐ฎ lint
|
|
1767
|
+
artifacts: false
|
|
1768
|
+
- job: 'app2 ๐จ app | dev '
|
|
1769
|
+
artifacts: false
|
|
1770
|
+
- job: 'app2 ๐จ docker | dev '
|
|
1771
|
+
artifacts: false
|
|
1772
|
+
- job: app2 ๐งช test
|
|
1773
|
+
artifacts: false
|
|
1774
|
+
- job: 'app2 ๐งพ sbom | dev '
|
|
1775
|
+
artifacts: true
|
|
1776
|
+
- job: app2 ๐ก audit
|
|
1777
|
+
artifacts: false
|
|
1778
|
+
retry: *a1
|
|
1779
|
+
interruptible: true
|
|
1780
|
+
allow_failure: false
|
|
1781
|
+
'app2 ๐ Stop โ ๏ธ | dev ':
|
|
1782
|
+
stage: stop dev
|
|
1783
|
+
image: path/to/docker/gcloud:the-version
|
|
1784
|
+
variables:
|
|
1785
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1786
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1787
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1788
|
+
GIT_STRATEGY: none
|
|
1789
|
+
script:
|
|
1790
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1791
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
1792
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1793
|
+
- set +e
|
|
1794
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
1795
|
+
- gcloud run services delete pan-test-app-dev-app2 --project=asdf --region=asia-east1
|
|
1796
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2 --quiet --delete-tags
|
|
1797
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
|
|
1798
|
+
- echo 'Disabling component in Dependency Track'
|
|
1799
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app2" "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
|
|
1800
|
+
- set -e
|
|
1801
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
1802
|
+
environment:
|
|
1803
|
+
name: dev/app2
|
|
1804
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
1805
|
+
action: stop
|
|
1806
|
+
artifacts:
|
|
1807
|
+
reports:
|
|
1808
|
+
dotenv: gitlab_environment.env
|
|
1809
|
+
rules:
|
|
1810
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
1811
|
+
when: on_success
|
|
1812
|
+
- when: never
|
|
1813
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
1814
|
+
- when: manual
|
|
1815
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
1816
|
+
needs: []
|
|
1817
|
+
retry: *a1
|
|
1818
|
+
interruptible: true
|
|
1819
|
+
allow_failure: true
|
|
1820
|
+
'app2 ๐จ app | review ':
|
|
1821
|
+
stage: build
|
|
1822
|
+
image: path/to/docker/jobs-default:the-version
|
|
1823
|
+
variables:
|
|
1824
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1825
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1826
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
1827
|
+
script:
|
|
1828
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1829
|
+
- export ENV_SHORT="review"
|
|
1830
|
+
- export APP_DIR="app2"
|
|
1831
|
+
- export ENV_TYPE="review"
|
|
1832
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1833
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1834
|
+
- 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")"
|
|
1835
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1836
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1837
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1838
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1839
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1840
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
1841
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
1842
|
+
- export SECRET2="$CL_review_app2_SECRET2"
|
|
1843
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_review_app2_GCLOUD_DEPLOY_credentialsKey"
|
|
1844
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix"
|
|
1845
|
+
- export foo2="foo-value-2"
|
|
1846
|
+
- 'export referencingSecret="secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
|
|
1847
|
+
- 'export foo1="this is from app1: foo-value"'
|
|
1848
|
+
- 'export selfReference="this is from self: foo-value-2"'
|
|
1849
|
+
- 'export selfReference2="this is from self: this is from app1: foo-value"'
|
|
1850
|
+
- export app1Api="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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
|
|
1851
|
+
- 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
|
|
1852
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1853
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
|
|
1854
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
1855
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1856
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1857
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
1858
|
+
- cd app2
|
|
1859
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
1860
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
1861
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
1862
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
1863
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
1864
|
+
- yarn install --immutable
|
|
1865
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
1866
|
+
- yarn build
|
|
1867
|
+
cache:
|
|
1868
|
+
- key: app2-yarn
|
|
1869
|
+
policy: pull-push
|
|
1870
|
+
paths:
|
|
1871
|
+
- app2/.yarn
|
|
1872
|
+
- key: app2-node-modules
|
|
1873
|
+
policy: pull-push
|
|
1874
|
+
paths:
|
|
1875
|
+
- app2/node_modules
|
|
1876
|
+
- key: app2-next-cache
|
|
1877
|
+
policy: pull-push
|
|
1878
|
+
paths:
|
|
1879
|
+
- app2/.next/cache
|
|
1880
|
+
artifacts:
|
|
1881
|
+
paths:
|
|
1882
|
+
- app2/__build_info.json
|
|
1883
|
+
- app2/.next
|
|
1884
|
+
- app2/dist
|
|
1885
|
+
expire_in: 1 day
|
|
1886
|
+
when: always
|
|
1887
|
+
reports: {}
|
|
1888
|
+
rules:
|
|
1889
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
1890
|
+
needs: []
|
|
1891
|
+
retry: *a1
|
|
1892
|
+
interruptible: true
|
|
1893
|
+
'app2 ๐จ docker | review ':
|
|
1894
|
+
stage: build
|
|
1895
|
+
image: path/to/docker/docker-build:the-version
|
|
1896
|
+
services:
|
|
1897
|
+
- name: docker:24.0.6-dind
|
|
1898
|
+
command:
|
|
1899
|
+
- --tls=false
|
|
1900
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
1901
|
+
variables:
|
|
1902
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
1903
|
+
DOCKER_TLS_CERTDIR: ''
|
|
1904
|
+
DOCKER_DRIVER: overlay2
|
|
1905
|
+
DOCKER_BUILDKIT: '1'
|
|
1906
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
1907
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
1908
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
1909
|
+
script:
|
|
1910
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1911
|
+
- export APP_DIR="app2"
|
|
1912
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
1913
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
1914
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
|
|
1915
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
|
|
1916
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
1917
|
+
- |-
|
|
1918
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
1919
|
+
RUN yarn plugin import workspace-tools
|
|
1920
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
1921
|
+
- |-
|
|
1922
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app2/package.json /app/app2/package.json
|
|
1923
|
+
COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
|
|
1924
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
1925
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
1926
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1927
|
+
- ensureNodeDockerfile
|
|
1928
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
1929
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_review_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
1930
|
+
- gcloud auth configure-docker asia-east1-docker.pkg.dev
|
|
1931
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
1932
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
1933
|
+
- 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
|
|
1934
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
1935
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
1936
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
1937
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
1938
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
1939
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
1940
|
+
cache:
|
|
1941
|
+
- key: app2-yarn
|
|
1942
|
+
policy: pull
|
|
1943
|
+
paths:
|
|
1944
|
+
- app2/.yarn
|
|
1945
|
+
rules:
|
|
1946
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
1947
|
+
needs:
|
|
1948
|
+
- 'app2 ๐จ app | review '
|
|
1949
|
+
retry: *a1
|
|
1950
|
+
interruptible: true
|
|
1951
|
+
'app2 ๐งพ sbom | review ':
|
|
1952
|
+
stage: build
|
|
1953
|
+
image: aquasec/trivy:0.38.3
|
|
1954
|
+
variables: {}
|
|
1955
|
+
script:
|
|
1956
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1957
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
1958
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
|
|
1959
|
+
artifacts:
|
|
1960
|
+
paths:
|
|
1961
|
+
- __sbom.json
|
|
1962
|
+
rules:
|
|
1963
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
1964
|
+
needs: []
|
|
1965
|
+
retry: *a1
|
|
1966
|
+
interruptible: true
|
|
1967
|
+
allow_failure: true
|
|
1968
|
+
'app2 ๐ Deploy | review ':
|
|
1969
|
+
stage: deploy review
|
|
1970
|
+
image: path/to/docker/gcloud:the-version
|
|
1971
|
+
variables:
|
|
1972
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
1973
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
1974
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
1975
|
+
script:
|
|
1976
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
1977
|
+
- export ENV_SHORT="review"
|
|
1978
|
+
- export APP_DIR="app2"
|
|
1979
|
+
- export ENV_TYPE="review"
|
|
1980
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
1981
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
1982
|
+
- 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")"
|
|
1983
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1984
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1985
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1986
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1987
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
1988
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
1989
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
1990
|
+
- export SECRET2="$CL_review_app2_SECRET2"
|
|
1991
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_review_app2_GCLOUD_DEPLOY_credentialsKey"
|
|
1992
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix"
|
|
1993
|
+
- export foo2="foo-value-2"
|
|
1994
|
+
- 'export referencingSecret="secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
|
|
1995
|
+
- 'export foo1="this is from app1: foo-value"'
|
|
1996
|
+
- 'export selfReference="this is from self: foo-value-2"'
|
|
1997
|
+
- 'export selfReference2="this is from self: this is from app1: foo-value"'
|
|
1998
|
+
- export app1Api="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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
|
|
1999
|
+
- 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
|
|
2000
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
2001
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
|
|
2002
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
|
|
2003
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2004
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
2005
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2006
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
|
|
2007
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_review_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
2008
|
+
- export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
|
|
2009
|
+
- 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
|
|
2010
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
|
|
2011
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
|
|
2012
|
+
- |
|
|
2013
|
+
cat > ____envvars.yaml <<EOF
|
|
2014
|
+
ENV_SHORT: |-
|
|
2015
|
+
review
|
|
2016
|
+
APP_DIR: |-
|
|
2017
|
+
app2
|
|
2018
|
+
ENV_TYPE: |-
|
|
2019
|
+
review
|
|
2020
|
+
BUILD_INFO_BUILD_ID: |-
|
|
2021
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
2022
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
2023
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
2024
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
2025
|
+
$(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/^/ /')
|
|
2026
|
+
HOST: |-
|
|
2027
|
+
$(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2028
|
+
ROOT_URL: |-
|
|
2029
|
+
$(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2030
|
+
HOST_INTERNAL: |-
|
|
2031
|
+
$(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2032
|
+
HOST_CANONICAL: |-
|
|
2033
|
+
$(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2034
|
+
ROOT_URL_INTERNAL: |-
|
|
2035
|
+
$(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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2036
|
+
DEPLOY_CLOUD_RUN_PROJECT_ID: |-
|
|
2037
|
+
asdf
|
|
2038
|
+
DEPLOY_CLOUD_RUN_REGION: |-
|
|
2039
|
+
asia-east1
|
|
2040
|
+
SECRET2: |-
|
|
2041
|
+
$(printf %s "$CL_review_app2_SECRET2" | sed 's/^/ /')
|
|
2042
|
+
GCLOUD_RUN_canonicalHostSuffix: |-
|
|
2043
|
+
$(printf %s "$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
|
|
2044
|
+
foo2: |-
|
|
2045
|
+
foo-value-2
|
|
2046
|
+
referencingSecret: |-
|
|
2047
|
+
$(printf %s "secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2" | sed 's/^/ /')
|
|
2048
|
+
foo1: |-
|
|
2049
|
+
this is from app1: foo-value
|
|
2050
|
+
selfReference: |-
|
|
2051
|
+
this is from self: foo-value-2
|
|
2052
|
+
selfReference2: |-
|
|
2053
|
+
this is from self: this is from app1: foo-value
|
|
2054
|
+
app1Api: |-
|
|
2055
|
+
$(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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
|
|
2056
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
2057
|
+
["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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
|
|
2058
|
+
|
|
2059
|
+
EOF
|
|
2060
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
|
|
2061
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
|
|
2062
|
+
- 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"; })-app2" | awk '{print tolower($0)}') --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -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=app2,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"; })-app2" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
|
|
2063
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
|
|
2064
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
|
|
2065
|
+
- 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"; })-app2" | 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
|
|
2066
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -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/app2/$([ -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
|
|
2067
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
|
|
2068
|
+
- set +e
|
|
2069
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2 --quiet --delete-tags
|
|
2070
|
+
- set -e
|
|
2071
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
|
|
2072
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
2073
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
|
|
2074
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
2075
|
+
environment:
|
|
2076
|
+
name: review/$CI_COMMIT_REF_NAME/app2
|
|
2077
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
2078
|
+
on_stop: 'app2 ๐ Stop โ ๏ธ | review '
|
|
2079
|
+
auto_stop_in: 1 week
|
|
2080
|
+
artifacts:
|
|
2081
|
+
reports:
|
|
2082
|
+
dotenv: gitlab_environment.env
|
|
2083
|
+
rules:
|
|
2084
|
+
- when: on_success
|
|
2085
|
+
if: $CI_MERGE_REQUEST_ID
|
|
2086
|
+
needs:
|
|
2087
|
+
- job: app2 ๐ฎ lint
|
|
2088
|
+
artifacts: false
|
|
2089
|
+
- job: 'app2 ๐จ app | review '
|
|
2090
|
+
artifacts: false
|
|
2091
|
+
- job: 'app2 ๐จ docker | review '
|
|
2092
|
+
artifacts: false
|
|
2093
|
+
- job: app2 ๐งช test
|
|
2094
|
+
artifacts: false
|
|
2095
|
+
- job: 'app2 ๐งพ sbom | review '
|
|
2096
|
+
artifacts: true
|
|
2097
|
+
- job: app2 ๐ก audit
|
|
2098
|
+
artifacts: false
|
|
2099
|
+
retry: *a1
|
|
2100
|
+
interruptible: true
|
|
2101
|
+
allow_failure: false
|
|
2102
|
+
'app2 ๐ Stop โ ๏ธ | review ':
|
|
2103
|
+
stage: stop review
|
|
2104
|
+
image: path/to/docker/gcloud:the-version
|
|
2105
|
+
variables:
|
|
2106
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2107
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2108
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2109
|
+
GIT_STRATEGY: none
|
|
2110
|
+
script:
|
|
2111
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2112
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
2113
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2114
|
+
- set +e
|
|
2115
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_review_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
2116
|
+
- 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"; })-app2" | awk '{print tolower($0)}') --project=asdf --region=asia-east1
|
|
2117
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -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
|
|
2118
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
|
|
2119
|
+
- set +e
|
|
2120
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2 --quiet --delete-tags
|
|
2121
|
+
- set -e
|
|
2122
|
+
- echo 'Disabling component in Dependency Track'
|
|
2123
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app2" "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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
|
|
2124
|
+
- set -e
|
|
2125
|
+
- 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
2126
|
+
environment:
|
|
2127
|
+
name: review/$CI_COMMIT_REF_NAME/app2
|
|
2128
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
2129
|
+
action: stop
|
|
2130
|
+
artifacts:
|
|
2131
|
+
reports:
|
|
2132
|
+
dotenv: gitlab_environment.env
|
|
2133
|
+
rules:
|
|
2134
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
2135
|
+
when: on_success
|
|
2136
|
+
- when: manual
|
|
2137
|
+
if: $CI_MERGE_REQUEST_ID
|
|
2138
|
+
needs: []
|
|
2139
|
+
retry: *a1
|
|
2140
|
+
interruptible: true
|
|
2141
|
+
allow_failure: true
|
|
2142
|
+
'app2 ๐จ app | stage ':
|
|
2143
|
+
stage: build
|
|
2144
|
+
image: path/to/docker/jobs-default:the-version
|
|
2145
|
+
variables:
|
|
2146
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2147
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2148
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
2149
|
+
script:
|
|
2150
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2151
|
+
- export ENV_SHORT="stage"
|
|
2152
|
+
- export APP_DIR="app2"
|
|
2153
|
+
- export ENV_TYPE="stage"
|
|
2154
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2155
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2156
|
+
- 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")"
|
|
2157
|
+
- export HOST="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2158
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2159
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2160
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2161
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2162
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
2163
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
2164
|
+
- export SECRET2="$CL_stage_app2_SECRET2"
|
|
2165
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey"
|
|
2166
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix"
|
|
2167
|
+
- export foo2="foo-value-2"
|
|
2168
|
+
- 'export referencingSecret="secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
|
|
2169
|
+
- 'export foo1="this is from app1: foo-value"'
|
|
2170
|
+
- 'export selfReference="this is from self: foo-value-2"'
|
|
2171
|
+
- 'export selfReference2="this is from self: this is from app1: foo-value"'
|
|
2172
|
+
- export app1Api="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
|
|
2173
|
+
- 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
|
|
2174
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2175
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
|
|
2176
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
2177
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2178
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2179
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
2180
|
+
- cd app2
|
|
2181
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
2182
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2183
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2184
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
2185
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
2186
|
+
- yarn install --immutable
|
|
2187
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
2188
|
+
- yarn build
|
|
2189
|
+
cache:
|
|
2190
|
+
- key: app2-yarn
|
|
2191
|
+
policy: pull-push
|
|
2192
|
+
paths:
|
|
2193
|
+
- app2/.yarn
|
|
2194
|
+
- key: app2-node-modules
|
|
2195
|
+
policy: pull-push
|
|
2196
|
+
paths:
|
|
2197
|
+
- app2/node_modules
|
|
2198
|
+
- key: app2-next-cache
|
|
2199
|
+
policy: pull-push
|
|
2200
|
+
paths:
|
|
2201
|
+
- app2/.next/cache
|
|
2202
|
+
artifacts:
|
|
2203
|
+
paths:
|
|
2204
|
+
- app2/__build_info.json
|
|
2205
|
+
- app2/.next
|
|
2206
|
+
- app2/dist
|
|
2207
|
+
expire_in: 1 day
|
|
2208
|
+
when: always
|
|
2209
|
+
reports: {}
|
|
2210
|
+
rules:
|
|
2211
|
+
- if: $CI_COMMIT_TAG
|
|
2212
|
+
needs: []
|
|
2213
|
+
retry: *a1
|
|
2214
|
+
interruptible: true
|
|
2215
|
+
'app2 ๐จ docker | stage ':
|
|
2216
|
+
stage: build
|
|
2217
|
+
image: path/to/docker/docker-build:the-version
|
|
2218
|
+
services:
|
|
2219
|
+
- name: docker:24.0.6-dind
|
|
2220
|
+
command:
|
|
2221
|
+
- --tls=false
|
|
2222
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
2223
|
+
variables:
|
|
2224
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
2225
|
+
DOCKER_TLS_CERTDIR: ''
|
|
2226
|
+
DOCKER_DRIVER: overlay2
|
|
2227
|
+
DOCKER_BUILDKIT: '1'
|
|
2228
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2229
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2230
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
2231
|
+
script:
|
|
2232
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2233
|
+
- export APP_DIR="app2"
|
|
2234
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
2235
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
2236
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2"
|
|
2237
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
|
|
2238
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2239
|
+
- |-
|
|
2240
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
2241
|
+
RUN yarn plugin import workspace-tools
|
|
2242
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
2243
|
+
- |-
|
|
2244
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app2/package.json /app/app2/package.json
|
|
2245
|
+
COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
|
|
2246
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
2247
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
2248
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2249
|
+
- ensureNodeDockerfile
|
|
2250
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
2251
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
2252
|
+
- gcloud auth configure-docker asia-east1-docker.pkg.dev
|
|
2253
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
2254
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
2255
|
+
- 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
|
|
2256
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
2257
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
2258
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
2259
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
2260
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
2261
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
2262
|
+
cache:
|
|
2263
|
+
- key: app2-yarn
|
|
2264
|
+
policy: pull
|
|
2265
|
+
paths:
|
|
2266
|
+
- app2/.yarn
|
|
2267
|
+
rules:
|
|
2268
|
+
- if: $CI_COMMIT_TAG
|
|
2269
|
+
needs:
|
|
2270
|
+
- 'app2 ๐จ app | stage '
|
|
2271
|
+
retry: *a1
|
|
2272
|
+
interruptible: true
|
|
2273
|
+
'app2 ๐งพ sbom | stage ':
|
|
2274
|
+
stage: build
|
|
2275
|
+
image: aquasec/trivy:0.38.3
|
|
2276
|
+
variables: {}
|
|
2277
|
+
script:
|
|
2278
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2279
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2280
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
|
|
2281
|
+
artifacts:
|
|
2282
|
+
paths:
|
|
2283
|
+
- __sbom.json
|
|
2284
|
+
rules:
|
|
2285
|
+
- if: $CI_COMMIT_TAG
|
|
2286
|
+
needs: []
|
|
2287
|
+
retry: *a1
|
|
2288
|
+
interruptible: true
|
|
2289
|
+
allow_failure: true
|
|
2290
|
+
'app2 ๐ Deploy | stage ':
|
|
2291
|
+
stage: deploy stage
|
|
2292
|
+
image: path/to/docker/gcloud:the-version
|
|
2293
|
+
variables:
|
|
2294
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2295
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2296
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2297
|
+
script:
|
|
2298
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2299
|
+
- export ENV_SHORT="stage"
|
|
2300
|
+
- export APP_DIR="app2"
|
|
2301
|
+
- export ENV_TYPE="stage"
|
|
2302
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2303
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2304
|
+
- 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")"
|
|
2305
|
+
- export HOST="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2306
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2307
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2308
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2309
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2310
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
2311
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
2312
|
+
- export SECRET2="$CL_stage_app2_SECRET2"
|
|
2313
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey"
|
|
2314
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix"
|
|
2315
|
+
- export foo2="foo-value-2"
|
|
2316
|
+
- 'export referencingSecret="secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
|
|
2317
|
+
- 'export foo1="this is from app1: foo-value"'
|
|
2318
|
+
- 'export selfReference="this is from self: foo-value-2"'
|
|
2319
|
+
- 'export selfReference2="this is from self: this is from app1: foo-value"'
|
|
2320
|
+
- export app1Api="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
|
|
2321
|
+
- 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
|
|
2322
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
2323
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2"
|
|
2324
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
|
|
2325
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2326
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
2327
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2328
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
|
|
2329
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
2330
|
+
- export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
|
|
2331
|
+
- 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
|
|
2332
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
|
|
2333
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
|
|
2334
|
+
- |
|
|
2335
|
+
cat > ____envvars.yaml <<EOF
|
|
2336
|
+
ENV_SHORT: |-
|
|
2337
|
+
stage
|
|
2338
|
+
APP_DIR: |-
|
|
2339
|
+
app2
|
|
2340
|
+
ENV_TYPE: |-
|
|
2341
|
+
stage
|
|
2342
|
+
BUILD_INFO_BUILD_ID: |-
|
|
2343
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
2344
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
2345
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
2346
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
2347
|
+
$(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/^/ /')
|
|
2348
|
+
HOST: |-
|
|
2349
|
+
$(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2350
|
+
ROOT_URL: |-
|
|
2351
|
+
$(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2352
|
+
HOST_INTERNAL: |-
|
|
2353
|
+
$(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2354
|
+
HOST_CANONICAL: |-
|
|
2355
|
+
$(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2356
|
+
ROOT_URL_INTERNAL: |-
|
|
2357
|
+
$(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2358
|
+
DEPLOY_CLOUD_RUN_PROJECT_ID: |-
|
|
2359
|
+
asdf
|
|
2360
|
+
DEPLOY_CLOUD_RUN_REGION: |-
|
|
2361
|
+
asia-east1
|
|
2362
|
+
SECRET2: |-
|
|
2363
|
+
$(printf %s "$CL_stage_app2_SECRET2" | sed 's/^/ /')
|
|
2364
|
+
GCLOUD_RUN_canonicalHostSuffix: |-
|
|
2365
|
+
$(printf %s "$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
|
|
2366
|
+
foo2: |-
|
|
2367
|
+
foo-value-2
|
|
2368
|
+
referencingSecret: |-
|
|
2369
|
+
$(printf %s "secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2" | sed 's/^/ /')
|
|
2370
|
+
foo1: |-
|
|
2371
|
+
this is from app1: foo-value
|
|
2372
|
+
selfReference: |-
|
|
2373
|
+
this is from self: foo-value-2
|
|
2374
|
+
selfReference2: |-
|
|
2375
|
+
this is from self: this is from app1: foo-value
|
|
2376
|
+
app1Api: |-
|
|
2377
|
+
$(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
|
|
2378
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
2379
|
+
["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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
|
|
2380
|
+
|
|
2381
|
+
EOF
|
|
2382
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
|
|
2383
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
|
|
2384
|
+
- gcloud run deploy pan-test-app-stage-app2 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app2,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-app2 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
|
|
2385
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
|
|
2386
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
|
|
2387
|
+
- gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-app2 --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
|
|
2388
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2 --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/app2@$version --quiet --delete-tags; done
|
|
2389
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
|
|
2390
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
|
|
2391
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
2392
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
|
|
2393
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
2394
|
+
environment:
|
|
2395
|
+
name: stage/app2
|
|
2396
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
2397
|
+
on_stop: 'app2 ๐ Stop โ ๏ธ | stage '
|
|
2398
|
+
artifacts:
|
|
2399
|
+
reports:
|
|
2400
|
+
dotenv: gitlab_environment.env
|
|
2401
|
+
rules:
|
|
2402
|
+
- when: on_success
|
|
2403
|
+
if: $CI_COMMIT_TAG
|
|
2404
|
+
needs:
|
|
2405
|
+
- job: 'app2 ๐จ app | stage '
|
|
2406
|
+
artifacts: false
|
|
2407
|
+
- job: 'app2 ๐จ docker | stage '
|
|
2408
|
+
artifacts: false
|
|
2409
|
+
- job: 'app2 ๐งพ sbom | stage '
|
|
2410
|
+
artifacts: true
|
|
2411
|
+
retry: *a1
|
|
2412
|
+
interruptible: true
|
|
2413
|
+
allow_failure: false
|
|
2414
|
+
'app2 ๐ Stop โ ๏ธ | stage ':
|
|
2415
|
+
stage: stop stage
|
|
2416
|
+
image: path/to/docker/gcloud:the-version
|
|
2417
|
+
variables:
|
|
2418
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2419
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2420
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2421
|
+
GIT_STRATEGY: none
|
|
2422
|
+
script:
|
|
2423
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2424
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
2425
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2426
|
+
- set +e
|
|
2427
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
2428
|
+
- gcloud run services delete pan-test-app-stage-app2 --project=asdf --region=asia-east1
|
|
2429
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2 --quiet --delete-tags
|
|
2430
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
|
|
2431
|
+
- echo 'Disabling component in Dependency Track'
|
|
2432
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app2" "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
|
|
2433
|
+
- set -e
|
|
2434
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
2435
|
+
environment:
|
|
2436
|
+
name: stage/app2
|
|
2437
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
2438
|
+
action: stop
|
|
2439
|
+
artifacts:
|
|
2440
|
+
reports:
|
|
2441
|
+
dotenv: gitlab_environment.env
|
|
2442
|
+
rules:
|
|
2443
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
2444
|
+
when: on_success
|
|
2445
|
+
- when: manual
|
|
2446
|
+
if: $CI_COMMIT_TAG
|
|
2447
|
+
needs: []
|
|
2448
|
+
retry: *a1
|
|
2449
|
+
interruptible: true
|
|
2450
|
+
allow_failure: true
|
|
2451
|
+
'app2 ๐จ app | prod ':
|
|
2452
|
+
stage: build
|
|
2453
|
+
image: path/to/docker/jobs-default:the-version
|
|
2454
|
+
variables:
|
|
2455
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2456
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2457
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
2458
|
+
script:
|
|
2459
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2460
|
+
- export ENV_SHORT="prod"
|
|
2461
|
+
- export APP_DIR="app2"
|
|
2462
|
+
- export ENV_TYPE="prod"
|
|
2463
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2464
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2465
|
+
- 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")"
|
|
2466
|
+
- export HOST="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2467
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2468
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2469
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2470
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2471
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
2472
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
2473
|
+
- export SECRET2="$CL_prod_app2_SECRET2"
|
|
2474
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey"
|
|
2475
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix"
|
|
2476
|
+
- export foo2="foo-value-2"
|
|
2477
|
+
- 'export referencingSecret="secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
|
|
2478
|
+
- 'export foo1="this is from app1: foo-value"'
|
|
2479
|
+
- 'export selfReference="this is from self: foo-value-2"'
|
|
2480
|
+
- 'export selfReference2="this is from self: this is from app1: foo-value"'
|
|
2481
|
+
- export app1Api="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
|
|
2482
|
+
- 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
|
|
2483
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2484
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
|
|
2485
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
2486
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2487
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2488
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
2489
|
+
- cd app2
|
|
2490
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
2491
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2492
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2493
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
2494
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
2495
|
+
- yarn install --immutable
|
|
2496
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
2497
|
+
- yarn build
|
|
2498
|
+
cache:
|
|
2499
|
+
- key: app2-yarn
|
|
2500
|
+
policy: pull-push
|
|
2501
|
+
paths:
|
|
2502
|
+
- app2/.yarn
|
|
2503
|
+
- key: app2-node-modules
|
|
2504
|
+
policy: pull-push
|
|
2505
|
+
paths:
|
|
2506
|
+
- app2/node_modules
|
|
2507
|
+
- key: app2-next-cache
|
|
2508
|
+
policy: pull-push
|
|
2509
|
+
paths:
|
|
2510
|
+
- app2/.next/cache
|
|
2511
|
+
artifacts:
|
|
2512
|
+
paths:
|
|
2513
|
+
- app2/__build_info.json
|
|
2514
|
+
- app2/.next
|
|
2515
|
+
- app2/dist
|
|
2516
|
+
expire_in: 1 day
|
|
2517
|
+
when: always
|
|
2518
|
+
reports: {}
|
|
2519
|
+
rules:
|
|
2520
|
+
- if: $CI_COMMIT_TAG
|
|
2521
|
+
needs: []
|
|
2522
|
+
retry: *a1
|
|
2523
|
+
interruptible: true
|
|
2524
|
+
'app2 ๐จ docker | prod ':
|
|
2525
|
+
stage: build
|
|
2526
|
+
image: path/to/docker/docker-build:the-version
|
|
2527
|
+
services:
|
|
2528
|
+
- name: docker:24.0.6-dind
|
|
2529
|
+
command:
|
|
2530
|
+
- --tls=false
|
|
2531
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
2532
|
+
variables:
|
|
2533
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
2534
|
+
DOCKER_TLS_CERTDIR: ''
|
|
2535
|
+
DOCKER_DRIVER: overlay2
|
|
2536
|
+
DOCKER_BUILDKIT: '1'
|
|
2537
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2538
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2539
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
2540
|
+
script:
|
|
2541
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2542
|
+
- export APP_DIR="app2"
|
|
2543
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
2544
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
2545
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2"
|
|
2546
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
|
|
2547
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2548
|
+
- |-
|
|
2549
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
2550
|
+
RUN yarn plugin import workspace-tools
|
|
2551
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
2552
|
+
- |-
|
|
2553
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node app2/package.json /app/app2/package.json
|
|
2554
|
+
COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
|
|
2555
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
2556
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
2557
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2558
|
+
- ensureNodeDockerfile
|
|
2559
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
2560
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
2561
|
+
- gcloud auth configure-docker asia-east1-docker.pkg.dev
|
|
2562
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
2563
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
2564
|
+
- 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
|
|
2565
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
2566
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
2567
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
2568
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
2569
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
2570
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
2571
|
+
cache:
|
|
2572
|
+
- key: app2-yarn
|
|
2573
|
+
policy: pull
|
|
2574
|
+
paths:
|
|
2575
|
+
- app2/.yarn
|
|
2576
|
+
rules:
|
|
2577
|
+
- if: $CI_COMMIT_TAG
|
|
2578
|
+
needs:
|
|
2579
|
+
- 'app2 ๐จ app | prod '
|
|
2580
|
+
retry: *a1
|
|
2581
|
+
interruptible: true
|
|
2582
|
+
'app2 ๐งพ sbom | prod ':
|
|
2583
|
+
stage: build
|
|
2584
|
+
image: aquasec/trivy:0.38.3
|
|
2585
|
+
variables: {}
|
|
2586
|
+
script:
|
|
2587
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2588
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2589
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
|
|
2590
|
+
artifacts:
|
|
2591
|
+
paths:
|
|
2592
|
+
- __sbom.json
|
|
2593
|
+
rules:
|
|
2594
|
+
- if: $CI_COMMIT_TAG
|
|
2595
|
+
needs: []
|
|
2596
|
+
retry: *a1
|
|
2597
|
+
interruptible: true
|
|
2598
|
+
allow_failure: true
|
|
2599
|
+
'app2 ๐ Deploy | prod ':
|
|
2600
|
+
stage: deploy prod
|
|
2601
|
+
image: path/to/docker/gcloud:the-version
|
|
2602
|
+
variables:
|
|
2603
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2604
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2605
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2606
|
+
script:
|
|
2607
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2608
|
+
- export ENV_SHORT="prod"
|
|
2609
|
+
- export APP_DIR="app2"
|
|
2610
|
+
- export ENV_TYPE="prod"
|
|
2611
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2612
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2613
|
+
- 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")"
|
|
2614
|
+
- export HOST="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2615
|
+
- export ROOT_URL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2616
|
+
- export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2617
|
+
- export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2618
|
+
- export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
|
|
2619
|
+
- export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
|
|
2620
|
+
- export DEPLOY_CLOUD_RUN_REGION="asia-east1"
|
|
2621
|
+
- export SECRET2="$CL_prod_app2_SECRET2"
|
|
2622
|
+
- export GCLOUD_DEPLOY_credentialsKey="$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey"
|
|
2623
|
+
- export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix"
|
|
2624
|
+
- export foo2="foo-value-2"
|
|
2625
|
+
- 'export referencingSecret="secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
|
|
2626
|
+
- 'export foo1="this is from app1: foo-value"'
|
|
2627
|
+
- 'export selfReference="this is from self: foo-value-2"'
|
|
2628
|
+
- 'export selfReference2="this is from self: this is from app1: foo-value"'
|
|
2629
|
+
- export app1Api="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
|
|
2630
|
+
- 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
|
|
2631
|
+
- export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
|
|
2632
|
+
- export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2"
|
|
2633
|
+
- export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
|
|
2634
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2635
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
2636
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2637
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
|
|
2638
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
2639
|
+
- export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
|
|
2640
|
+
- 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
|
|
2641
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
|
|
2642
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
|
|
2643
|
+
- |
|
|
2644
|
+
cat > ____envvars.yaml <<EOF
|
|
2645
|
+
ENV_SHORT: |-
|
|
2646
|
+
prod
|
|
2647
|
+
APP_DIR: |-
|
|
2648
|
+
app2
|
|
2649
|
+
ENV_TYPE: |-
|
|
2650
|
+
prod
|
|
2651
|
+
BUILD_INFO_BUILD_ID: |-
|
|
2652
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
2653
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
2654
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
2655
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
2656
|
+
$(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/^/ /')
|
|
2657
|
+
HOST: |-
|
|
2658
|
+
$(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2659
|
+
ROOT_URL: |-
|
|
2660
|
+
$(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2661
|
+
HOST_INTERNAL: |-
|
|
2662
|
+
$(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2663
|
+
HOST_CANONICAL: |-
|
|
2664
|
+
$(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2665
|
+
ROOT_URL_INTERNAL: |-
|
|
2666
|
+
$(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
|
|
2667
|
+
DEPLOY_CLOUD_RUN_PROJECT_ID: |-
|
|
2668
|
+
asdf
|
|
2669
|
+
DEPLOY_CLOUD_RUN_REGION: |-
|
|
2670
|
+
asia-east1
|
|
2671
|
+
SECRET2: |-
|
|
2672
|
+
$(printf %s "$CL_prod_app2_SECRET2" | sed 's/^/ /')
|
|
2673
|
+
GCLOUD_RUN_canonicalHostSuffix: |-
|
|
2674
|
+
$(printf %s "$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
|
|
2675
|
+
foo2: |-
|
|
2676
|
+
foo-value-2
|
|
2677
|
+
referencingSecret: |-
|
|
2678
|
+
$(printf %s "secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2" | sed 's/^/ /')
|
|
2679
|
+
foo1: |-
|
|
2680
|
+
this is from app1: foo-value
|
|
2681
|
+
selfReference: |-
|
|
2682
|
+
this is from self: foo-value-2
|
|
2683
|
+
selfReference2: |-
|
|
2684
|
+
this is from self: this is from app1: foo-value
|
|
2685
|
+
app1Api: |-
|
|
2686
|
+
$(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
|
|
2687
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
2688
|
+
["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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
|
|
2689
|
+
|
|
2690
|
+
EOF
|
|
2691
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
|
|
2692
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
|
|
2693
|
+
- gcloud run deploy pan-test-app-prod-app2 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app2,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-app2 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
|
|
2694
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
|
|
2695
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
|
|
2696
|
+
- gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-app2 --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
|
|
2697
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2 --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/app2@$version --quiet --delete-tags; done
|
|
2698
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
|
|
2699
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
|
|
2700
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
2701
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
|
|
2702
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
2703
|
+
environment:
|
|
2704
|
+
name: prod/app2
|
|
2705
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
2706
|
+
on_stop: 'app2 ๐ Stop โ ๏ธ | prod '
|
|
2707
|
+
artifacts:
|
|
2708
|
+
reports:
|
|
2709
|
+
dotenv: gitlab_environment.env
|
|
2710
|
+
rules:
|
|
2711
|
+
- when: manual
|
|
2712
|
+
if: $CI_COMMIT_TAG
|
|
2713
|
+
needs:
|
|
2714
|
+
- job: 'app2 ๐จ app | prod '
|
|
2715
|
+
artifacts: false
|
|
2716
|
+
- job: 'app2 ๐จ docker | prod '
|
|
2717
|
+
artifacts: false
|
|
2718
|
+
- job: 'app2 ๐งพ sbom | prod '
|
|
2719
|
+
artifacts: true
|
|
2720
|
+
retry: *a1
|
|
2721
|
+
interruptible: true
|
|
2722
|
+
allow_failure: true
|
|
2723
|
+
'app2 ๐ Stop โ ๏ธ | prod ':
|
|
2724
|
+
stage: stop prod
|
|
2725
|
+
image: path/to/docker/gcloud:the-version
|
|
2726
|
+
variables:
|
|
2727
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
2728
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
2729
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
2730
|
+
GIT_STRATEGY: none
|
|
2731
|
+
script:
|
|
2732
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2733
|
+
- export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
|
|
2734
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2735
|
+
- set +e
|
|
2736
|
+
- gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey")
|
|
2737
|
+
- gcloud run services delete pan-test-app-prod-app2 --project=asdf --region=asia-east1
|
|
2738
|
+
- gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2 --quiet --delete-tags
|
|
2739
|
+
- gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --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/app2@$version --quiet --delete-tags; done
|
|
2740
|
+
- echo 'Disabling component in Dependency Track'
|
|
2741
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app2" "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
|
|
2742
|
+
- set -e
|
|
2743
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
|
|
2744
|
+
environment:
|
|
2745
|
+
name: prod/app2
|
|
2746
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
2747
|
+
action: stop
|
|
2748
|
+
artifacts:
|
|
2749
|
+
reports:
|
|
2750
|
+
dotenv: gitlab_environment.env
|
|
2751
|
+
rules:
|
|
2752
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
2753
|
+
when: on_success
|
|
2754
|
+
- when: manual
|
|
2755
|
+
if: $CI_COMMIT_TAG
|
|
2756
|
+
needs: []
|
|
2757
|
+
retry: *a1
|
|
2758
|
+
interruptible: true
|
|
2759
|
+
allow_failure: true
|
|
2760
|
+
app3 ๐ก audit:
|
|
2761
|
+
stage: test
|
|
2762
|
+
image: path/to/docker/jobs-default:the-version
|
|
2763
|
+
variables:
|
|
2764
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2765
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2766
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
2767
|
+
script:
|
|
2768
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2769
|
+
- export APP_PATH="kube"
|
|
2770
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2771
|
+
- cd kube
|
|
2772
|
+
- yarn npm audit --environment production
|
|
2773
|
+
rules:
|
|
2774
|
+
- when: never
|
|
2775
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
2776
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
2777
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
2778
|
+
needs: []
|
|
2779
|
+
retry: *a1
|
|
2780
|
+
interruptible: true
|
|
2781
|
+
allow_failure: true
|
|
2782
|
+
app3 ๐ฎ lint:
|
|
2783
|
+
stage: test
|
|
2784
|
+
image: path/to/docker/jobs-default:the-version
|
|
2785
|
+
variables:
|
|
2786
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2787
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2788
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
2789
|
+
script:
|
|
2790
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2791
|
+
- export APP_PATH="kube"
|
|
2792
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2793
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
2794
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2795
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2796
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
2797
|
+
- cd kube
|
|
2798
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
2799
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2800
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2801
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
2802
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
2803
|
+
- yarn install --immutable
|
|
2804
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
2805
|
+
- yarn lint
|
|
2806
|
+
cache:
|
|
2807
|
+
- key: kube-yarn
|
|
2808
|
+
policy: pull-push
|
|
2809
|
+
paths:
|
|
2810
|
+
- kube/.yarn
|
|
2811
|
+
- key: kube-node-modules
|
|
2812
|
+
policy: pull-push
|
|
2813
|
+
paths:
|
|
2814
|
+
- kube/node_modules
|
|
2815
|
+
rules:
|
|
2816
|
+
- when: never
|
|
2817
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
2818
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
2819
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
2820
|
+
needs: []
|
|
2821
|
+
retry: *a1
|
|
2822
|
+
interruptible: true
|
|
2823
|
+
app3 ๐งช test:
|
|
2824
|
+
stage: test
|
|
2825
|
+
image: path/to/docker/jobs-testing-chrome:the-version
|
|
2826
|
+
variables:
|
|
2827
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2828
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2829
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
2830
|
+
script:
|
|
2831
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2832
|
+
- export APP_PATH="kube"
|
|
2833
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2834
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
2835
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2836
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2837
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
2838
|
+
- cd kube
|
|
2839
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
2840
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2841
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2842
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
2843
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
2844
|
+
- yarn install --immutable
|
|
2845
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
2846
|
+
- yarn test
|
|
2847
|
+
cache:
|
|
2848
|
+
- key: kube-yarn
|
|
2849
|
+
policy: pull-push
|
|
2850
|
+
paths:
|
|
2851
|
+
- kube/.yarn
|
|
2852
|
+
- key: kube-node-modules
|
|
2853
|
+
policy: pull-push
|
|
2854
|
+
paths:
|
|
2855
|
+
- kube/node_modules
|
|
2856
|
+
rules:
|
|
2857
|
+
- when: never
|
|
2858
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
2859
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
2860
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
2861
|
+
needs: []
|
|
2862
|
+
retry: *a1
|
|
2863
|
+
interruptible: true
|
|
2864
|
+
'app3 ๐จ app | dev ':
|
|
2865
|
+
stage: build
|
|
2866
|
+
image: path/to/docker/jobs-default:the-version
|
|
2867
|
+
variables:
|
|
2868
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2869
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2870
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
2871
|
+
script:
|
|
2872
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2873
|
+
- export ENV_SHORT="dev"
|
|
2874
|
+
- export APP_DIR="kube"
|
|
2875
|
+
- export ENV_TYPE="dev"
|
|
2876
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
2877
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
2878
|
+
- 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")"
|
|
2879
|
+
- export HOST="app3.dev.test-app.pan.panter.cloud"
|
|
2880
|
+
- export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
|
|
2881
|
+
- export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
|
|
2882
|
+
- export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
|
|
2883
|
+
- export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
|
|
2884
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
2885
|
+
- export KUBE_APP_NAME="app3"
|
|
2886
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
2887
|
+
- export foo3="foo-value-3"
|
|
2888
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
2889
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
2890
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
|
|
2891
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
|
|
2892
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
2893
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2894
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
|
|
2895
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
2896
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2897
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2898
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
2899
|
+
- cd kube
|
|
2900
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
2901
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
2902
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
2903
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
2904
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
2905
|
+
- yarn install --immutable
|
|
2906
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
2907
|
+
- yarn build
|
|
2908
|
+
cache:
|
|
2909
|
+
- key: kube-yarn
|
|
2910
|
+
policy: pull-push
|
|
2911
|
+
paths:
|
|
2912
|
+
- kube/.yarn
|
|
2913
|
+
- key: kube-node-modules
|
|
2914
|
+
policy: pull-push
|
|
2915
|
+
paths:
|
|
2916
|
+
- kube/node_modules
|
|
2917
|
+
- key: app3-next-cache
|
|
2918
|
+
policy: pull-push
|
|
2919
|
+
paths:
|
|
2920
|
+
- kube/.next/cache
|
|
2921
|
+
artifacts:
|
|
2922
|
+
paths:
|
|
2923
|
+
- kube/__build_info.json
|
|
2924
|
+
- kube/.next
|
|
2925
|
+
- kube/dist
|
|
2926
|
+
expire_in: 1 day
|
|
2927
|
+
when: always
|
|
2928
|
+
reports: {}
|
|
2929
|
+
rules:
|
|
2930
|
+
- when: never
|
|
2931
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
2932
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
2933
|
+
needs: []
|
|
2934
|
+
retry: *a1
|
|
2935
|
+
interruptible: true
|
|
2936
|
+
'app3 ๐จ docker | dev ':
|
|
2937
|
+
stage: build
|
|
2938
|
+
image: path/to/docker/docker-build:the-version
|
|
2939
|
+
services:
|
|
2940
|
+
- name: docker:24.0.6-dind
|
|
2941
|
+
command:
|
|
2942
|
+
- --tls=false
|
|
2943
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
2944
|
+
variables:
|
|
2945
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
2946
|
+
DOCKER_TLS_CERTDIR: ''
|
|
2947
|
+
DOCKER_DRIVER: overlay2
|
|
2948
|
+
DOCKER_BUILDKIT: '1'
|
|
2949
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
2950
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
2951
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
2952
|
+
script:
|
|
2953
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
2954
|
+
- export APP_DIR="kube"
|
|
2955
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
2956
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
2957
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
|
|
2958
|
+
- export DOCKER_IMAGE_NAME="dev/app3"
|
|
2959
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
2960
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
2961
|
+
- |-
|
|
2962
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
2963
|
+
RUN yarn plugin import workspace-tools
|
|
2964
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
2965
|
+
- |-
|
|
2966
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node kube/package.json /app/kube/package.json
|
|
2967
|
+
COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
|
|
2968
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
2969
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
2970
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
2971
|
+
- ensureNodeDockerfile
|
|
2972
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
2973
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
2974
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
2975
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
2976
|
+
- 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
|
|
2977
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
2978
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
2979
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
2980
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
2981
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
2982
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
2983
|
+
cache:
|
|
2984
|
+
- key: kube-yarn
|
|
2985
|
+
policy: pull
|
|
2986
|
+
paths:
|
|
2987
|
+
- kube/.yarn
|
|
2988
|
+
rules:
|
|
2989
|
+
- when: never
|
|
2990
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
2991
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
2992
|
+
needs:
|
|
2993
|
+
- 'app3 ๐จ app | dev '
|
|
2994
|
+
retry: *a1
|
|
2995
|
+
interruptible: true
|
|
2996
|
+
'app3 ๐งพ sbom | dev ':
|
|
2997
|
+
stage: build
|
|
2998
|
+
image: aquasec/trivy:0.38.3
|
|
2999
|
+
variables: {}
|
|
3000
|
+
script:
|
|
3001
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3002
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3003
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
|
|
3004
|
+
artifacts:
|
|
3005
|
+
paths:
|
|
3006
|
+
- __sbom.json
|
|
3007
|
+
rules:
|
|
3008
|
+
- when: never
|
|
3009
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
3010
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
3011
|
+
needs: []
|
|
3012
|
+
retry: *a1
|
|
3013
|
+
interruptible: true
|
|
3014
|
+
allow_failure: true
|
|
3015
|
+
'app3 ๐ Deploy | dev ':
|
|
3016
|
+
stage: deploy dev
|
|
3017
|
+
image: path/to/docker/kubernetes:the-version
|
|
3018
|
+
variables:
|
|
3019
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3020
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3021
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3022
|
+
script:
|
|
3023
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3024
|
+
- export ENV_SHORT="dev"
|
|
3025
|
+
- export APP_DIR="kube"
|
|
3026
|
+
- export ENV_TYPE="dev"
|
|
3027
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3028
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3029
|
+
- 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")"
|
|
3030
|
+
- export HOST="app3.dev.test-app.pan.panter.cloud"
|
|
3031
|
+
- export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
|
|
3032
|
+
- export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
|
|
3033
|
+
- export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
|
|
3034
|
+
- export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
|
|
3035
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
3036
|
+
- export KUBE_APP_NAME="app3"
|
|
3037
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
3038
|
+
- export foo3="foo-value-3"
|
|
3039
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
3040
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
3041
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
|
|
3042
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
|
|
3043
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
3044
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
3045
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
|
|
3046
|
+
- export DOCKER_IMAGE_NAME="dev/app3"
|
|
3047
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
3048
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
3049
|
+
- export RELEASE_NAME="pan-test-app-dev-app3"
|
|
3050
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
3051
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
3052
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
3053
|
+
- export HELM_ARGS=""
|
|
3054
|
+
- export COMPONENT_NAME="app3"
|
|
3055
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3056
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3057
|
+
- kubectl config set-cluster "kube-pan-test-app-dev-app3" --server="$CL_dev_app3_KUBE_URL" --certificate-authority <(echo $CL_dev_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
3058
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-app3" --token="$CL_dev_app3_KUBE_TOKEN"
|
|
3059
|
+
- kubectl config set-context "kube-pan-test-app-dev-app3" --cluster="kube-pan-test-app-dev-app3" --user="kube-pan-test-app-dev-app3" --namespace="pan-test-app-dev"
|
|
3060
|
+
- kubectl config use-context "kube-pan-test-app-dev-app3"
|
|
3061
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
|
|
3062
|
+
- |
|
|
3063
|
+
cat > __all_values.yml <<EOF
|
|
3064
|
+
env:
|
|
3065
|
+
secret:
|
|
3066
|
+
transitiveWithSecret: |-
|
|
3067
|
+
$(printf %s "this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2" | sed 's/^/ /')
|
|
3068
|
+
someJson: |-
|
|
3069
|
+
$(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
|
|
3070
|
+
public:
|
|
3071
|
+
ENV_SHORT: |-
|
|
3072
|
+
dev
|
|
3073
|
+
APP_DIR: |-
|
|
3074
|
+
kube
|
|
3075
|
+
ENV_TYPE: |-
|
|
3076
|
+
dev
|
|
3077
|
+
BUILD_INFO_BUILD_ID: |-
|
|
3078
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
3079
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
3080
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
3081
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
3082
|
+
$(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/^/ /')
|
|
3083
|
+
HOST: |-
|
|
3084
|
+
app3.dev.test-app.pan.panter.cloud
|
|
3085
|
+
ROOT_URL: |-
|
|
3086
|
+
https://app3.dev.test-app.pan.panter.cloud
|
|
3087
|
+
HOST_INTERNAL: |-
|
|
3088
|
+
app3.dev.test-app.pan.panter.cloud
|
|
3089
|
+
HOST_CANONICAL: |-
|
|
3090
|
+
app3.dev.test-app.pan.panter.cloud
|
|
3091
|
+
ROOT_URL_INTERNAL: |-
|
|
3092
|
+
https://app3.dev.test-app.pan.panter.cloud
|
|
3093
|
+
KUBE_NAMESPACE: |-
|
|
3094
|
+
pan-test-app-dev
|
|
3095
|
+
KUBE_APP_NAME: |-
|
|
3096
|
+
app3
|
|
3097
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
3098
|
+
foo3: |-
|
|
3099
|
+
foo-value-3
|
|
3100
|
+
foo2: |-
|
|
3101
|
+
this is from app2: foo-value-2
|
|
3102
|
+
transitive: |-
|
|
3103
|
+
this is from app2: this is from app1: foo-value
|
|
3104
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
3105
|
+
["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
|
|
3106
|
+
application:
|
|
3107
|
+
host: |-
|
|
3108
|
+
app3.dev.test-app.pan.panter.cloud
|
|
3109
|
+
command: |-
|
|
3110
|
+
yarn start
|
|
3111
|
+
livenessProbe:
|
|
3112
|
+
httpGet:
|
|
3113
|
+
path: |-
|
|
3114
|
+
__health
|
|
3115
|
+
readinessProbe:
|
|
3116
|
+
httpGet:
|
|
3117
|
+
path: |-
|
|
3118
|
+
__health
|
|
3119
|
+
startupProbe:
|
|
3120
|
+
httpGet:
|
|
3121
|
+
path: |-
|
|
3122
|
+
__health
|
|
3123
|
+
|
|
3124
|
+
EOF
|
|
3125
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
|
|
3126
|
+
- kubernetesCreateSecret
|
|
3127
|
+
- kubernetesDeploy
|
|
3128
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
3129
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app3" "https://app3.dev.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
|
|
3130
|
+
- echo deployment successful ๐ป
|
|
3131
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
3132
|
+
environment:
|
|
3133
|
+
name: dev/app3
|
|
3134
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
3135
|
+
on_stop: 'app3 ๐ Stop โ ๏ธ | dev '
|
|
3136
|
+
auto_stop_in: 4 weeks
|
|
3137
|
+
artifacts:
|
|
3138
|
+
reports:
|
|
3139
|
+
dotenv: gitlab_environment.env
|
|
3140
|
+
rules:
|
|
3141
|
+
- when: never
|
|
3142
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
3143
|
+
- when: on_success
|
|
3144
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
3145
|
+
needs:
|
|
3146
|
+
- job: app3 ๐ฎ lint
|
|
3147
|
+
artifacts: false
|
|
3148
|
+
- job: 'app3 ๐จ app | dev '
|
|
3149
|
+
artifacts: false
|
|
3150
|
+
- job: 'app3 ๐จ docker | dev '
|
|
3151
|
+
artifacts: false
|
|
3152
|
+
- job: app3 ๐งช test
|
|
3153
|
+
artifacts: false
|
|
3154
|
+
- job: 'app3 ๐งพ sbom | dev '
|
|
3155
|
+
artifacts: true
|
|
3156
|
+
- job: app3 ๐ก audit
|
|
3157
|
+
artifacts: false
|
|
3158
|
+
retry: *a1
|
|
3159
|
+
interruptible: true
|
|
3160
|
+
allow_failure: false
|
|
3161
|
+
'app3 ๐ Stop โ ๏ธ | dev ':
|
|
3162
|
+
stage: stop dev
|
|
3163
|
+
image: path/to/docker/kubernetes:the-version
|
|
3164
|
+
variables:
|
|
3165
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3166
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3167
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3168
|
+
GIT_STRATEGY: none
|
|
3169
|
+
script:
|
|
3170
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3171
|
+
- export ENV_SHORT="dev"
|
|
3172
|
+
- export APP_DIR="kube"
|
|
3173
|
+
- export ENV_TYPE="dev"
|
|
3174
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3175
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3176
|
+
- 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")"
|
|
3177
|
+
- export HOST="app3.dev.test-app.pan.panter.cloud"
|
|
3178
|
+
- export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
|
|
3179
|
+
- export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
|
|
3180
|
+
- export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
|
|
3181
|
+
- export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
|
|
3182
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
3183
|
+
- export KUBE_APP_NAME="app3"
|
|
3184
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
3185
|
+
- export foo3="foo-value-3"
|
|
3186
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
3187
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
3188
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
|
|
3189
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
|
|
3190
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
3191
|
+
- export RELEASE_NAME="pan-test-app-dev-app3"
|
|
3192
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
3193
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
3194
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
3195
|
+
- export HELM_ARGS=""
|
|
3196
|
+
- export COMPONENT_NAME="app3"
|
|
3197
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3198
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3199
|
+
- kubectl config set-cluster "kube-pan-test-app-dev-app3" --server="$CL_dev_app3_KUBE_URL" --certificate-authority <(echo $CL_dev_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
3200
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-app3" --token="$CL_dev_app3_KUBE_TOKEN"
|
|
3201
|
+
- kubectl config set-context "kube-pan-test-app-dev-app3" --cluster="kube-pan-test-app-dev-app3" --user="kube-pan-test-app-dev-app3" --namespace="pan-test-app-dev"
|
|
3202
|
+
- kubectl config use-context "kube-pan-test-app-dev-app3"
|
|
3203
|
+
- kubernetesDelete
|
|
3204
|
+
- echo 'Disabling component in Dependency Track'
|
|
3205
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app3" "https://app3.dev.test-app.pan.panter.cloud" || true
|
|
3206
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
3207
|
+
environment:
|
|
3208
|
+
name: dev/app3
|
|
3209
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
3210
|
+
action: stop
|
|
3211
|
+
artifacts:
|
|
3212
|
+
reports:
|
|
3213
|
+
dotenv: gitlab_environment.env
|
|
3214
|
+
rules:
|
|
3215
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
3216
|
+
when: on_success
|
|
3217
|
+
- when: never
|
|
3218
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
3219
|
+
- when: manual
|
|
3220
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
3221
|
+
needs: []
|
|
3222
|
+
retry: *a1
|
|
3223
|
+
interruptible: true
|
|
3224
|
+
allow_failure: true
|
|
3225
|
+
'app3 โฉ๏ธ Rollback โ ๏ธ | dev ':
|
|
3226
|
+
stage: rollback dev
|
|
3227
|
+
image: path/to/docker/kubernetes:the-version
|
|
3228
|
+
variables:
|
|
3229
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3230
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3231
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3232
|
+
GIT_STRATEGY: none
|
|
3233
|
+
script:
|
|
3234
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3235
|
+
- export ENV_SHORT="dev"
|
|
3236
|
+
- export APP_DIR="kube"
|
|
3237
|
+
- export ENV_TYPE="dev"
|
|
3238
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3239
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3240
|
+
- 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")"
|
|
3241
|
+
- export HOST="app3.dev.test-app.pan.panter.cloud"
|
|
3242
|
+
- export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
|
|
3243
|
+
- export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
|
|
3244
|
+
- export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
|
|
3245
|
+
- export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
|
|
3246
|
+
- export KUBE_NAMESPACE="pan-test-app-dev"
|
|
3247
|
+
- export KUBE_APP_NAME="app3"
|
|
3248
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
3249
|
+
- export foo3="foo-value-3"
|
|
3250
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
3251
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
3252
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
|
|
3253
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
|
|
3254
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
3255
|
+
- export RELEASE_NAME="pan-test-app-dev-app3"
|
|
3256
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
3257
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
3258
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
3259
|
+
- export HELM_ARGS=""
|
|
3260
|
+
- export COMPONENT_NAME="app3"
|
|
3261
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3262
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3263
|
+
- kubectl config set-cluster "kube-pan-test-app-dev-app3" --server="$CL_dev_app3_KUBE_URL" --certificate-authority <(echo $CL_dev_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
3264
|
+
- kubectl config set-credentials "kube-pan-test-app-dev-app3" --token="$CL_dev_app3_KUBE_TOKEN"
|
|
3265
|
+
- kubectl config set-context "kube-pan-test-app-dev-app3" --cluster="kube-pan-test-app-dev-app3" --user="kube-pan-test-app-dev-app3" --namespace="pan-test-app-dev"
|
|
3266
|
+
- kubectl config use-context "kube-pan-test-app-dev-app3"
|
|
3267
|
+
- kubernetesRollback
|
|
3268
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
3269
|
+
environment:
|
|
3270
|
+
name: dev/app3
|
|
3271
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
3272
|
+
action: access
|
|
3273
|
+
artifacts:
|
|
3274
|
+
reports:
|
|
3275
|
+
dotenv: gitlab_environment.env
|
|
3276
|
+
rules:
|
|
3277
|
+
- when: never
|
|
3278
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
3279
|
+
- when: manual
|
|
3280
|
+
if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
3281
|
+
needs: []
|
|
3282
|
+
retry: *a1
|
|
3283
|
+
interruptible: true
|
|
3284
|
+
allow_failure: true
|
|
3285
|
+
'app3 ๐จ app | review ':
|
|
3286
|
+
stage: build
|
|
3287
|
+
image: path/to/docker/jobs-default:the-version
|
|
3288
|
+
variables:
|
|
3289
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
3290
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
3291
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
3292
|
+
script:
|
|
3293
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3294
|
+
- export ENV_SHORT="review"
|
|
3295
|
+
- export APP_DIR="kube"
|
|
3296
|
+
- export ENV_TYPE="review"
|
|
3297
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3298
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3299
|
+
- 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")"
|
|
3300
|
+
- export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3301
|
+
- export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3302
|
+
- export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3303
|
+
- export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3304
|
+
- export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3305
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
3306
|
+
- export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
|
|
3307
|
+
- export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
|
|
3308
|
+
- export foo3="foo-value-3"
|
|
3309
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
3310
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
3311
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
|
|
3312
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
|
|
3313
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
3314
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3315
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
|
|
3316
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
3317
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
3318
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
3319
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
3320
|
+
- cd kube
|
|
3321
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
3322
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
3323
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
3324
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
3325
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
3326
|
+
- yarn install --immutable
|
|
3327
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
3328
|
+
- yarn build
|
|
3329
|
+
cache:
|
|
3330
|
+
- key: kube-yarn
|
|
3331
|
+
policy: pull-push
|
|
3332
|
+
paths:
|
|
3333
|
+
- kube/.yarn
|
|
3334
|
+
- key: kube-node-modules
|
|
3335
|
+
policy: pull-push
|
|
3336
|
+
paths:
|
|
3337
|
+
- kube/node_modules
|
|
3338
|
+
- key: app3-next-cache
|
|
3339
|
+
policy: pull-push
|
|
3340
|
+
paths:
|
|
3341
|
+
- kube/.next/cache
|
|
3342
|
+
artifacts:
|
|
3343
|
+
paths:
|
|
3344
|
+
- kube/__build_info.json
|
|
3345
|
+
- kube/.next
|
|
3346
|
+
- kube/dist
|
|
3347
|
+
expire_in: 1 day
|
|
3348
|
+
when: always
|
|
3349
|
+
reports: {}
|
|
3350
|
+
rules:
|
|
3351
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
3352
|
+
needs: []
|
|
3353
|
+
retry: *a1
|
|
3354
|
+
interruptible: true
|
|
3355
|
+
'app3 ๐จ docker | review ':
|
|
3356
|
+
stage: build
|
|
3357
|
+
image: path/to/docker/docker-build:the-version
|
|
3358
|
+
services:
|
|
3359
|
+
- name: docker:24.0.6-dind
|
|
3360
|
+
command:
|
|
3361
|
+
- --tls=false
|
|
3362
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
3363
|
+
variables:
|
|
3364
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
3365
|
+
DOCKER_TLS_CERTDIR: ''
|
|
3366
|
+
DOCKER_DRIVER: overlay2
|
|
3367
|
+
DOCKER_BUILDKIT: '1'
|
|
3368
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
3369
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
3370
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
3371
|
+
script:
|
|
3372
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3373
|
+
- export APP_DIR="kube"
|
|
3374
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
3375
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
3376
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
|
|
3377
|
+
- export DOCKER_IMAGE_NAME="review/app3"
|
|
3378
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
3379
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
3380
|
+
- |-
|
|
3381
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
3382
|
+
RUN yarn plugin import workspace-tools
|
|
3383
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
3384
|
+
- |-
|
|
3385
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node kube/package.json /app/kube/package.json
|
|
3386
|
+
COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
|
|
3387
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
3388
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
3389
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3390
|
+
- ensureNodeDockerfile
|
|
3391
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
3392
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
3393
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
3394
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
3395
|
+
- 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
|
|
3396
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
3397
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
3398
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
3399
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
3400
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
3401
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
3402
|
+
cache:
|
|
3403
|
+
- key: kube-yarn
|
|
3404
|
+
policy: pull
|
|
3405
|
+
paths:
|
|
3406
|
+
- kube/.yarn
|
|
3407
|
+
rules:
|
|
3408
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
3409
|
+
needs:
|
|
3410
|
+
- 'app3 ๐จ app | review '
|
|
3411
|
+
retry: *a1
|
|
3412
|
+
interruptible: true
|
|
3413
|
+
'app3 ๐งพ sbom | review ':
|
|
3414
|
+
stage: build
|
|
3415
|
+
image: aquasec/trivy:0.38.3
|
|
3416
|
+
variables: {}
|
|
3417
|
+
script:
|
|
3418
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3419
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3420
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
|
|
3421
|
+
artifacts:
|
|
3422
|
+
paths:
|
|
3423
|
+
- __sbom.json
|
|
3424
|
+
rules:
|
|
3425
|
+
- if: $CI_MERGE_REQUEST_ID
|
|
3426
|
+
needs: []
|
|
3427
|
+
retry: *a1
|
|
3428
|
+
interruptible: true
|
|
3429
|
+
allow_failure: true
|
|
3430
|
+
'app3 ๐ Deploy | review ':
|
|
3431
|
+
stage: deploy review
|
|
3432
|
+
image: path/to/docker/kubernetes:the-version
|
|
3433
|
+
variables:
|
|
3434
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3435
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3436
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3437
|
+
script:
|
|
3438
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3439
|
+
- export ENV_SHORT="review"
|
|
3440
|
+
- export APP_DIR="kube"
|
|
3441
|
+
- export ENV_TYPE="review"
|
|
3442
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3443
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3444
|
+
- 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")"
|
|
3445
|
+
- export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3446
|
+
- export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3447
|
+
- export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3448
|
+
- export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3449
|
+
- export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3450
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
3451
|
+
- export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
|
|
3452
|
+
- export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
|
|
3453
|
+
- export foo3="foo-value-3"
|
|
3454
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
3455
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
3456
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
|
|
3457
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
|
|
3458
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
3459
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
3460
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
|
|
3461
|
+
- export DOCKER_IMAGE_NAME="review/app3"
|
|
3462
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
3463
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
3464
|
+
- export RELEASE_NAME="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"; })-app3"
|
|
3465
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
3466
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
3467
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
3468
|
+
- export HELM_ARGS=""
|
|
3469
|
+
- export COMPONENT_NAME="app3"
|
|
3470
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3471
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3472
|
+
- kubectl config set-cluster "kube-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"; })-app3" --server="$CL_review_app3_KUBE_URL" --certificate-authority <(echo $CL_review_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
3473
|
+
- kubectl config set-credentials "kube-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"; })-app3" --token="$CL_review_app3_KUBE_TOKEN"
|
|
3474
|
+
- kubectl config set-context "kube-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"; })-app3" --cluster="kube-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"; })-app3" --user="kube-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"; })-app3" --namespace="pan-test-app-review"
|
|
3475
|
+
- kubectl config use-context "kube-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"; })-app3"
|
|
3476
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
|
|
3477
|
+
- |
|
|
3478
|
+
cat > __all_values.yml <<EOF
|
|
3479
|
+
env:
|
|
3480
|
+
secret:
|
|
3481
|
+
transitiveWithSecret: |-
|
|
3482
|
+
$(printf %s "this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2" | sed 's/^/ /')
|
|
3483
|
+
someJson: |-
|
|
3484
|
+
$(printf %s "[{\\"name\\": \\"app1\\", \\"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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
|
|
3485
|
+
public:
|
|
3486
|
+
ENV_SHORT: |-
|
|
3487
|
+
review
|
|
3488
|
+
APP_DIR: |-
|
|
3489
|
+
kube
|
|
3490
|
+
ENV_TYPE: |-
|
|
3491
|
+
review
|
|
3492
|
+
BUILD_INFO_BUILD_ID: |-
|
|
3493
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
3494
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
3495
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
3496
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
3497
|
+
$(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/^/ /')
|
|
3498
|
+
HOST: |-
|
|
3499
|
+
$(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
|
|
3500
|
+
ROOT_URL: |-
|
|
3501
|
+
$(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
|
|
3502
|
+
HOST_INTERNAL: |-
|
|
3503
|
+
$(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
|
|
3504
|
+
HOST_CANONICAL: |-
|
|
3505
|
+
$(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
|
|
3506
|
+
ROOT_URL_INTERNAL: |-
|
|
3507
|
+
$(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
|
|
3508
|
+
KUBE_NAMESPACE: |-
|
|
3509
|
+
pan-test-app-review
|
|
3510
|
+
KUBE_APP_NAME: |-
|
|
3511
|
+
$(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" | sed 's/^/ /')
|
|
3512
|
+
KUBE_APP_NAME_PREFIX: |-
|
|
3513
|
+
$(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | sed 's/^/ /')
|
|
3514
|
+
foo3: |-
|
|
3515
|
+
foo-value-3
|
|
3516
|
+
foo2: |-
|
|
3517
|
+
this is from app2: foo-value-2
|
|
3518
|
+
transitive: |-
|
|
3519
|
+
this is from app2: this is from app1: foo-value
|
|
3520
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
3521
|
+
["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
|
|
3522
|
+
application:
|
|
3523
|
+
host: |-
|
|
3524
|
+
$(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
|
|
3525
|
+
command: |-
|
|
3526
|
+
yarn start
|
|
3527
|
+
livenessProbe:
|
|
3528
|
+
httpGet:
|
|
3529
|
+
path: |-
|
|
3530
|
+
__health
|
|
3531
|
+
readinessProbe:
|
|
3532
|
+
httpGet:
|
|
3533
|
+
path: |-
|
|
3534
|
+
__health
|
|
3535
|
+
startupProbe:
|
|
3536
|
+
httpGet:
|
|
3537
|
+
path: |-
|
|
3538
|
+
__health
|
|
3539
|
+
|
|
3540
|
+
EOF
|
|
3541
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
|
|
3542
|
+
- kubernetesCreateSecret
|
|
3543
|
+
- kubernetesDeploy
|
|
3544
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
3545
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app3" "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
|
|
3546
|
+
- echo deployment successful ๐ป
|
|
3547
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
3548
|
+
environment:
|
|
3549
|
+
name: review/$CI_COMMIT_REF_NAME/app3
|
|
3550
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
3551
|
+
on_stop: 'app3 ๐ Stop โ ๏ธ | review '
|
|
3552
|
+
auto_stop_in: 1 week
|
|
3553
|
+
artifacts:
|
|
3554
|
+
reports:
|
|
3555
|
+
dotenv: gitlab_environment.env
|
|
3556
|
+
rules:
|
|
3557
|
+
- when: on_success
|
|
3558
|
+
if: $CI_MERGE_REQUEST_ID
|
|
3559
|
+
needs:
|
|
3560
|
+
- job: app3 ๐ฎ lint
|
|
3561
|
+
artifacts: false
|
|
3562
|
+
- job: 'app3 ๐จ app | review '
|
|
3563
|
+
artifacts: false
|
|
3564
|
+
- job: 'app3 ๐จ docker | review '
|
|
3565
|
+
artifacts: false
|
|
3566
|
+
- job: app3 ๐งช test
|
|
3567
|
+
artifacts: false
|
|
3568
|
+
- job: 'app3 ๐งพ sbom | review '
|
|
3569
|
+
artifacts: true
|
|
3570
|
+
- job: app3 ๐ก audit
|
|
3571
|
+
artifacts: false
|
|
3572
|
+
retry: *a1
|
|
3573
|
+
interruptible: true
|
|
3574
|
+
allow_failure: false
|
|
3575
|
+
'app3 ๐ Stop โ ๏ธ | review ':
|
|
3576
|
+
stage: stop review
|
|
3577
|
+
image: path/to/docker/kubernetes:the-version
|
|
3578
|
+
variables:
|
|
3579
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3580
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3581
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3582
|
+
GIT_STRATEGY: none
|
|
3583
|
+
script:
|
|
3584
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3585
|
+
- export ENV_SHORT="review"
|
|
3586
|
+
- export APP_DIR="kube"
|
|
3587
|
+
- export ENV_TYPE="review"
|
|
3588
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3589
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3590
|
+
- 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")"
|
|
3591
|
+
- export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3592
|
+
- export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3593
|
+
- export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3594
|
+
- export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3595
|
+
- export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3596
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
3597
|
+
- export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
|
|
3598
|
+
- export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
|
|
3599
|
+
- export foo3="foo-value-3"
|
|
3600
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
3601
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
3602
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
|
|
3603
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
|
|
3604
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
3605
|
+
- export RELEASE_NAME="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"; })-app3"
|
|
3606
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
3607
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
3608
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
3609
|
+
- export HELM_ARGS=""
|
|
3610
|
+
- export COMPONENT_NAME="app3"
|
|
3611
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3612
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3613
|
+
- kubectl config set-cluster "kube-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"; })-app3" --server="$CL_review_app3_KUBE_URL" --certificate-authority <(echo $CL_review_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
3614
|
+
- kubectl config set-credentials "kube-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"; })-app3" --token="$CL_review_app3_KUBE_TOKEN"
|
|
3615
|
+
- kubectl config set-context "kube-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"; })-app3" --cluster="kube-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"; })-app3" --user="kube-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"; })-app3" --namespace="pan-test-app-review"
|
|
3616
|
+
- kubectl config use-context "kube-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"; })-app3"
|
|
3617
|
+
- kubernetesDelete
|
|
3618
|
+
- echo 'Disabling component in Dependency Track'
|
|
3619
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app3" "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" || true
|
|
3620
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
3621
|
+
environment:
|
|
3622
|
+
name: review/$CI_COMMIT_REF_NAME/app3
|
|
3623
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
3624
|
+
action: stop
|
|
3625
|
+
artifacts:
|
|
3626
|
+
reports:
|
|
3627
|
+
dotenv: gitlab_environment.env
|
|
3628
|
+
rules:
|
|
3629
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
3630
|
+
when: on_success
|
|
3631
|
+
- when: manual
|
|
3632
|
+
if: $CI_MERGE_REQUEST_ID
|
|
3633
|
+
needs: []
|
|
3634
|
+
retry: *a1
|
|
3635
|
+
interruptible: true
|
|
3636
|
+
allow_failure: true
|
|
3637
|
+
'app3 โฉ๏ธ Rollback โ ๏ธ | review ':
|
|
3638
|
+
stage: rollback review
|
|
3639
|
+
image: path/to/docker/kubernetes:the-version
|
|
3640
|
+
variables:
|
|
3641
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3642
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3643
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3644
|
+
GIT_STRATEGY: none
|
|
3645
|
+
script:
|
|
3646
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3647
|
+
- export ENV_SHORT="review"
|
|
3648
|
+
- export APP_DIR="kube"
|
|
3649
|
+
- export ENV_TYPE="review"
|
|
3650
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3651
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3652
|
+
- 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")"
|
|
3653
|
+
- export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3654
|
+
- export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3655
|
+
- export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3656
|
+
- export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3657
|
+
- export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
|
|
3658
|
+
- export KUBE_NAMESPACE="pan-test-app-review"
|
|
3659
|
+
- export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
|
|
3660
|
+
- export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
|
|
3661
|
+
- export foo3="foo-value-3"
|
|
3662
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
3663
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
3664
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
|
|
3665
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
|
|
3666
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
3667
|
+
- export RELEASE_NAME="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"; })-app3"
|
|
3668
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
3669
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
3670
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
3671
|
+
- export HELM_ARGS=""
|
|
3672
|
+
- export COMPONENT_NAME="app3"
|
|
3673
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3674
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3675
|
+
- kubectl config set-cluster "kube-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"; })-app3" --server="$CL_review_app3_KUBE_URL" --certificate-authority <(echo $CL_review_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
3676
|
+
- kubectl config set-credentials "kube-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"; })-app3" --token="$CL_review_app3_KUBE_TOKEN"
|
|
3677
|
+
- kubectl config set-context "kube-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"; })-app3" --cluster="kube-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"; })-app3" --user="kube-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"; })-app3" --namespace="pan-test-app-review"
|
|
3678
|
+
- kubectl config use-context "kube-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"; })-app3"
|
|
3679
|
+
- kubernetesRollback
|
|
3680
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
3681
|
+
environment:
|
|
3682
|
+
name: review/$CI_COMMIT_REF_NAME/app3
|
|
3683
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
3684
|
+
action: access
|
|
3685
|
+
artifacts:
|
|
3686
|
+
reports:
|
|
3687
|
+
dotenv: gitlab_environment.env
|
|
3688
|
+
rules:
|
|
3689
|
+
- when: manual
|
|
3690
|
+
if: $CI_MERGE_REQUEST_ID
|
|
3691
|
+
needs: []
|
|
3692
|
+
retry: *a1
|
|
3693
|
+
interruptible: true
|
|
3694
|
+
allow_failure: true
|
|
3695
|
+
'app3 ๐จ app | stage ':
|
|
3696
|
+
stage: build
|
|
3697
|
+
image: path/to/docker/jobs-default:the-version
|
|
3698
|
+
variables:
|
|
3699
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
3700
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
3701
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
3702
|
+
script:
|
|
3703
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3704
|
+
- export ENV_SHORT="stage"
|
|
3705
|
+
- export APP_DIR="kube"
|
|
3706
|
+
- export ENV_TYPE="stage"
|
|
3707
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3708
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3709
|
+
- 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")"
|
|
3710
|
+
- export HOST="app3.stage.test-app.pan.panter.cloud"
|
|
3711
|
+
- export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
|
|
3712
|
+
- export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
|
|
3713
|
+
- export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
|
|
3714
|
+
- export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
|
|
3715
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
3716
|
+
- export KUBE_APP_NAME="app3"
|
|
3717
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
3718
|
+
- export foo3="foo-value-3"
|
|
3719
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
3720
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
3721
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
|
|
3722
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
|
|
3723
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
3724
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3725
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
|
|
3726
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
3727
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
3728
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
3729
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
3730
|
+
- cd kube
|
|
3731
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
3732
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
3733
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
3734
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
3735
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
3736
|
+
- yarn install --immutable
|
|
3737
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
3738
|
+
- yarn build
|
|
3739
|
+
cache:
|
|
3740
|
+
- key: kube-yarn
|
|
3741
|
+
policy: pull-push
|
|
3742
|
+
paths:
|
|
3743
|
+
- kube/.yarn
|
|
3744
|
+
- key: kube-node-modules
|
|
3745
|
+
policy: pull-push
|
|
3746
|
+
paths:
|
|
3747
|
+
- kube/node_modules
|
|
3748
|
+
- key: app3-next-cache
|
|
3749
|
+
policy: pull-push
|
|
3750
|
+
paths:
|
|
3751
|
+
- kube/.next/cache
|
|
3752
|
+
artifacts:
|
|
3753
|
+
paths:
|
|
3754
|
+
- kube/__build_info.json
|
|
3755
|
+
- kube/.next
|
|
3756
|
+
- kube/dist
|
|
3757
|
+
expire_in: 1 day
|
|
3758
|
+
when: always
|
|
3759
|
+
reports: {}
|
|
3760
|
+
rules:
|
|
3761
|
+
- if: $CI_COMMIT_TAG
|
|
3762
|
+
needs: []
|
|
3763
|
+
retry: *a1
|
|
3764
|
+
interruptible: true
|
|
3765
|
+
'app3 ๐จ docker | stage ':
|
|
3766
|
+
stage: build
|
|
3767
|
+
image: path/to/docker/docker-build:the-version
|
|
3768
|
+
services:
|
|
3769
|
+
- name: docker:24.0.6-dind
|
|
3770
|
+
command:
|
|
3771
|
+
- --tls=false
|
|
3772
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
3773
|
+
variables:
|
|
3774
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
3775
|
+
DOCKER_TLS_CERTDIR: ''
|
|
3776
|
+
DOCKER_DRIVER: overlay2
|
|
3777
|
+
DOCKER_BUILDKIT: '1'
|
|
3778
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
3779
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
3780
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
3781
|
+
script:
|
|
3782
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3783
|
+
- export APP_DIR="kube"
|
|
3784
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
3785
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
3786
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
|
|
3787
|
+
- export DOCKER_IMAGE_NAME="stage/app3"
|
|
3788
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
3789
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
3790
|
+
- |-
|
|
3791
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
3792
|
+
RUN yarn plugin import workspace-tools
|
|
3793
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
3794
|
+
- |-
|
|
3795
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node kube/package.json /app/kube/package.json
|
|
3796
|
+
COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
|
|
3797
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
3798
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
3799
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3800
|
+
- ensureNodeDockerfile
|
|
3801
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
3802
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
3803
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
3804
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
3805
|
+
- 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
|
|
3806
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
3807
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
3808
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
3809
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
3810
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
3811
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
3812
|
+
cache:
|
|
3813
|
+
- key: kube-yarn
|
|
3814
|
+
policy: pull
|
|
3815
|
+
paths:
|
|
3816
|
+
- kube/.yarn
|
|
3817
|
+
rules:
|
|
3818
|
+
- if: $CI_COMMIT_TAG
|
|
3819
|
+
needs:
|
|
3820
|
+
- 'app3 ๐จ app | stage '
|
|
3821
|
+
retry: *a1
|
|
3822
|
+
interruptible: true
|
|
3823
|
+
'app3 ๐งพ sbom | stage ':
|
|
3824
|
+
stage: build
|
|
3825
|
+
image: aquasec/trivy:0.38.3
|
|
3826
|
+
variables: {}
|
|
3827
|
+
script:
|
|
3828
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3829
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3830
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
|
|
3831
|
+
artifacts:
|
|
3832
|
+
paths:
|
|
3833
|
+
- __sbom.json
|
|
3834
|
+
rules:
|
|
3835
|
+
- if: $CI_COMMIT_TAG
|
|
3836
|
+
needs: []
|
|
3837
|
+
retry: *a1
|
|
3838
|
+
interruptible: true
|
|
3839
|
+
allow_failure: true
|
|
3840
|
+
'app3 ๐ Deploy | stage ':
|
|
3841
|
+
stage: deploy stage
|
|
3842
|
+
image: path/to/docker/kubernetes:the-version
|
|
3843
|
+
variables:
|
|
3844
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3845
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3846
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3847
|
+
script:
|
|
3848
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3849
|
+
- export ENV_SHORT="stage"
|
|
3850
|
+
- export APP_DIR="kube"
|
|
3851
|
+
- export ENV_TYPE="stage"
|
|
3852
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3853
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3854
|
+
- 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")"
|
|
3855
|
+
- export HOST="app3.stage.test-app.pan.panter.cloud"
|
|
3856
|
+
- export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
|
|
3857
|
+
- export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
|
|
3858
|
+
- export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
|
|
3859
|
+
- export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
|
|
3860
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
3861
|
+
- export KUBE_APP_NAME="app3"
|
|
3862
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
3863
|
+
- export foo3="foo-value-3"
|
|
3864
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
3865
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
3866
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
|
|
3867
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
|
|
3868
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
3869
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
3870
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
|
|
3871
|
+
- export DOCKER_IMAGE_NAME="stage/app3"
|
|
3872
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
3873
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
3874
|
+
- export RELEASE_NAME="pan-test-app-stage-app3"
|
|
3875
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
3876
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
3877
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
3878
|
+
- export HELM_ARGS=""
|
|
3879
|
+
- export COMPONENT_NAME="app3"
|
|
3880
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3881
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
3882
|
+
- kubectl config set-cluster "kube-pan-test-app-stage-app3" --server="$CL_stage_app3_KUBE_URL" --certificate-authority <(echo $CL_stage_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
3883
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-app3" --token="$CL_stage_app3_KUBE_TOKEN"
|
|
3884
|
+
- kubectl config set-context "kube-pan-test-app-stage-app3" --cluster="kube-pan-test-app-stage-app3" --user="kube-pan-test-app-stage-app3" --namespace="pan-test-app-stage"
|
|
3885
|
+
- kubectl config use-context "kube-pan-test-app-stage-app3"
|
|
3886
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
|
|
3887
|
+
- |
|
|
3888
|
+
cat > __all_values.yml <<EOF
|
|
3889
|
+
env:
|
|
3890
|
+
secret:
|
|
3891
|
+
transitiveWithSecret: |-
|
|
3892
|
+
$(printf %s "this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2" | sed 's/^/ /')
|
|
3893
|
+
someJson: |-
|
|
3894
|
+
$(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
|
|
3895
|
+
public:
|
|
3896
|
+
ENV_SHORT: |-
|
|
3897
|
+
stage
|
|
3898
|
+
APP_DIR: |-
|
|
3899
|
+
kube
|
|
3900
|
+
ENV_TYPE: |-
|
|
3901
|
+
stage
|
|
3902
|
+
BUILD_INFO_BUILD_ID: |-
|
|
3903
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
3904
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
3905
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
3906
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
3907
|
+
$(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/^/ /')
|
|
3908
|
+
HOST: |-
|
|
3909
|
+
app3.stage.test-app.pan.panter.cloud
|
|
3910
|
+
ROOT_URL: |-
|
|
3911
|
+
https://app3.stage.test-app.pan.panter.cloud
|
|
3912
|
+
HOST_INTERNAL: |-
|
|
3913
|
+
app3.stage.test-app.pan.panter.cloud
|
|
3914
|
+
HOST_CANONICAL: |-
|
|
3915
|
+
app3.stage.test-app.pan.panter.cloud
|
|
3916
|
+
ROOT_URL_INTERNAL: |-
|
|
3917
|
+
https://app3.stage.test-app.pan.panter.cloud
|
|
3918
|
+
KUBE_NAMESPACE: |-
|
|
3919
|
+
pan-test-app-stage
|
|
3920
|
+
KUBE_APP_NAME: |-
|
|
3921
|
+
app3
|
|
3922
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
3923
|
+
foo3: |-
|
|
3924
|
+
foo-value-3
|
|
3925
|
+
foo2: |-
|
|
3926
|
+
this is from app2: foo-value-2
|
|
3927
|
+
transitive: |-
|
|
3928
|
+
this is from app2: this is from app1: foo-value
|
|
3929
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
3930
|
+
["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
|
|
3931
|
+
application:
|
|
3932
|
+
host: |-
|
|
3933
|
+
app3.stage.test-app.pan.panter.cloud
|
|
3934
|
+
command: |-
|
|
3935
|
+
yarn start
|
|
3936
|
+
livenessProbe:
|
|
3937
|
+
httpGet:
|
|
3938
|
+
path: |-
|
|
3939
|
+
__health
|
|
3940
|
+
readinessProbe:
|
|
3941
|
+
httpGet:
|
|
3942
|
+
path: |-
|
|
3943
|
+
__health
|
|
3944
|
+
startupProbe:
|
|
3945
|
+
httpGet:
|
|
3946
|
+
path: |-
|
|
3947
|
+
__health
|
|
3948
|
+
|
|
3949
|
+
EOF
|
|
3950
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
|
|
3951
|
+
- kubernetesCreateSecret
|
|
3952
|
+
- kubernetesDeploy
|
|
3953
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
3954
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app3" "https://app3.stage.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
|
|
3955
|
+
- echo deployment successful ๐ป
|
|
3956
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
3957
|
+
environment:
|
|
3958
|
+
name: stage/app3
|
|
3959
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
3960
|
+
on_stop: 'app3 ๐ Stop โ ๏ธ | stage '
|
|
3961
|
+
artifacts:
|
|
3962
|
+
reports:
|
|
3963
|
+
dotenv: gitlab_environment.env
|
|
3964
|
+
rules:
|
|
3965
|
+
- when: on_success
|
|
3966
|
+
if: $CI_COMMIT_TAG
|
|
3967
|
+
needs:
|
|
3968
|
+
- job: 'app3 ๐จ app | stage '
|
|
3969
|
+
artifacts: false
|
|
3970
|
+
- job: 'app3 ๐จ docker | stage '
|
|
3971
|
+
artifacts: false
|
|
3972
|
+
- job: 'app3 ๐งพ sbom | stage '
|
|
3973
|
+
artifacts: true
|
|
3974
|
+
retry: *a1
|
|
3975
|
+
interruptible: true
|
|
3976
|
+
allow_failure: false
|
|
3977
|
+
'app3 ๐ Stop โ ๏ธ | stage ':
|
|
3978
|
+
stage: stop stage
|
|
3979
|
+
image: path/to/docker/kubernetes:the-version
|
|
3980
|
+
variables:
|
|
3981
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
3982
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
3983
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
3984
|
+
GIT_STRATEGY: none
|
|
3985
|
+
script:
|
|
3986
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
3987
|
+
- export ENV_SHORT="stage"
|
|
3988
|
+
- export APP_DIR="kube"
|
|
3989
|
+
- export ENV_TYPE="stage"
|
|
3990
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
3991
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
3992
|
+
- 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")"
|
|
3993
|
+
- export HOST="app3.stage.test-app.pan.panter.cloud"
|
|
3994
|
+
- export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
|
|
3995
|
+
- export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
|
|
3996
|
+
- export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
|
|
3997
|
+
- export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
|
|
3998
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
3999
|
+
- export KUBE_APP_NAME="app3"
|
|
4000
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
4001
|
+
- export foo3="foo-value-3"
|
|
4002
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
4003
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
4004
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
|
|
4005
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
|
|
4006
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
4007
|
+
- export RELEASE_NAME="pan-test-app-stage-app3"
|
|
4008
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
4009
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
4010
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
4011
|
+
- export HELM_ARGS=""
|
|
4012
|
+
- export COMPONENT_NAME="app3"
|
|
4013
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
4014
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
4015
|
+
- kubectl config set-cluster "kube-pan-test-app-stage-app3" --server="$CL_stage_app3_KUBE_URL" --certificate-authority <(echo $CL_stage_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
4016
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-app3" --token="$CL_stage_app3_KUBE_TOKEN"
|
|
4017
|
+
- kubectl config set-context "kube-pan-test-app-stage-app3" --cluster="kube-pan-test-app-stage-app3" --user="kube-pan-test-app-stage-app3" --namespace="pan-test-app-stage"
|
|
4018
|
+
- kubectl config use-context "kube-pan-test-app-stage-app3"
|
|
4019
|
+
- kubernetesDelete
|
|
4020
|
+
- echo 'Disabling component in Dependency Track'
|
|
4021
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app3" "https://app3.stage.test-app.pan.panter.cloud" || true
|
|
4022
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
4023
|
+
environment:
|
|
4024
|
+
name: stage/app3
|
|
4025
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
4026
|
+
action: stop
|
|
4027
|
+
artifacts:
|
|
4028
|
+
reports:
|
|
4029
|
+
dotenv: gitlab_environment.env
|
|
4030
|
+
rules:
|
|
4031
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
4032
|
+
when: on_success
|
|
4033
|
+
- when: manual
|
|
4034
|
+
if: $CI_COMMIT_TAG
|
|
4035
|
+
needs: []
|
|
4036
|
+
retry: *a1
|
|
4037
|
+
interruptible: true
|
|
4038
|
+
allow_failure: true
|
|
4039
|
+
'app3 โฉ๏ธ Rollback โ ๏ธ | stage ':
|
|
4040
|
+
stage: rollback stage
|
|
4041
|
+
image: path/to/docker/kubernetes:the-version
|
|
4042
|
+
variables:
|
|
4043
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
4044
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
4045
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
4046
|
+
GIT_STRATEGY: none
|
|
4047
|
+
script:
|
|
4048
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
4049
|
+
- export ENV_SHORT="stage"
|
|
4050
|
+
- export APP_DIR="kube"
|
|
4051
|
+
- export ENV_TYPE="stage"
|
|
4052
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
4053
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
4054
|
+
- 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")"
|
|
4055
|
+
- export HOST="app3.stage.test-app.pan.panter.cloud"
|
|
4056
|
+
- export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
|
|
4057
|
+
- export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
|
|
4058
|
+
- export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
|
|
4059
|
+
- export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
|
|
4060
|
+
- export KUBE_NAMESPACE="pan-test-app-stage"
|
|
4061
|
+
- export KUBE_APP_NAME="app3"
|
|
4062
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
4063
|
+
- export foo3="foo-value-3"
|
|
4064
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
4065
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
4066
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
|
|
4067
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
|
|
4068
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
4069
|
+
- export RELEASE_NAME="pan-test-app-stage-app3"
|
|
4070
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
4071
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
4072
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
4073
|
+
- export HELM_ARGS=""
|
|
4074
|
+
- export COMPONENT_NAME="app3"
|
|
4075
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
4076
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
4077
|
+
- kubectl config set-cluster "kube-pan-test-app-stage-app3" --server="$CL_stage_app3_KUBE_URL" --certificate-authority <(echo $CL_stage_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
4078
|
+
- kubectl config set-credentials "kube-pan-test-app-stage-app3" --token="$CL_stage_app3_KUBE_TOKEN"
|
|
4079
|
+
- kubectl config set-context "kube-pan-test-app-stage-app3" --cluster="kube-pan-test-app-stage-app3" --user="kube-pan-test-app-stage-app3" --namespace="pan-test-app-stage"
|
|
4080
|
+
- kubectl config use-context "kube-pan-test-app-stage-app3"
|
|
4081
|
+
- kubernetesRollback
|
|
4082
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
4083
|
+
environment:
|
|
4084
|
+
name: stage/app3
|
|
4085
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
4086
|
+
action: access
|
|
4087
|
+
artifacts:
|
|
4088
|
+
reports:
|
|
4089
|
+
dotenv: gitlab_environment.env
|
|
4090
|
+
rules:
|
|
4091
|
+
- when: manual
|
|
4092
|
+
if: $CI_COMMIT_TAG
|
|
4093
|
+
needs: []
|
|
4094
|
+
retry: *a1
|
|
4095
|
+
interruptible: true
|
|
4096
|
+
allow_failure: true
|
|
4097
|
+
'app3 ๐จ app | prod ':
|
|
4098
|
+
stage: build
|
|
4099
|
+
image: path/to/docker/jobs-default:the-version
|
|
4100
|
+
variables:
|
|
4101
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
4102
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
4103
|
+
KUBERNETES_MEMORY_LIMIT: 4Gi
|
|
4104
|
+
script:
|
|
4105
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
4106
|
+
- export ENV_SHORT="prod"
|
|
4107
|
+
- export APP_DIR="kube"
|
|
4108
|
+
- export ENV_TYPE="prod"
|
|
4109
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
4110
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
4111
|
+
- 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")"
|
|
4112
|
+
- export HOST="app3.prod.test-app.pan.panter.cloud"
|
|
4113
|
+
- export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
|
|
4114
|
+
- export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
|
|
4115
|
+
- export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
|
|
4116
|
+
- export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
|
|
4117
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
4118
|
+
- export KUBE_APP_NAME="app3"
|
|
4119
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
4120
|
+
- export foo3="foo-value-3"
|
|
4121
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
4122
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
4123
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
|
|
4124
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
|
|
4125
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
4126
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
4127
|
+
- echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
|
|
4128
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
4129
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
4130
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
4131
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
4132
|
+
- cd kube
|
|
4133
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
|
|
4134
|
+
- if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
|
|
4135
|
+
- if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
|
|
4136
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
|
|
4137
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
|
|
4138
|
+
- yarn install --immutable
|
|
4139
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
|
|
4140
|
+
- yarn build
|
|
4141
|
+
cache:
|
|
4142
|
+
- key: kube-yarn
|
|
4143
|
+
policy: pull-push
|
|
4144
|
+
paths:
|
|
4145
|
+
- kube/.yarn
|
|
4146
|
+
- key: kube-node-modules
|
|
4147
|
+
policy: pull-push
|
|
4148
|
+
paths:
|
|
4149
|
+
- kube/node_modules
|
|
4150
|
+
- key: app3-next-cache
|
|
4151
|
+
policy: pull-push
|
|
4152
|
+
paths:
|
|
4153
|
+
- kube/.next/cache
|
|
4154
|
+
artifacts:
|
|
4155
|
+
paths:
|
|
4156
|
+
- kube/__build_info.json
|
|
4157
|
+
- kube/.next
|
|
4158
|
+
- kube/dist
|
|
4159
|
+
expire_in: 1 day
|
|
4160
|
+
when: always
|
|
4161
|
+
reports: {}
|
|
4162
|
+
rules:
|
|
4163
|
+
- if: $CI_COMMIT_TAG
|
|
4164
|
+
needs: []
|
|
4165
|
+
retry: *a1
|
|
4166
|
+
interruptible: true
|
|
4167
|
+
'app3 ๐จ docker | prod ':
|
|
4168
|
+
stage: build
|
|
4169
|
+
image: path/to/docker/docker-build:the-version
|
|
4170
|
+
services:
|
|
4171
|
+
- name: docker:24.0.6-dind
|
|
4172
|
+
command:
|
|
4173
|
+
- --tls=false
|
|
4174
|
+
- --registry-mirror=https://mirror.gcr.io
|
|
4175
|
+
variables:
|
|
4176
|
+
DOCKER_HOST: tcp://0.0.0.0:2375
|
|
4177
|
+
DOCKER_TLS_CERTDIR: ''
|
|
4178
|
+
DOCKER_DRIVER: overlay2
|
|
4179
|
+
DOCKER_BUILDKIT: '1'
|
|
4180
|
+
KUBERNETES_CPU_REQUEST: '0.45'
|
|
4181
|
+
KUBERNETES_MEMORY_REQUEST: 1Gi
|
|
4182
|
+
KUBERNETES_MEMORY_LIMIT: 2Gi
|
|
4183
|
+
script:
|
|
4184
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
4185
|
+
- export APP_DIR="kube"
|
|
4186
|
+
- export DOCKER_BUILD_CONTEXT="."
|
|
4187
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
4188
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
|
|
4189
|
+
- export DOCKER_IMAGE_NAME="prod/app3"
|
|
4190
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
4191
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
4192
|
+
- |-
|
|
4193
|
+
export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
|
|
4194
|
+
RUN yarn plugin import workspace-tools
|
|
4195
|
+
RUN yarn workspaces focus --production && yarn rebuild"
|
|
4196
|
+
- |-
|
|
4197
|
+
export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node kube/package.json /app/kube/package.json
|
|
4198
|
+
COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
|
|
4199
|
+
COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
|
|
4200
|
+
COPY --chown=node:node .yarn /app/.yarn"
|
|
4201
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
4202
|
+
- ensureNodeDockerfile
|
|
4203
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
|
|
4204
|
+
- docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
|
|
4205
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
|
|
4206
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
|
|
4207
|
+
- 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
|
|
4208
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
|
|
4209
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
|
|
4210
|
+
- docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
|
|
4211
|
+
- docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
|
|
4212
|
+
- docker push $DOCKER_CACHE_IMAGE
|
|
4213
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
|
|
4214
|
+
cache:
|
|
4215
|
+
- key: kube-yarn
|
|
4216
|
+
policy: pull
|
|
4217
|
+
paths:
|
|
4218
|
+
- kube/.yarn
|
|
4219
|
+
rules:
|
|
4220
|
+
- if: $CI_COMMIT_TAG
|
|
4221
|
+
needs:
|
|
4222
|
+
- 'app3 ๐จ app | prod '
|
|
4223
|
+
retry: *a1
|
|
4224
|
+
interruptible: true
|
|
4225
|
+
'app3 ๐งพ sbom | prod ':
|
|
4226
|
+
stage: build
|
|
4227
|
+
image: aquasec/trivy:0.38.3
|
|
4228
|
+
variables: {}
|
|
4229
|
+
script:
|
|
4230
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
4231
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
4232
|
+
- trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
|
|
4233
|
+
artifacts:
|
|
4234
|
+
paths:
|
|
4235
|
+
- __sbom.json
|
|
4236
|
+
rules:
|
|
4237
|
+
- if: $CI_COMMIT_TAG
|
|
4238
|
+
needs: []
|
|
4239
|
+
retry: *a1
|
|
4240
|
+
interruptible: true
|
|
4241
|
+
allow_failure: true
|
|
4242
|
+
'app3 ๐ Deploy | prod ':
|
|
4243
|
+
stage: deploy prod
|
|
4244
|
+
image: path/to/docker/kubernetes:the-version
|
|
4245
|
+
variables:
|
|
4246
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
4247
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
4248
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
4249
|
+
script:
|
|
4250
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
4251
|
+
- export ENV_SHORT="prod"
|
|
4252
|
+
- export APP_DIR="kube"
|
|
4253
|
+
- export ENV_TYPE="prod"
|
|
4254
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
4255
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
4256
|
+
- 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")"
|
|
4257
|
+
- export HOST="app3.prod.test-app.pan.panter.cloud"
|
|
4258
|
+
- export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
|
|
4259
|
+
- export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
|
|
4260
|
+
- export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
|
|
4261
|
+
- export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
|
|
4262
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
4263
|
+
- export KUBE_APP_NAME="app3"
|
|
4264
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
4265
|
+
- export foo3="foo-value-3"
|
|
4266
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
4267
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
4268
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
|
|
4269
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
|
|
4270
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
4271
|
+
- export DOCKER_REGISTRY="$CI_REGISTRY"
|
|
4272
|
+
- export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
|
|
4273
|
+
- export DOCKER_IMAGE_NAME="prod/app3"
|
|
4274
|
+
- export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
|
|
4275
|
+
- export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
|
|
4276
|
+
- export RELEASE_NAME="pan-test-app-prod-app3"
|
|
4277
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
4278
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
4279
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
4280
|
+
- export HELM_ARGS=""
|
|
4281
|
+
- export COMPONENT_NAME="app3"
|
|
4282
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
4283
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
4284
|
+
- kubectl config set-cluster "kube-pan-test-app-prod-app3" --server="$CL_prod_app3_KUBE_URL" --certificate-authority <(echo $CL_prod_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
4285
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-app3" --token="$CL_prod_app3_KUBE_TOKEN"
|
|
4286
|
+
- kubectl config set-context "kube-pan-test-app-prod-app3" --cluster="kube-pan-test-app-prod-app3" --user="kube-pan-test-app-prod-app3" --namespace="pan-test-app-prod"
|
|
4287
|
+
- kubectl config use-context "kube-pan-test-app-prod-app3"
|
|
4288
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
|
|
4289
|
+
- |
|
|
4290
|
+
cat > __all_values.yml <<EOF
|
|
4291
|
+
env:
|
|
4292
|
+
secret:
|
|
4293
|
+
transitiveWithSecret: |-
|
|
4294
|
+
$(printf %s "this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2" | sed 's/^/ /')
|
|
4295
|
+
someJson: |-
|
|
4296
|
+
$(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
|
|
4297
|
+
public:
|
|
4298
|
+
ENV_SHORT: |-
|
|
4299
|
+
prod
|
|
4300
|
+
APP_DIR: |-
|
|
4301
|
+
kube
|
|
4302
|
+
ENV_TYPE: |-
|
|
4303
|
+
prod
|
|
4304
|
+
BUILD_INFO_BUILD_ID: |-
|
|
4305
|
+
$(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
|
|
4306
|
+
BUILD_INFO_BUILD_TIME: |-
|
|
4307
|
+
$(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
|
|
4308
|
+
BUILD_INFO_CURRENT_VERSION: |-
|
|
4309
|
+
$(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/^/ /')
|
|
4310
|
+
HOST: |-
|
|
4311
|
+
app3.prod.test-app.pan.panter.cloud
|
|
4312
|
+
ROOT_URL: |-
|
|
4313
|
+
https://app3.prod.test-app.pan.panter.cloud
|
|
4314
|
+
HOST_INTERNAL: |-
|
|
4315
|
+
app3.prod.test-app.pan.panter.cloud
|
|
4316
|
+
HOST_CANONICAL: |-
|
|
4317
|
+
app3.prod.test-app.pan.panter.cloud
|
|
4318
|
+
ROOT_URL_INTERNAL: |-
|
|
4319
|
+
https://app3.prod.test-app.pan.panter.cloud
|
|
4320
|
+
KUBE_NAMESPACE: |-
|
|
4321
|
+
pan-test-app-prod
|
|
4322
|
+
KUBE_APP_NAME: |-
|
|
4323
|
+
app3
|
|
4324
|
+
KUBE_APP_NAME_PREFIX: ""
|
|
4325
|
+
foo3: |-
|
|
4326
|
+
foo-value-3
|
|
4327
|
+
foo2: |-
|
|
4328
|
+
this is from app2: foo-value-2
|
|
4329
|
+
transitive: |-
|
|
4330
|
+
this is from app2: this is from app1: foo-value
|
|
4331
|
+
_ALL_ENV_VAR_KEYS: |-
|
|
4332
|
+
["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
|
|
4333
|
+
application:
|
|
4334
|
+
host: |-
|
|
4335
|
+
app3.prod.test-app.pan.panter.cloud
|
|
4336
|
+
command: |-
|
|
4337
|
+
yarn start
|
|
4338
|
+
livenessProbe:
|
|
4339
|
+
httpGet:
|
|
4340
|
+
path: |-
|
|
4341
|
+
__health
|
|
4342
|
+
readinessProbe:
|
|
4343
|
+
httpGet:
|
|
4344
|
+
path: |-
|
|
4345
|
+
__health
|
|
4346
|
+
startupProbe:
|
|
4347
|
+
httpGet:
|
|
4348
|
+
path: |-
|
|
4349
|
+
__health
|
|
4350
|
+
|
|
4351
|
+
EOF
|
|
4352
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
|
|
4353
|
+
- kubernetesCreateSecret
|
|
4354
|
+
- kubernetesDeploy
|
|
4355
|
+
- echo 'Uploading SBOM to Dependency Track'
|
|
4356
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app3" "https://app3.prod.test-app.pan.panter.cloud" "__sbom.json" vex.json || true
|
|
4357
|
+
- echo deployment successful ๐ป
|
|
4358
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
4359
|
+
environment:
|
|
4360
|
+
name: prod/app3
|
|
4361
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
4362
|
+
on_stop: 'app3 ๐ Stop โ ๏ธ | prod '
|
|
4363
|
+
artifacts:
|
|
4364
|
+
reports:
|
|
4365
|
+
dotenv: gitlab_environment.env
|
|
4366
|
+
rules:
|
|
4367
|
+
- when: manual
|
|
4368
|
+
if: $CI_COMMIT_TAG
|
|
4369
|
+
needs:
|
|
4370
|
+
- job: 'app3 ๐จ app | prod '
|
|
4371
|
+
artifacts: false
|
|
4372
|
+
- job: 'app3 ๐จ docker | prod '
|
|
4373
|
+
artifacts: false
|
|
4374
|
+
- job: 'app3 ๐งพ sbom | prod '
|
|
4375
|
+
artifacts: true
|
|
4376
|
+
retry: *a1
|
|
4377
|
+
interruptible: true
|
|
4378
|
+
allow_failure: true
|
|
4379
|
+
'app3 ๐ Stop โ ๏ธ | prod ':
|
|
4380
|
+
stage: stop prod
|
|
4381
|
+
image: path/to/docker/kubernetes:the-version
|
|
4382
|
+
variables:
|
|
4383
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
4384
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
4385
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
4386
|
+
GIT_STRATEGY: none
|
|
4387
|
+
script:
|
|
4388
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
4389
|
+
- export ENV_SHORT="prod"
|
|
4390
|
+
- export APP_DIR="kube"
|
|
4391
|
+
- export ENV_TYPE="prod"
|
|
4392
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
4393
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
4394
|
+
- 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")"
|
|
4395
|
+
- export HOST="app3.prod.test-app.pan.panter.cloud"
|
|
4396
|
+
- export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
|
|
4397
|
+
- export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
|
|
4398
|
+
- export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
|
|
4399
|
+
- export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
|
|
4400
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
4401
|
+
- export KUBE_APP_NAME="app3"
|
|
4402
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
4403
|
+
- export foo3="foo-value-3"
|
|
4404
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
4405
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
4406
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
|
|
4407
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
|
|
4408
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
4409
|
+
- export RELEASE_NAME="pan-test-app-prod-app3"
|
|
4410
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
4411
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
4412
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
4413
|
+
- export HELM_ARGS=""
|
|
4414
|
+
- export COMPONENT_NAME="app3"
|
|
4415
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
4416
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
4417
|
+
- kubectl config set-cluster "kube-pan-test-app-prod-app3" --server="$CL_prod_app3_KUBE_URL" --certificate-authority <(echo $CL_prod_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
4418
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-app3" --token="$CL_prod_app3_KUBE_TOKEN"
|
|
4419
|
+
- kubectl config set-context "kube-pan-test-app-prod-app3" --cluster="kube-pan-test-app-prod-app3" --user="kube-pan-test-app-prod-app3" --namespace="pan-test-app-prod"
|
|
4420
|
+
- kubectl config use-context "kube-pan-test-app-prod-app3"
|
|
4421
|
+
- kubernetesDelete
|
|
4422
|
+
- echo 'Disabling component in Dependency Track'
|
|
4423
|
+
- /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app3" "https://app3.prod.test-app.pan.panter.cloud" || true
|
|
4424
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
4425
|
+
environment:
|
|
4426
|
+
name: prod/app3
|
|
4427
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
4428
|
+
action: stop
|
|
4429
|
+
artifacts:
|
|
4430
|
+
reports:
|
|
4431
|
+
dotenv: gitlab_environment.env
|
|
4432
|
+
rules:
|
|
4433
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
|
|
4434
|
+
when: on_success
|
|
4435
|
+
- when: manual
|
|
4436
|
+
if: $CI_COMMIT_TAG
|
|
4437
|
+
needs: []
|
|
4438
|
+
retry: *a1
|
|
4439
|
+
interruptible: true
|
|
4440
|
+
allow_failure: true
|
|
4441
|
+
'app3 โฉ๏ธ Rollback โ ๏ธ | prod ':
|
|
4442
|
+
stage: rollback prod
|
|
4443
|
+
image: path/to/docker/kubernetes:the-version
|
|
4444
|
+
variables:
|
|
4445
|
+
KUBERNETES_CPU_REQUEST: '0.22'
|
|
4446
|
+
KUBERNETES_MEMORY_REQUEST: 200Mi
|
|
4447
|
+
KUBERNETES_MEMORY_LIMIT: 400Mi
|
|
4448
|
+
GIT_STRATEGY: none
|
|
4449
|
+
script:
|
|
4450
|
+
- echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
|
|
4451
|
+
- export ENV_SHORT="prod"
|
|
4452
|
+
- export APP_DIR="kube"
|
|
4453
|
+
- export ENV_TYPE="prod"
|
|
4454
|
+
- export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
4455
|
+
- export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
|
|
4456
|
+
- 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")"
|
|
4457
|
+
- export HOST="app3.prod.test-app.pan.panter.cloud"
|
|
4458
|
+
- export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
|
|
4459
|
+
- export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
|
|
4460
|
+
- export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
|
|
4461
|
+
- export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
|
|
4462
|
+
- export KUBE_NAMESPACE="pan-test-app-prod"
|
|
4463
|
+
- export KUBE_APP_NAME="app3"
|
|
4464
|
+
- export KUBE_APP_NAME_PREFIX=""
|
|
4465
|
+
- export foo3="foo-value-3"
|
|
4466
|
+
- 'export foo2="this is from app2: foo-value-2"'
|
|
4467
|
+
- 'export transitive="this is from app2: this is from app1: foo-value"'
|
|
4468
|
+
- 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
|
|
4469
|
+
- 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
|
|
4470
|
+
- 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
|
|
4471
|
+
- export RELEASE_NAME="pan-test-app-prod-app3"
|
|
4472
|
+
- export HELM_EXPERIMENTAL_OCI="1"
|
|
4473
|
+
- export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
|
|
4474
|
+
- export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
|
|
4475
|
+
- export HELM_ARGS=""
|
|
4476
|
+
- export COMPONENT_NAME="app3"
|
|
4477
|
+
- export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
|
|
4478
|
+
- echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
|
|
4479
|
+
- kubectl config set-cluster "kube-pan-test-app-prod-app3" --server="$CL_prod_app3_KUBE_URL" --certificate-authority <(echo $CL_prod_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
|
|
4480
|
+
- kubectl config set-credentials "kube-pan-test-app-prod-app3" --token="$CL_prod_app3_KUBE_TOKEN"
|
|
4481
|
+
- kubectl config set-context "kube-pan-test-app-prod-app3" --cluster="kube-pan-test-app-prod-app3" --user="kube-pan-test-app-prod-app3" --namespace="pan-test-app-prod"
|
|
4482
|
+
- kubectl config use-context "kube-pan-test-app-prod-app3"
|
|
4483
|
+
- kubernetesRollback
|
|
4484
|
+
- echo "CL_GITLAB_ENVIRONMENT_URL=https://app3.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
|
|
4485
|
+
environment:
|
|
4486
|
+
name: prod/app3
|
|
4487
|
+
url: $CL_GITLAB_ENVIRONMENT_URL
|
|
4488
|
+
action: access
|
|
4489
|
+
artifacts:
|
|
4490
|
+
reports:
|
|
4491
|
+
dotenv: gitlab_environment.env
|
|
4492
|
+
rules:
|
|
4493
|
+
- when: manual
|
|
4494
|
+
if: $CI_COMMIT_TAG
|
|
4495
|
+
needs: []
|
|
4496
|
+
retry: *a1
|
|
4497
|
+
interruptible: true
|
|
4498
|
+
allow_failure: true
|
|
4499
|
+
create release:
|
|
4500
|
+
stage: release
|
|
4501
|
+
image: path/to/docker/semantic-release:the-version
|
|
4502
|
+
script:
|
|
4503
|
+
- semanticRelease
|
|
4504
|
+
after_script:
|
|
4505
|
+
- echo '๐ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
|
|
4506
|
+
rules:
|
|
4507
|
+
- &a2
|
|
4508
|
+
if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
|
|
4509
|
+
when: never
|
|
4510
|
+
- &a3
|
|
4511
|
+
if: $CI_PIPELINE_SOURCE == "schedule"
|
|
4512
|
+
when: never
|
|
4513
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
|
|
4514
|
+
when: on_success
|
|
4515
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
4516
|
+
when: manual
|
|
4517
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
|
|
4518
|
+
when: manual
|
|
4519
|
+
โ ๏ธ force create release:
|
|
4520
|
+
stage: release
|
|
4521
|
+
image: path/to/docker/semantic-release:the-version
|
|
4522
|
+
script:
|
|
4523
|
+
- semanticRelease
|
|
4524
|
+
after_script:
|
|
4525
|
+
- echo '๐ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
|
|
4526
|
+
rules:
|
|
4527
|
+
- *a2
|
|
4528
|
+
- *a3
|
|
4529
|
+
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
|
|
4530
|
+
when: manual
|
|
4531
|
+
- if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
|
|
4532
|
+
when: manual
|
|
4533
|
+
needs: []
|
|
4534
|
+
"
|
|
4535
|
+
`;
|