@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,37 +191,36 @@ 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 DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
177
206
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
178
207
  - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
179
208
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
180
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
181
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
209
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
210
+ - collapseable_section_end "injectvars"
182
211
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
183
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
212
+ - collapseable_section_start "nodeinstall" "Ensure node version"
184
213
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
185
214
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
186
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
215
+ - collapseable_section_end "nodeinstall"
187
216
  - cd api
188
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
217
+ - collapseable_section_start "nodeinstall" "Ensure node version"
189
218
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
190
219
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
191
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
192
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
220
+ - collapseable_section_end "nodeinstall"
221
+ - collapseable_section_start "yarninstall" "Yarn install"
193
222
  - yarn install --immutable
194
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
223
+ - collapseable_section_end "yarninstall"
195
224
  - yarn build
196
225
  cache:
197
226
  - key: api-yarn
@@ -202,10 +231,6 @@ api 🧪 test:
202
231
  policy: pull-push
203
232
  paths:
204
233
  - api/node_modules
205
- - key: api-next-cache
206
- policy: pull-push
207
- paths:
208
- - api/.next/cache
209
234
  artifacts:
210
235
  paths:
211
236
  - api/__build_info.json
@@ -238,7 +263,7 @@ api 🧪 test:
238
263
  KUBERNETES_MEMORY_REQUEST: 1Gi
239
264
  KUBERNETES_MEMORY_LIMIT: 2Gi
240
265
  script:
241
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
266
+ - collapseable_section_start "injectvars" "Injecting variables"
242
267
  - export APP_DIR="api"
243
268
  - export DOCKER_BUILD_CONTEXT="."
244
269
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -254,20 +279,20 @@ api 🧪 test:
254
279
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
255
280
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
256
281
  COPY --chown=node:node .yarn /app/.yarn"
257
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
282
+ - collapseable_section_end "injectvars"
258
283
  - ensureNodeDockerfile
259
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
284
+ - collapseable_section_start "docker-login" "Docker Login"
260
285
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
261
286
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
262
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
263
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
287
+ - collapseable_section_end "docker-login"
288
+ - collapseable_section_start "docker-build" "Docker build"
264
289
  - 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
265
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
266
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
290
+ - collapseable_section_end "docker-build"
291
+ - collapseable_section_start "docker-push" "Docker push and tag"
267
292
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
268
293
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
269
294
  - docker push $DOCKER_CACHE_IMAGE
270
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
295
+ - collapseable_section_end "docker-push"
271
296
  cache:
272
297
  - key: api-yarn
273
298
  policy: pull
@@ -286,8 +311,8 @@ api 🧪 test:
286
311
  image: aquasec/trivy:0.38.3
287
312
  variables: {}
288
313
  script:
289
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
290
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
314
+ - collapseable_section_start "injectvars" "Injecting variables"
315
+ - collapseable_section_end "injectvars"
291
316
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
292
317
  artifacts:
293
318
  paths:
@@ -308,35 +333,34 @@ api 🧪 test:
308
333
  KUBERNETES_MEMORY_REQUEST: 200Mi
309
334
  KUBERNETES_MEMORY_LIMIT: 400Mi
310
335
  script:
311
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
336
+ - collapseable_section_start "injectvars" "Injecting variables"
312
337
  - export ENV_SHORT="dev"
313
338
  - export APP_DIR="api"
314
339
  - export ENV_TYPE="dev"
315
340
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
316
341
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
317
342
  - 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")"
318
- - export HOST="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
343
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
319
344
  - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
320
- - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
321
- - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
345
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
322
346
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
323
347
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
324
348
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
325
349
  - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
326
350
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
327
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
351
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
328
352
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
329
353
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
330
354
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
331
355
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
332
356
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
333
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
334
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
357
+ - collapseable_section_end "injectvars"
358
+ - collapseable_section_start "prepare" "Prepare..."
335
359
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
336
360
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
337
361
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
338
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
339
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
362
+ - collapseable_section_end "prepare"
363
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
340
364
  - |
