@catladder/pipeline 1.170.1 โ†’ 2.0.0

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