@catladder/pipeline 1.170.0 → 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 (194) hide show
  1. package/dist/bash/BashExpression.d.ts +2 -6
  2. package/dist/bash/BashExpression.js +5 -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 -41
  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 +4741 -0
  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 → referencing-other-vars.test.ts} +2 -2
  123. package/examples/referencing-other-vars.ts +83 -0
  124. package/examples/workspace-api-www-turbo-cache.test.ts +11 -0
  125. package/examples/{workspace-api-www-custom-cache.ts → workspace-api-www-turbo-cache.ts} +4 -3
  126. package/examples/workspace-api-www.ts +3 -2
  127. package/package.json +2 -6
  128. package/src/bash/BashExpression.ts +10 -13
  129. package/src/bash/bashEscape.ts +158 -0
  130. package/src/bash/bashYaml.ts +36 -2
  131. package/src/bash/getInjectVarsScript.ts +11 -2
  132. package/src/bash/index.ts +2 -0
  133. package/src/build/base/createAppBuildJob.ts +0 -1
  134. package/src/build/base/writeDotEnv.ts +6 -6
  135. package/src/build/custom/testJob.ts +0 -1
  136. package/src/build/node/buildJob.ts +2 -2
  137. package/src/build/node/cache.ts +0 -29
  138. package/src/build/node/testJob.ts +0 -1
  139. package/src/build/rails/build.ts +0 -1
  140. package/src/build/rails/test.ts +0 -1
  141. package/src/build/types.ts +0 -13
  142. package/src/context/createComponentContext.ts +0 -1
  143. package/src/context/getEnvConfig.ts +2 -2
  144. package/src/context/getEnvironment.ts +1 -1
  145. package/src/context/getEnvironmentContext.ts +1 -1
  146. package/src/context/getEnvironmentVariables.ts +44 -51
  147. package/src/deploy/base/deploy.ts +1 -1
  148. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +4 -12
  149. package/src/deploy/cloudRun/index.ts +2 -2
  150. package/src/deploy/kubernetes/cloudSql/index.ts +3 -16
  151. package/src/deploy/kubernetes/deployJob.ts +0 -2
  152. package/src/deploy/kubernetes/index.ts +2 -2
  153. package/src/deploy/kubernetes/kubeEnv.ts +3 -3
  154. package/src/deploy/kubernetes/kubeValues.ts +5 -8
  155. package/src/deploy/types/base.ts +0 -6
  156. package/src/deploy/types/kubernetes.ts +1 -36
  157. package/src/globalScriptFunctions/index.ts +30 -0
  158. package/src/index.ts +2 -0
  159. package/src/pipeline/gitlab/createGitlabJobs.ts +1 -4
  160. package/src/pipeline/gitlab/createGitlabPipeline.ts +8 -1
  161. package/src/pipeline/packageManager.ts +7 -5
  162. package/src/runner/index.ts +0 -1
  163. package/src/types/config.ts +6 -9
  164. package/src/types/context.ts +3 -9
  165. package/src/types/gitlab-types.ts +1 -0
  166. package/src/types/jobs.ts +0 -8
  167. package/src/utils/gitlab.ts +19 -2
  168. package/src/utils/writeFiles.ts +1 -2
  169. package/src/variables/VariableValue.ts +6 -0
  170. package/src/variables/VariableValueContainingReferences.ts +89 -0
  171. package/src/variables/__tests__/resolveAllReferences.test.ts +110 -0
  172. package/src/variables/__tests__/resolveAllReferencesOnce.test.ts +64 -0
  173. package/src/variables/__tests__/resolveReferencesOnce.test.ts +117 -0
  174. package/src/variables/__tests__/variableValue.test.ts +73 -0
  175. package/src/variables/resolveAllReferences.ts +46 -0
  176. package/src/variables/resolveAllReferencesOnce.ts +44 -0
  177. package/src/variables/resolveReferencesOnce.ts +29 -0
  178. package/bin/catladder-gitlab-dev.js +0 -3
  179. package/bin/catladder-gitlab.js +0 -3
  180. package/dist/bash/replaceAsync.d.ts +0 -2
  181. package/dist/bundles/catladder-gitlab/index.js +0 -15
  182. package/dist/context/__tests__/resolveReferences.test.js +0 -368
  183. package/dist/context/resolveReferences.d.ts +0 -6
  184. package/dist/context/resolveReferences.js +0 -286
  185. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +0 -85
  186. package/dist/deploy/kubernetes/processSecretsAsFiles.js +0 -33
  187. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +0 -1795
  188. package/examples/kubernetes-with-cloud-sql-legacy.ts +0 -35
  189. package/scripts/bundle +0 -2
  190. package/src/bash/replaceAsync.ts +0 -54
  191. package/src/context/__tests__/resolveReferences.test.ts +0 -148
  192. package/src/context/resolveReferences.ts +0 -93
  193. package/src/deploy/kubernetes/processSecretsAsFiles.ts +0 -35
  194. /package/dist/{context/__tests__/resolveReferences.test.d.ts → variables/__tests__/resolveAllReferences.test.d.ts} +0 -0
@@ -45,6 +45,36 @@ variables:
45
45
  CACHE_COMPRESSION_LEVEL: fast
46
46
  TRANSFER_METER_FREQUENCY: 5s
47
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
+ }
48
78
  api 🛡 audit:
49
79
  stage: test
50
80
  image: path/to/docker/jobs-default:the-version
@@ -53,9 +83,9 @@ api 🛡 audit:
53
83
  KUBERNETES_MEMORY_REQUEST: 1Gi
54
84
  KUBERNETES_MEMORY_LIMIT: 4Gi
55
85
  script:
56
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
86
+ - collapseable_section_start "injectvars" "Injecting variables"
57
87
  - export APP_PATH="api"
58
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
88
+ - collapseable_section_end "injectvars"
59
89
  - cd api
60
90
  - yarn npm audit --environment production
61
91
  rules:
@@ -79,21 +109,21 @@ api 👮 lint:
79
109
  KUBERNETES_MEMORY_REQUEST: 1Gi
80
110
  KUBERNETES_MEMORY_LIMIT: 4Gi
81
111
  script:
82
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
112
+ - collapseable_section_start "injectvars" "Injecting variables"
83
113
  - export APP_PATH="api"
84
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
85
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
114
+ - collapseable_section_end "injectvars"
115
+ - collapseable_section_start "nodeinstall" "Ensure node version"
86
116
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
87
117
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
88
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
118
+ - collapseable_section_end "nodeinstall"
89
119
  - cd api
90
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
120
+ - collapseable_section_start "nodeinstall" "Ensure node version"
91
121
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
92
122
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
93
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
94
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
123
+ - collapseable_section_end "nodeinstall"
124
+ - collapseable_section_start "yarninstall" "Yarn install"
95
125
  - yarn install --immutable
96
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
126
+ - collapseable_section_end "yarninstall"
97
127
  - yarn lint
98
128
  cache:
99
129
  - key: api-yarn
@@ -120,21 +150,21 @@ api 🧪 test:
120
150
  KUBERNETES_MEMORY_REQUEST: 1Gi
121
151
  KUBERNETES_MEMORY_LIMIT: 4Gi
122
152
  script:
123
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
153
+ - collapseable_section_start "injectvars" "Injecting variables"
124
154
  - export APP_PATH="api"
125
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
126
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
155
+ - collapseable_section_end "injectvars"
156
+ - collapseable_section_start "nodeinstall" "Ensure node version"
127
157
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
128
158
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
129
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
159
+ - collapseable_section_end "nodeinstall"
130
160
  - cd api
131
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
161
+ - collapseable_section_start "nodeinstall" "Ensure node version"
132
162
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
133
163
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
134
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
135
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
164
+ - collapseable_section_end "nodeinstall"
165
+ - collapseable_section_start "yarninstall" "Yarn install"
136
166
  - yarn install --immutable
137
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
167
+ - collapseable_section_end "yarninstall"
138
168
  - yarn test
139
169
  cache:
140
170
  - key: api-yarn
@@ -161,17 +191,16 @@ api 🧪 test:
161
191
  KUBERNETES_MEMORY_REQUEST: 1Gi
162
192
  KUBERNETES_MEMORY_LIMIT: 4Gi
163
193
  script:
164
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
194
+ - collapseable_section_start "injectvars" "Injecting variables"
165
195
  - export ENV_SHORT="dev"
166
196
  - export APP_DIR="api"
167
197
  - export ENV_TYPE="dev"
168
198
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
169
199
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
170
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")"
171
- - export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
201
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
172
202
  - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
173
- - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
174
- - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
203
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
175
204
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
176
205
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
177
206
  - export DB_NAME="pan-test-app-dev-api"
@@ -183,21 +212,44 @@ api 🧪 test:
183
212
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
184
213
  - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
185
214
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
186
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
187
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
215
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
216
+ - collapseable_section_end "injectvars"
217
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
218
+ - |-
219
+ cat <<EOF > api/.env
220
+ ENV_SHORT=dev
221
+ APP_DIR=api
222
+ ENV_TYPE=dev
223
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
224
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
225
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
226
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
227
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
228
+ DB_NAME=pan-test-app-dev-api
229
+ DB_USER=my-user
230
+ DB_PASSWORD=$(printf %s "$CL_dev_api_DB_PASSWORD" | escapeForDotEnv)
231
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
232
+ DATABASE_JDBC_URL=jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
233
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
234
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
235
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
236
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
237
+ _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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
238
+ EOF
239
+ - collapseable_section_end "write-dotenv-api"
188
240
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
189
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
241
+ - collapseable_section_start "nodeinstall" "Ensure node version"
190
242
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
191
243
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
192
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
244
+ - collapseable_section_end "nodeinstall"
193
245
  - cd api
194
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
246
+ - collapseable_section_start "nodeinstall" "Ensure node version"
195
247
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
196
248
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
197
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
198
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
249
+ - collapseable_section_end "nodeinstall"
250
+ - collapseable_section_start "yarninstall" "Yarn install"
199
251
  - yarn install --immutable
200
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
252
+ - collapseable_section_end "yarninstall"
201
253
  - yarn build
202
254
  cache:
203
255
  - key: api-yarn
@@ -208,15 +260,13 @@ api 🧪 test:
208
260
  policy: pull-push
209
261
  paths:
210
262
  - api/node_modules
211
- - key: api-next-cache
212
- policy: pull-push
213
- paths:
214
- - api/.next/cache
215
263
  artifacts:
216
264
  paths:
217
265
  - api/__build_info.json
218
266
  - api/.next
219
267
  - api/dist
268
+ exclude:
269
+ - api/.env
220
270
  expire_in: 1 day
221
271
  when: always
222
272
  reports: {}
@@ -244,7 +294,7 @@ api 🧪 test:
244
294
  KUBERNETES_MEMORY_REQUEST: 1Gi
245
295
  KUBERNETES_MEMORY_LIMIT: 2Gi
246
296
  script:
