@catladder/pipeline 1.170.1 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (193) hide show
  1. package/dist/bash/BashExpression.d.ts +1 -6
  2. package/dist/bash/BashExpression.js +2 -15
  3. package/dist/bash/bashEscape.d.ts +34 -0
  4. package/dist/bash/bashEscape.js +114 -0
  5. package/dist/bash/bashYaml.js +25 -2
  6. package/dist/bash/getInjectVarsScript.js +4 -2
  7. package/dist/bash/index.d.ts +2 -0
  8. package/dist/bash/index.js +26 -0
  9. package/dist/build/base/createAppBuildJob.js +3 -3
  10. package/dist/build/base/writeDotEnv.js +6 -4
  11. package/dist/build/custom/testJob.js +12 -12
  12. package/dist/build/docker.d.ts +3 -3
  13. package/dist/build/node/buildJob.js +1 -1
  14. package/dist/build/node/cache.d.ts +2 -4
  15. package/dist/build/node/cache.js +3 -24
  16. package/dist/build/node/testJob.js +11 -11
  17. package/dist/build/rails/build.js +1 -1
  18. package/dist/build/rails/test.js +8 -8
  19. package/dist/build/types.d.ts +0 -10
  20. package/dist/constants.js +1 -1
  21. package/dist/context/createComponentContext.js +0 -1
  22. package/dist/context/getEnvConfig.js +2 -1
  23. package/dist/context/getEnvironment.js +1 -2
  24. package/dist/context/getEnvironmentVariables.d.ts +5 -6
  25. package/dist/context/getEnvironmentVariables.js +50 -38
  26. package/dist/deploy/base/deploy.js +3 -3
  27. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +2 -2
  28. package/dist/deploy/cloudRun/index.js +2 -2
  29. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +1 -1
  30. package/dist/deploy/kubernetes/cloudSql/index.d.ts +2 -2
  31. package/dist/deploy/kubernetes/cloudSql/index.js +3 -14
  32. package/dist/deploy/kubernetes/deployJob.js +1 -3
  33. package/dist/deploy/kubernetes/index.js +2 -2
  34. package/dist/deploy/kubernetes/kubeEnv.d.ts +3 -3
  35. package/dist/deploy/kubernetes/kubeValues.d.ts +3 -4
  36. package/dist/deploy/kubernetes/kubeValues.js +2 -3
  37. package/dist/deploy/types/base.d.ts +0 -6
  38. package/dist/deploy/types/kubernetes.d.ts +1 -34
  39. package/dist/globalScriptFunctions/index.d.ts +14 -0
  40. package/dist/globalScriptFunctions/index.js +37 -0
  41. package/dist/index.d.ts +3 -1
  42. package/dist/index.js +3 -1
  43. package/dist/pipeline/gitlab/createGitlabJobs.js +3 -5
  44. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +1 -0
  45. package/dist/pipeline/gitlab/createGitlabPipeline.js +38 -2
  46. package/dist/pipeline/packageManager.js +1 -1
  47. package/dist/runner/index.d.ts +1 -1
  48. package/dist/tsconfig.tsbuildinfo +1 -1
  49. package/dist/types/config.d.ts +6 -9
  50. package/dist/types/context.d.ts +2 -9
  51. package/dist/types/gitlab-types.d.ts +1 -0
  52. package/dist/types/jobs.d.ts +0 -8
  53. package/dist/utils/gitlab.js +4 -1
  54. package/dist/utils/writeFiles.js +1 -7
  55. package/dist/variables/VariableValue.d.ts +3 -0
  56. package/dist/variables/VariableValue.js +5 -0
  57. package/dist/variables/VariableValueContainingReferences.d.ts +24 -0
  58. package/dist/variables/VariableValueContainingReferences.js +97 -0
  59. package/dist/variables/__tests__/resolveAllReferences.test.js +219 -0
  60. package/dist/variables/__tests__/resolveAllReferencesOnce.test.d.ts +1 -0
  61. package/dist/variables/__tests__/resolveAllReferencesOnce.test.js +171 -0
  62. package/dist/variables/__tests__/resolveReferencesOnce.test.d.ts +1 -0
  63. package/dist/variables/__tests__/resolveReferencesOnce.test.js +202 -0
  64. package/dist/variables/__tests__/variableValue.test.d.ts +1 -0
  65. package/dist/variables/__tests__/variableValue.test.js +36 -0
  66. package/dist/variables/resolveAllReferences.d.ts +3 -0
  67. package/dist/{bash/replaceAsync.js → variables/resolveAllReferences.js} +60 -40
  68. package/dist/variables/resolveAllReferencesOnce.d.ts +5 -0
  69. package/dist/variables/resolveAllReferencesOnce.js +191 -0
  70. package/dist/variables/resolveReferencesOnce.d.ts +8 -0
  71. package/dist/variables/resolveReferencesOnce.js +22 -0
  72. package/examples/__snapshots__/cloud-run-http2.test.ts.snap +312 -238
  73. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +312 -238
  74. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +312 -222
  75. package/examples/__snapshots__/cloud-run-nextjs.test.ts.snap +1436 -0
  76. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +312 -238
  77. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +316 -238
  78. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +312 -238
  79. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +313 -238
  80. package/examples/__snapshots__/cloud-run-service-custom-vpc-connector.test.ts.snap +312 -238
  81. package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +312 -238
  82. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +312 -238
  83. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +312 -238
  84. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +316 -238
  85. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +294 -220
  86. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +312 -238
  87. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +652 -486
  88. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +282 -288
  89. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +312 -238
  90. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +284 -194
  91. package/examples/__snapshots__/custom-build-job.test.ts.snap +278 -188
  92. package/examples/__snapshots__/custom-deploy.test.ts.snap +220 -154
  93. package/examples/__snapshots__/custom-envs.test.ts.snap +216 -126
  94. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +278 -188
  95. package/examples/__snapshots__/git-submodule.test.ts.snap +312 -238
  96. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +231 -253
  97. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +240 -262
  98. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +504 -506
  99. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +239 -261
  100. package/examples/__snapshots__/local-dot-env.test.ts.snap +236 -238
  101. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +236 -242
  102. package/examples/__snapshots__/multiline-var.test.ts.snap +1355 -973
  103. package/examples/__snapshots__/native-app.test.ts.snap +438 -392
  104. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +312 -238
  105. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +312 -238
  106. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +186 -188
  107. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +162 -164
  108. package/examples/__snapshots__/referencing-other-vars.test.ts.snap +971 -765
  109. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +330 -228
  110. package/examples/__snapshots__/{workspace-api-www-custom-cache.test.ts.snap → workspace-api-www-turbo-cache.test.ts.snap} +457 -499
  111. package/examples/__snapshots__/workspace-api-www.test.ts.snap +452 -482
  112. package/examples/{workspace-api-www-custom-cache.test.ts → cloud-run-nextjs.test.ts} +2 -2
  113. package/examples/cloud-run-nextjs.ts +28 -0
  114. package/examples/cloud-run-with-sql.ts +0 -1
  115. package/examples/kubernetes-application-customization.ts +1 -0
  116. package/examples/kubernetes-with-cloud-sql.ts +1 -0
  117. package/examples/kubernetes-with-jobs.ts +1 -0
  118. package/examples/kubernetes-with-mongodb.ts +1 -0
  119. package/examples/meteor-kubernetes.ts +1 -1
  120. package/examples/native-app.ts +10 -7
  121. package/examples/rails-k8s-with-worker.ts +7 -1
  122. package/examples/{kubernetes-with-cloud-sql-legacy.test.ts → workspace-api-www-turbo-cache.test.ts} +2 -2
  123. package/examples/{workspace-api-www-custom-cache.ts → workspace-api-www-turbo-cache.ts} +4 -3
  124. package/examples/workspace-api-www.ts +3 -2
  125. package/package.json +2 -6
  126. package/scripts/generate-examples-test.ts +0 -7
  127. package/src/bash/BashExpression.ts +0 -13
  128. package/src/bash/bashEscape.ts +158 -0
  129. package/src/bash/bashYaml.ts +36 -2
  130. package/src/bash/getInjectVarsScript.ts +11 -2
  131. package/src/bash/index.ts +2 -0
  132. package/src/build/base/createAppBuildJob.ts +0 -1
  133. package/src/build/base/writeDotEnv.ts +6 -6
  134. package/src/build/custom/testJob.ts +0 -1
  135. package/src/build/node/buildJob.ts +2 -2
  136. package/src/build/node/cache.ts +0 -29
  137. package/src/build/node/testJob.ts +0 -1
  138. package/src/build/rails/build.ts +0 -1
  139. package/src/build/rails/test.ts +0 -1
  140. package/src/build/types.ts +0 -13
  141. package/src/context/createComponentContext.ts +0 -1
  142. package/src/context/getEnvConfig.ts +2 -2
  143. package/src/context/getEnvironment.ts +1 -1
  144. package/src/context/getEnvironmentContext.ts +1 -1
  145. package/src/context/getEnvironmentVariables.ts +44 -51
  146. package/src/deploy/base/deploy.ts +1 -1
  147. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +4 -12
  148. package/src/deploy/cloudRun/index.ts +2 -2
  149. package/src/deploy/kubernetes/cloudSql/index.ts +3 -16
  150. package/src/deploy/kubernetes/deployJob.ts +0 -2
  151. package/src/deploy/kubernetes/index.ts +2 -2
  152. package/src/deploy/kubernetes/kubeEnv.ts +3 -3
  153. package/src/deploy/kubernetes/kubeValues.ts +5 -8
  154. package/src/deploy/types/base.ts +0 -6
  155. package/src/deploy/types/kubernetes.ts +1 -36
  156. package/src/globalScriptFunctions/index.ts +30 -0
  157. package/src/index.ts +2 -0
  158. package/src/pipeline/gitlab/createGitlabJobs.ts +1 -4
  159. package/src/pipeline/gitlab/createGitlabPipeline.ts +8 -1
  160. package/src/pipeline/packageManager.ts +7 -5
  161. package/src/runner/index.ts +0 -1
  162. package/src/types/config.ts +6 -9
  163. package/src/types/context.ts +3 -9
  164. package/src/types/gitlab-types.ts +1 -0
  165. package/src/types/jobs.ts +0 -8
  166. package/src/utils/gitlab.ts +19 -2
  167. package/src/utils/writeFiles.ts +1 -2
  168. package/src/variables/VariableValue.ts +6 -0
  169. package/src/variables/VariableValueContainingReferences.ts +89 -0
  170. package/src/variables/__tests__/resolveAllReferences.test.ts +110 -0
  171. package/src/variables/__tests__/resolveAllReferencesOnce.test.ts +64 -0
  172. package/src/variables/__tests__/resolveReferencesOnce.test.ts +117 -0
  173. package/src/variables/__tests__/variableValue.test.ts +73 -0
  174. package/src/variables/resolveAllReferences.ts +46 -0
  175. package/src/variables/resolveAllReferencesOnce.ts +44 -0
  176. package/src/variables/resolveReferencesOnce.ts +29 -0
  177. package/bin/catladder-gitlab-dev.js +0 -3
  178. package/bin/catladder-gitlab.js +0 -3
  179. package/dist/bash/replaceAsync.d.ts +0 -2
  180. package/dist/bundles/catladder-gitlab/index.js +0 -15
  181. package/dist/context/__tests__/resolveReferences.test.js +0 -368
  182. package/dist/context/resolveReferences.d.ts +0 -6
  183. package/dist/context/resolveReferences.js +0 -286
  184. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +0 -85
  185. package/dist/deploy/kubernetes/processSecretsAsFiles.js +0 -33
  186. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +0 -1795
  187. package/examples/kubernetes-with-cloud-sql-legacy.ts +0 -35
  188. package/scripts/bundle +0 -2
  189. package/src/bash/replaceAsync.ts +0 -49
  190. package/src/context/__tests__/resolveReferences.test.ts +0 -148
  191. package/src/context/resolveReferences.ts +0 -93
  192. package/src/deploy/kubernetes/processSecretsAsFiles.ts +0 -35
  193. /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"