341
365
  cat > ____envvars.yaml <<EOF
342
366
  ENV_SHORT: |-
@@ -346,40 +370,38 @@ api 🧪 test:
346
370
  ENV_TYPE: |-
347
371
  dev
348
372
  BUILD_INFO_BUILD_ID: |-
349
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
373
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
350
374
  BUILD_INFO_BUILD_TIME: |-
351
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
375
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
352
376
  BUILD_INFO_CURRENT_VERSION: |-
353
- $(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/^/ /')
354
- HOST: |-
355
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
377
+ $(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/^/ /')
378
+ HOSTNAME: |-
379
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
356
380
  ROOT_URL: |-
357
- $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
358
- HOST_INTERNAL: |-
359
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
360
- HOST_CANONICAL: |-
361
- $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
381
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
382
+ HOSTNAME_INTERNAL: |-
383
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
362
384
  ROOT_URL_INTERNAL: |-
363
- $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
385
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
364
386
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
365
387
  google-project-id
366
388
  DEPLOY_CLOUD_RUN_REGION: |-
367
389
  europe-west6
368
390
  GCLOUD_RUN_canonicalHostSuffix: |-
369
- $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
391
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
370
392
  _ALL_ENV_VAR_KEYS: |-
371
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
393
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
372
394
 
373
395
  EOF
374
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
375
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
396
+ - collapseable_section_end "writeenvvars"
397
+ - collapseable_section_start "deploy" "Deploy to cloud run"
376
398
  - 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 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
377
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
378
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
399
+ - collapseable_section_end "deploy"
400
+ - collapseable_section_start "cleanup" "Cleanup"
379
401
  - 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
380
402
  - 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
381
403
  - 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
382
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
404
+ - collapseable_section_end "cleanup"
383
405
  - echo 'Uploading SBOM to Dependency Track'
384
406
  - /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
385
407
  - 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
@@ -421,9 +443,9 @@ api 🧪 test:
421
443
  KUBERNETES_MEMORY_LIMIT: 400Mi
422
444
  GIT_STRATEGY: none
423
445
  script:
424
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
446
+ - collapseable_section_start "injectvars" "Injecting variables"
425
447
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
426
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
448
+ - collapseable_section_end "injectvars"
427
449
  - set +e
428
450
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
429
451
  - gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6
@@ -459,37 +481,36 @@ api 🧪 test:
459
481
  KUBERNETES_MEMORY_REQUEST: 1Gi
460
482
  KUBERNETES_MEMORY_LIMIT: 4Gi
461
483
  script:
462
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
484
+ - collapseable_section_start "injectvars" "Injecting variables"
463
485
  - export ENV_SHORT="review"
464
486
  - export APP_DIR="api"
465
487
  - export ENV_TYPE="review"
466
488
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
467
489
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
468
490
  - 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")"
469
- - 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)}')"
491
+ - 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)}')"
470
492
  - 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)}')"
471
- - 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)}')"
472
- - 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)}')"
493
+ - 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)}')"
473
494
  - 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)}')"
474
495
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
475
496
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
476
497
  - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
477
498
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
478
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
479
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
499
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
500
+ - collapseable_section_end "injectvars"
480
501
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
481
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
502
+ - collapseable_section_start "nodeinstall" "Ensure node version"
482
503
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
483
504
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
484
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
505
+ - collapseable_section_end "nodeinstall"
485
506
  - cd api
486
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
507
+ - collapseable_section_start "nodeinstall" "Ensure node version"
487
508
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
488
509
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
489
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
490
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
510
+ - collapseable_section_end "nodeinstall"
511
+ - collapseable_section_start "yarninstall" "Yarn install"
491
512
  - yarn install --immutable
492
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
513
+ - collapseable_section_end "yarninstall"
493
514
  - yarn build
494
515
  cache:
495
516
  - key: api-yarn
@@ -500,10 +521,6 @@ api 🧪 test:
500
521
  policy: pull-push
501
522
  paths:
502
523
  - api/node_modules