247
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
297
+ - collapseable_section_start "injectvars" "Injecting variables"
248
298
  - export APP_DIR="api"
249
299
  - export DOCKER_BUILD_CONTEXT="."
250
300
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -260,20 +310,20 @@ api 🧪 test:
260
310
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
261
311
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
262
312
  COPY --chown=node:node .yarn /app/.yarn"
263
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
313
+ - collapseable_section_end "injectvars"
264
314
  - ensureNodeDockerfile
265
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
315
+ - collapseable_section_start "docker-login" "Docker Login"
266
316
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
267
317
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
268
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
269
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
318
+ - collapseable_section_end "docker-login"
319
+ - collapseable_section_start "docker-build" "Docker build"
270
320
  - 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
271
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
272
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
321
+ - collapseable_section_end "docker-build"
322
+ - collapseable_section_start "docker-push" "Docker push and tag"
273
323
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
274
324
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
275
325
  - docker push $DOCKER_CACHE_IMAGE
276
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
326
+ - collapseable_section_end "docker-push"
277
327
  cache:
278
328
  - key: api-yarn
279
329
  policy: pull
@@ -292,8 +342,8 @@ api 🧪 test:
292
342
  image: aquasec/trivy:0.38.3
293
343
  variables: {}
294
344
  script:
295
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
296
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
345
+ - collapseable_section_start "injectvars" "Injecting variables"
346
+ - collapseable_section_end "injectvars"
297
347
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
298
348
  artifacts:
299
349
  paths:
@@ -314,17 +364,16 @@ api 🧪 test:
314
364
  KUBERNETES_MEMORY_REQUEST: 200Mi
315
365
  KUBERNETES_MEMORY_LIMIT: 400Mi
316
366
  script:
317
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
367
+ - collapseable_section_start "injectvars" "Injecting variables"
318
368
  - export ENV_SHORT="dev"
319
369
  - export APP_DIR="api"
320
370
  - export ENV_TYPE="dev"
321
371
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
322
372
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
323
373
  - 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")"
324
- - export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
374
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
325
375
  - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
326
- - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
327
- - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
376
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
328
377
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
329
378
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
330
379
  - export DB_NAME="pan-test-app-dev-api"
@@ -336,19 +385,19 @@ api 🧪 test:
336
385
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
337
386
  - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
338
387
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
339
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
388
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
340
389
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
341
390
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
342
391
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
343
392
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
344
393
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
345
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
346
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
394
+ - collapseable_section_end "injectvars"
395
+ - collapseable_section_start "prepare" "Prepare..."
347
396
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
348
397
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
349
398
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
350
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
351
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
399
+ - collapseable_section_end "prepare"
400
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
352
401
  - |
353
402
  cat > ____envvars.yaml <<EOF
354
403
  ENV_SHORT: |-
@@ -358,21 +407,19 @@ api 🧪 test:
358
407
  ENV_TYPE: |-
359
408
  dev
360
409
  BUILD_INFO_BUILD_ID: |-
361
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
410
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
362
411
  BUILD_INFO_BUILD_TIME: |-
363
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
412
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
364
413
  BUILD_INFO_CURRENT_VERSION: |-
365
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
366
- HOST: |-
367
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
414
+ $(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/^/ /')
415
+ HOSTNAME: |-
416
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
368
417
  ROOT_URL: |-
369
- $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
370
- HOST_INTERNAL: |-
371
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
372
- HOST_CANONICAL: |-
373
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
418
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
419
+ HOSTNAME_INTERNAL: |-
420
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
374
421
  ROOT_URL_INTERNAL: |-
375
- $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
422
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
376
423
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
377
424
  projectId:region:instancename
378
425
  DB_NAME: |-
@@ -380,7 +427,7 @@ api 🧪 test:
380
427
  DB_USER: |-
381
428
  my-user
382
429
  DB_PASSWORD: |-
383
- $(printf %s "$CL_dev_api_DB_PASSWORD" | sed 's/^/ /')
430
+ $(printf %s "$CL_dev_api_DB_PASSWORD" | sed '1!s/^/ /')
384
431
  DATABASE_URL: |-
385
432
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
386
433
  DATABASE_JDBC_URL: |-
@@ -390,24 +437,24 @@ api 🧪 test:
390
437
  DEPLOY_CLOUD_RUN_REGION: |-
391
438
  europe-west6
392
439
  GCLOUD_RUN_canonicalHostSuffix: |-
393
- $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
440
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
394
441
  _ALL_ENV_VAR_KEYS: |-
395
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
442
+ ["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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
396
443
 
397
444
  EOF
398
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
399
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
445
+ - collapseable_section_end "writeenvvars"
446
+ - collapseable_section_start "deploy" "Deploy to cloud run"
400
447
  - set +e
401
448
  - echo "ensuring Database..."
402
449
  - gcloud sql databases create pan-test-app-dev-api --instance=instancename --project projectId
403
450
  - set -e
404
451
  - gcloud run deploy pan-test-app-dev-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
405
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
406
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
452
+ - collapseable_section_end "deploy"
453
+ - collapseable_section_start "cleanup" "Cleanup"
407
454
  - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-dev-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
408
455
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api@$version --quiet --delete-tags; done
409
456
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
410
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
457
+ - collapseable_section_end "cleanup"
411
458
  - echo 'Uploading SBOM to Dependency Track'
412
459
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
413
460
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -449,9 +496,9 @@ api 🧪 test:
449
496
  KUBERNETES_MEMORY_LIMIT: 400Mi
450
497
  GIT_STRATEGY: none
451
498
  script:
452
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
499
+ - collapseable_section_start "injectvars" "Injecting variables"
453
500
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
454
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
501
+ - collapseable_section_end "injectvars"
455
502
  - set +e
456
503
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
457
504
  - gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6
@@ -487,17 +534,16 @@ api 🧪 test:
487
534
  KUBERNETES_MEMORY_REQUEST: 1Gi
488
535
  KUBERNETES_MEMORY_LIMIT: 4Gi
489
536
  script:
490
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
537
+ - collapseable_section_start "injectvars" "Injecting variables"
491
538
  - export ENV_SHORT="review"
492
539
  - export APP_DIR="api"
493
540
  - export ENV_TYPE="review"
494
541
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
495
542
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
496
543
  - 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")"
497
- - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
544
+ - 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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
498
545
  - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
499
- - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
500
- - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
546
+ - 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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
501
547
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
502
548
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
503
549
  - export DB_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
@@ -509,21 +555,44 @@ api 🧪 test:
509
555
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
510
556
  - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
511
557
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
512
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
513
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
558
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
559
+ - collapseable_section_end "injectvars"
560
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
561
+ - |-
562
+ cat <<EOF > api/.env
563
+ ENV_SHORT=review
564
+ APP_DIR=api
565
+ ENV_TYPE=review
566
+ 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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
567
+ 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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
568
+ 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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
569
+ 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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
570
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
571
+ DB_NAME=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | escapeForDotEnv)
572
+ DB_USER=my-user
573
+ DB_PASSWORD=$(printf %s "$CL_review_api_DB_PASSWORD" | escapeForDotEnv)
574
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
575
+ DATABASE_JDBC_URL=jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
576
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
577
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
578
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
579
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
580
+ _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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
581
+ EOF
582
+ - collapseable_section_end "write-dotenv-api"
514
583
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
515
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
584
+ - collapseable_section_start "nodeinstall" "Ensure node version"
516
585
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
517
586
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
518
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
587
+ - collapseable_section_end "nodeinstall"
519
588
  - cd api
520
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
589
+ - collapseable_section_start "nodeinstall" "Ensure node version"
521
590
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
522
591
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
523
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
524
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
592
+ - collapseable_section_end "nodeinstall"
593
+ - collapseable_section_start "yarninstall" "Yarn install"
525
594
  - yarn install --immutable
526
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
595
+ - collapseable_section_end "yarninstall"
527
596
  - yarn build
528
597
  cache:
529
598
  - key: api-yarn
@@ -534,15 +603,13 @@ api 🧪 test:
534
603
  policy: pull-push
535
604
  paths:
536
605
  - api/node_modules
537
- - key: api-next-cache
538
- policy: pull-push
539
- paths:
540
- - api/.next/cache
541
606
  artifacts:
542
607
  paths:
543
608
  - api/__build_info.json
544
609
  - api/.next
545
610
  - api/dist
611
+ exclude:
612
+ - api/.env
546
613
  expire_in: 1 day
547
614
  when: always
548
615
  reports: {}
@@ -568,7 +635,7 @@ api 🧪 test:
568
635
  KUBERNETES_MEMORY_REQUEST: 1Gi
569
636
  KUBERNETES_MEMORY_LIMIT: 2Gi
570
637
  script:
571
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
638
+ - collapseable_section_start "injectvars" "Injecting variables"
572
639
  - export APP_DIR="api"
573
640
  - export DOCKER_BUILD_CONTEXT="."
574
641
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -584,20 +651,20 @@ api 🧪 test:
584
651
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
585
652
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
586
653
  COPY --chown=node:node .yarn /app/.yarn"
587
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
654
+ - collapseable_section_end "injectvars"
588
655
  - ensureNodeDockerfile
589
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
656
+ - collapseable_section_start "docker-login" "Docker Login"
590
657
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
591
658
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
592
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
593
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
659
+ - collapseable_section_end "docker-login"
660
+ - collapseable_section_start "docker-build" "Docker build"
594
661
  - 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
595
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
596
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
662
+ - collapseable_section_end "docker-build"
663
+ - collapseable_section_start "docker-push" "Docker push and tag"
597
664
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
598
665
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
599
666
  - docker push $DOCKER_CACHE_IMAGE
600
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
667
+ - collapseable_section_end "docker-push"
601
668
  cache:
602
669
  - key: api-yarn
603
670
  policy: pull
@@ -614,8 +681,8 @@ api 🧪 test:
614
681
  image: aquasec/trivy:0.38.3
615
682
  variables: {}
616
683
  script:
617
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
618
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
684
+ - collapseable_section_start "injectvars" "Injecting variables"
685
+ - collapseable_section_end "injectvars"
619
686
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
620
687
  artifacts:
621
688
  paths:
@@ -634,17 +701,16 @@ api 🧪 test:
634
701
  KUBERNETES_MEMORY_REQUEST: 200Mi
635
702
  KUBERNETES_MEMORY_LIMIT: 400Mi
636
703
  script:
637
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
704
+ - collapseable_section_start "injectvars" "Injecting variables"
638
705
  - export ENV_SHORT="review"
639
706
  - export APP_DIR="api"
640
707
  - export ENV_TYPE="review"
641
708
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
642
709
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
643
710
  - 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")"
644
- - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
711
+ - 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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
645
712
  - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
646
- - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
647
- - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
713
+ - 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"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
648
714
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
649
715
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
650
716
  - export DB_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
@@ -656,19 +722,19 @@ api 🧪 test:
656
722
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
657
723
  - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
658
724
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
659
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
725
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
660
726
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
661
727
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
662
728
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
663
729
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
664
730
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
665
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
666
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
731
+ - collapseable_section_end "injectvars"
732
+ - collapseable_section_start "prepare" "Prepare..."
667
733
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
668
734
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
669
735
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
670
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
671
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
736
+ - collapseable_section_end "prepare"
737
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
672
738
  - |
673
739
  cat > ____envvars.yaml <<EOF
674
740
  ENV_SHORT: |-
@@ -678,29 +744,27 @@ api 🧪 test:
678
744
  ENV_TYPE: |-
679
745
  review
680
746
  BUILD_INFO_BUILD_ID: |-
681
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
747
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
682
748
  BUILD_INFO_BUILD_TIME: |-
683
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
749
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
684
750
  BUILD_INFO_CURRENT_VERSION: |-
685
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
686
- HOST: |-
687
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
751
+ $(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/^/ /')
752
+ HOSTNAME: |-
753
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
688
754
  ROOT_URL: |-
689
- $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
690
- HOST_INTERNAL: |-
691
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
692
- HOST_CANONICAL: |-
693
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
755
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
756
+ HOSTNAME_INTERNAL: |-
757
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
694
758
  ROOT_URL_INTERNAL: |-
695
- $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
759
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
696
760
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
697
761
  projectId:region:instancename
698
762
  DB_NAME: |-
699
- $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed 's/^/ /')
763
+ $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed '1!s/^/ /')
700
764
  DB_USER: |-