@@ -185,47 +214,46 @@ api 🧪 test:
185
214
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
186
215
  - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
187
216
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
188
- - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
189
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
190
- - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
217
+ - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
218
+ - collapseable_section_end "injectvars"
219
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
191
220
  - |-
192
221
  cat <<EOF > api/.env
193
222
  ENV_SHORT=dev
194
223
  APP_DIR=api
195
224
  ENV_TYPE=dev
196
- HOST=$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
197
- ROOT_URL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
198
- HOST_INTERNAL=$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
199
- HOST_CANONICAL=$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
200
- ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
225
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
226
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
227
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
228
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
201
229
  CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
202
230
  DB_NAME=pan-test-app-dev-api
203
231
  DB_USER=my-user
204
- DB_PASSWORD=$CL_dev_api_DB_PASSWORD
232
+ DB_PASSWORD=$(printf %s "$CL_dev_api_DB_PASSWORD" | escapeForDotEnv)
205
233
  DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
206
234
  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
207
235
  CLOUD_RUN_JOB_TRIGGER_URL_migration=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-migration:run
208
236
  CLOUD_RUN_JOB_TRIGGER_URL_send_reminders=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-dev-api-send-reminders:run
209
237
  DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
210
238
  DEPLOY_CLOUD_RUN_REGION=europe-west6