503
- - key: api-next-cache
504
- policy: pull-push
505
- paths:
506
- - api/.next/cache
507
524
  artifacts:
508
525
  paths:
509
526
  - api/__build_info.json
@@ -534,7 +551,7 @@ api 🧪 test:
534
551
  KUBERNETES_MEMORY_REQUEST: 1Gi
535
552
  KUBERNETES_MEMORY_LIMIT: 2Gi
536
553
  script:
537
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
554
+ - collapseable_section_start "injectvars" "Injecting variables"
538
555
  - export APP_DIR="api"
539
556
  - export DOCKER_BUILD_CONTEXT="."
540
557
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -550,20 +567,20 @@ api 🧪 test:
550
567
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
551
568
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
552
569
  COPY --chown=node:node .yarn /app/.yarn"
553
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
570
+ - collapseable_section_end "injectvars"
554
571
  - ensureNodeDockerfile
555
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
572
+ - collapseable_section_start "docker-login" "Docker Login"
556
573
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
557
574
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
558
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
559
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
575
+ - collapseable_section_end "docker-login"
576
+ - collapseable_section_start "docker-build" "Docker build"
560
577
  - 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
561
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
562
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
578
+ - collapseable_section_end "docker-build"
579
+ - collapseable_section_start "docker-push" "Docker push and tag"
563
580
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
564
581
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
565
582
  - docker push $DOCKER_CACHE_IMAGE
566
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
583
+ - collapseable_section_end "docker-push"
567
584
  cache:
568
585
  - key: api-yarn
569
586
  policy: pull
@@ -580,8 +597,8 @@ api 🧪 test:
580
597
  image: aquasec/trivy:0.38.3
581
598
  variables: {}
582
599
  script:
583
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
584
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
600
+ - collapseable_section_start "injectvars" "Injecting variables"
601
+ - collapseable_section_end "injectvars"
585
602
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
586
603
  artifacts:
587
604
  paths:
@@ -600,35 +617,34 @@ api 🧪 test:
600
617
  KUBERNETES_MEMORY_REQUEST: 200Mi
601
618
  KUBERNETES_MEMORY_LIMIT: 400Mi
602
619
  script:
603
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
620
+ - collapseable_section_start "injectvars" "Injecting variables"
604
621
  - export ENV_SHORT="review"
605
622
  - export APP_DIR="api"
606
623
  - export ENV_TYPE="review"
607
624
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
608
625
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
609
626
  - 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")"
610
- - 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)}')"
627
+ - 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)}')"
611
628
  - 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)}')"
612
- - 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)}')"
613
- - 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)}')"
629
+ - 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)}')"
614
630
  - 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)}')"
615
631
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
616
632
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
617
633
  - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
618
634
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
619
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
635
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
620
636
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
621
637
  - 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"; })"
622
638
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
623
639
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
624
640
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
625
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
626
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
641
+ - collapseable_section_end "injectvars"
642
+ - collapseable_section_start "prepare" "Prepare..."
627
643
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
628
644
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
629
645
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
630
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
631
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
646
+ - collapseable_section_end "prepare"
647
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
632
648
  - |
633
649
  cat > ____envvars.yaml <<EOF
634
650
  ENV_SHORT: |-
@@ -638,43 +654,41 @@ api 🧪 test:
638
654
  ENV_TYPE: |-
639
655
  review
640
656
  BUILD_INFO_BUILD_ID: |-
641
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
657
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
642
658
  BUILD_INFO_BUILD_TIME: |-
643
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
659
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
644
660
  BUILD_INFO_CURRENT_VERSION: |-