701
765
  my-user
702
766
  DB_PASSWORD: |-
703
- $(printf %s "$CL_review_api_DB_PASSWORD" | sed 's/^/ /')
767
+ $(printf %s "$CL_review_api_DB_PASSWORD" | sed '1!s/^/ /')
704
768
  DATABASE_URL: |-
705
769
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
706
770
  DATABASE_JDBC_URL: |-
@@ -710,27 +774,27 @@ api 🧪 test:
710
774
  DEPLOY_CLOUD_RUN_REGION: |-
711
775
  europe-west6
712
776
  GCLOUD_RUN_canonicalHostSuffix: |-
713
- $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
777
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
714
778
  _ALL_ENV_VAR_KEYS: |-
715
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
779
+ ["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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
716
780
 
717
781
  EOF
718
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
719
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
782
+ - collapseable_section_end "writeenvvars"
783
+ - collapseable_section_start "deploy" "Deploy to cloud run"
720
784
  - set +e
721
785
  - echo "ensuring Database..."
722
786
  - gcloud sql databases create pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api --instance=instancename --project projectId
723
787
  - set -e
724
788
  - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
725
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
726
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
789
+ - collapseable_section_end "deploy"
790
+ - collapseable_section_start "cleanup" "Cleanup"
727
791
  - 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"; })-api" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
728
792
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
729
793
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
730
794
  - set +e
731
795
  - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
732
796
  - set -e
733
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
797
+ - collapseable_section_end "cleanup"
734
798
  - echo 'Uploading SBOM to Dependency Track'
735
799
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
736
800
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -770,9 +834,9 @@ api 🧪 test:
770
834
  KUBERNETES_MEMORY_LIMIT: 400Mi
771
835
  GIT_STRATEGY: none
772
836
  script:
773
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
837
+ - collapseable_section_start "injectvars" "Injecting variables"
774
838
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
775
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
839
+ - collapseable_section_end "injectvars"
776
840
  - set +e
777
841
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
778
842
  - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6
@@ -812,17 +876,16 @@ api 🧪 test:
812
876
  KUBERNETES_MEMORY_REQUEST: 1Gi
813
877
  KUBERNETES_MEMORY_LIMIT: 4Gi
814
878
  script:
815
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
879
+ - collapseable_section_start "injectvars" "Injecting variables"
816
880
  - export ENV_SHORT="stage"
817
881
  - export APP_DIR="api"
818
882
  - export ENV_TYPE="stage"
819
883
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
820
884
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
821
885
  - 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")"
822
- - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
886
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
823
887
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
824
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
825
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
888
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
826
889
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
827
890
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
828
891
  - export DB_NAME="pan-test-app-stage-api"
@@ -834,21 +897,44 @@ api 🧪 test:
834
897
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
835
898
  - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
836
899
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
837
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
838
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
900
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
901
+ - collapseable_section_end "injectvars"
902
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
903
+ - |-
904
+ cat <<EOF > api/.env
905
+ ENV_SHORT=stage
906
+ APP_DIR=api
907
+ ENV_TYPE=stage
908
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
909
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
910
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
911
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
912
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
913
+ DB_NAME=pan-test-app-stage-api
914
+ DB_USER=my-user
915
+ DB_PASSWORD=$(printf %s "$CL_stage_api_DB_PASSWORD" | escapeForDotEnv)
916
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
917
+ DATABASE_JDBC_URL=jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
918
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
919
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
920
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
921
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
922
+ _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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
923
+ EOF
924
+ - collapseable_section_end "write-dotenv-api"
839
925
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
840
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
926
+ - collapseable_section_start "nodeinstall" "Ensure node version"
841
927
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
842
928
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
843
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
929
+ - collapseable_section_end "nodeinstall"
844
930
  - cd api
845
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
931
+ - collapseable_section_start "nodeinstall" "Ensure node version"
846
932
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
847
933
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
848
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
849
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
934
+ - collapseable_section_end "nodeinstall"
935
+ - collapseable_section_start "yarninstall" "Yarn install"
850
936
  - yarn install --immutable
851
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
937
+ - collapseable_section_end "yarninstall"
852
938
  - yarn build
853
939
  cache:
854
940
  - key: api-yarn
@@ -859,15 +945,13 @@ api 🧪 test:
859
945
  policy: pull-push
860
946
  paths:
861
947
  - api/node_modules
862
- - key: api-next-cache
863
- policy: pull-push
864
- paths:
865
- - api/.next/cache
866
948
  artifacts:
867
949
  paths:
868
950
  - api/__build_info.json
869
951
  - api/.next
870
952
  - api/dist
953
+ exclude:
954
+ - api/.env
871
955
  expire_in: 1 day
872
956
  when: always
873
957
  reports: {}
@@ -893,7 +977,7 @@ api 🧪 test:
893
977
  KUBERNETES_MEMORY_REQUEST: 1Gi
894
978
  KUBERNETES_MEMORY_LIMIT: 2Gi
895
979
  script:
896
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
980
+ - collapseable_section_start "injectvars" "Injecting variables"
897
981
  - export APP_DIR="api"
898
982
  - export DOCKER_BUILD_CONTEXT="."
899
983
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -909,20 +993,20 @@ api 🧪 test:
909
993
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
910
994
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
911
995
  COPY --chown=node:node .yarn /app/.yarn"
912
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
996
+ - collapseable_section_end "injectvars"
913
997
  - ensureNodeDockerfile
914
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
998
+ - collapseable_section_start "docker-login" "Docker Login"
915
999
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
916
1000
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
917
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
918
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1001
+ - collapseable_section_end "docker-login"
1002
+ - collapseable_section_start "docker-build" "Docker build"
919
1003
  - 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
920
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
921
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1004
+ - collapseable_section_end "docker-build"
1005
+ - collapseable_section_start "docker-push" "Docker push and tag"
922
1006
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
923
1007
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
924
1008
  - docker push $DOCKER_CACHE_IMAGE
925
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1009
+ - collapseable_section_end "docker-push"
926
1010
  cache:
927
1011
  - key: api-yarn
928
1012
  policy: pull
@@ -939,8 +1023,8 @@ api 🧪 test:
939
1023
  image: aquasec/trivy:0.38.3
940
1024
  variables: {}
941
1025
  script:
942
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
943
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1026
+ - collapseable_section_start "injectvars" "Injecting variables"
1027
+ - collapseable_section_end "injectvars"
944
1028
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
945
1029
  artifacts:
946
1030
  paths:
@@ -959,17 +1043,16 @@ api 🧪 test:
959
1043
  KUBERNETES_MEMORY_REQUEST: 200Mi
960
1044
  KUBERNETES_MEMORY_LIMIT: 400Mi
961
1045
  script:
962
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1046
+ - collapseable_section_start "injectvars" "Injecting variables"
963
1047
  - export ENV_SHORT="stage"
964
1048
  - export APP_DIR="api"
965
1049
  - export ENV_TYPE="stage"
966
1050
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
967
1051
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
968
1052
  - 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")"
969
- - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1053
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
970
1054
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
971
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
972
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1055
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
973
1056
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
974
1057
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
975
1058
  - export DB_NAME="pan-test-app-stage-api"
@@ -981,19 +1064,19 @@ api 🧪 test:
981
1064
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
982
1065
  - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
983
1066
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
984
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1067
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
985
1068
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
986
1069
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
987
1070
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
988
1071
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
989
1072
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
990
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
991
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1073
+ - collapseable_section_end "injectvars"
1074
+ - collapseable_section_start "prepare" "Prepare..."
992
1075
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
993
1076
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
994
1077
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
995
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
996
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1078
+ - collapseable_section_end "prepare"
1079
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
997
1080
  - |
998
1081
  cat > ____envvars.yaml <<EOF
999
1082
  ENV_SHORT: |-
@@ -1003,21 +1086,19 @@ api 🧪 test:
1003
1086
  ENV_TYPE: |-
1004
1087
  stage
1005
1088
  BUILD_INFO_BUILD_ID: |-
1006
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1089
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1007
1090
  BUILD_INFO_BUILD_TIME: |-
1008
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1091
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1009
1092
  BUILD_INFO_CURRENT_VERSION: |-
1010
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1011
- HOST: |-
1012
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1093
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
1094
+ HOSTNAME: |-
1095
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1013
1096
  ROOT_URL: |-
1014
- $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1015
- HOST_INTERNAL: |-
1016
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1017
- HOST_CANONICAL: |-
1018
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1097
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1098
+ HOSTNAME_INTERNAL: |-
1099
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1019
1100
  ROOT_URL_INTERNAL: |-
1020
- $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1101
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1021
1102
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
1022
1103
  projectId:region:instancename
1023
1104
  DB_NAME: |-
@@ -1025,7 +1106,7 @@ api 🧪 test:
1025
1106
  DB_USER: |-
1026
1107
  my-user
1027
1108
  DB_PASSWORD: |-
1028
- $(printf %s "$CL_stage_api_DB_PASSWORD" | sed 's/^/ /')
1109
+ $(printf %s "$CL_stage_api_DB_PASSWORD" | sed '1!s/^/ /')
1029
1110
  DATABASE_URL: |-
1030
1111
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1031
1112
  DATABASE_JDBC_URL: |-
@@ -1035,24 +1116,24 @@ api 🧪 test:
1035
1116
  DEPLOY_CLOUD_RUN_REGION: |-
1036
1117
  europe-west6
1037
1118
  GCLOUD_RUN_canonicalHostSuffix: |-
1038
- $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1119
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1039
1120
  _ALL_ENV_VAR_KEYS: |-
1040
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1121
+ ["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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1041
1122
 
1042
1123
  EOF
1043
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1044
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1124
+ - collapseable_section_end "writeenvvars"
1125
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1045
1126
  - set +e
1046
1127
  - echo "ensuring Database..."
1047
1128
  - gcloud sql databases create pan-test-app-stage-api --instance=instancename --project projectId
1048
1129
  - set -e
1049
1130
  - gcloud run deploy pan-test-app-stage-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1050
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1051
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1131
+ - collapseable_section_end "deploy"
1132
+ - collapseable_section_start "cleanup" "Cleanup"
1052
1133
  - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-stage-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
1053
1134
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api@$version --quiet --delete-tags; done
1054
1135
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1055
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1136
+ - collapseable_section_end "cleanup"
1056
1137
  - echo 'Uploading SBOM to Dependency Track'
1057
1138
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1058
1139
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -1085,9 +1166,9 @@ api 🧪 test:
1085
1166
  KUBERNETES_MEMORY_LIMIT: 400Mi
1086
1167
  GIT_STRATEGY: none
1087
1168
  script:
1088
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1169
+ - collapseable_section_start "injectvars" "Injecting variables"
1089
1170
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1090
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1171
+ - collapseable_section_end "injectvars"
1091
1172
  - set +e
1092
1173
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1093
1174
  - gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6
@@ -1121,17 +1202,16 @@ api 🧪 test:
1121
1202
  KUBERNETES_MEMORY_REQUEST: 1Gi
1122
1203
  KUBERNETES_MEMORY_LIMIT: 4Gi
1123
1204
  script:
1124
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1205
+ - collapseable_section_start "injectvars" "Injecting variables"
1125
1206
  - export ENV_SHORT="prod"
1126
1207
  - export APP_DIR="api"
1127
1208
  - export ENV_TYPE="prod"
1128
1209
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1129
1210
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1130
1211
  - 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")"
1131
- - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1212
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1132
1213
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1133
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1134
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1214
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1135
1215
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1136
1216
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1137
1217
  - export DB_NAME="pan-test-app-prod-api"
@@ -1143,21 +1223,44 @@ api 🧪 test:
1143
1223
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1144
1224
  - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1145
1225
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1146
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1147
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1226
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1227
+ - collapseable_section_end "injectvars"
1228
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
1229
+ - |-
1230
+ cat <<EOF > api/.env
1231
+ ENV_SHORT=prod
1232
+ APP_DIR=api
1233
+ ENV_TYPE=prod
1234
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1235
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1236
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1237
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1238
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
1239
+ DB_NAME=pan-test-app-prod-api
1240
+ DB_USER=my-user
1241
+ DB_PASSWORD=$(printf %s "$CL_prod_api_DB_PASSWORD" | escapeForDotEnv)
1242
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1243
+ DATABASE_JDBC_URL=jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
1244
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
1245
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
1246
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1247
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1248
+ _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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1249
+ EOF
1250
+ - collapseable_section_end "write-dotenv-api"
1148
1251
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1149
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1252
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1150
1253
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1151
1254
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1152
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1255
+ - collapseable_section_end "nodeinstall"
1153
1256
  - cd api
1154
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1257
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1155
1258
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1156
1259
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1157
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1158
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1260
+ - collapseable_section_end "nodeinstall"
1261
+ - collapseable_section_start "yarninstall" "Yarn install"
1159
1262
  - yarn install --immutable
1160
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1263
+ - collapseable_section_end "yarninstall"
1161
1264
  - yarn build
1162
1265
  cache:
1163
1266
  - key: api-yarn
@@ -1168,15 +1271,13 @@ api 🧪 test:
1168
1271
  policy: pull-push
1169
1272
  paths:
1170
1273
  - api/node_modules
1171
- - key: api-next-cache
1172
- policy: pull-push
1173
- paths:
1174
- - api/.next/cache
1175
1274
  artifacts:
1176
1275
  paths:
1177
1276
  - api/__build_info.json
1178
1277
  - api/.next
1179
1278
  - api/dist
1279
+ exclude:
1280
+ - api/.env
1180
1281
  expire_in: 1 day
1181
1282
  when: always
1182
1283
  reports: {}
@@ -1202,7 +1303,7 @@ api 🧪 test:
1202
1303
  KUBERNETES_MEMORY_REQUEST: 1Gi
1203
1304
  KUBERNETES_MEMORY_LIMIT: 2Gi
1204
1305
  script:
1205
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1306
+ - collapseable_section_start "injectvars" "Injecting variables"
1206
1307
  - export APP_DIR="api"
1207
1308
  - export DOCKER_BUILD_CONTEXT="."
1208
1309
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -1218,20 +1319,20 @@ api 🧪 test:
1218
1319
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1219
1320
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1220
1321
  COPY --chown=node:node .yarn /app/.yarn"
1221
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1322
+ - collapseable_section_end "injectvars"
1222
1323
  - ensureNodeDockerfile
1223
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1324
+ - collapseable_section_start "docker-login" "Docker Login"
1224
1325
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1225
1326
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
1226
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1227
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1327
+ - collapseable_section_end "docker-login"
1328
+ - collapseable_section_start "docker-build" "Docker build"
1228
1329
  - 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
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1230
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1330
+ - collapseable_section_end "docker-build"
1331
+ - collapseable_section_start "docker-push" "Docker push and tag"
1231
1332
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1232
1333
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1233
1334
  - docker push $DOCKER_CACHE_IMAGE
1234
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1335
+ - collapseable_section_end "docker-push"
1235
1336
  cache:
1236
1337
  - key: api-yarn
1237
1338
  policy: pull
@@ -1248,8 +1349,8 @@ api 🧪 test:
1248
1349
  image: aquasec/trivy:0.38.3
1249
1350
  variables: {}
1250
1351
  script:
1251
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1252
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1352
+ - collapseable_section_start "injectvars" "Injecting variables"
1353
+ - collapseable_section_end "injectvars"
1253
1354
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1254
1355
  artifacts:
1255
1356
  paths:
@@ -1268,17 +1369,16 @@ api 🧪 test:
1268
1369
  KUBERNETES_MEMORY_REQUEST: 200Mi
1269
1370
  KUBERNETES_MEMORY_LIMIT: 400Mi
1270
1371
  script:
1271
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1372
+ - collapseable_section_start "injectvars" "Injecting variables"
1272
1373
  - export ENV_SHORT="prod"
1273
1374
  - export APP_DIR="api"
1274
1375
  - export ENV_TYPE="prod"
1275
1376
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1276
1377
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1277
1378
  - 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 HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1379
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1279
1380
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1280
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1281
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1381
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1282
1382
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1283
1383
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1284
1384
  - export DB_NAME="pan-test-app-prod-api"
@@ -1290,19 +1390,19 @@ api 🧪 test:
1290
1390
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1291
1391
  - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1292
1392
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1293
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1393
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1294
1394
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1295
1395
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1296
1396
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1297
1397
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1298
1398
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1299
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1300
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1399
+ - collapseable_section_end "injectvars"
1400
+ - collapseable_section_start "prepare" "Prepare..."
1301
1401
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1302
1402
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1303
1403
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1304
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1305
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1404
+ - collapseable_section_end "prepare"
1405
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1306
1406
  - |
1307
1407
  cat > ____envvars.yaml <<EOF
1308
1408
  ENV_SHORT: |-
@@ -1312,21 +1412,19 @@ api 🧪 test:
1312
1412
  ENV_TYPE: |-
1313
1413
  prod
1314
1414
  BUILD_INFO_BUILD_ID: |-
1315
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1415
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1316
1416
  BUILD_INFO_BUILD_TIME: |-
1317
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1417
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1318
1418
  BUILD_INFO_CURRENT_VERSION: |-
1319
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1320
- HOST: |-
1321
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1419
+ $(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/^/ /')
1420
+ HOSTNAME: |-
1421
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1322
1422
  ROOT_URL: |-
1323
- $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1324
- HOST_INTERNAL: |-
1325
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1326
- HOST_CANONICAL: |-
1327
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1423
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1424
+ HOSTNAME_INTERNAL: |-
1425
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1328
1426
  ROOT_URL_INTERNAL: |-
1329
- $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1427
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1330
1428
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
1331
1429
  projectId:region:instancename
1332
1430
  DB_NAME: |-
@@ -1334,7 +1432,7 @@ api 🧪 test:
1334
1432
  DB_USER: |-
1335
1433
  my-user
1336
1434
  DB_PASSWORD: |-
1337
- $(printf %s "$CL_prod_api_DB_PASSWORD" | sed 's/^/ /')
1435
+ $(printf %s "$CL_prod_api_DB_PASSWORD" | sed '1!s/^/ /')
1338
1436
  DATABASE_URL: |-
1339
1437
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1340
1438
  DATABASE_JDBC_URL: |-
@@ -1344,24 +1442,24 @@ api 🧪 test:
1344
1442
  DEPLOY_CLOUD_RUN_REGION: |-
1345
1443
  europe-west6
1346
1444
  GCLOUD_RUN_canonicalHostSuffix: |-
1347
- $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1445
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1348
1446
  _ALL_ENV_VAR_KEYS: |-
1349
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1447
+ ["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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1350
1448
 
1351
1449
  EOF
1352
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1353
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1450
+ - collapseable_section_end "writeenvvars"
1451
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1354
1452
  - set +e
1355
1453
  - echo "ensuring Database..."
1356
1454
  - gcloud sql databases create pan-test-app-prod-api --instance=instancename --project projectId
1357
1455
  - set -e
1358
1456
  - gcloud run deploy pan-test-app-prod-api --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1359
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1360
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1457
+ - collapseable_section_end "deploy"
1458
+ - collapseable_section_start "cleanup" "Cleanup"
1361
1459
  - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-prod-api --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
1362
1460
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api@$version --quiet --delete-tags; done
1363
1461
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api@$version --quiet --delete-tags; done
1364
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1462
+ - collapseable_section_end "cleanup"
1365
1463
  - echo 'Uploading SBOM to Dependency Track'
1366
1464
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1367
1465
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -1394,9 +1492,9 @@ api 🧪 test:
1394
1492
  KUBERNETES_MEMORY_LIMIT: 400Mi
1395
1493
  GIT_STRATEGY: none
1396
1494
  script:
1397
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1495
+ - collapseable_section_start "injectvars" "Injecting variables"
1398
1496
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1399
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1497
+ - collapseable_section_end "injectvars"
1400
1498
  - set +e
1401
1499
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1402
1500
  - gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6
@@ -1430,9 +1528,9 @@ worker 🛡 audit:
1430
1528
  KUBERNETES_MEMORY_REQUEST: 1Gi
1431
1529
  KUBERNETES_MEMORY_LIMIT: 4Gi
1432
1530
  script:
1433
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1531
+ - collapseable_section_start "injectvars" "Injecting variables"
1434
1532
  - export APP_PATH="api"
1435
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1533
+ - collapseable_section_end "injectvars"
1436
1534
  - cd api
1437
1535
  - yarn npm audit --environment production
1438
1536
  rules:
@@ -1452,21 +1550,21 @@ worker 👮 lint:
1452
1550
  KUBERNETES_MEMORY_REQUEST: 1Gi
1453
1551
  KUBERNETES_MEMORY_LIMIT: 4Gi
1454
1552
  script:
1455
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1553
+ - collapseable_section_start "injectvars" "Injecting variables"
1456
1554
  - export APP_PATH="api"
1457
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1458
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1555
+ - collapseable_section_end "injectvars"
1556
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1459
1557
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1460
1558
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1461
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1559
+ - collapseable_section_end "nodeinstall"
1462
1560
  - cd api
1463
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1561
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1464
1562
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1465
1563
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1466
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1467
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1564
+ - collapseable_section_end "nodeinstall"
1565
+ - collapseable_section_start "yarninstall" "Yarn install"
1468
1566
  - yarn install --immutable
1469
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1567
+ - collapseable_section_end "yarninstall"
1470
1568
  - yarn lint
1471
1569
  cache:
1472
1570
  - key: api-yarn
@@ -1493,21 +1591,21 @@ worker 🧪 test:
1493
1591
  KUBERNETES_MEMORY_REQUEST: 1Gi
1494
1592
  KUBERNETES_MEMORY_LIMIT: 4Gi
1495
1593
  script:
1496
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1594
+ - collapseable_section_start "injectvars" "Injecting variables"
1497
1595
  - export APP_PATH="api"
1498
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1499
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1596
+ - collapseable_section_end "injectvars"
1597
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1500
1598
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1501
1599
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1502
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1600
+ - collapseable_section_end "nodeinstall"
1503
1601
  - cd api
1504
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1602
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1505
1603
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1506
1604
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1507
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1508
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1605
+ - collapseable_section_end "nodeinstall"
1606
+ - collapseable_section_start "yarninstall" "Yarn install"
1509
1607
  - yarn install --immutable
1510
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1608
+ - collapseable_section_end "yarninstall"
1511
1609
  - yarn test
1512
1610
  cache:
1513
1611
  - key: api-yarn
@@ -1534,17 +1632,16 @@ worker 🧪 test:
1534
1632
  KUBERNETES_MEMORY_REQUEST: 1Gi
1535
1633
  KUBERNETES_MEMORY_LIMIT: 4Gi
1536
1634
  script:
1537
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1635
+ - collapseable_section_start "injectvars" "Injecting variables"
1538
1636
  - export ENV_SHORT="dev"
1539
1637
  - export APP_DIR="api"
1540
1638
  - export ENV_TYPE="dev"
1541
1639
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1542
1640
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1543
1641
  - 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")"
1544
- - export HOST="$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1642
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1545
1643
  - export ROOT_URL="https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1546
- - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1547
- - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1644
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1548
1645
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1549
1646
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1550
1647
  - export DB_NAME="pan-test-app-dev-api"
@@ -1556,21 +1653,44 @@ worker 🧪 test:
1556
1653
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1557
1654
  - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_worker_GCLOUD_DEPLOY_credentialsKey"
1558
1655
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix"
1559
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1560
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1656
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1657
+ - collapseable_section_end "injectvars"
1658
+ - collapseable_section_start "write-dotenv-worker" "write dot env for worker"
1659
+ - |-
1660
+ cat <<EOF > api/.env
1661
+ ENV_SHORT=dev
1662
+ APP_DIR=api
1663
+ ENV_TYPE=dev
1664
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1665
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1666
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1667
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1668
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
1669
+ DB_NAME=pan-test-app-dev-api
1670
+ DB_USER=my-user
1671
+ DB_PASSWORD=$(printf %s "$CL_dev_api_DB_PASSWORD" | escapeForDotEnv)
1672
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1673
+ DATABASE_JDBC_URL=jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
1674
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
1675
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
1676
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_worker_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1677
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1678
+ _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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1679
+ EOF
1680
+ - collapseable_section_end "write-dotenv-worker"
1561
1681
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1562
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1682
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1563
1683
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1564
1684
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1565
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1685
+ - collapseable_section_end "nodeinstall"
1566
1686
  - cd api
1567
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1687
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1568
1688
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1569
1689
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1570
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1571
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1690
+ - collapseable_section_end "nodeinstall"
1691
+ - collapseable_section_start "yarninstall" "Yarn install"
1572
1692
  - yarn install --immutable
1573
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1693
+ - collapseable_section_end "yarninstall"
1574
1694
  - yarn build:worker
1575
1695
  cache:
1576
1696
  - key: api-yarn
@@ -1581,15 +1701,13 @@ worker 🧪 test:
1581
1701
  policy: pull-push
1582
1702
  paths:
1583
1703
  - api/node_modules
1584
- - key: worker-next-cache
1585
- policy: pull-push
1586
- paths:
1587
- - api/.next/cache
1588
1704
  artifacts:
1589
1705
  paths:
1590
1706
  - api/__build_info.json
1591
1707
  - api/.next
1592
1708
  - api/dist
1709
+ exclude:
1710
+ - api/.env
1593
1711
  expire_in: 1 day
1594
1712
  when: always
1595
1713
  reports: {}
@@ -1617,7 +1735,7 @@ worker 🧪 test:
1617
1735
  KUBERNETES_MEMORY_REQUEST: 1Gi
1618
1736
  KUBERNETES_MEMORY_LIMIT: 2Gi
1619
1737
  script:
1620
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1738
+ - collapseable_section_start "injectvars" "Injecting variables"
1621
1739
  - export APP_DIR="api"
1622
1740
  - export DOCKER_BUILD_CONTEXT="."
1623
1741
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -1633,20 +1751,20 @@ worker 🧪 test:
1633
1751
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1634
1752
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1635
1753
  COPY --chown=node:node .yarn /app/.yarn"
1636
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1754
+ - collapseable_section_end "injectvars"
1637
1755
  - ensureNodeDockerfile
1638
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1756
+ - collapseable_section_start "docker-login" "Docker Login"
1639
1757
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_worker_GCLOUD_DEPLOY_credentialsKey")
1640
1758
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
1641
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1642
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1759
+ - collapseable_section_end "docker-login"
1760
+ - collapseable_section_start "docker-build" "Docker build"
1643
1761
  - 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
1644
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1645
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1762
+ - collapseable_section_end "docker-build"
1763
+ - collapseable_section_start "docker-push" "Docker push and tag"
1646
1764
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1647
1765
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1648
1766
  - docker push $DOCKER_CACHE_IMAGE
1649
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1767
+ - collapseable_section_end "docker-push"
1650
1768
  cache:
1651
1769
  - key: api-yarn
1652
1770
  policy: pull
@@ -1665,8 +1783,8 @@ worker 🧪 test:
1665
1783
  image: aquasec/trivy:0.38.3
1666
1784
  variables: {}
1667
1785
  script:
1668
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1669
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1786
+ - collapseable_section_start "injectvars" "Injecting variables"
1787
+ - collapseable_section_end "injectvars"
1670
1788
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1671
1789
  artifacts:
1672
1790
  paths:
@@ -1687,17 +1805,16 @@ worker 🧪 test:
1687
1805
  KUBERNETES_MEMORY_REQUEST: 200Mi
1688
1806
  KUBERNETES_MEMORY_LIMIT: 400Mi
1689
1807
  script:
1690
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1808
+ - collapseable_section_start "injectvars" "Injecting variables"
1691
1809
  - export ENV_SHORT="dev"
1692
1810
  - export APP_DIR="api"
1693
1811
  - export ENV_TYPE="dev"
1694
1812
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1695
1813
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1696
1814
  - 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")"
1697
- - export HOST="$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1815
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1698
1816
  - export ROOT_URL="https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1699
- - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1700
- - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1817
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1701
1818
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1702
1819
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1703
1820
  - export DB_NAME="pan-test-app-dev-api"
@@ -1709,19 +1826,19 @@ worker 🧪 test:
1709
1826
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1710
1827
  - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_worker_GCLOUD_DEPLOY_credentialsKey"
1711
1828
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix"
1712
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1829
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1713
1830
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1714
1831
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/worker"
1715
1832
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/worker"
1716
1833
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1717
1834
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1718
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1719
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1835
+ - collapseable_section_end "injectvars"
1836
+ - collapseable_section_start "prepare" "Prepare..."
1720
1837
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_worker_GCLOUD_DEPLOY_credentialsKey")
1721
1838
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1722
1839
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1723
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1724
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1840
+ - collapseable_section_end "prepare"
1841
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1725
1842
  - |
1726
1843
  cat > ____envvars.yaml <<EOF
1727
1844
  ENV_SHORT: |-
@@ -1731,21 +1848,19 @@ worker 🧪 test:
1731
1848
  ENV_TYPE: |-
1732
1849
  dev
1733
1850
  BUILD_INFO_BUILD_ID: |-
1734
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1851
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1735
1852
  BUILD_INFO_BUILD_TIME: |-
1736
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1853
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1737
1854
  BUILD_INFO_CURRENT_VERSION: |-
1738
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1739
- HOST: |-
1740
- $(printf %s "$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1855
+ $(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/^/ /')
1856
+ HOSTNAME: |-
1857
+ $(printf %s "$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1741
1858
  ROOT_URL: |-
1742
- $(printf %s "https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1743
- HOST_INTERNAL: |-
1744
- $(printf %s "$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1745
- HOST_CANONICAL: |-
1746
- $(printf %s "$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1859
+ $(printf %s "https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1860
+ HOSTNAME_INTERNAL: |-
1861
+ $(printf %s "$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1747
1862
  ROOT_URL_INTERNAL: |-
1748
- $(printf %s "https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1863
+ $(printf %s "https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1749
1864
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
1750
1865
  projectId:region:instancename
1751
1866
  DB_NAME: |-
@@ -1753,7 +1868,7 @@ worker 🧪 test:
1753
1868
  DB_USER: |-
1754
1869
  my-user
1755
1870
  DB_PASSWORD: |-
1756
- $(printf %s "$CL_dev_api_DB_PASSWORD" | sed 's/^/ /')
1871
+ $(printf %s "$CL_dev_api_DB_PASSWORD" | sed '1!s/^/ /')
1757
1872
  DATABASE_URL: |-
1758
1873
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1759
1874
  DATABASE_JDBC_URL: |-
@@ -1763,24 +1878,24 @@ worker 🧪 test:
1763
1878
  DEPLOY_CLOUD_RUN_REGION: |-
1764
1879
  europe-west6
1765
1880
  GCLOUD_RUN_canonicalHostSuffix: |-
1766
- $(printf %s "$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1881
+ $(printf %s "$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1767
1882
  _ALL_ENV_VAR_KEYS: |-
1768
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1883
+ ["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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1769
1884
 
1770
1885
  EOF
1771
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1772
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1886
+ - collapseable_section_end "writeenvvars"
1887
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1773
1888
  - set +e
1774
1889
  - echo "ensuring Database..."
1775
1890
  - gcloud sql databases create pan-test-app-dev-api --instance=instancename --project projectId
1776
1891
  - set -e
1777
1892
  - gcloud run deploy pan-test-app-dev-worker --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/worker:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=worker,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-worker --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1778
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1779
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1893
+ - collapseable_section_end "deploy"
1894
+ - collapseable_section_start "cleanup" "Cleanup"
1780
1895
  - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-dev-worker --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
1781
1896
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/worker --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/worker@$version --quiet --delete-tags; done
1782
1897
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/worker --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/worker@$version --quiet --delete-tags; done
1783
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1898
+ - collapseable_section_end "cleanup"
1784
1899
  - echo 'Uploading SBOM to Dependency Track'
1785
1900
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/worker" "https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1786
1901
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-worker-$CL_dev_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -1822,9 +1937,9 @@ worker 🧪 test:
1822
1937
  KUBERNETES_MEMORY_LIMIT: 400Mi
1823
1938
  GIT_STRATEGY: none
1824
1939
  script:
1825
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1940
+ - collapseable_section_start "injectvars" "Injecting variables"
1826
1941
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1827
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1942
+ - collapseable_section_end "injectvars"
1828
1943
  - set +e
1829
1944
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_worker_GCLOUD_DEPLOY_credentialsKey")
1830
1945
  - gcloud run services delete pan-test-app-dev-worker --project=google-project-id --region=europe-west6
@@ -1860,17 +1975,16 @@ worker 🧪 test:
1860
1975
  KUBERNETES_MEMORY_REQUEST: 1Gi
1861
1976
  KUBERNETES_MEMORY_LIMIT: 4Gi
1862
1977
  script:
1863
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1978
+ - collapseable_section_start "injectvars" "Injecting variables"
1864
1979
  - export ENV_SHORT="review"
1865
1980
  - export APP_DIR="api"
1866
1981
  - export ENV_TYPE="review"
1867
1982
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1868
1983
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1869
1984
  - 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")"
1870
- - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1985
+ - 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1871
1986
  - 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1872
- - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1873
- - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1987
+ - 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1874
1988
  - 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1875
1989
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1876
1990
  - export DB_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
@@ -1882,21 +1996,44 @@ worker 🧪 test:
1882
1996
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1883
1997
  - export GCLOUD_DEPLOY_credentialsKey="$CL_review_worker_GCLOUD_DEPLOY_credentialsKey"
1884
1998
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix"
1885
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1886
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1999
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2000
+ - collapseable_section_end "injectvars"
2001
+ - collapseable_section_start "write-dotenv-worker" "write dot env for worker"
2002
+ - |-
2003
+ cat <<EOF > api/.env
2004
+ ENV_SHORT=review
2005
+ APP_DIR=api
2006
+ ENV_TYPE=review
2007
+ 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2008
+ 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2009
+ 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2010
+ 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2011
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
2012
+ DB_NAME=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | escapeForDotEnv)
2013
+ DB_USER=my-user
2014
+ DB_PASSWORD=$(printf %s "$CL_review_api_DB_PASSWORD" | escapeForDotEnv)
2015
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
2016
+ DATABASE_JDBC_URL=jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
2017
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
2018
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
2019
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_worker_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
2020
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
2021
+ _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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2022
+ EOF
2023
+ - collapseable_section_end "write-dotenv-worker"
1887
2024
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1888
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2025
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1889
2026
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1890
2027
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1891
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2028
+ - collapseable_section_end "nodeinstall"
1892
2029
  - cd api
1893
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2030
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1894
2031
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1895
2032
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1896
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1897
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2033
+ - collapseable_section_end "nodeinstall"
2034
+ - collapseable_section_start "yarninstall" "Yarn install"
1898
2035
  - yarn install --immutable
1899
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2036
+ - collapseable_section_end "yarninstall"
1900
2037
  - yarn build:worker
1901
2038
  cache:
1902
2039
  - key: api-yarn
@@ -1907,15 +2044,13 @@ worker 🧪 test:
1907
2044
  policy: pull-push
1908
2045
  paths:
1909
2046
  - api/node_modules
1910
- - key: worker-next-cache
1911
- policy: pull-push
1912
- paths:
1913
- - api/.next/cache
1914
2047
  artifacts:
1915
2048
  paths:
1916
2049
  - api/__build_info.json
1917
2050
  - api/.next
1918
2051
  - api/dist
2052
+ exclude:
2053
+ - api/.env
1919
2054
  expire_in: 1 day
1920
2055
  when: always
1921
2056
  reports: {}
@@ -1941,7 +2076,7 @@ worker 🧪 test:
1941
2076
  KUBERNETES_MEMORY_REQUEST: 1Gi
1942
2077
  KUBERNETES_MEMORY_LIMIT: 2Gi
1943
2078
  script:
1944
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2079
+ - collapseable_section_start "injectvars" "Injecting variables"
1945
2080
  - export APP_DIR="api"
1946
2081
  - export DOCKER_BUILD_CONTEXT="."
1947
2082
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -1957,20 +2092,20 @@ worker 🧪 test:
1957
2092
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1958
2093
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1959
2094
  COPY --chown=node:node .yarn /app/.yarn"
1960
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2095
+ - collapseable_section_end "injectvars"
1961
2096
  - ensureNodeDockerfile
1962
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2097
+ - collapseable_section_start "docker-login" "Docker Login"
1963
2098
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_worker_GCLOUD_DEPLOY_credentialsKey")
1964
2099
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
1965
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1966
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2100
+ - collapseable_section_end "docker-login"
2101
+ - collapseable_section_start "docker-build" "Docker build"
1967
2102
  - 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
1968
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1969
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2103
+ - collapseable_section_end "docker-build"
2104
+ - collapseable_section_start "docker-push" "Docker push and tag"
1970
2105
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1971
2106
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1972
2107
  - docker push $DOCKER_CACHE_IMAGE
1973
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2108
+ - collapseable_section_end "docker-push"
1974
2109
  cache:
1975
2110
  - key: api-yarn
1976
2111
  policy: pull
@@ -1987,8 +2122,8 @@ worker 🧪 test:
1987
2122
  image: aquasec/trivy:0.38.3
1988
2123
  variables: {}
1989
2124
  script:
1990
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1991
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2125
+ - collapseable_section_start "injectvars" "Injecting variables"
2126
+ - collapseable_section_end "injectvars"
1992
2127
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1993
2128
  artifacts:
1994
2129
  paths:
@@ -2007,17 +2142,16 @@ worker 🧪 test:
2007
2142
  KUBERNETES_MEMORY_REQUEST: 200Mi
2008
2143
  KUBERNETES_MEMORY_LIMIT: 400Mi
2009
2144
  script:
2010
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2145
+ - collapseable_section_start "injectvars" "Injecting variables"
2011
2146
  - export ENV_SHORT="review"
2012
2147
  - export APP_DIR="api"
2013
2148
  - export ENV_TYPE="review"
2014
2149
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2015
2150
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2016
2151
  - 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")"
2017
- - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2152
+ - 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2018
2153
  - 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2019
- - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2020
- - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2154
+ - 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2021
2155
  - 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2022
2156
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
2023
2157
  - export DB_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
@@ -2029,19 +2163,19 @@ worker 🧪 test:
2029
2163
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2030
2164
  - export GCLOUD_DEPLOY_credentialsKey="$CL_review_worker_GCLOUD_DEPLOY_credentialsKey"
2031
2165
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix"
2032
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2166
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2033
2167
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2034
2168
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/worker/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
2035
2169
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/worker"
2036
2170
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2037
2171
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2038
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2039
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2172
+ - collapseable_section_end "injectvars"
2173
+ - collapseable_section_start "prepare" "Prepare..."
2040
2174
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_worker_GCLOUD_DEPLOY_credentialsKey")
2041
2175
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
2042
2176
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2043
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2044
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2177
+ - collapseable_section_end "prepare"
2178
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
2045
2179
  - |
2046
2180
  cat > ____envvars.yaml <<EOF
2047
2181
  ENV_SHORT: |-
@@ -2051,29 +2185,27 @@ worker 🧪 test:
2051
2185
  ENV_TYPE: |-
2052
2186
  review
2053
2187
  BUILD_INFO_BUILD_ID: |-
2054
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2188
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2055
2189
  BUILD_INFO_BUILD_TIME: |-
2056
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2190
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2057
2191
  BUILD_INFO_CURRENT_VERSION: |-
2058
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2059
- HOST: |-
2060
- $(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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2192
+ $(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/^/ /')
2193
+ HOSTNAME: |-
2194
+ $(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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2061
2195
  ROOT_URL: |-
2062
- $(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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2063
- HOST_INTERNAL: |-
2064
- $(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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2065
- HOST_CANONICAL: |-
2066
- $(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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2196
+ $(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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2197
+ HOSTNAME_INTERNAL: |-
2198
+ $(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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2067
2199
  ROOT_URL_INTERNAL: |-
2068
- $(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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2200
+ $(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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2069
2201
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
2070
2202
  projectId:region:instancename
2071
2203
  DB_NAME: |-
2072
- $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed 's/^/ /')
2204
+ $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed '1!s/^/ /')
2073
2205
  DB_USER: |-
2074
2206
  my-user
2075
2207
  DB_PASSWORD: |-
2076
- $(printf %s "$CL_review_api_DB_PASSWORD" | sed 's/^/ /')
2208
+ $(printf %s "$CL_review_api_DB_PASSWORD" | sed '1!s/^/ /')
2077
2209
  DATABASE_URL: |-
2078
2210
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
2079
2211
  DATABASE_JDBC_URL: |-
@@ -2083,27 +2215,27 @@ worker 🧪 test:
2083
2215
  DEPLOY_CLOUD_RUN_REGION: |-
2084
2216
  europe-west6
2085
2217
  GCLOUD_RUN_canonicalHostSuffix: |-
2086
- $(printf %s "$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2218
+ $(printf %s "$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
2087
2219
  _ALL_ENV_VAR_KEYS: |-
2088
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2220
+ ["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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2089
2221
 
2090
2222
  EOF
2091
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2092
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2223
+ - collapseable_section_end "writeenvvars"
2224
+ - collapseable_section_start "deploy" "Deploy to cloud run"
2093
2225
  - set +e
2094
2226
  - echo "ensuring Database..."
2095
2227
  - gcloud sql databases create pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api --instance=instancename --project projectId
2096
2228
  - set -e
2097
2229
  - 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"; })-worker" | awk '{print tolower($0)}') --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/worker/$([ -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 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=worker,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"; })-worker" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2098
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2099
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2230
+ - collapseable_section_end "deploy"
2231
+ - collapseable_section_start "cleanup" "Cleanup"
2100
2232
  - 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"; })-worker" | 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
2101
2233
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/worker/$([ -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/worker/$([ -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
2102
2234
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/worker --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/worker@$version --quiet --delete-tags; done
2103
2235
  - set +e
2104
2236
  - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/worker --quiet --delete-tags
2105
2237
  - set -e
2106
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2238
+ - collapseable_section_end "cleanup"
2107
2239
  - echo 'Uploading SBOM to Dependency Track'
2108
2240
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/worker" "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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2109
2241
  - 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"; })-worker-$CL_review_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -2143,9 +2275,9 @@ worker 🧪 test:
2143
2275
  KUBERNETES_MEMORY_LIMIT: 400Mi
2144
2276
  GIT_STRATEGY: none
2145
2277
  script:
2146
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2278
+ - collapseable_section_start "injectvars" "Injecting variables"
2147
2279
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2148
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2280
+ - collapseable_section_end "injectvars"
2149
2281
  - set +e
2150
2282
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_worker_GCLOUD_DEPLOY_credentialsKey")
2151
2283
  - 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"; })-worker" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6
@@ -2185,17 +2317,16 @@ worker 🧪 test:
2185
2317
  KUBERNETES_MEMORY_REQUEST: 1Gi
2186
2318
  KUBERNETES_MEMORY_LIMIT: 4Gi
2187
2319
  script:
2188
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2320
+ - collapseable_section_start "injectvars" "Injecting variables"
2189
2321
  - export ENV_SHORT="stage"
2190
2322
  - export APP_DIR="api"
2191
2323
  - export ENV_TYPE="stage"
2192
2324
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2193
2325
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2194
2326
  - 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")"
2195
- - export HOST="$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2327
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2196
2328
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2197
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2198
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2329
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2199
2330
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2200
2331
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
2201
2332
  - export DB_NAME="pan-test-app-stage-api"
@@ -2207,21 +2338,44 @@ worker 🧪 test:
2207
2338
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2208
2339
  - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_worker_GCLOUD_DEPLOY_credentialsKey"
2209
2340
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix"
2210
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2211
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2341
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2342
+ - collapseable_section_end "injectvars"
2343
+ - collapseable_section_start "write-dotenv-worker" "write dot env for worker"
2344
+ - |-
2345
+ cat <<EOF > api/.env
2346
+ ENV_SHORT=stage
2347
+ APP_DIR=api
2348
+ ENV_TYPE=stage
2349
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2350
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2351
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2352
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2353
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
2354
+ DB_NAME=pan-test-app-stage-api
2355
+ DB_USER=my-user
2356
+ DB_PASSWORD=$(printf %s "$CL_stage_api_DB_PASSWORD" | escapeForDotEnv)
2357
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
2358
+ DATABASE_JDBC_URL=jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
2359
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
2360
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
2361
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_worker_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
2362
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
2363
+ _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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2364
+ EOF
2365
+ - collapseable_section_end "write-dotenv-worker"
2212
2366
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
2213
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2367
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2214
2368
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2215
2369
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2216
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2370
+ - collapseable_section_end "nodeinstall"
2217
2371
  - cd api
2218
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2372
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2219
2373
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2220
2374
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2221
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2222
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2375
+ - collapseable_section_end "nodeinstall"
2376
+ - collapseable_section_start "yarninstall" "Yarn install"
2223
2377
  - yarn install --immutable
2224
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2378
+ - collapseable_section_end "yarninstall"
2225
2379
  - yarn build:worker
2226
2380
  cache:
2227
2381
  - key: api-yarn
@@ -2232,15 +2386,13 @@ worker 🧪 test:
2232
2386
  policy: pull-push
2233
2387
  paths:
2234
2388
  - api/node_modules
2235
- - key: worker-next-cache
2236
- policy: pull-push
2237
- paths:
2238
- - api/.next/cache
2239
2389
  artifacts:
2240
2390
  paths:
2241
2391
  - api/__build_info.json
2242
2392
  - api/.next
2243
2393
  - api/dist
2394
+ exclude:
2395
+ - api/.env
2244
2396
  expire_in: 1 day
2245
2397
  when: always
2246
2398
  reports: {}
@@ -2266,7 +2418,7 @@ worker 🧪 test:
2266
2418
  KUBERNETES_MEMORY_REQUEST: 1Gi
2267
2419
  KUBERNETES_MEMORY_LIMIT: 2Gi
2268
2420
  script:
2269
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2421
+ - collapseable_section_start "injectvars" "Injecting variables"
2270
2422
  - export APP_DIR="api"
2271
2423
  - export DOCKER_BUILD_CONTEXT="."
2272
2424
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -2282,20 +2434,20 @@ worker 🧪 test:
2282
2434
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2283
2435
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2284
2436
  COPY --chown=node:node .yarn /app/.yarn"
2285
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2437
+ - collapseable_section_end "injectvars"
2286
2438
  - ensureNodeDockerfile
2287
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2439
+ - collapseable_section_start "docker-login" "Docker Login"
2288
2440
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_worker_GCLOUD_DEPLOY_credentialsKey")
2289
2441
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
2290
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2291
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2442
+ - collapseable_section_end "docker-login"
2443
+ - collapseable_section_start "docker-build" "Docker build"
2292
2444
  - 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
2293
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2294
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2445
+ - collapseable_section_end "docker-build"
2446
+ - collapseable_section_start "docker-push" "Docker push and tag"
2295
2447
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2296
2448
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2297
2449
  - docker push $DOCKER_CACHE_IMAGE
2298
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2450
+ - collapseable_section_end "docker-push"
2299
2451
  cache:
2300
2452
  - key: api-yarn
2301
2453
  policy: pull
@@ -2312,8 +2464,8 @@ worker 🧪 test:
2312
2464
  image: aquasec/trivy:0.38.3
2313
2465
  variables: {}
2314
2466
  script:
2315
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2316
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2467
+ - collapseable_section_start "injectvars" "Injecting variables"
2468
+ - collapseable_section_end "injectvars"
2317
2469
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
2318
2470
  artifacts:
2319
2471
  paths:
@@ -2332,17 +2484,16 @@ worker 🧪 test:
2332
2484
  KUBERNETES_MEMORY_REQUEST: 200Mi
2333
2485
  KUBERNETES_MEMORY_LIMIT: 400Mi
2334
2486
  script:
2335
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2487
+ - collapseable_section_start "injectvars" "Injecting variables"
2336
2488
  - export ENV_SHORT="stage"
2337
2489
  - export APP_DIR="api"
2338
2490
  - export ENV_TYPE="stage"
2339
2491
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2340
2492
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2341
2493
  - 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")"
2342
- - export HOST="$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2494
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2343
2495
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2344
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2345
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2496
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2346
2497
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2347
2498
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
2348
2499
  - export DB_NAME="pan-test-app-stage-api"
@@ -2354,19 +2505,19 @@ worker 🧪 test:
2354
2505
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2355
2506
  - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_worker_GCLOUD_DEPLOY_credentialsKey"
2356
2507
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix"
2357
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2508
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2358
2509
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2359
2510
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/worker"
2360
2511
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/worker"
2361
2512
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2362
2513
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2363
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2364
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2514
+ - collapseable_section_end "injectvars"
2515
+ - collapseable_section_start "prepare" "Prepare..."
2365
2516
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_worker_GCLOUD_DEPLOY_credentialsKey")
2366
2517
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
2367
2518
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2368
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2369
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2519
+ - collapseable_section_end "prepare"
2520
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
2370
2521
  - |
2371
2522
  cat > ____envvars.yaml <<EOF
2372
2523
  ENV_SHORT: |-
@@ -2376,21 +2527,19 @@ worker 🧪 test:
2376
2527
  ENV_TYPE: |-
2377
2528
  stage
2378
2529
  BUILD_INFO_BUILD_ID: |-
2379
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2530
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2380
2531
  BUILD_INFO_BUILD_TIME: |-
2381
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2532
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2382
2533
  BUILD_INFO_CURRENT_VERSION: |-
2383
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2384
- HOST: |-
2385
- $(printf %s "$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2534
+ $(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/^/ /')
2535
+ HOSTNAME: |-
2536
+ $(printf %s "$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2386
2537
  ROOT_URL: |-
2387
- $(printf %s "https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2388
- HOST_INTERNAL: |-
2389
- $(printf %s "$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2390
- HOST_CANONICAL: |-
2391
- $(printf %s "$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2538
+ $(printf %s "https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2539
+ HOSTNAME_INTERNAL: |-
2540
+ $(printf %s "$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2392
2541
  ROOT_URL_INTERNAL: |-
2393
- $(printf %s "https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2542
+ $(printf %s "https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2394
2543
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
2395
2544
  projectId:region:instancename
2396
2545
  DB_NAME: |-
@@ -2398,7 +2547,7 @@ worker 🧪 test:
2398
2547
  DB_USER: |-
2399
2548
  my-user
2400
2549
  DB_PASSWORD: |-
2401
- $(printf %s "$CL_stage_api_DB_PASSWORD" | sed 's/^/ /')
2550
+ $(printf %s "$CL_stage_api_DB_PASSWORD" | sed '1!s/^/ /')
2402
2551
  DATABASE_URL: |-
2403
2552
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
2404
2553
  DATABASE_JDBC_URL: |-
@@ -2408,24 +2557,24 @@ worker 🧪 test:
2408
2557
  DEPLOY_CLOUD_RUN_REGION: |-
2409
2558
  europe-west6
2410
2559
  GCLOUD_RUN_canonicalHostSuffix: |-
2411
- $(printf %s "$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2560
+ $(printf %s "$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
2412
2561
  _ALL_ENV_VAR_KEYS: |-
2413
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2562
+ ["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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2414
2563
 
2415
2564
  EOF
2416
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2417
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2565
+ - collapseable_section_end "writeenvvars"
2566
+ - collapseable_section_start "deploy" "Deploy to cloud run"
2418
2567
  - set +e
2419
2568
  - echo "ensuring Database..."
2420
2569
  - gcloud sql databases create pan-test-app-stage-api --instance=instancename --project projectId
2421
2570
  - set -e
2422
2571
  - gcloud run deploy pan-test-app-stage-worker --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/worker:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=worker,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-worker --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2423
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2424
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2572
+ - collapseable_section_end "deploy"
2573
+ - collapseable_section_start "cleanup" "Cleanup"
2425
2574
  - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-stage-worker --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
2426
2575
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/worker --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/worker@$version --quiet --delete-tags; done
2427
2576
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/worker --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/worker@$version --quiet --delete-tags; done
2428
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2577
+ - collapseable_section_end "cleanup"
2429
2578
  - echo 'Uploading SBOM to Dependency Track'
2430
2579
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/worker" "https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2431
2580
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-worker-$CL_stage_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -2458,9 +2607,9 @@ worker 🧪 test:
2458
2607
  KUBERNETES_MEMORY_LIMIT: 400Mi
2459
2608
  GIT_STRATEGY: none
2460
2609
  script:
2461
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2610
+ - collapseable_section_start "injectvars" "Injecting variables"
2462
2611
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2463
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2612
+ - collapseable_section_end "injectvars"
2464
2613
  - set +e
2465
2614
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_worker_GCLOUD_DEPLOY_credentialsKey")
2466
2615
  - gcloud run services delete pan-test-app-stage-worker --project=google-project-id --region=europe-west6
@@ -2494,17 +2643,16 @@ worker 🧪 test:
2494
2643
  KUBERNETES_MEMORY_REQUEST: 1Gi
2495
2644
  KUBERNETES_MEMORY_LIMIT: 4Gi
2496
2645
  script:
2497
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2646
+ - collapseable_section_start "injectvars" "Injecting variables"
2498
2647
  - export ENV_SHORT="prod"
2499
2648
  - export APP_DIR="api"
2500
2649
  - export ENV_TYPE="prod"
2501
2650
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2502
2651
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2503
2652
  - 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")"
2504
- - export HOST="$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2653
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2505
2654
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2506
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2507
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2655
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2508
2656
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2509
2657
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
2510
2658
  - export DB_NAME="pan-test-app-prod-api"
@@ -2516,21 +2664,44 @@ worker 🧪 test:
2516
2664
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2517
2665
  - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_worker_GCLOUD_DEPLOY_credentialsKey"
2518
2666
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix"
2519
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2520
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2667
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2668
+ - collapseable_section_end "injectvars"
2669
+ - collapseable_section_start "write-dotenv-worker" "write dot env for worker"
2670
+ - |-
2671
+ cat <<EOF > api/.env
2672
+ ENV_SHORT=prod
2673
+ APP_DIR=api
2674
+ ENV_TYPE=prod
2675
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2676
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2677
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2678
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2679
+ CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
2680
+ DB_NAME=pan-test-app-prod-api
2681
+ DB_USER=my-user
2682
+ DB_PASSWORD=$(printf %s "$CL_prod_api_DB_PASSWORD" | escapeForDotEnv)
2683
+ DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
2684
+ DATABASE_JDBC_URL=jdbc:postgresql:///$DB_NAME?cloudSqlInstance=$CLOUD_SQL_INSTANCE_CONNECTION_NAME&socketFactory=com.google.cloud.sql.postgres.SocketFactory&user=$DB_USER&password=$DB_PASSWORD
2685
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
2686
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
2687
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_worker_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
2688
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
2689
+ _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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2690
+ EOF
2691
+ - collapseable_section_end "write-dotenv-worker"
2521
2692
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
2522
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2693
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2523
2694
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2524
2695
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2525
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2696
+ - collapseable_section_end "nodeinstall"
2526
2697
  - cd api
2527
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2698
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2528
2699
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2529
2700
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2530
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2531
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2701
+ - collapseable_section_end "nodeinstall"
2702
+ - collapseable_section_start "yarninstall" "Yarn install"
2532
2703
  - yarn install --immutable
2533
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2704
+ - collapseable_section_end "yarninstall"
2534
2705
  - yarn build:worker
2535
2706
  cache:
2536
2707
  - key: api-yarn
@@ -2541,15 +2712,13 @@ worker 🧪 test:
2541
2712
  policy: pull-push
2542
2713
  paths:
2543
2714
  - api/node_modules
2544
- - key: worker-next-cache
2545
- policy: pull-push
2546
- paths:
2547
- - api/.next/cache
2548
2715
  artifacts:
2549
2716
  paths:
2550
2717
  - api/__build_info.json
2551
2718
  - api/.next
2552
2719
  - api/dist
2720
+ exclude:
2721
+ - api/.env
2553
2722
  expire_in: 1 day
2554
2723
  when: always
2555
2724
  reports: {}
@@ -2575,7 +2744,7 @@ worker 🧪 test:
2575
2744
  KUBERNETES_MEMORY_REQUEST: 1Gi
2576
2745
  KUBERNETES_MEMORY_LIMIT: 2Gi
2577
2746
  script:
2578
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2747
+ - collapseable_section_start "injectvars" "Injecting variables"
2579
2748
  - export APP_DIR="api"
2580
2749
  - export DOCKER_BUILD_CONTEXT="."
2581
2750
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -2591,20 +2760,20 @@ worker 🧪 test:
2591
2760
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2592
2761
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2593
2762
  COPY --chown=node:node .yarn /app/.yarn"
2594
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2763
+ - collapseable_section_end "injectvars"
2595
2764
  - ensureNodeDockerfile
2596
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2765
+ - collapseable_section_start "docker-login" "Docker Login"
2597
2766
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_worker_GCLOUD_DEPLOY_credentialsKey")
2598
2767
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
2599
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2600
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2768
+ - collapseable_section_end "docker-login"
2769
+ - collapseable_section_start "docker-build" "Docker build"
2601
2770
  - 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
2602
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2603
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2771
+ - collapseable_section_end "docker-build"
2772
+ - collapseable_section_start "docker-push" "Docker push and tag"
2604
2773
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2605
2774
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2606
2775
  - docker push $DOCKER_CACHE_IMAGE
2607
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2776
+ - collapseable_section_end "docker-push"
2608
2777
  cache:
2609
2778
  - key: api-yarn
2610
2779
  policy: pull
@@ -2621,8 +2790,8 @@ worker 🧪 test:
2621
2790
  image: aquasec/trivy:0.38.3
2622
2791
  variables: {}
2623
2792
  script:
2624
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2625
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2793
+ - collapseable_section_start "injectvars" "Injecting variables"
2794
+ - collapseable_section_end "injectvars"
2626
2795
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
2627
2796
  artifacts:
2628
2797
  paths:
@@ -2641,17 +2810,16 @@ worker 🧪 test:
2641
2810
  KUBERNETES_MEMORY_REQUEST: 200Mi
2642
2811
  KUBERNETES_MEMORY_LIMIT: 400Mi
2643
2812
  script:
2644
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2813
+ - collapseable_section_start "injectvars" "Injecting variables"
2645
2814
  - export ENV_SHORT="prod"
2646
2815
  - export APP_DIR="api"
2647
2816
  - export ENV_TYPE="prod"
2648
2817
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2649
2818
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2650
2819
  - 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")"
2651
- - export HOST="$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2820
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2652
2821
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2653
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2654
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2822
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2655
2823
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2656
2824
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
2657
2825
  - export DB_NAME="pan-test-app-prod-api"
@@ -2663,19 +2831,19 @@ worker 🧪 test:
2663
2831
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
2664
2832
  - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_worker_GCLOUD_DEPLOY_credentialsKey"
2665
2833
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix"
2666
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2834
+ - 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\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
2667
2835
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
2668
2836
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/worker"
2669
2837
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/worker"
2670
2838
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2671
2839
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2672
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2673
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2840
+ - collapseable_section_end "injectvars"
2841
+ - collapseable_section_start "prepare" "Prepare..."
2674
2842
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_worker_GCLOUD_DEPLOY_credentialsKey")
2675
2843
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
2676
2844
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2677
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2678
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2845
+ - collapseable_section_end "prepare"
2846
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
2679
2847
  - |
2680
2848
  cat > ____envvars.yaml <<EOF
2681
2849
  ENV_SHORT: |-
@@ -2685,21 +2853,19 @@ worker 🧪 test:
2685
2853
  ENV_TYPE: |-
2686
2854
  prod
2687
2855
  BUILD_INFO_BUILD_ID: |-
2688
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2856
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2689
2857
  BUILD_INFO_BUILD_TIME: |-
2690
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2858
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2691
2859
  BUILD_INFO_CURRENT_VERSION: |-
2692
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2693
- HOST: |-
2694
- $(printf %s "$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2860
+ $(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/^/ /')
2861
+ HOSTNAME: |-
2862
+ $(printf %s "$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2695
2863
  ROOT_URL: |-
2696
- $(printf %s "https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2697
- HOST_INTERNAL: |-
2698
- $(printf %s "$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2699
- HOST_CANONICAL: |-
2700
- $(printf %s "$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2864
+ $(printf %s "https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2865
+ HOSTNAME_INTERNAL: |-
2866
+ $(printf %s "$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2701
2867
  ROOT_URL_INTERNAL: |-
2702
- $(printf %s "https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2868
+ $(printf %s "https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2703
2869
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
2704
2870
  projectId:region:instancename
2705
2871
  DB_NAME: |-
@@ -2707,7 +2873,7 @@ worker 🧪 test:
2707
2873
  DB_USER: |-
2708
2874
  my-user
2709
2875
  DB_PASSWORD: |-
2710
- $(printf %s "$CL_prod_api_DB_PASSWORD" | sed 's/^/ /')
2876
+ $(printf %s "$CL_prod_api_DB_PASSWORD" | sed '1!s/^/ /')
2711
2877
  DATABASE_URL: |-
2712
2878
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
2713
2879
  DATABASE_JDBC_URL: |-
@@ -2717,24 +2883,24 @@ worker 🧪 test:
2717
2883
  DEPLOY_CLOUD_RUN_REGION: |-
2718
2884
  europe-west6
2719
2885
  GCLOUD_RUN_canonicalHostSuffix: |-
2720
- $(printf %s "$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2886
+ $(printf %s "$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
2721
2887
  _ALL_ENV_VAR_KEYS: |-
2722
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2888
+ ["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","CLOUD_SQL_INSTANCE_CONNECTION_NAME","DB_NAME","DB_USER","DB_PASSWORD","DATABASE_URL","DATABASE_JDBC_URL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2723
2889
 
2724
2890
  EOF
2725
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2726
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2891
+ - collapseable_section_end "writeenvvars"
2892
+ - collapseable_section_start "deploy" "Deploy to cloud run"
2727
2893
  - set +e
2728
2894
  - echo "ensuring Database..."
2729
2895
  - gcloud sql databases create pan-test-app-prod-api --instance=instancename --project projectId
2730
2896
  - set -e
2731
2897
  - gcloud run deploy pan-test-app-prod-worker --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/worker:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --set-cloudsql-instances=projectId:region:instancename --labels=customer-name=pan,component-name=worker,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-worker --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2732
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2733
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2898
+ - collapseable_section_end "deploy"
2899
+ - collapseable_section_start "cleanup" "Cleanup"
2734
2900
  - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-prod-worker --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
2735
2901
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/worker --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/worker@$version --quiet --delete-tags; done
2736
2902
  - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/worker --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/worker@$version --quiet --delete-tags; done
2737
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2903
+ - collapseable_section_end "cleanup"
2738
2904
  - echo 'Uploading SBOM to Dependency Track'
2739
2905
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/worker" "https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2740
2906
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-worker-$CL_prod_worker_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -2767,9 +2933,9 @@ worker 🧪 test:
2767
2933
  KUBERNETES_MEMORY_LIMIT: 400Mi
2768
2934
  GIT_STRATEGY: none
2769
2935
  script:
2770
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2936
+ - collapseable_section_start "injectvars" "Injecting variables"
2771
2937
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2772
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2938
+ - collapseable_section_end "injectvars"
2773
2939
  - set +e
2774
2940
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_worker_GCLOUD_DEPLOY_credentialsKey")
2775
2941
  - gcloud run services delete pan-test-app-prod-worker --project=google-project-id --region=europe-west6