211
- GCLOUD_DEPLOY_credentialsKey=$CL_dev_api_GCLOUD_DEPLOY_credentialsKey
212
- GCLOUD_RUN_canonicalHostSuffix=$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix
213
- _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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
239
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
240
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
241
+ _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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
214
242
  EOF
215
- - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
243
+ - collapseable_section_end "write-dotenv-api"
216
244
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
217
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
245
+ - collapseable_section_start "nodeinstall" "Ensure node version"
218
246
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
219
247
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
220
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
248
+ - collapseable_section_end "nodeinstall"
221
249
  - cd api
222
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
250
+ - collapseable_section_start "nodeinstall" "Ensure node version"
223
251
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
224
252
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
225
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
226
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
253
+ - collapseable_section_end "nodeinstall"
254
+ - collapseable_section_start "yarninstall" "Yarn install"
227
255
  - yarn install --immutable
228
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
256
+ - collapseable_section_end "yarninstall"
229
257
  - yarn build
230
258
  cache:
231
259
  - key: api-yarn
@@ -236,10 +264,6 @@ api 🧪 test:
236
264
  policy: pull-push
237
265
  paths:
238
266
  - api/node_modules
239
- - key: api-next-cache
240
- policy: pull-push
241
- paths:
242
- - api/.next/cache
243
267
  artifacts:
244
268
  paths:
245
269
  - api/__build_info.json
@@ -274,7 +298,7 @@ api 🧪 test:
274
298
  KUBERNETES_MEMORY_REQUEST: 1Gi
275
299
  KUBERNETES_MEMORY_LIMIT: 2Gi
276
300
  script:
277
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
301
+ - collapseable_section_start "injectvars" "Injecting variables"
278
302
  - export APP_DIR="api"
279
303
  - export DOCKER_BUILD_CONTEXT="."
280
304
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -290,20 +314,20 @@ api 🧪 test:
290
314
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
291
315
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
292
316
  COPY --chown=node:node .yarn /app/.yarn"
293
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
317
+ - collapseable_section_end "injectvars"
294
318
  - ensureNodeDockerfile
295
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
319
+ - collapseable_section_start "docker-login" "Docker Login"
296
320
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
297
321
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
298
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
299
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
322
+ - collapseable_section_end "docker-login"
323
+ - collapseable_section_start "docker-build" "Docker build"
300
324
  - 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
301
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
302
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
325
+ - collapseable_section_end "docker-build"
326
+ - collapseable_section_start "docker-push" "Docker push and tag"
303
327
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
304
328
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
305
329
  - docker push $DOCKER_CACHE_IMAGE
306
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
330
+ - collapseable_section_end "docker-push"
307
331
  cache:
308
332
  - key: api-yarn
309
333
  policy: pull
@@ -322,8 +346,8 @@ api 🧪 test:
322
346
  image: aquasec/trivy:0.38.3
323
347
  variables: {}
324
348
  script:
325
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
326
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
349
+ - collapseable_section_start "injectvars" "Injecting variables"
350
+ - collapseable_section_end "injectvars"
327
351
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
328
352
  artifacts:
329
353
  paths:
@@ -344,17 +368,16 @@ api 🧪 test:
344
368
  KUBERNETES_MEMORY_REQUEST: 200Mi
345
369
  KUBERNETES_MEMORY_LIMIT: 400Mi
346
370
  script:
347
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
371
+ - collapseable_section_start "injectvars" "Injecting variables"
348
372
  - export ENV_SHORT="dev"
349
373
  - export APP_DIR="api"
350
374
  - export ENV_TYPE="dev"
351
375
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
352
376
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
353
377
  - 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")"
354
- - export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
378
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
355
379
  - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
356
- - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
357
- - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
380
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
358
381
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
359
382
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
360
383
  - export DB_NAME="pan-test-app-dev-api"
@@ -368,19 +391,19 @@ api 🧪 test:
368
391
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
369
392
  - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
370
393
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
371
- - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
394
+ - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
372
395
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
373
396
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
374
397
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
375
398
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
376
399
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
377
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
378
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
400
+ - collapseable_section_end "injectvars"
401
+ - collapseable_section_start "prepare" "Prepare..."
379
402
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
380
403
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
381
404
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
382
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
383
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
405
+ - collapseable_section_end "prepare"
406
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
384
407
  - |
385
408
  cat > ____envvars.yaml <<EOF
386
409
  ENV_SHORT: |-
@@ -390,21 +413,19 @@ api 🧪 test:
390
413
  ENV_TYPE: |-
391
414
  dev
392
415
  BUILD_INFO_BUILD_ID: |-
393
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
416
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
394
417
  BUILD_INFO_BUILD_TIME: |-
395
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
418
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
396
419
  BUILD_INFO_CURRENT_VERSION: |-