645
- $(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/^/ /')
646
- HOST: |-
647
- $(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/^/ /')
661
+ $(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/^/ /')
662
+ HOSTNAME: |-
663
+ $(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/^/ /')
648
664
  ROOT_URL: |-
649
- $(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/^/ /')
650
- HOST_INTERNAL: |-
651
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
652
- HOST_CANONICAL: |-
653
- $(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/^/ /')
665
+ $(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/^/ /')
666
+ HOSTNAME_INTERNAL: |-
667
+ $(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/^/ /')
654
668
  ROOT_URL_INTERNAL: |-
655
- $(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/^/ /')
669
+ $(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/^/ /')
656
670
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
657
671
  google-project-id
658
672
  DEPLOY_CLOUD_RUN_REGION: |-
659
673
  europe-west6
660
674
  GCLOUD_RUN_canonicalHostSuffix: |-
661
- $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
675
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
662
676
  _ALL_ENV_VAR_KEYS: |-
663
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
677
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
664
678
 
665
679
  EOF
666
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
667
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
680
+ - collapseable_section_end "writeenvvars"
681
+ - collapseable_section_start "deploy" "Deploy to cloud run"
668
682
  - 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 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
669
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
670
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
683
+ - collapseable_section_end "deploy"
684
+ - collapseable_section_start "cleanup" "Cleanup"
671
685
  - 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
672
686
  - 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
673
687
  - 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
674
688
  - set +e
675
689
  - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
676
690
  - set -e
677
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
691
+ - collapseable_section_end "cleanup"
678
692
  - echo 'Uploading SBOM to Dependency Track'
679
693
  - /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
680
694
  - 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
@@ -714,9 +728,9 @@ api 🧪 test:
714
728
  KUBERNETES_MEMORY_LIMIT: 400Mi
715
729
  GIT_STRATEGY: none
716
730
  script:
717
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
731
+ - collapseable_section_start "injectvars" "Injecting variables"
718
732
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
719
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
733
+ - collapseable_section_end "injectvars"
720
734
  - set +e
721
735
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
722
736
  - 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
@@ -753,37 +767,36 @@ api 🧪 test:
753
767
  KUBERNETES_MEMORY_REQUEST: 1Gi
754
768
  KUBERNETES_MEMORY_LIMIT: 4Gi
755
769
  script:
756
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
770
+ - collapseable_section_start "injectvars" "Injecting variables"
757
771
  - export ENV_SHORT="stage"
758
772
  - export APP_DIR="api"
759
773
  - export ENV_TYPE="stage"
760
774
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
761
775
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
762
776
  - 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")"
763
- - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
777
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
764
778
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
765
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
766
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
779
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
767
780
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
768
781
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
769
782
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
770
783
  - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
771
784
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
772
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
773
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
785
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
786
+ - collapseable_section_end "injectvars"
774
787
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
775
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
788
+ - collapseable_section_start "nodeinstall" "Ensure node version"
776
789
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
777
790
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
778
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
791
+ - collapseable_section_end "nodeinstall"
779
792
  - cd api
780
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
793
+ - collapseable_section_start "nodeinstall" "Ensure node version"
781
794
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
782
795
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
783
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
784
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
796
+ - collapseable_section_end "nodeinstall"
797
+ - collapseable_section_start "yarninstall" "Yarn install"
785
798
  - yarn install --immutable
786
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
799
+ - collapseable_section_end "yarninstall"
787
800
  - yarn build
788
801
  cache:
789
802
  - key: api-yarn
@@ -794,10 +807,6 @@ api 🧪 test:
794
807
  policy: pull-push
795
808
  paths:
796
809
  - api/node_modules
797
- - key: api-next-cache
798
- policy: pull-push
799
- paths:
800
- - api/.next/cache
801
810
  artifacts:
802
811
  paths:
803
812
  - api/__build_info.json
@@ -828,7 +837,7 @@ api 🧪 test:
828
837
  KUBERNETES_MEMORY_REQUEST: 1Gi
829
838
  KUBERNETES_MEMORY_LIMIT: 2Gi
830
839
  script:
831
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
840
+ - collapseable_section_start "injectvars" "Injecting variables"
832
841
  - export APP_DIR="api"
833
842
  - export DOCKER_BUILD_CONTEXT="."
834
843
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -844,20 +853,20 @@ api 🧪 test:
844
853
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
845
854
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
846
855
  COPY --chown=node:node .yarn /app/.yarn"
847
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
856
+ - collapseable_section_end "injectvars"
848
857
  - ensureNodeDockerfile
849
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
858
+ - collapseable_section_start "docker-login" "Docker Login"
850
859
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
851
860
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
852
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
853
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
861
+ - collapseable_section_end "docker-login"
862
+ - collapseable_section_start "docker-build" "Docker build"
854
863
  - 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
855
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
856
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
864
+ - collapseable_section_end "docker-build"
865
+ - collapseable_section_start "docker-push" "Docker push and tag"
857
866
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
858
867
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
859
868
  - docker push $DOCKER_CACHE_IMAGE
860
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
869
+ - collapseable_section_end "docker-push"
861
870
  cache:
862
871
  - key: api-yarn
863
872
  policy: pull
@@ -874,8 +883,8 @@ api 🧪 test:
874
883
  image: aquasec/trivy:0.38.3
875
884
  variables: {}
876
885
  script:
877
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
878
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
886
+ - collapseable_section_start "injectvars" "Injecting variables"
887
+ - collapseable_section_end "injectvars"
879
888
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
880
889
  artifacts:
881
890
  paths:
@@ -894,35 +903,34 @@ api 🧪 test:
894
903
  KUBERNETES_MEMORY_REQUEST: 200Mi
895
904
  KUBERNETES_MEMORY_LIMIT: 400Mi
896
905
  script:
897
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
906
+ - collapseable_section_start "injectvars" "Injecting variables"
898
907
  - export ENV_SHORT="stage"
899
908
  - export APP_DIR="api"
900
909
  - export ENV_TYPE="stage"
901
910
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
902
911
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
903
912
  - 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")"
904
- - export HOST="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
913
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
905
914
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
906
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
907
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
915
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
908
916
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
909
917
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
910
918
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
911
919
  - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
912
920
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
913
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
921
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
914
922
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
915
923
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
916
924
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
917
925
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
918
926
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
919
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
920
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
927
+ - collapseable_section_end "injectvars"
928
+ - collapseable_section_start "prepare" "Prepare..."
921
929
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
922
930
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
923
931
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
924
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
925
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
932
+ - collapseable_section_end "prepare"
933
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
926
934
  - |
927
935
  cat > ____envvars.yaml <<EOF
928
936
  ENV_SHORT: |-
@@ -932,40 +940,38 @@ api 🧪 test:
932
940
  ENV_TYPE: |-
933
941
  stage
934
942
  BUILD_INFO_BUILD_ID: |-
935
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
943
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
936
944
  BUILD_INFO_BUILD_TIME: |-
937
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
945
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
938
946
  BUILD_INFO_CURRENT_VERSION: |-
939
- $(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/^/ /')
940
- HOST: |-
941
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
947
+ $(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/^/ /')
948
+ HOSTNAME: |-
949
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
942
950
  ROOT_URL: |-
943
- $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
944
- HOST_INTERNAL: |-
945
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
946
- HOST_CANONICAL: |-
947
- $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
951
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
952
+ HOSTNAME_INTERNAL: |-
953
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
948
954
  ROOT_URL_INTERNAL: |-
949
- $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
955
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
950
956
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
951
957
  google-project-id
952
958
  DEPLOY_CLOUD_RUN_REGION: |-
953
959
  europe-west6
954
960
  GCLOUD_RUN_canonicalHostSuffix: |-
955
- $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
961
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
956
962
  _ALL_ENV_VAR_KEYS: |-
957
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
963
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
958
964
 
959
965
  EOF
960
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
961
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
966
+ - collapseable_section_end "writeenvvars"
967
+ - collapseable_section_start "deploy" "Deploy to cloud run"
962
968
  - 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 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
963
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
964
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
969
+ - collapseable_section_end "deploy"
970
+ - collapseable_section_start "cleanup" "Cleanup"
965
971
  - 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
966
972
  - 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
967
973
  - 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
968
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
974
+ - collapseable_section_end "cleanup"
969
975
  - echo 'Uploading SBOM to Dependency Track'
970
976
  - /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
971
977
  - 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
@@ -998,9 +1004,9 @@ api 🧪 test:
998
1004
  KUBERNETES_MEMORY_LIMIT: 400Mi
999
1005
  GIT_STRATEGY: none
1000
1006
  script:
1001
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1007
+ - collapseable_section_start "injectvars" "Injecting variables"
1002
1008
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1003
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1009
+ - collapseable_section_end "injectvars"
1004
1010
  - set +e
1005
1011
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1006
1012
  - gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6
@@ -1034,37 +1040,36 @@ api 🧪 test:
1034
1040
  KUBERNETES_MEMORY_REQUEST: 1Gi
1035
1041
  KUBERNETES_MEMORY_LIMIT: 4Gi
1036
1042
  script:
1037
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1043
+ - collapseable_section_start "injectvars" "Injecting variables"
1038
1044
  - export ENV_SHORT="prod"
1039
1045
  - export APP_DIR="api"
1040
1046
  - export ENV_TYPE="prod"
1041
1047
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1042
1048
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1043
1049
  - 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")"
1044
- - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1050
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1045
1051
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1046
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1047
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1052
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1048
1053
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1049
1054
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1050
1055
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1051
1056
  - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1052
1057
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1053
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1054
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1058
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1059
+ - collapseable_section_end "injectvars"
1055
1060
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1056
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1061
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1057
1062
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1058
1063
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1059
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1064
+ - collapseable_section_end "nodeinstall"
1060
1065
  - cd api
1061
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1066
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1062
1067
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1063
1068
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1064
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1065
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1069
+ - collapseable_section_end "nodeinstall"
1070
+ - collapseable_section_start "yarninstall" "Yarn install"
1066
1071
  - yarn install --immutable
1067
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1072
+ - collapseable_section_end "yarninstall"
1068
1073
  - yarn build
1069
1074
  cache:
1070
1075
  - key: api-yarn
@@ -1075,10 +1080,6 @@ api 🧪 test:
1075
1080
  policy: pull-push
1076
1081
  paths:
1077
1082
  - api/node_modules
1078
- - key: api-next-cache
1079
- policy: pull-push
1080
- paths:
1081
- - api/.next/cache
1082
1083
  artifacts:
1083
1084
  paths:
1084
1085
  - api/__build_info.json
@@ -1109,7 +1110,7 @@ api 🧪 test:
1109
1110
  KUBERNETES_MEMORY_REQUEST: 1Gi
1110
1111
  KUBERNETES_MEMORY_LIMIT: 2Gi
1111
1112
  script:
1112
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1113
+ - collapseable_section_start "injectvars" "Injecting variables"
1113
1114
  - export APP_DIR="api"
1114
1115
  - export DOCKER_BUILD_CONTEXT="."
1115
1116
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
@@ -1125,20 +1126,20 @@ api 🧪 test:
1125
1126
  COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1126
1127
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1127
1128
  COPY --chown=node:node .yarn /app/.yarn"
1128
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1129
+ - collapseable_section_end "injectvars"
1129
1130
  - ensureNodeDockerfile
1130
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1131
+ - collapseable_section_start "docker-login" "Docker Login"
1131
1132
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1132
1133
  - gcloud auth configure-docker europe-west6-docker.pkg.dev
1133
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1134
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1134
+ - collapseable_section_end "docker-login"
1135
+ - collapseable_section_start "docker-build" "Docker build"
1135
1136
  - 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
1136
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1137
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1137
+ - collapseable_section_end "docker-build"
1138
+ - collapseable_section_start "docker-push" "Docker push and tag"
1138
1139
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1139
1140
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1140
1141
  - docker push $DOCKER_CACHE_IMAGE
1141
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1142
+ - collapseable_section_end "docker-push"
1142
1143
  cache:
1143
1144
  - key: api-yarn
1144
1145
  policy: pull
@@ -1155,8 +1156,8 @@ api 🧪 test:
1155
1156
  image: aquasec/trivy:0.38.3
1156
1157
  variables: {}
1157
1158
  script:
1158
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1159
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1159
+ - collapseable_section_start "injectvars" "Injecting variables"
1160
+ - collapseable_section_end "injectvars"
1160
1161
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1161
1162
  artifacts:
1162
1163
  paths:
@@ -1175,35 +1176,34 @@ api 🧪 test:
1175
1176
  KUBERNETES_MEMORY_REQUEST: 200Mi
1176
1177
  KUBERNETES_MEMORY_LIMIT: 400Mi
1177
1178
  script:
1178
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1179
+ - collapseable_section_start "injectvars" "Injecting variables"
1179
1180
  - export ENV_SHORT="prod"
1180
1181
  - export APP_DIR="api"
1181
1182
  - export ENV_TYPE="prod"
1182
1183
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1183
1184
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1184
1185
  - 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")"
1185
- - export HOST="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1186
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1186
1187
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1187
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1188
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1188
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1189
1189
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1190
1190
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1191
1191
  - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1192
1192
  - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1193
1193
  - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1194
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1194
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1195
1195
  - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1196
1196
  - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1197
1197
  - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1198
1198
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1199
1199
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1200
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1201
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1200
+ - collapseable_section_end "injectvars"
1201
+ - collapseable_section_start "prepare" "Prepare..."
1202
1202
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1203
1203
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1204
1204
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1205
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1206
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1205
+ - collapseable_section_end "prepare"
1206
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1207
1207
  - |
1208
1208
  cat > ____envvars.yaml <<EOF
1209
1209
  ENV_SHORT: |-
@@ -1213,40 +1213,38 @@ api 🧪 test:
1213
1213
  ENV_TYPE: |-
1214
1214
  prod
1215
1215
  BUILD_INFO_BUILD_ID: |-
1216
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1216
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1217
1217
  BUILD_INFO_BUILD_TIME: |-
1218
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1218
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1219
1219
  BUILD_INFO_CURRENT_VERSION: |-
1220
- $(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/^/ /')
1221
- HOST: |-
1222
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1220
+ $(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/^/ /')
1221
+ HOSTNAME: |-
1222
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1223
1223
  ROOT_URL: |-
1224
- $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1225
- HOST_INTERNAL: |-
1226
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1227
- HOST_CANONICAL: |-
1228
- $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1224
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1225
+ HOSTNAME_INTERNAL: |-
1226
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1229
1227
  ROOT_URL_INTERNAL: |-
1230
- $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1228
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1231
1229
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1232
1230
  google-project-id
1233
1231
  DEPLOY_CLOUD_RUN_REGION: |-
1234
1232
  europe-west6
1235
1233
  GCLOUD_RUN_canonicalHostSuffix: |-
1236
- $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1234
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1237
1235
  _ALL_ENV_VAR_KEYS: |-
1238
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1236
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1239
1237
 
1240
1238
  EOF
1241
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1242
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1239
+ - collapseable_section_end "writeenvvars"
1240
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1243
1241
  - 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 --labels=customer-name=pan,component-name=api,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-api --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1244
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1245
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1242
+ - collapseable_section_end "deploy"
1243
+ - collapseable_section_start "cleanup" "Cleanup"
1246
1244
  - 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
1247
1245
  - 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
1248
1246
  - 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
1249
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1247
+ - collapseable_section_end "cleanup"
1250
1248
  - echo 'Uploading SBOM to Dependency Track'
1251
1249
  - /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
1252
1250
  - 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
@@ -1279,9 +1277,9 @@ api 🧪 test:
1279
1277
  KUBERNETES_MEMORY_LIMIT: 400Mi
1280
1278
  GIT_STRATEGY: none
1281
1279
  script:
1282
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1280
+ - collapseable_section_start "injectvars" "Injecting variables"
1283
1281
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1284
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1282
+ - collapseable_section_end "injectvars"
1285
1283
  - set +e
1286
1284
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1287
1285
  - gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6