397
- $(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/^/ /')
398
- HOST: |-
399
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
420
+ $(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/^/ /')
421
+ HOSTNAME: |-
422
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
400
423
  ROOT_URL: |-
401
- $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
402
- HOST_INTERNAL: |-
403
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
404
- HOST_CANONICAL: |-
405
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
424
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
425
+ HOSTNAME_INTERNAL: |-
426
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
406
427
  ROOT_URL_INTERNAL: |-
407
- $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
428
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
408
429
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
409
430
  projectId:region:instancename
410
431
  DB_NAME: |-
@@ -412,7 +433,7 @@ api 🧪 test:
412
433
  DB_USER: |-
413
434
  my-user
414
435
  DB_PASSWORD: |-
415
- $(printf %s "$CL_dev_api_DB_PASSWORD" | sed 's/^/ /')
436
+ $(printf %s "$CL_dev_api_DB_PASSWORD" | sed '1!s/^/ /')
416
437
  DATABASE_URL: |-
417
438
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
418
439
  DATABASE_JDBC_URL: |-
@@ -426,13 +447,13 @@ api 🧪 test:
426
447
  DEPLOY_CLOUD_RUN_REGION: |-
427
448
  europe-west6
428
449
  GCLOUD_RUN_canonicalHostSuffix: |-
429
- $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
450
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
430
451
  _ALL_ENV_VAR_KEYS: |-
431
- ["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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
452
+ ["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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
432
453
 
433
454
  EOF
434
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
435
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
455
+ - collapseable_section_end "writeenvvars"
456
+ - collapseable_section_start "deploy" "Deploy to cloud run"
436
457
  - set +e
437
458
  - echo "ensuring Database..."
438
459
  - gcloud sql databases create pan-test-app-dev-api --instance=instancename --project projectId
@@ -467,12 +488,12 @@ api 🧪 test:
467
488
  fi
468
489
  - 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=5 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
469
490
  - gcloud run jobs execute pan-test-app-dev-api-migration --project=google-project-id --region=europe-west6
470
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
471
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
491
+ - collapseable_section_end "deploy"
492
+ - collapseable_section_start "cleanup" "Cleanup"
472
493
  - 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
473
494
  - 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
474
495
  - 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
475
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
496
+ - collapseable_section_end "cleanup"
476
497
  - echo 'Uploading SBOM to Dependency Track'
477
498
  - /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
478
499
  - 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
@@ -514,9 +535,9 @@ api 🧪 test:
514
535
  KUBERNETES_MEMORY_LIMIT: 400Mi
515
536
  GIT_STRATEGY: none
516
537
  script:
517
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
538
+ - collapseable_section_start "injectvars" "Injecting variables"
518
539
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
519
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
540
+ - collapseable_section_end "injectvars"
520
541
  - set +e
521
542
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
522
543
  - gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6
@@ -557,17 +578,16 @@ api 🧪 test:
557
578
  KUBERNETES_MEMORY_REQUEST: 1Gi
558
579
  KUBERNETES_MEMORY_LIMIT: 4Gi
559
580
  script:
560
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
581
+ - collapseable_section_start "injectvars" "Injecting variables"
561
582
  - export ENV_SHORT="review"
562
583
  - export APP_DIR="api"
563
584
  - export ENV_TYPE="review"
564
585
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
565
586
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
566
587
  - 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")"
567
- - 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)}')"
588
+ - 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)}')"
568
589
  - 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)}')"
569
- - 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)}')"
570
- - 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)}')"
590
+ - 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)}')"
571
591
  - 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)}')"
572
592
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
573
593
  - 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"
@@ -581,47 +601,46 @@ api 🧪 test:
581
601
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
582
602
  - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
583
603
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
584
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
585
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
586
- - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
604
+ - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
605
+ - collapseable_section_end "injectvars"
606
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
587
607
  - |-
588
608
  cat <<EOF > api/.env
589
609
  ENV_SHORT=review
590
610
  APP_DIR=api
591
611
  ENV_TYPE=review
592
- 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)}')
593
- 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)}')
594
- 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)}')
595
- 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)}')
596
- 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)}')
612
+ 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)
613
+ 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)
614
+ 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)
615
+ 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)
597
616
  CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
598
- 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
617
+ 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)
599
618
  DB_USER=my-user
600
- DB_PASSWORD=$CL_review_api_DB_PASSWORD
619
+ DB_PASSWORD=$(printf %s "$CL_review_api_DB_PASSWORD" | escapeForDotEnv)
601
620
  DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
602
621
  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
603
622
  CLOUD_RUN_JOB_TRIGGER_URL_migration=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/$(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)}')-migration:run
604
623
  CLOUD_RUN_JOB_TRIGGER_URL_send_reminders=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/$(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)}')-send-reminders:run
605
624
  DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
606
625
  DEPLOY_CLOUD_RUN_REGION=europe-west6
607
- GCLOUD_DEPLOY_credentialsKey=$CL_review_api_GCLOUD_DEPLOY_credentialsKey
608
- GCLOUD_RUN_canonicalHostSuffix=$CL_review_api_GCLOUD_RUN_canonicalHostSuffix
609
- _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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
626
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
627
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
628
+ _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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
610
629
  EOF
611
- - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
630
+ - collapseable_section_end "write-dotenv-api"
612
631
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
613
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
632
+ - collapseable_section_start "nodeinstall" "Ensure node version"
614
633
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
615
634
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
616
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
635
+ - collapseable_section_end "nodeinstall"
617
636
  - cd api
618
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
637
+ - collapseable_section_start "nodeinstall" "Ensure node version"
619
638
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
620
639
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
621
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
622
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
640
+ - collapseable_section_end "nodeinstall"
641
+ - collapseable_section_start "yarninstall" "Yarn install"
623
642
  - yarn install --immutable
624
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
643
+ - collapseable_section_end "yarninstall"
625
644
  - yarn build
626
645
  cache:
627
646
  - key: api-yarn
@@ -632,10 +651,6 @@ api 🧪 test:
632
651
  policy: pull-push
633
652
  paths:
634
653
  - api/node_modules
635
- - key: api-next-cache
636
- policy: pull-push
637
- paths:
638
- - api/.next/cache
639
654
  artifacts:
640
655
  paths:
641
656
  - api/__build_info.json
@@ -668,7 +683,7 @@ api 🧪 test:
668
683
  KUBERNETES_MEMORY_REQUEST: 1Gi
669
684
  KUBERNETES_MEMORY_LIMIT: 2Gi
670
685
  script:
671
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
686
+ - collapseable_section_start "injectvars" "Injecting variables"
672
687
  - export APP_DIR="api"
673
688
  - export DOCKER_BUILD_CONTEXT="."
674
689
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -684,20 +699,20 @@ api 🧪 test:
684
699
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
685
700
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
686
701
  COPY --chown=node:node .yarn /app/.yarn"
687
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
702
+ - collapseable_section_end "injectvars"
688
703
  - ensureNodeDockerfile
689
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
704
+ - collapseable_section_start "docker-login" "Docker Login"
690
705
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
691
706
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
692
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
693
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
707
+ - collapseable_section_end "docker-login"
708
+ - collapseable_section_start "docker-build" "Docker build"
694
709
  - 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
695
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
696
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
710
+ - collapseable_section_end "docker-build"
711
+ - collapseable_section_start "docker-push" "Docker push and tag"
697
712
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
698
713
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
699
714
  - docker push $DOCKER_CACHE_IMAGE
700
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
715
+ - collapseable_section_end "docker-push"
701
716
  cache:
702
717
  - key: api-yarn
703
718
  policy: pull
@@ -714,8 +729,8 @@ api 🧪 test:
714
729
  image: aquasec/trivy:0.38.3
715
730
  variables: {}
716
731
  script:
717
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
718
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
732
+ - collapseable_section_start "injectvars" "Injecting variables"
733
+ - collapseable_section_end "injectvars"
719
734
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
720
735
  artifacts:
721
736
  paths:
@@ -734,17 +749,16 @@ api 🧪 test:
734
749
  KUBERNETES_MEMORY_REQUEST: 200Mi
735
750
  KUBERNETES_MEMORY_LIMIT: 400Mi
736
751
  script:
737
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
752
+ - collapseable_section_start "injectvars" "Injecting variables"
738
753
  - export ENV_SHORT="review"
739
754
  - export APP_DIR="api"
740
755
  - export ENV_TYPE="review"
741
756
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
742
757
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
743
758
  - 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")"
744
- - 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)}')"
759
+ - 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)}')"
745
760
  - 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)}')"
746
- - 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)}')"
747
- - 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)}')"
761
+ - 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)}')"
748
762
  - 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)}')"
749
763
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
750
764
  - 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"
@@ -758,19 +772,19 @@ api 🧪 test:
758
772
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
759
773
  - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
760
774
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
761
- - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
775
+ - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
762
776
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
763
777
  - 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"; })"
764
778
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
765
779
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
766
780
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
767
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
768
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
781
+ - collapseable_section_end "injectvars"
782
+ - collapseable_section_start "prepare" "Prepare..."
769
783
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
770
784
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
771
785
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
772
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
773
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
786
+ - collapseable_section_end "prepare"
787
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
774
788
  - |
775
789
  cat > ____envvars.yaml <<EOF
776
790
  ENV_SHORT: |-
@@ -780,29 +794,27 @@ api 🧪 test:
780
794
  ENV_TYPE: |-
781
795
  review
782
796
  BUILD_INFO_BUILD_ID: |-
783
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
797
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
784
798
  BUILD_INFO_BUILD_TIME: |-
785
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
799
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
786
800
  BUILD_INFO_CURRENT_VERSION: |-
787
- $(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/^/ /')
788
- HOST: |-
789
- $(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/^/ /')
801
+ $(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/^/ /')
802
+ HOSTNAME: |-
803
+ $(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/^/ /')
790
804
  ROOT_URL: |-
791
- $(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/^/ /')
792
- HOST_INTERNAL: |-
793
- $(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/^/ /')
794
- HOST_CANONICAL: |-
795
- $(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/^/ /')
805
+ $(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/^/ /')
806
+ HOSTNAME_INTERNAL: |-
807
+ $(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/^/ /')
796
808
  ROOT_URL_INTERNAL: |-
797
- $(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/^/ /')
809
+ $(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/^/ /')
798
810
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
799
811
  projectId:region:instancename
800
812
  DB_NAME: |-
801
- $(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/^/ /')
813
+ $(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/^/ /')
802
814
  DB_USER: |-
803
815
  my-user
804
816
  DB_PASSWORD: |-
805
- $(printf %s "$CL_review_api_DB_PASSWORD" | sed 's/^/ /')
817
+ $(printf %s "$CL_review_api_DB_PASSWORD" | sed '1!s/^/ /')
806
818
  DATABASE_URL: |-
807
819
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
808
820
  DATABASE_JDBC_URL: |-
@@ -816,13 +828,13 @@ api 🧪 test:
816
828
  DEPLOY_CLOUD_RUN_REGION: |-
817
829
  europe-west6
818
830
  GCLOUD_RUN_canonicalHostSuffix: |-
819
- $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
831
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
820
832
  _ALL_ENV_VAR_KEYS: |-
821
- ["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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
833
+ ["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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
822
834
 
823
835
  EOF
824
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
825
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
836
+ - collapseable_section_end "writeenvvars"
837
+ - collapseable_section_start "deploy" "Deploy to cloud run"
826
838
  - set +e
827
839
  - echo "ensuring Database..."
828
840
  - 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
@@ -857,15 +869,15 @@ api 🧪 test:
857
869
  fi
858
870
  - 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=5 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
859
871
  - gcloud run jobs execute $(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)}')-migration --project=google-project-id --region=europe-west6
860
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
861
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
872
+ - collapseable_section_end "deploy"
873
+ - collapseable_section_start "cleanup" "Cleanup"
862
874
  - 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
863
875
  - 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
864
876
  - 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
865
877
  - set +e
866
878
  - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
867
879
  - set -e
868
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
880
+ - collapseable_section_end "cleanup"
869
881
  - echo 'Uploading SBOM to Dependency Track'
870
882
  - /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
871
883
  - 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
@@ -905,9 +917,9 @@ api 🧪 test:
905
917
  KUBERNETES_MEMORY_LIMIT: 400Mi
906
918
  GIT_STRATEGY: none
907
919
  script:
908
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
920
+ - collapseable_section_start "injectvars" "Injecting variables"
909
921
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
910
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
922
+ - collapseable_section_end "injectvars"
911
923
  - set +e
912
924
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
913
925
  - 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
@@ -952,17 +964,16 @@ api 🧪 test:
952
964
  KUBERNETES_MEMORY_REQUEST: 1Gi
953
965
  KUBERNETES_MEMORY_LIMIT: 4Gi
954
966
  script:
955
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
967
+ - collapseable_section_start "injectvars" "Injecting variables"
956
968
  - export ENV_SHORT="stage"
957
969
  - export APP_DIR="api"
958
970
  - export ENV_TYPE="stage"
959
971
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
960
972
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
961
973
  - 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")"
962
- - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
974
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
963
975
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
964
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
965
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
976
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
966
977
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
967
978
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
968
979
  - export DB_NAME="pan-test-app-stage-api"
@@ -976,47 +987,46 @@ api 🧪 test:
976
987
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
977
988
  - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
978
989
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
979
- - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
980
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
981
- - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
990
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"CLOUD_SQL_INSTANCE_CONNECTION_NAME\\",\\"DB_NAME\\",\\"DB_USER\\",\\"DB_PASSWORD\\",\\"DATABASE_URL\\",\\"DATABASE_JDBC_URL\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
991
+ - collapseable_section_end "injectvars"
992
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
982
993
  - |-
983
994
  cat <<EOF > api/.env
984
995
  ENV_SHORT=stage
985
996
  APP_DIR=api
986
997
  ENV_TYPE=stage
987
- HOST=$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
988
- ROOT_URL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
989
- HOST_INTERNAL=$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
990
- HOST_CANONICAL=$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
991
- ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
998
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
999
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1000
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1001
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
992
1002
  CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
993
1003
  DB_NAME=pan-test-app-stage-api
994
1004
  DB_USER=my-user
995
- DB_PASSWORD=$CL_stage_api_DB_PASSWORD
1005
+ DB_PASSWORD=$(printf %s "$CL_stage_api_DB_PASSWORD" | escapeForDotEnv)
996
1006
  DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
997
1007
  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
998
1008
  CLOUD_RUN_JOB_TRIGGER_URL_migration=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-migration:run
999
1009
  CLOUD_RUN_JOB_TRIGGER_URL_send_reminders=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-stage-api-send-reminders:run
1000
1010
  DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
1001
1011
  DEPLOY_CLOUD_RUN_REGION=europe-west6
1002
- GCLOUD_DEPLOY_credentialsKey=$CL_stage_api_GCLOUD_DEPLOY_credentialsKey
1003
- GCLOUD_RUN_canonicalHostSuffix=$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix
1004
- _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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1012
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1013
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1014
+ _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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1005
1015
  EOF
1006
- - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
1016
+ - collapseable_section_end "write-dotenv-api"
1007
1017
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1008
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1018
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1009
1019
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1010
1020
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1011
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1021
+ - collapseable_section_end "nodeinstall"
1012
1022
  - cd api
1013
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1023
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1014
1024
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1015
1025
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1016
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1017
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1026
+ - collapseable_section_end "nodeinstall"
1027
+ - collapseable_section_start "yarninstall" "Yarn install"
1018
1028
  - yarn install --immutable
1019
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1029
+ - collapseable_section_end "yarninstall"
1020
1030
  - yarn build
1021
1031
  cache:
1022
1032
  - key: api-yarn
@@ -1027,10 +1037,6 @@ api 🧪 test:
1027
1037
  policy: pull-push
1028
1038
  paths:
1029
1039
  - api/node_modules
1030
- - key: api-next-cache
1031
- policy: pull-push
1032
- paths:
1033
- - api/.next/cache
1034
1040
  artifacts:
1035
1041
  paths:
1036
1042
  - api/__build_info.json
@@ -1063,7 +1069,7 @@ api 🧪 test:
1063
1069
  KUBERNETES_MEMORY_REQUEST: 1Gi
1064
1070
  KUBERNETES_MEMORY_LIMIT: 2Gi
1065
1071
  script:
1066
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1072
+ - collapseable_section_start "injectvars" "Injecting variables"
1067
1073
  - export APP_DIR="api"
1068
1074
  - export DOCKER_BUILD_CONTEXT="."
1069
1075
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -1079,20 +1085,20 @@ api 🧪 test:
1079
1085
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1080
1086
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1081
1087
  COPY --chown=node:node .yarn /app/.yarn"
1082
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1088
+ - collapseable_section_end "injectvars"
1083
1089
  - ensureNodeDockerfile
1084
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1090
+ - collapseable_section_start "docker-login" "Docker Login"
1085
1091
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1086
1092
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
1087
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1088
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1093
+ - collapseable_section_end "docker-login"
1094
+ - collapseable_section_start "docker-build" "Docker build"
1089
1095
  - 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
1090
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1091
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1096
+ - collapseable_section_end "docker-build"
1097
+ - collapseable_section_start "docker-push" "Docker push and tag"
1092
1098
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1093
1099
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1094
1100
  - docker push $DOCKER_CACHE_IMAGE
1095
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1101
+ - collapseable_section_end "docker-push"
1096
1102
  cache:
1097
1103
  - key: api-yarn
1098
1104
  policy: pull
@@ -1109,8 +1115,8 @@ api 🧪 test:
1109
1115
  image: aquasec/trivy:0.38.3
1110
1116
  variables: {}
1111
1117
  script:
1112
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1113
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1118
+ - collapseable_section_start "injectvars" "Injecting variables"
1119
+ - collapseable_section_end "injectvars"
1114
1120
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1115
1121
  artifacts:
1116
1122
  paths:
@@ -1129,17 +1135,16 @@ api 🧪 test:
1129
1135
  KUBERNETES_MEMORY_REQUEST: 200Mi
1130
1136
  KUBERNETES_MEMORY_LIMIT: 400Mi
1131
1137
  script:
1132
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1138
+ - collapseable_section_start "injectvars" "Injecting variables"
1133
1139
  - export ENV_SHORT="stage"
1134
1140
  - export APP_DIR="api"
1135
1141
  - export ENV_TYPE="stage"
1136
1142
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1137
1143
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1138
1144
  - 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")"
1139
- - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1145
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1140
1146
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1141
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1142
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1147
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1143
1148
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1144
1149
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1145
1150
  - export DB_NAME="pan-test-app-stage-api"
@@ -1153,19 +1158,19 @@ api 🧪 test:
1153
1158
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1154
1159
  - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
1155
1160
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
1156
- - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1161
+ - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1157
1162
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1158
1163
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
1159
1164
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1160
1165
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1161
1166
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1162
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1163
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1167
+ - collapseable_section_end "injectvars"
1168
+ - collapseable_section_start "prepare" "Prepare..."
1164
1169
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1165
1170
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1166
1171
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1167
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1168
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1172
+ - collapseable_section_end "prepare"
1173
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1169
1174
  - |
1170
1175
  cat > ____envvars.yaml <<EOF
1171
1176
  ENV_SHORT: |-
@@ -1175,21 +1180,19 @@ api 🧪 test:
1175
1180
  ENV_TYPE: |-
1176
1181
  stage
1177
1182
  BUILD_INFO_BUILD_ID: |-
1178
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1183
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1179
1184
  BUILD_INFO_BUILD_TIME: |-
1180
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1185
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1181
1186
  BUILD_INFO_CURRENT_VERSION: |-
1182
- $(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/^/ /')
1183
- HOST: |-
1184
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1187
+ $(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/^/ /')
1188
+ HOSTNAME: |-
1189
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1185
1190
  ROOT_URL: |-
1186
- $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1187
- HOST_INTERNAL: |-
1188
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1189
- HOST_CANONICAL: |-
1190
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1191
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1192
+ HOSTNAME_INTERNAL: |-
1193
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1191
1194
  ROOT_URL_INTERNAL: |-
1192
- $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1195
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1193
1196
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
1194
1197
  projectId:region:instancename
1195
1198
  DB_NAME: |-
@@ -1197,7 +1200,7 @@ api 🧪 test:
1197
1200
  DB_USER: |-
1198
1201
  my-user
1199
1202
  DB_PASSWORD: |-
1200
- $(printf %s "$CL_stage_api_DB_PASSWORD" | sed 's/^/ /')
1203
+ $(printf %s "$CL_stage_api_DB_PASSWORD" | sed '1!s/^/ /')
1201
1204
  DATABASE_URL: |-
1202
1205
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1203
1206
  DATABASE_JDBC_URL: |-
@@ -1211,13 +1214,13 @@ api 🧪 test:
1211
1214
  DEPLOY_CLOUD_RUN_REGION: |-
1212
1215
  europe-west6
1213
1216
  GCLOUD_RUN_canonicalHostSuffix: |-
1214
- $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1217
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1215
1218
  _ALL_ENV_VAR_KEYS: |-
1216
- ["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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1219
+ ["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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1217
1220
 
1218
1221
  EOF
1219
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1220
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1222
+ - collapseable_section_end "writeenvvars"
1223
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1221
1224
  - set +e
1222
1225
  - echo "ensuring Database..."
1223
1226
  - gcloud sql databases create pan-test-app-stage-api --instance=instancename --project projectId
@@ -1252,12 +1255,12 @@ api 🧪 test:
1252
1255
  fi
1253
1256
  - 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=5 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1254
1257
  - gcloud run jobs execute pan-test-app-stage-api-migration --project=google-project-id --region=europe-west6
1255
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1256
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1258
+ - collapseable_section_end "deploy"
1259
+ - collapseable_section_start "cleanup" "Cleanup"
1257
1260
  - 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
1258
1261
  - 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
1259
1262
  - 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
1260
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1263
+ - collapseable_section_end "cleanup"
1261
1264
  - echo 'Uploading SBOM to Dependency Track'
1262
1265
  - /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
1263
1266
  - 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
@@ -1290,9 +1293,9 @@ api 🧪 test:
1290
1293
  KUBERNETES_MEMORY_LIMIT: 400Mi
1291
1294
  GIT_STRATEGY: none
1292
1295
  script:
1293
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1296
+ - collapseable_section_start "injectvars" "Injecting variables"
1294
1297
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1295
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1298
+ - collapseable_section_end "injectvars"
1296
1299
  - set +e
1297
1300
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1298
1301
  - gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6
@@ -1331,17 +1334,16 @@ api 🧪 test:
1331
1334
  KUBERNETES_MEMORY_REQUEST: 1Gi
1332
1335
  KUBERNETES_MEMORY_LIMIT: 4Gi
1333
1336
  script:
1334
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1337
+ - collapseable_section_start "injectvars" "Injecting variables"
1335
1338
  - export ENV_SHORT="prod"
1336
1339
  - export APP_DIR="api"
1337
1340
  - export ENV_TYPE="prod"
1338
1341
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1339
1342
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1340
1343
  - 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")"
1341
- - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1344
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1342
1345
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1343
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1344
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1346
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1345
1347
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1346
1348
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1347
1349
  - export DB_NAME="pan-test-app-prod-api"
@@ -1355,47 +1357,46 @@ api 🧪 test:
1355
1357
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1356
1358
  - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1357
1359
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1358
- - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1359
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1360
- - echo -e "\\e[0Ksection_start:$(date +%s):write-dotenv-api[collapsed=true]\\r\\e[0Kwrite dot env"
1360
+ - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1361
+ - collapseable_section_end "injectvars"
1362
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
1361
1363
  - |-
1362
1364
  cat <<EOF > api/.env
1363
1365
  ENV_SHORT=prod
1364
1366
  APP_DIR=api
1365
1367
  ENV_TYPE=prod
1366
- HOST=$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
1367
- ROOT_URL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
1368
- HOST_INTERNAL=$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
1369
- HOST_CANONICAL=$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
1370
- ROOT_URL_INTERNAL=https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')
1368
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1369
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1370
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1371
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1371
1372
  CLOUD_SQL_INSTANCE_CONNECTION_NAME=projectId:region:instancename
1372
1373
  DB_NAME=pan-test-app-prod-api
1373
1374
  DB_USER=my-user
1374
- DB_PASSWORD=$CL_prod_api_DB_PASSWORD
1375
+ DB_PASSWORD=$(printf %s "$CL_prod_api_DB_PASSWORD" | escapeForDotEnv)
1375
1376
  DATABASE_URL=postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1376
1377
  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
1377
1378
  CLOUD_RUN_JOB_TRIGGER_URL_migration=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-migration:run
1378
1379
  CLOUD_RUN_JOB_TRIGGER_URL_send_reminders=https://europe-west6-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/google-project-id/jobs/pan-test-app-prod-api-send-reminders:run
1379
1380
  DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
1380
1381
  DEPLOY_CLOUD_RUN_REGION=europe-west6
1381
- GCLOUD_DEPLOY_credentialsKey=$CL_prod_api_GCLOUD_DEPLOY_credentialsKey
1382
- GCLOUD_RUN_canonicalHostSuffix=$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix
1383
- _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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1382
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1383
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1384
+ _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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1384
1385
  EOF
1385
- - echo -e "\\e[0Ksection_end:$(date +%s):write-dotenv-api\\r\\e[0K"
1386
+ - collapseable_section_end "write-dotenv-api"
1386
1387
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1387
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1388
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1388
1389
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1389
1390
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1390
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1391
+ - collapseable_section_end "nodeinstall"
1391
1392
  - cd api
1392
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1393
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1393
1394
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1394
1395
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1395
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1396
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1396
+ - collapseable_section_end "nodeinstall"
1397
+ - collapseable_section_start "yarninstall" "Yarn install"
1397
1398
  - yarn install --immutable
1398
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1399
+ - collapseable_section_end "yarninstall"
1399
1400
  - yarn build
1400
1401
  cache:
1401
1402
  - key: api-yarn
@@ -1406,10 +1407,6 @@ api 🧪 test:
1406
1407
  policy: pull-push
1407
1408
  paths:
1408
1409
  - api/node_modules
1409
- - key: api-next-cache
1410
- policy: pull-push
1411
- paths:
1412
- - api/.next/cache
1413
1410
  artifacts:
1414
1411
  paths:
1415
1412
  - api/__build_info.json
@@ -1442,7 +1439,7 @@ api 🧪 test:
1442
1439
  KUBERNETES_MEMORY_REQUEST: 1Gi
1443
1440
  KUBERNETES_MEMORY_LIMIT: 2Gi
1444
1441
  script:
1445
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1442
+ - collapseable_section_start "injectvars" "Injecting variables"
1446
1443
  - export APP_DIR="api"
1447
1444
  - export DOCKER_BUILD_CONTEXT="."
1448
1445
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -1458,20 +1455,20 @@ api 🧪 test:
1458
1455
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1459
1456
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1460
1457
  COPY --chown=node:node .yarn /app/.yarn"
1461
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1458
+ - collapseable_section_end "injectvars"
1462
1459
  - ensureNodeDockerfile
1463
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1460
+ - collapseable_section_start "docker-login" "Docker Login"
1464
1461
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1465
1462
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
1466
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1467
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1463
+ - collapseable_section_end "docker-login"
1464
+ - collapseable_section_start "docker-build" "Docker build"
1468
1465
  - 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
1469
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1470
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1466
+ - collapseable_section_end "docker-build"
1467
+ - collapseable_section_start "docker-push" "Docker push and tag"
1471
1468
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1472
1469
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1473
1470
  - docker push $DOCKER_CACHE_IMAGE
1474
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1471
+ - collapseable_section_end "docker-push"
1475
1472
  cache:
1476
1473
  - key: api-yarn
1477
1474
  policy: pull
@@ -1488,8 +1485,8 @@ api 🧪 test:
1488
1485
  image: aquasec/trivy:0.38.3
1489
1486
  variables: {}
1490
1487
  script:
1491
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1492
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1488
+ - collapseable_section_start "injectvars" "Injecting variables"
1489
+ - collapseable_section_end "injectvars"
1493
1490
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1494
1491
  artifacts:
1495
1492
  paths:
@@ -1508,17 +1505,16 @@ api 🧪 test:
1508
1505
  KUBERNETES_MEMORY_REQUEST: 200Mi
1509
1506
  KUBERNETES_MEMORY_LIMIT: 400Mi
1510
1507
  script:
1511
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1508
+ - collapseable_section_start "injectvars" "Injecting variables"
1512
1509
  - export ENV_SHORT="prod"
1513
1510
  - export APP_DIR="api"
1514
1511
  - export ENV_TYPE="prod"
1515
1512
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1516
1513
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1517
1514
  - 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")"
1518
- - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1515
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1519
1516
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1520
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1521
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1517
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1522
1518
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1523
1519
  - export CLOUD_SQL_INSTANCE_CONNECTION_NAME="projectId:region:instancename"
1524
1520
  - export DB_NAME="pan-test-app-prod-api"
@@ -1532,19 +1528,19 @@ api 🧪 test:
1532
1528
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1533
1529
  - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1534
1530
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1535
- - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1531
+ - 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\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_migration\\",\\"CLOUD_RUN_JOB_TRIGGER_URL_send_reminders\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1536
1532
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1537
1533
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1538
1534
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1539
1535
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1540
1536
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1541
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1542
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1537
+ - collapseable_section_end "injectvars"
1538
+ - collapseable_section_start "prepare" "Prepare..."
1543
1539
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1544
1540
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1545
1541
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1546
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1547
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1542
+ - collapseable_section_end "prepare"
1543
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1548
1544
  - |
1549
1545
  cat > ____envvars.yaml <<EOF
1550
1546
  ENV_SHORT: |-
@@ -1554,21 +1550,19 @@ api 🧪 test:
1554
1550
  ENV_TYPE: |-
1555
1551
  prod
1556
1552
  BUILD_INFO_BUILD_ID: |-
1557
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1553
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1558
1554
  BUILD_INFO_BUILD_TIME: |-
1559
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1555
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1560
1556
  BUILD_INFO_CURRENT_VERSION: |-
1561
- $(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/^/ /')
1562
- HOST: |-
1563
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1557
+ $(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/^/ /')
1558
+ HOSTNAME: |-
1559
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1564
1560
  ROOT_URL: |-
1565
- $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1566
- HOST_INTERNAL: |-
1567
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1568
- HOST_CANONICAL: |-
1569
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1561
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1562
+ HOSTNAME_INTERNAL: |-
1563
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1570
1564
  ROOT_URL_INTERNAL: |-
1571
- $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1565
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1572
1566
  CLOUD_SQL_INSTANCE_CONNECTION_NAME: |-
1573
1567
  projectId:region:instancename
1574
1568
  DB_NAME: |-
@@ -1576,7 +1570,7 @@ api 🧪 test:
1576
1570
  DB_USER: |-
1577
1571
  my-user
1578
1572
  DB_PASSWORD: |-
1579
- $(printf %s "$CL_prod_api_DB_PASSWORD" | sed 's/^/ /')
1573
+ $(printf %s "$CL_prod_api_DB_PASSWORD" | sed '1!s/^/ /')
1580
1574
  DATABASE_URL: |-
1581
1575
  postgresql://$DB_USER:$DB_PASSWORD@localhost/$DB_NAME?host=/cloudsql/$CLOUD_SQL_INSTANCE_CONNECTION_NAME
1582
1576
  DATABASE_JDBC_URL: |-
@@ -1590,13 +1584,13 @@ api 🧪 test:
1590
1584
  DEPLOY_CLOUD_RUN_REGION: |-
1591
1585
  europe-west6
1592
1586
  GCLOUD_RUN_canonicalHostSuffix: |-
1593
- $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1587
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1594
1588
  _ALL_ENV_VAR_KEYS: |-
1595
- ["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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1589
+ ["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","CLOUD_RUN_JOB_TRIGGER_URL_migration","CLOUD_RUN_JOB_TRIGGER_URL_send_reminders","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1596
1590
 
1597
1591
  EOF
1598
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1599
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1592
+ - collapseable_section_end "writeenvvars"
1593
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1600
1594
  - set +e
1601
1595
  - echo "ensuring Database..."
1602
1596
  - gcloud sql databases create pan-test-app-prod-api --instance=instancename --project projectId
@@ -1631,12 +1625,12 @@ api 🧪 test:
1631
1625
  fi
1632
1626
  - 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=5 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1633
1627
  - gcloud run jobs execute pan-test-app-prod-api-migration --project=google-project-id --region=europe-west6
1634
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1635
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1628
+ - collapseable_section_end "deploy"
1629
+ - collapseable_section_start "cleanup" "Cleanup"
1636
1630
  - 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
1637
1631
  - 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
1638
1632
  - 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
1639
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1633
+ - collapseable_section_end "cleanup"
1640
1634
  - echo 'Uploading SBOM to Dependency Track'
1641
1635
  - /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
1642
1636
  - 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
@@ -1669,9 +1663,9 @@ api 🧪 test:
1669
1663
  KUBERNETES_MEMORY_LIMIT: 400Mi
1670
1664
  GIT_STRATEGY: none
1671
1665
  script:
1672
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1666
+ - collapseable_section_start "injectvars" "Injecting variables"
1673
1667
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1674
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1668
+ - collapseable_section_end "injectvars"
1675
1669
  - set +e
1676
1670
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1677
1671
  - gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6