@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
  app1 🛡 audit:
49
79
  stage: test
50
80
  image: path/to/docker/jobs-default:the-version
@@ -53,9 +83,9 @@ app1 🛡 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="app1"
58
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
88
+ - collapseable_section_end "injectvars"
59
89
  - cd app1
60
90
  - yarn npm audit --environment production
61
91
  rules:
@@ -79,21 +109,21 @@ app1 👮 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="app1"
84
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
85
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
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 app1
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: app1-yarn
@@ -120,21 +150,21 @@ app1 🧪 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="app1"
125
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
126
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
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 app1
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: app1-yarn
@@ -161,17 +191,16 @@ app1 🧪 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="app1"
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-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
201
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
172
202
  - export ROOT_URL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
173
- - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
174
- - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
203
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
175
204
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
176
205
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
177
206
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -181,22 +210,44 @@ app1 🧪 test:
181
210
  - export foo="foo-value"
182
211
  - export bar="bar-value"
183
212
  - 'export foo3="from app3: foo-value-3"'
184
- - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
185
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
186
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
213
+ - 'export circle="this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\""'
214
+ - 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
215
+ - collapseable_section_end "injectvars"
216
+ - collapseable_section_start "write-dotenv-app1" "write dot env for app1"
217
+ - |-
218
+ cat <<EOF > app1/.env
219
+ ENV_SHORT=dev
220
+ APP_DIR=app1
221
+ ENV_TYPE=dev
222
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
223
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
224
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
225
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
226
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
227
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
228
+ SECRET1=$(printf %s "$CL_dev_app1_SECRET1" | escapeForDotEnv)
229
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
230
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
231
+ foo=foo-value
232
+ bar=bar-value
233
+ foo3=from app3: foo-value-3
234
+ circle=this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
235
+ _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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
236
+ EOF
237
+ - collapseable_section_end "write-dotenv-app1"
187
238
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
188
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
239
+ - collapseable_section_start "nodeinstall" "Ensure node version"
189
240
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
190
241
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
191
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
242
+ - collapseable_section_end "nodeinstall"
192
243
  - cd app1
193
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
244
+ - collapseable_section_start "nodeinstall" "Ensure node version"
194
245
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
195
246
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
196
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
197
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
247
+ - collapseable_section_end "nodeinstall"
248
+ - collapseable_section_start "yarninstall" "Yarn install"
198
249
  - yarn install --immutable
199
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
250
+ - collapseable_section_end "yarninstall"
200
251
  - yarn build
201
252
  cache:
202
253
  - key: app1-yarn
@@ -207,15 +258,13 @@ app1 🧪 test:
207
258
  policy: pull-push
208
259
  paths:
209
260
  - app1/node_modules
210
- - key: app1-next-cache
211
- policy: pull-push
212
- paths:
213
- - app1/.next/cache
214
261
  artifacts:
215
262
  paths:
216
263
  - app1/__build_info.json
217
264
  - app1/.next
218
265
  - app1/dist
266
+ exclude:
267
+ - app1/.env
219
268
  expire_in: 1 day
220
269
  when: always
221
270
  reports: {}
@@ -243,7 +292,7 @@ app1 🧪 test:
243
292
  KUBERNETES_MEMORY_REQUEST: 1Gi
244
293
  KUBERNETES_MEMORY_LIMIT: 2Gi
245
294
  script:
246
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
295
+ - collapseable_section_start "injectvars" "Injecting variables"
247
296
  - export APP_DIR="app1"
248
297
  - export DOCKER_BUILD_CONTEXT="."
249
298
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
@@ -259,20 +308,20 @@ app1 🧪 test:
259
308
  COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
260
309
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
261
310
  COPY --chown=node:node .yarn /app/.yarn"
262
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
311
+ - collapseable_section_end "injectvars"
263
312
  - ensureNodeDockerfile
264
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
313
+ - collapseable_section_start "docker-login" "Docker Login"
265
314
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey")
266
315
  - gcloud auth configure-docker asia-east1-docker.pkg.dev
267
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
268
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
316
+ - collapseable_section_end "docker-login"
317
+ - collapseable_section_start "docker-build" "Docker build"
269
318
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
270
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
271
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
319
+ - collapseable_section_end "docker-build"
320
+ - collapseable_section_start "docker-push" "Docker push and tag"
272
321
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
273
322
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
274
323
  - docker push $DOCKER_CACHE_IMAGE
275
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
324
+ - collapseable_section_end "docker-push"
276
325
  cache:
277
326
  - key: app1-yarn
278
327
  policy: pull
@@ -291,8 +340,8 @@ app1 🧪 test:
291
340
  image: aquasec/trivy:0.38.3
292
341
  variables: {}
293
342
  script:
294
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
295
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
343
+ - collapseable_section_start "injectvars" "Injecting variables"
344
+ - collapseable_section_end "injectvars"
296
345
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
297
346
  artifacts:
298
347
  paths:
@@ -313,17 +362,16 @@ app1 🧪 test:
313
362
  KUBERNETES_MEMORY_REQUEST: 200Mi
314
363
  KUBERNETES_MEMORY_LIMIT: 400Mi
315
364
  script:
316
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
365
+ - collapseable_section_start "injectvars" "Injecting variables"
317
366
  - export ENV_SHORT="dev"
318
367
  - export APP_DIR="app1"
319
368
  - export ENV_TYPE="dev"
320
369
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
321
370
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
322
371
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
323
- - export HOST="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
372
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
324
373
  - export ROOT_URL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
325
- - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
326
- - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
374
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
327
375
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
328
376
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
329
377
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -333,20 +381,20 @@ app1 🧪 test:
333
381
  - export foo="foo-value"
334
382
  - export bar="bar-value"
335
383
  - 'export foo3="from app3: foo-value-3"'
336
- - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
337
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
384
+ - 'export circle="this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\""'
385
+ - 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
338
386
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
339
387
  - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1"
340
388
  - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
341
389
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
342
390
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
343
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
344
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
391
+ - collapseable_section_end "injectvars"
392
+ - collapseable_section_start "prepare" "Prepare..."
345
393
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey")
346
394
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
347
395
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
348
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
349
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
396
+ - collapseable_section_end "prepare"
397
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
350
398
  - |
351
399
  cat > ____envvars.yaml <<EOF
352
400
  ENV_SHORT: |-
@@ -356,29 +404,27 @@ app1 🧪 test:
356
404
  ENV_TYPE: |-
357
405
  dev
358
406
  BUILD_INFO_BUILD_ID: |-
359
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
407
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
360
408
  BUILD_INFO_BUILD_TIME: |-
361
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
409
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
362
410
  BUILD_INFO_CURRENT_VERSION: |-
363
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
364
- HOST: |-
365
- $(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
411
+ $(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/^/ /')
412
+ HOSTNAME: |-
413
+ $(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
366
414
  ROOT_URL: |-
367
- $(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
368
- HOST_INTERNAL: |-
369
- $(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
370
- HOST_CANONICAL: |-
371
- $(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
415
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
416
+ HOSTNAME_INTERNAL: |-
417
+ $(printf %s "$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
372
418
  ROOT_URL_INTERNAL: |-
373
- $(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
419
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
374
420
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
375
421
  asdf
376
422
  DEPLOY_CLOUD_RUN_REGION: |-
377
423
  asia-east1
378
424
  SECRET1: |-
379
- $(printf %s "$CL_dev_app1_SECRET1" | sed 's/^/ /')
425
+ $(printf %s "$CL_dev_app1_SECRET1" | sed '1!s/^/ /')
380
426
  GCLOUD_RUN_canonicalHostSuffix: |-
381
- $(printf %s "$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
427
+ $(printf %s "$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
382
428
  foo: |-
383
429
  foo-value
384
430
  bar: |-
@@ -386,20 +432,20 @@ app1 🧪 test:
386
432
  foo3: |-
387
433
  from app3: foo-value-3
388
434
  circle: |-
389
- this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
435
+ this is from app3 that has reference to app1: "this is from app2: this is from app1: foo-value"
390
436
  _ALL_ENV_VAR_KEYS: |-
391
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
437
+ ["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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
392
438
 
393
439
  EOF
394
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
395
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
440
+ - collapseable_section_end "writeenvvars"
441
+ - collapseable_section_start "deploy" "Deploy to cloud run"
396
442
  - gcloud run deploy pan-test-app-dev-app1 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app1,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-app1 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
397
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
398
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
443
+ - collapseable_section_end "deploy"
444
+ - collapseable_section_start "cleanup" "Cleanup"
399
445
  - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-app1 --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
400
446
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app1@$version --quiet --delete-tags; done
401
447
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1@$version --quiet --delete-tags; done
402
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
448
+ - collapseable_section_end "cleanup"
403
449
  - echo 'Uploading SBOM to Dependency Track'
404
450
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
405
451
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -441,9 +487,9 @@ app1 🧪 test:
441
487
  KUBERNETES_MEMORY_LIMIT: 400Mi
442
488
  GIT_STRATEGY: none
443
489
  script:
444
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
490
+ - collapseable_section_start "injectvars" "Injecting variables"
445
491
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
446
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
492
+ - collapseable_section_end "injectvars"
447
493
  - set +e
448
494
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app1_GCLOUD_DEPLOY_credentialsKey")
449
495
  - gcloud run services delete pan-test-app-dev-app1 --project=asdf --region=asia-east1
@@ -479,17 +525,16 @@ app1 🧪 test:
479
525
  KUBERNETES_MEMORY_REQUEST: 1Gi
480
526
  KUBERNETES_MEMORY_LIMIT: 4Gi
481
527
  script:
482
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
528
+ - collapseable_section_start "injectvars" "Injecting variables"
483
529
  - export ENV_SHORT="review"
484
530
  - export APP_DIR="app1"
485
531
  - export ENV_TYPE="review"
486
532
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
487
533
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
488
534
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
489
- - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
535
+ - 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
490
536
  - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
491
- - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
492
- - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
537
+ - 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
493
538
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
494
539
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
495
540
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -499,22 +544,44 @@ app1 🧪 test:
499
544
  - export foo="foo-value"
500
545
  - export bar="bar-value"
501
546
  - 'export foo3="from app3: foo-value-3"'
502
- - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
503
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
504
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
547
+ - 'export circle="this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\""'
548
+ - 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
549
+ - collapseable_section_end "injectvars"
550
+ - collapseable_section_start "write-dotenv-app1" "write dot env for app1"
551
+ - |-
552
+ cat <<EOF > app1/.env
553
+ ENV_SHORT=review
554
+ APP_DIR=app1
555
+ ENV_TYPE=review
556
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
557
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
558
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
559
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
560
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
561
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
562
+ SECRET1=$(printf %s "$CL_review_app1_SECRET1" | escapeForDotEnv)
563
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_app1_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
564
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
565
+ foo=foo-value
566
+ bar=bar-value
567
+ foo3=from app3: foo-value-3
568
+ circle=this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
569
+ _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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
570
+ EOF
571
+ - collapseable_section_end "write-dotenv-app1"
505
572
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
506
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
573
+ - collapseable_section_start "nodeinstall" "Ensure node version"
507
574
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
508
575
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
509
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
576
+ - collapseable_section_end "nodeinstall"
510
577
  - cd app1
511
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
578
+ - collapseable_section_start "nodeinstall" "Ensure node version"
512
579
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
513
580
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
514
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
515
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
581
+ - collapseable_section_end "nodeinstall"
582
+ - collapseable_section_start "yarninstall" "Yarn install"
516
583
  - yarn install --immutable
517
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
584
+ - collapseable_section_end "yarninstall"
518
585
  - yarn build
519
586
  cache:
520
587
  - key: app1-yarn
@@ -525,15 +592,13 @@ app1 🧪 test:
525
592
  policy: pull-push
526
593
  paths:
527
594
  - app1/node_modules
528
- - key: app1-next-cache
529
- policy: pull-push
530
- paths:
531
- - app1/.next/cache
532
595
  artifacts:
533
596
  paths:
534
597
  - app1/__build_info.json
535
598
  - app1/.next
536
599
  - app1/dist
600
+ exclude:
601
+ - app1/.env
537
602
  expire_in: 1 day
538
603
  when: always
539
604
  reports: {}
@@ -559,7 +624,7 @@ app1 🧪 test:
559
624
  KUBERNETES_MEMORY_REQUEST: 1Gi
560
625
  KUBERNETES_MEMORY_LIMIT: 2Gi
561
626
  script:
562
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
627
+ - collapseable_section_start "injectvars" "Injecting variables"
563
628
  - export APP_DIR="app1"
564
629
  - export DOCKER_BUILD_CONTEXT="."
565
630
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
@@ -575,20 +640,20 @@ app1 🧪 test:
575
640
  COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
576
641
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
577
642
  COPY --chown=node:node .yarn /app/.yarn"
578
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
643
+ - collapseable_section_end "injectvars"
579
644
  - ensureNodeDockerfile
580
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
645
+ - collapseable_section_start "docker-login" "Docker Login"
581
646
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app1_GCLOUD_DEPLOY_credentialsKey")
582
647
  - gcloud auth configure-docker asia-east1-docker.pkg.dev
583
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
584
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
648
+ - collapseable_section_end "docker-login"
649
+ - collapseable_section_start "docker-build" "Docker build"
585
650
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
586
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
587
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
651
+ - collapseable_section_end "docker-build"
652
+ - collapseable_section_start "docker-push" "Docker push and tag"
588
653
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
589
654
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
590
655
  - docker push $DOCKER_CACHE_IMAGE
591
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
656
+ - collapseable_section_end "docker-push"
592
657
  cache:
593
658
  - key: app1-yarn
594
659
  policy: pull
@@ -605,8 +670,8 @@ app1 🧪 test:
605
670
  image: aquasec/trivy:0.38.3
606
671
  variables: {}
607
672
  script:
608
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
609
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
673
+ - collapseable_section_start "injectvars" "Injecting variables"
674
+ - collapseable_section_end "injectvars"
610
675
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
611
676
  artifacts:
612
677
  paths:
@@ -625,17 +690,16 @@ app1 🧪 test:
625
690
  KUBERNETES_MEMORY_REQUEST: 200Mi
626
691
  KUBERNETES_MEMORY_LIMIT: 400Mi
627
692
  script:
628
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
693
+ - collapseable_section_start "injectvars" "Injecting variables"
629
694
  - export ENV_SHORT="review"
630
695
  - export APP_DIR="app1"
631
696
  - export ENV_TYPE="review"
632
697
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
633
698
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
634
699
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
635
- - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
700
+ - 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
636
701
  - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
637
- - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
638
- - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
702
+ - 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"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
639
703
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
640
704
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
641
705
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -645,20 +709,20 @@ app1 🧪 test:
645
709
  - export foo="foo-value"
646
710
  - export bar="bar-value"
647
711
  - 'export foo3="from app3: foo-value-3"'
648
- - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
649
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
712
+ - 'export circle="this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\""'
713
+ - 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
650
714
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
651
715
  - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
652
716
  - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
653
717
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
654
718
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
655
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
656
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
719
+ - collapseable_section_end "injectvars"
720
+ - collapseable_section_start "prepare" "Prepare..."
657
721
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app1_GCLOUD_DEPLOY_credentialsKey")
658
722
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
659
723
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
660
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
661
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
724
+ - collapseable_section_end "prepare"
725
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
662
726
  - |
663
727
  cat > ____envvars.yaml <<EOF
664
728
  ENV_SHORT: |-
@@ -668,29 +732,27 @@ app1 🧪 test:
668
732
  ENV_TYPE: |-
669
733
  review
670
734
  BUILD_INFO_BUILD_ID: |-
671
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
735
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
672
736
  BUILD_INFO_BUILD_TIME: |-
673
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
737
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
674
738
  BUILD_INFO_CURRENT_VERSION: |-
675
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
676
- HOST: |-
677
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
739
+ $(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/^/ /')
740
+ HOSTNAME: |-
741
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
678
742
  ROOT_URL: |-
679
- $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
680
- HOST_INTERNAL: |-
681
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
682
- HOST_CANONICAL: |-
683
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
743
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
744
+ HOSTNAME_INTERNAL: |-
745
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
684
746
  ROOT_URL_INTERNAL: |-
685
- $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
747
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
686
748
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
687
749
  asdf
688
750
  DEPLOY_CLOUD_RUN_REGION: |-
689
751
  asia-east1
690
752
  SECRET1: |-
691
- $(printf %s "$CL_review_app1_SECRET1" | sed 's/^/ /')
753
+ $(printf %s "$CL_review_app1_SECRET1" | sed '1!s/^/ /')
692
754
  GCLOUD_RUN_canonicalHostSuffix: |-
693
- $(printf %s "$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
755
+ $(printf %s "$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
694
756
  foo: |-
695
757
  foo-value
696
758
  bar: |-
@@ -698,23 +760,23 @@ app1 🧪 test:
698
760
  foo3: |-
699
761
  from app3: foo-value-3
700
762
  circle: |-
701
- this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
763
+ this is from app3 that has reference to app1: "this is from app2: this is from app1: foo-value"
702
764
  _ALL_ENV_VAR_KEYS: |-
703
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
765
+ ["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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
704
766
 
705
767
  EOF
706
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
707
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
768
+ - collapseable_section_end "writeenvvars"
769
+ - collapseable_section_start "deploy" "Deploy to cloud run"
708
770
  - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1" | awk '{print tolower($0)}') --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app1,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
709
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
710
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
771
+ - collapseable_section_end "deploy"
772
+ - collapseable_section_start "cleanup" "Cleanup"
711
773
  - gcloud run revisions list --project=asdf --region=asia-east1 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
712
774
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
713
775
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1@$version --quiet --delete-tags; done
714
776
  - set +e
715
777
  - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app1 --quiet --delete-tags
716
778
  - set -e
717
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
779
+ - collapseable_section_end "cleanup"
718
780
  - echo 'Uploading SBOM to Dependency Track'
719
781
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
720
782
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -754,9 +816,9 @@ app1 🧪 test:
754
816
  KUBERNETES_MEMORY_LIMIT: 400Mi
755
817
  GIT_STRATEGY: none
756
818
  script:
757
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
819
+ - collapseable_section_start "injectvars" "Injecting variables"
758
820
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
759
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
821
+ - collapseable_section_end "injectvars"
760
822
  - set +e
761
823
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app1_GCLOUD_DEPLOY_credentialsKey")
762
824
  - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1" | awk '{print tolower($0)}') --project=asdf --region=asia-east1
@@ -793,17 +855,16 @@ app1 🧪 test:
793
855
  KUBERNETES_MEMORY_REQUEST: 1Gi
794
856
  KUBERNETES_MEMORY_LIMIT: 4Gi
795
857
  script:
796
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
858
+ - collapseable_section_start "injectvars" "Injecting variables"
797
859
  - export ENV_SHORT="stage"
798
860
  - export APP_DIR="app1"
799
861
  - export ENV_TYPE="stage"
800
862
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
801
863
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
802
864
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
803
- - export HOST="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
865
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
804
866
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
805
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
806
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
867
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
807
868
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
808
869
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
809
870
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -813,22 +874,44 @@ app1 🧪 test:
813
874
  - export foo="foo-value"
814
875
  - export bar="bar-value"
815
876
  - 'export foo3="from app3: foo-value-3"'
816
- - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
817
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
818
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
877
+ - 'export circle="this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\""'
878
+ - 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
879
+ - collapseable_section_end "injectvars"
880
+ - collapseable_section_start "write-dotenv-app1" "write dot env for app1"
881
+ - |-
882
+ cat <<EOF > app1/.env
883
+ ENV_SHORT=stage
884
+ APP_DIR=app1
885
+ ENV_TYPE=stage
886
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
887
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
888
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
889
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
890
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
891
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
892
+ SECRET1=$(printf %s "$CL_stage_app1_SECRET1" | escapeForDotEnv)
893
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
894
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
895
+ foo=foo-value
896
+ bar=bar-value
897
+ foo3=from app3: foo-value-3
898
+ circle=this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
899
+ _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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
900
+ EOF
901
+ - collapseable_section_end "write-dotenv-app1"
819
902
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
820
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
903
+ - collapseable_section_start "nodeinstall" "Ensure node version"
821
904
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
822
905
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
823
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
906
+ - collapseable_section_end "nodeinstall"
824
907
  - cd app1
825
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
908
+ - collapseable_section_start "nodeinstall" "Ensure node version"
826
909
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
827
910
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
828
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
829
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
911
+ - collapseable_section_end "nodeinstall"
912
+ - collapseable_section_start "yarninstall" "Yarn install"
830
913
  - yarn install --immutable
831
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
914
+ - collapseable_section_end "yarninstall"
832
915
  - yarn build
833
916
  cache:
834
917
  - key: app1-yarn
@@ -839,15 +922,13 @@ app1 🧪 test:
839
922
  policy: pull-push
840
923
  paths:
841
924
  - app1/node_modules
842
- - key: app1-next-cache
843
- policy: pull-push
844
- paths:
845
- - app1/.next/cache
846
925
  artifacts:
847
926
  paths:
848
927
  - app1/__build_info.json
849
928
  - app1/.next
850
929
  - app1/dist
930
+ exclude:
931
+ - app1/.env
851
932
  expire_in: 1 day
852
933
  when: always
853
934
  reports: {}
@@ -873,7 +954,7 @@ app1 🧪 test:
873
954
  KUBERNETES_MEMORY_REQUEST: 1Gi
874
955
  KUBERNETES_MEMORY_LIMIT: 2Gi
875
956
  script:
876
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
957
+ - collapseable_section_start "injectvars" "Injecting variables"
877
958
  - export APP_DIR="app1"
878
959
  - export DOCKER_BUILD_CONTEXT="."
879
960
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
@@ -889,20 +970,20 @@ app1 🧪 test:
889
970
  COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
890
971
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
891
972
  COPY --chown=node:node .yarn /app/.yarn"
892
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
973
+ - collapseable_section_end "injectvars"
893
974
  - ensureNodeDockerfile
894
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
975
+ - collapseable_section_start "docker-login" "Docker Login"
895
976
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey")
896
977
  - gcloud auth configure-docker asia-east1-docker.pkg.dev
897
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
898
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
978
+ - collapseable_section_end "docker-login"
979
+ - collapseable_section_start "docker-build" "Docker build"
899
980
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
900
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
901
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
981
+ - collapseable_section_end "docker-build"
982
+ - collapseable_section_start "docker-push" "Docker push and tag"
902
983
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
903
984
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
904
985
  - docker push $DOCKER_CACHE_IMAGE
905
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
986
+ - collapseable_section_end "docker-push"
906
987
  cache:
907
988
  - key: app1-yarn
908
989
  policy: pull
@@ -919,8 +1000,8 @@ app1 🧪 test:
919
1000
  image: aquasec/trivy:0.38.3
920
1001
  variables: {}
921
1002
  script:
922
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
923
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1003
+ - collapseable_section_start "injectvars" "Injecting variables"
1004
+ - collapseable_section_end "injectvars"
924
1005
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
925
1006
  artifacts:
926
1007
  paths:
@@ -939,17 +1020,16 @@ app1 🧪 test:
939
1020
  KUBERNETES_MEMORY_REQUEST: 200Mi
940
1021
  KUBERNETES_MEMORY_LIMIT: 400Mi
941
1022
  script:
942
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1023
+ - collapseable_section_start "injectvars" "Injecting variables"
943
1024
  - export ENV_SHORT="stage"
944
1025
  - export APP_DIR="app1"
945
1026
  - export ENV_TYPE="stage"
946
1027
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
947
1028
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
948
1029
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
949
- - export HOST="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1030
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
950
1031
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
951
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
952
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1032
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
953
1033
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
954
1034
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
955
1035
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -959,20 +1039,20 @@ app1 🧪 test:
959
1039
  - export foo="foo-value"
960
1040
  - export bar="bar-value"
961
1041
  - 'export foo3="from app3: foo-value-3"'
962
- - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
963
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
1042
+ - 'export circle="this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\""'
1043
+ - 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
964
1044
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
965
1045
  - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1"
966
1046
  - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
967
1047
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
968
1048
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
969
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
970
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1049
+ - collapseable_section_end "injectvars"
1050
+ - collapseable_section_start "prepare" "Prepare..."
971
1051
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey")
972
1052
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
973
1053
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
974
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
975
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1054
+ - collapseable_section_end "prepare"
1055
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
976
1056
  - |
977
1057
  cat > ____envvars.yaml <<EOF
978
1058
  ENV_SHORT: |-
@@ -982,29 +1062,27 @@ app1 🧪 test:
982
1062
  ENV_TYPE: |-
983
1063
  stage
984
1064
  BUILD_INFO_BUILD_ID: |-
985
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1065
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
986
1066
  BUILD_INFO_BUILD_TIME: |-
987
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1067
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
988
1068
  BUILD_INFO_CURRENT_VERSION: |-
989
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
990
- HOST: |-
991
- $(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1069
+ $(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/^/ /')
1070
+ HOSTNAME: |-
1071
+ $(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
992
1072
  ROOT_URL: |-
993
- $(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
994
- HOST_INTERNAL: |-
995
- $(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
996
- HOST_CANONICAL: |-
997
- $(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1073
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1074
+ HOSTNAME_INTERNAL: |-
1075
+ $(printf %s "$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
998
1076
  ROOT_URL_INTERNAL: |-
999
- $(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1077
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1000
1078
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1001
1079
  asdf
1002
1080
  DEPLOY_CLOUD_RUN_REGION: |-
1003
1081
  asia-east1
1004
1082
  SECRET1: |-
1005
- $(printf %s "$CL_stage_app1_SECRET1" | sed 's/^/ /')
1083
+ $(printf %s "$CL_stage_app1_SECRET1" | sed '1!s/^/ /')
1006
1084
  GCLOUD_RUN_canonicalHostSuffix: |-
1007
- $(printf %s "$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1085
+ $(printf %s "$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1008
1086
  foo: |-
1009
1087
  foo-value
1010
1088
  bar: |-
@@ -1012,20 +1090,20 @@ app1 🧪 test:
1012
1090
  foo3: |-
1013
1091
  from app3: foo-value-3
1014
1092
  circle: |-
1015
- this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
1093
+ this is from app3 that has reference to app1: "this is from app2: this is from app1: foo-value"
1016
1094
  _ALL_ENV_VAR_KEYS: |-
1017
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
1095
+ ["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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
1018
1096
 
1019
1097
  EOF
1020
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1021
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1098
+ - collapseable_section_end "writeenvvars"
1099
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1022
1100
  - gcloud run deploy pan-test-app-stage-app1 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app1,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-app1 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1023
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1024
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1101
+ - collapseable_section_end "deploy"
1102
+ - collapseable_section_start "cleanup" "Cleanup"
1025
1103
  - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-app1 --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
1026
1104
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app1@$version --quiet --delete-tags; done
1027
1105
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1@$version --quiet --delete-tags; done
1028
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1106
+ - collapseable_section_end "cleanup"
1029
1107
  - echo 'Uploading SBOM to Dependency Track'
1030
1108
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1031
1109
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -1058,9 +1136,9 @@ app1 🧪 test:
1058
1136
  KUBERNETES_MEMORY_LIMIT: 400Mi
1059
1137
  GIT_STRATEGY: none
1060
1138
  script:
1061
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1139
+ - collapseable_section_start "injectvars" "Injecting variables"
1062
1140
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1063
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1141
+ - collapseable_section_end "injectvars"
1064
1142
  - set +e
1065
1143
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app1_GCLOUD_DEPLOY_credentialsKey")
1066
1144
  - gcloud run services delete pan-test-app-stage-app1 --project=asdf --region=asia-east1
@@ -1094,17 +1172,16 @@ app1 🧪 test:
1094
1172
  KUBERNETES_MEMORY_REQUEST: 1Gi
1095
1173
  KUBERNETES_MEMORY_LIMIT: 4Gi
1096
1174
  script:
1097
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1175
+ - collapseable_section_start "injectvars" "Injecting variables"
1098
1176
  - export ENV_SHORT="prod"
1099
1177
  - export APP_DIR="app1"
1100
1178
  - export ENV_TYPE="prod"
1101
1179
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1102
1180
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1103
1181
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1104
- - export HOST="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1182
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1105
1183
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1106
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1107
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1184
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1108
1185
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1109
1186
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1110
1187
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -1114,22 +1191,44 @@ app1 🧪 test:
1114
1191
  - export foo="foo-value"
1115
1192
  - export bar="bar-value"
1116
1193
  - 'export foo3="from app3: foo-value-3"'
1117
- - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
1118
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
1119
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1194
+ - 'export circle="this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\""'
1195
+ - 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\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
1196
+ - collapseable_section_end "injectvars"
1197
+ - collapseable_section_start "write-dotenv-app1" "write dot env for app1"
1198
+ - |-
1199
+ cat <<EOF > app1/.env
1200
+ ENV_SHORT=prod
1201
+ APP_DIR=app1
1202
+ ENV_TYPE=prod
1203
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1204
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1205
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1206
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1207
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
1208
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
1209
+ SECRET1=$(printf %s "$CL_prod_app1_SECRET1" | escapeForDotEnv)
1210
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1211
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1212
+ foo=foo-value
1213
+ bar=bar-value
1214
+ foo3=from app3: foo-value-3
1215
+ circle=this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
1216
+ _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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
1217
+ EOF
1218
+ - collapseable_section_end "write-dotenv-app1"
1120
1219
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app1/__build_info.json
1121
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1220
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1122
1221
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1123
1222
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1124
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1223
+ - collapseable_section_end "nodeinstall"
1125
1224
  - cd app1
1126
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1225
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1127
1226
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1128
1227
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1129
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1130
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1228
+ - collapseable_section_end "nodeinstall"
1229
+ - collapseable_section_start "yarninstall" "Yarn install"
1131
1230
  - yarn install --immutable
1132
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1231
+ - collapseable_section_end "yarninstall"
1133
1232
  - yarn build
1134
1233
  cache:
1135
1234
  - key: app1-yarn
@@ -1140,15 +1239,13 @@ app1 🧪 test:
1140
1239
  policy: pull-push
1141
1240
  paths:
1142
1241
  - app1/node_modules
1143
- - key: app1-next-cache
1144
- policy: pull-push
1145
- paths:
1146
- - app1/.next/cache
1147
1242
  artifacts:
1148
1243
  paths:
1149
1244
  - app1/__build_info.json
1150
1245
  - app1/.next
1151
1246
  - app1/dist
1247
+ exclude:
1248
+ - app1/.env
1152
1249
  expire_in: 1 day
1153
1250
  when: always
1154
1251
  reports: {}
@@ -1174,7 +1271,7 @@ app1 🧪 test:
1174
1271
  KUBERNETES_MEMORY_REQUEST: 1Gi
1175
1272
  KUBERNETES_MEMORY_LIMIT: 2Gi
1176
1273
  script:
1177
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1274
+ - collapseable_section_start "injectvars" "Injecting variables"
1178
1275
  - export APP_DIR="app1"
1179
1276
  - export DOCKER_BUILD_CONTEXT="."
1180
1277
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
@@ -1190,20 +1287,20 @@ app1 🧪 test:
1190
1287
  COPY --chown=node:node app1/yarn.lock /app/app1/yarn.lock
1191
1288
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1192
1289
  COPY --chown=node:node .yarn /app/.yarn"
1193
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1290
+ - collapseable_section_end "injectvars"
1194
1291
  - ensureNodeDockerfile
1195
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1292
+ - collapseable_section_start "docker-login" "Docker Login"
1196
1293
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey")
1197
1294
  - gcloud auth configure-docker asia-east1-docker.pkg.dev
1198
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1199
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1295
+ - collapseable_section_end "docker-login"
1296
+ - collapseable_section_start "docker-build" "Docker build"
1200
1297
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1201
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1202
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1298
+ - collapseable_section_end "docker-build"
1299
+ - collapseable_section_start "docker-push" "Docker push and tag"
1203
1300
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1204
1301
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1205
1302
  - docker push $DOCKER_CACHE_IMAGE
1206
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1303
+ - collapseable_section_end "docker-push"
1207
1304
  cache:
1208
1305
  - key: app1-yarn
1209
1306
  policy: pull
@@ -1220,8 +1317,8 @@ app1 🧪 test:
1220
1317
  image: aquasec/trivy:0.38.3
1221
1318
  variables: {}
1222
1319
  script:
1223
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1224
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1320
+ - collapseable_section_start "injectvars" "Injecting variables"
1321
+ - collapseable_section_end "injectvars"
1225
1322
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" app1
1226
1323
  artifacts:
1227
1324
  paths:
@@ -1240,17 +1337,16 @@ app1 🧪 test:
1240
1337
  KUBERNETES_MEMORY_REQUEST: 200Mi
1241
1338
  KUBERNETES_MEMORY_LIMIT: 400Mi
1242
1339
  script:
1243
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1340
+ - collapseable_section_start "injectvars" "Injecting variables"
1244
1341
  - export ENV_SHORT="prod"
1245
1342
  - export APP_DIR="app1"
1246
1343
  - export ENV_TYPE="prod"
1247
1344
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1248
1345
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1249
1346
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1250
- - export HOST="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1347
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1251
1348
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1252
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1253
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1349
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1254
1350
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1255
1351
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1256
1352
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -1260,20 +1356,20 @@ app1 🧪 test:
1260
1356
  - export foo="foo-value"
1261
1357
  - export bar="bar-value"
1262
1358
  - 'export foo3="from app3: foo-value-3"'
1263
- - 'export circle="this is from app3 that has reference to app1: \\\\"this is from app2: this is from app1: foo-value\\\\""'
1264
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
1359
+ - 'export circle="this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\""'
1360
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET1\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo\\",\\"bar\\",\\"foo3\\",\\"circle\\"]"
1265
1361
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1266
1362
  - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1"
1267
1363
  - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1"
1268
1364
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1269
1365
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1270
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1271
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1366
+ - collapseable_section_end "injectvars"
1367
+ - collapseable_section_start "prepare" "Prepare..."
1272
1368
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey")
1273
1369
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1274
1370
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1275
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1276
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1371
+ - collapseable_section_end "prepare"
1372
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1277
1373
  - |
1278
1374
  cat > ____envvars.yaml <<EOF
1279
1375
  ENV_SHORT: |-
@@ -1283,29 +1379,27 @@ app1 🧪 test:
1283
1379
  ENV_TYPE: |-
1284
1380
  prod
1285
1381
  BUILD_INFO_BUILD_ID: |-
1286
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1382
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1287
1383
  BUILD_INFO_BUILD_TIME: |-
1288
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1384
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1289
1385
  BUILD_INFO_CURRENT_VERSION: |-
1290
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1291
- HOST: |-
1292
- $(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1386
+ $(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/^/ /')
1387
+ HOSTNAME: |-
1388
+ $(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1293
1389
  ROOT_URL: |-
1294
- $(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1295
- HOST_INTERNAL: |-
1296
- $(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1297
- HOST_CANONICAL: |-
1298
- $(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1390
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1391
+ HOSTNAME_INTERNAL: |-
1392
+ $(printf %s "$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1299
1393
  ROOT_URL_INTERNAL: |-
1300
- $(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1394
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1301
1395
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1302
1396
  asdf
1303
1397
  DEPLOY_CLOUD_RUN_REGION: |-
1304
1398
  asia-east1
1305
1399
  SECRET1: |-
1306
- $(printf %s "$CL_prod_app1_SECRET1" | sed 's/^/ /')
1400
+ $(printf %s "$CL_prod_app1_SECRET1" | sed '1!s/^/ /')
1307
1401
  GCLOUD_RUN_canonicalHostSuffix: |-
1308
- $(printf %s "$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1402
+ $(printf %s "$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1309
1403
  foo: |-
1310
1404
  foo-value
1311
1405
  bar: |-
@@ -1313,20 +1407,20 @@ app1 🧪 test:
1313
1407
  foo3: |-
1314
1408
  from app3: foo-value-3
1315
1409
  circle: |-
1316
- this is from app3 that has reference to app1: \\"this is from app2: this is from app1: foo-value\\"
1410
+ this is from app3 that has reference to app1: "this is from app2: this is from app1: foo-value"
1317
1411
  _ALL_ENV_VAR_KEYS: |-
1318
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
1412
+ ["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","SECRET1","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo","bar","foo3","circle"]
1319
1413
 
1320
1414
  EOF
1321
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1322
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1415
+ - collapseable_section_end "writeenvvars"
1416
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1323
1417
  - gcloud run deploy pan-test-app-prod-app1 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app1,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-app1 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1324
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1325
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1418
+ - collapseable_section_end "deploy"
1419
+ - collapseable_section_start "cleanup" "Cleanup"
1326
1420
  - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-app1 --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
1327
1421
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app1@$version --quiet --delete-tags; done
1328
1422
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app1@$version --quiet --delete-tags; done
1329
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1423
+ - collapseable_section_end "cleanup"
1330
1424
  - echo 'Uploading SBOM to Dependency Track'
1331
1425
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app1" "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1332
1426
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -1359,9 +1453,9 @@ app1 🧪 test:
1359
1453
  KUBERNETES_MEMORY_LIMIT: 400Mi
1360
1454
  GIT_STRATEGY: none
1361
1455
  script:
1362
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1456
+ - collapseable_section_start "injectvars" "Injecting variables"
1363
1457
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1364
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1458
+ - collapseable_section_end "injectvars"
1365
1459
  - set +e
1366
1460
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app1_GCLOUD_DEPLOY_credentialsKey")
1367
1461
  - gcloud run services delete pan-test-app-prod-app1 --project=asdf --region=asia-east1
@@ -1395,9 +1489,9 @@ app2 🛡 audit:
1395
1489
  KUBERNETES_MEMORY_REQUEST: 1Gi
1396
1490
  KUBERNETES_MEMORY_LIMIT: 4Gi
1397
1491
  script:
1398
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1492
+ - collapseable_section_start "injectvars" "Injecting variables"
1399
1493
  - export APP_PATH="app2"
1400
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1494
+ - collapseable_section_end "injectvars"
1401
1495
  - cd app2
1402
1496
  - yarn npm audit --environment production
1403
1497
  rules:
@@ -1417,21 +1511,21 @@ app2 👮 lint:
1417
1511
  KUBERNETES_MEMORY_REQUEST: 1Gi
1418
1512
  KUBERNETES_MEMORY_LIMIT: 4Gi
1419
1513
  script:
1420
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1514
+ - collapseable_section_start "injectvars" "Injecting variables"
1421
1515
  - export APP_PATH="app2"
1422
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1423
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1516
+ - collapseable_section_end "injectvars"
1517
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1424
1518
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1425
1519
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1426
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1520
+ - collapseable_section_end "nodeinstall"
1427
1521
  - cd app2
1428
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1522
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1429
1523
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1430
1524
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1431
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1432
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1525
+ - collapseable_section_end "nodeinstall"
1526
+ - collapseable_section_start "yarninstall" "Yarn install"
1433
1527
  - yarn install --immutable
1434
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1528
+ - collapseable_section_end "yarninstall"
1435
1529
  - yarn lint
1436
1530
  cache:
1437
1531
  - key: app2-yarn
@@ -1458,21 +1552,21 @@ app2 🧪 test:
1458
1552
  KUBERNETES_MEMORY_REQUEST: 1Gi
1459
1553
  KUBERNETES_MEMORY_LIMIT: 4Gi
1460
1554
  script:
1461
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1555
+ - collapseable_section_start "injectvars" "Injecting variables"
1462
1556
  - export APP_PATH="app2"
1463
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1464
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1557
+ - collapseable_section_end "injectvars"
1558
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1465
1559
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1466
1560
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1467
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1561
+ - collapseable_section_end "nodeinstall"
1468
1562
  - cd app2
1469
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1563
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1470
1564
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1471
1565
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1472
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1473
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1566
+ - collapseable_section_end "nodeinstall"
1567
+ - collapseable_section_start "yarninstall" "Yarn install"
1474
1568
  - yarn install --immutable
1475
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1569
+ - collapseable_section_end "yarninstall"
1476
1570
  - yarn test
1477
1571
  cache:
1478
1572
  - key: app2-yarn
@@ -1499,17 +1593,16 @@ app2 🧪 test:
1499
1593
  KUBERNETES_MEMORY_REQUEST: 1Gi
1500
1594
  KUBERNETES_MEMORY_LIMIT: 4Gi
1501
1595
  script:
1502
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1596
+ - collapseable_section_start "injectvars" "Injecting variables"
1503
1597
  - export ENV_SHORT="dev"
1504
1598
  - export APP_DIR="app2"
1505
1599
  - export ENV_TYPE="dev"
1506
1600
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1507
1601
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1508
1602
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1509
- - export HOST="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1603
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1510
1604
  - export ROOT_URL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1511
- - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1512
- - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1605
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1513
1606
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1514
1607
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1515
1608
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -1522,21 +1615,45 @@ app2 🧪 test:
1522
1615
  - 'export selfReference="this is from self: foo-value-2"'
1523
1616
  - 'export selfReference2="this is from self: this is from app1: foo-value"'
1524
1617
  - export app1Api="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
1525
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
1526
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1618
+ - 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
1619
+ - collapseable_section_end "injectvars"
1620
+ - collapseable_section_start "write-dotenv-app2" "write dot env for app2"
1621
+ - |-
1622
+ cat <<EOF > app2/.env
1623
+ ENV_SHORT=dev
1624
+ APP_DIR=app2
1625
+ ENV_TYPE=dev
1626
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1627
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1628
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1629
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1630
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
1631
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
1632
+ SECRET2=$(printf %s "$CL_dev_app2_SECRET2" | escapeForDotEnv)
1633
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1634
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1635
+ foo2=foo-value-2
1636
+ referencingSecret=$(printf %s "secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2" | escapeForDotEnv)
1637
+ foo1=this is from app1: foo-value
1638
+ selfReference=this is from self: foo-value-2
1639
+ selfReference2=this is from self: this is from app1: foo-value
1640
+ app1Api=$(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | escapeForDotEnv)
1641
+ _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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
1642
+ EOF
1643
+ - collapseable_section_end "write-dotenv-app2"
1527
1644
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
1528
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1645
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1529
1646
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1530
1647
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1531
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1648
+ - collapseable_section_end "nodeinstall"
1532
1649
  - cd app2
1533
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1650
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1534
1651
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1535
1652
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1536
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1537
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1653
+ - collapseable_section_end "nodeinstall"
1654
+ - collapseable_section_start "yarninstall" "Yarn install"
1538
1655
  - yarn install --immutable
1539
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1656
+ - collapseable_section_end "yarninstall"
1540
1657
  - yarn build
1541
1658
  cache:
1542
1659
  - key: app2-yarn
@@ -1547,15 +1664,13 @@ app2 🧪 test:
1547
1664
  policy: pull-push
1548
1665
  paths:
1549
1666
  - app2/node_modules
1550
- - key: app2-next-cache
1551
- policy: pull-push
1552
- paths:
1553
- - app2/.next/cache
1554
1667
  artifacts:
1555
1668
  paths:
1556
1669
  - app2/__build_info.json
1557
1670
  - app2/.next
1558
1671
  - app2/dist
1672
+ exclude:
1673
+ - app2/.env
1559
1674
  expire_in: 1 day
1560
1675
  when: always
1561
1676
  reports: {}
@@ -1583,7 +1698,7 @@ app2 🧪 test:
1583
1698
  KUBERNETES_MEMORY_REQUEST: 1Gi
1584
1699
  KUBERNETES_MEMORY_LIMIT: 2Gi
1585
1700
  script:
1586
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1701
+ - collapseable_section_start "injectvars" "Injecting variables"
1587
1702
  - export APP_DIR="app2"
1588
1703
  - export DOCKER_BUILD_CONTEXT="."
1589
1704
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
@@ -1599,20 +1714,20 @@ app2 🧪 test:
1599
1714
  COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
1600
1715
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1601
1716
  COPY --chown=node:node .yarn /app/.yarn"
1602
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1717
+ - collapseable_section_end "injectvars"
1603
1718
  - ensureNodeDockerfile
1604
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1719
+ - collapseable_section_start "docker-login" "Docker Login"
1605
1720
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey")
1606
1721
  - gcloud auth configure-docker asia-east1-docker.pkg.dev
1607
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1608
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1722
+ - collapseable_section_end "docker-login"
1723
+ - collapseable_section_start "docker-build" "Docker build"
1609
1724
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1610
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1611
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1725
+ - collapseable_section_end "docker-build"
1726
+ - collapseable_section_start "docker-push" "Docker push and tag"
1612
1727
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1613
1728
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1614
1729
  - docker push $DOCKER_CACHE_IMAGE
1615
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1730
+ - collapseable_section_end "docker-push"
1616
1731
  cache:
1617
1732
  - key: app2-yarn
1618
1733
  policy: pull
@@ -1631,8 +1746,8 @@ app2 🧪 test:
1631
1746
  image: aquasec/trivy:0.38.3
1632
1747
  variables: {}
1633
1748
  script:
1634
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1635
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1749
+ - collapseable_section_start "injectvars" "Injecting variables"
1750
+ - collapseable_section_end "injectvars"
1636
1751
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
1637
1752
  artifacts:
1638
1753
  paths:
@@ -1653,17 +1768,16 @@ app2 🧪 test:
1653
1768
  KUBERNETES_MEMORY_REQUEST: 200Mi
1654
1769
  KUBERNETES_MEMORY_LIMIT: 400Mi
1655
1770
  script:
1656
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1771
+ - collapseable_section_start "injectvars" "Injecting variables"
1657
1772
  - export ENV_SHORT="dev"
1658
1773
  - export APP_DIR="app2"
1659
1774
  - export ENV_TYPE="dev"
1660
1775
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1661
1776
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1662
1777
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1663
- - export HOST="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1778
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1664
1779
  - export ROOT_URL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1665
- - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1666
- - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1780
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1667
1781
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1668
1782
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1669
1783
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -1676,19 +1790,19 @@ app2 🧪 test:
1676
1790
  - 'export selfReference="this is from self: foo-value-2"'
1677
1791
  - 'export selfReference2="this is from self: this is from app1: foo-value"'
1678
1792
  - export app1Api="https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
1679
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
1793
+ - 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
1680
1794
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1681
1795
  - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2"
1682
1796
  - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
1683
1797
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1684
1798
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1685
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1686
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
1799
+ - collapseable_section_end "injectvars"
1800
+ - collapseable_section_start "prepare" "Prepare..."
1687
1801
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey")
1688
1802
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1689
1803
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1690
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
1691
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
1804
+ - collapseable_section_end "prepare"
1805
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1692
1806
  - |
1693
1807
  cat > ____envvars.yaml <<EOF
1694
1808
  ENV_SHORT: |-
@@ -1698,33 +1812,31 @@ app2 🧪 test:
1698
1812
  ENV_TYPE: |-
1699
1813
  dev
1700
1814
  BUILD_INFO_BUILD_ID: |-
1701
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1815
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1702
1816
  BUILD_INFO_BUILD_TIME: |-
1703
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1817
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1704
1818
  BUILD_INFO_CURRENT_VERSION: |-
1705
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1706
- HOST: |-
1707
- $(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1819
+ $(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/^/ /')
1820
+ HOSTNAME: |-
1821
+ $(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1708
1822
  ROOT_URL: |-
1709
- $(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1710
- HOST_INTERNAL: |-
1711
- $(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1712
- HOST_CANONICAL: |-
1713
- $(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1823
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1824
+ HOSTNAME_INTERNAL: |-
1825
+ $(printf %s "$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1714
1826
  ROOT_URL_INTERNAL: |-
1715
- $(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1827
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1716
1828
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1717
1829
  asdf
1718
1830
  DEPLOY_CLOUD_RUN_REGION: |-
1719
1831
  asia-east1
1720
1832
  SECRET2: |-
1721
- $(printf %s "$CL_dev_app2_SECRET2" | sed 's/^/ /')
1833
+ $(printf %s "$CL_dev_app2_SECRET2" | sed '1!s/^/ /')
1722
1834
  GCLOUD_RUN_canonicalHostSuffix: |-
1723
- $(printf %s "$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1835
+ $(printf %s "$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1724
1836
  foo2: |-
1725
1837
  foo-value-2
1726
1838
  referencingSecret: |-
1727
- $(printf %s "secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2" | sed 's/^/ /')
1839
+ secret1: $(printf %s "$CL_dev_app1_SECRET1" | sed '1!s/^/ /'), secret2: $(printf %s "$CL_dev_app2_SECRET2" | sed '1!s/^/ /')
1728
1840
  foo1: |-
1729
1841
  this is from app1: foo-value
1730
1842
  selfReference: |-
@@ -1732,20 +1844,20 @@ app2 🧪 test:
1732
1844
  selfReference2: |-
1733
1845
  this is from self: this is from app1: foo-value
1734
1846
  app1Api: |-
1735
- $(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
1847
+ $(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')/graphql
1736
1848
  _ALL_ENV_VAR_KEYS: |-
1737
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
1849
+ ["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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
1738
1850
 
1739
1851
  EOF
1740
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
1741
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
1852
+ - collapseable_section_end "writeenvvars"
1853
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1742
1854
  - gcloud run deploy pan-test-app-dev-app2 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app2,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-app2 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1743
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
1744
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
1855
+ - collapseable_section_end "deploy"
1856
+ - collapseable_section_start "cleanup" "Cleanup"
1745
1857
  - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-dev-app2 --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
1746
1858
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/app2@$version --quiet --delete-tags; done
1747
1859
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2@$version --quiet --delete-tags; done
1748
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
1860
+ - collapseable_section_end "cleanup"
1749
1861
  - echo 'Uploading SBOM to Dependency Track'
1750
1862
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1751
1863
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -1787,9 +1899,9 @@ app2 🧪 test:
1787
1899
  KUBERNETES_MEMORY_LIMIT: 400Mi
1788
1900
  GIT_STRATEGY: none
1789
1901
  script:
1790
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1902
+ - collapseable_section_start "injectvars" "Injecting variables"
1791
1903
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1792
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1904
+ - collapseable_section_end "injectvars"
1793
1905
  - set +e
1794
1906
  - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_app2_GCLOUD_DEPLOY_credentialsKey")
1795
1907
  - gcloud run services delete pan-test-app-dev-app2 --project=asdf --region=asia-east1
@@ -1825,17 +1937,16 @@ app2 🧪 test:
1825
1937
  KUBERNETES_MEMORY_REQUEST: 1Gi
1826
1938
  KUBERNETES_MEMORY_LIMIT: 4Gi
1827
1939
  script:
1828
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1940
+ - collapseable_section_start "injectvars" "Injecting variables"
1829
1941
  - export ENV_SHORT="review"
1830
1942
  - export APP_DIR="app2"
1831
1943
  - export ENV_TYPE="review"
1832
1944
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1833
1945
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1834
1946
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1835
- - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1947
+ - 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1836
1948
  - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1837
- - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1838
- - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1949
+ - 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1839
1950
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1840
1951
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1841
1952
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -1848,21 +1959,45 @@ app2 🧪 test:
1848
1959
  - 'export selfReference="this is from self: foo-value-2"'
1849
1960
  - 'export selfReference2="this is from self: this is from app1: foo-value"'
1850
1961
  - export app1Api="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
1851
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
1852
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1962
+ - 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
1963
+ - collapseable_section_end "injectvars"
1964
+ - collapseable_section_start "write-dotenv-app2" "write dot env for app2"
1965
+ - |-
1966
+ cat <<EOF > app2/.env
1967
+ ENV_SHORT=review
1968
+ APP_DIR=app2
1969
+ ENV_TYPE=review
1970
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1971
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1972
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1973
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1974
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
1975
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
1976
+ SECRET2=$(printf %s "$CL_review_app2_SECRET2" | escapeForDotEnv)
1977
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_app2_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1978
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1979
+ foo2=foo-value-2
1980
+ referencingSecret=$(printf %s "secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2" | escapeForDotEnv)
1981
+ foo1=this is from app1: foo-value
1982
+ selfReference=this is from self: foo-value-2
1983
+ selfReference2=this is from self: this is from app1: foo-value
1984
+ app1Api=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | escapeForDotEnv)
1985
+ _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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
1986
+ EOF
1987
+ - collapseable_section_end "write-dotenv-app2"
1853
1988
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
1854
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1989
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1855
1990
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1856
1991
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1857
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1992
+ - collapseable_section_end "nodeinstall"
1858
1993
  - cd app2
1859
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1994
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1860
1995
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1861
1996
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1862
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1863
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1997
+ - collapseable_section_end "nodeinstall"
1998
+ - collapseable_section_start "yarninstall" "Yarn install"
1864
1999
  - yarn install --immutable
1865
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2000
+ - collapseable_section_end "yarninstall"
1866
2001
  - yarn build
1867
2002
  cache:
1868
2003
  - key: app2-yarn
@@ -1873,15 +2008,13 @@ app2 🧪 test:
1873
2008
  policy: pull-push
1874
2009
  paths:
1875
2010
  - app2/node_modules
1876
- - key: app2-next-cache
1877
- policy: pull-push
1878
- paths:
1879
- - app2/.next/cache
1880
2011
  artifacts:
1881
2012
  paths:
1882
2013
  - app2/__build_info.json
1883
2014
  - app2/.next
1884
2015
  - app2/dist
2016
+ exclude:
2017
+ - app2/.env
1885
2018
  expire_in: 1 day
1886
2019
  when: always
1887
2020
  reports: {}
@@ -1907,7 +2040,7 @@ app2 🧪 test:
1907
2040
  KUBERNETES_MEMORY_REQUEST: 1Gi
1908
2041
  KUBERNETES_MEMORY_LIMIT: 2Gi
1909
2042
  script:
1910
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2043
+ - collapseable_section_start "injectvars" "Injecting variables"
1911
2044
  - export APP_DIR="app2"
1912
2045
  - export DOCKER_BUILD_CONTEXT="."
1913
2046
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
@@ -1923,20 +2056,20 @@ app2 🧪 test:
1923
2056
  COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
1924
2057
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1925
2058
  COPY --chown=node:node .yarn /app/.yarn"
1926
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2059
+ - collapseable_section_end "injectvars"
1927
2060
  - ensureNodeDockerfile
1928
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2061
+ - collapseable_section_start "docker-login" "Docker Login"
1929
2062
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app2_GCLOUD_DEPLOY_credentialsKey")
1930
2063
  - gcloud auth configure-docker asia-east1-docker.pkg.dev
1931
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1932
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2064
+ - collapseable_section_end "docker-login"
2065
+ - collapseable_section_start "docker-build" "Docker build"
1933
2066
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1934
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1935
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2067
+ - collapseable_section_end "docker-build"
2068
+ - collapseable_section_start "docker-push" "Docker push and tag"
1936
2069
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1937
2070
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1938
2071
  - docker push $DOCKER_CACHE_IMAGE
1939
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2072
+ - collapseable_section_end "docker-push"
1940
2073
  cache:
1941
2074
  - key: app2-yarn
1942
2075
  policy: pull
@@ -1953,8 +2086,8 @@ app2 🧪 test:
1953
2086
  image: aquasec/trivy:0.38.3
1954
2087
  variables: {}
1955
2088
  script:
1956
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1957
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2089
+ - collapseable_section_start "injectvars" "Injecting variables"
2090
+ - collapseable_section_end "injectvars"
1958
2091
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
1959
2092
  artifacts:
1960
2093
  paths:
@@ -1973,17 +2106,16 @@ app2 🧪 test:
1973
2106
  KUBERNETES_MEMORY_REQUEST: 200Mi
1974
2107
  KUBERNETES_MEMORY_LIMIT: 400Mi
1975
2108
  script:
1976
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2109
+ - collapseable_section_start "injectvars" "Injecting variables"
1977
2110
  - export ENV_SHORT="review"
1978
2111
  - export APP_DIR="app2"
1979
2112
  - export ENV_TYPE="review"
1980
2113
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1981
2114
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1982
2115
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1983
- - export HOST="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2116
+ - 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1984
2117
  - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1985
- - export HOST_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1986
- - export HOST_CANONICAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2118
+ - 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"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1987
2119
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1988
2120
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1989
2121
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -1996,19 +2128,19 @@ app2 🧪 test:
1996
2128
  - 'export selfReference="this is from self: foo-value-2"'
1997
2129
  - 'export selfReference2="this is from self: this is from app1: foo-value"'
1998
2130
  - export app1Api="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
1999
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2131
+ - 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2000
2132
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2001
2133
  - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
2002
2134
  - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
2003
2135
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2004
2136
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2005
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2006
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2137
+ - collapseable_section_end "injectvars"
2138
+ - collapseable_section_start "prepare" "Prepare..."
2007
2139
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app2_GCLOUD_DEPLOY_credentialsKey")
2008
2140
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
2009
2141
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2010
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2011
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2142
+ - collapseable_section_end "prepare"
2143
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
2012
2144
  - |
2013
2145
  cat > ____envvars.yaml <<EOF
2014
2146
  ENV_SHORT: |-
@@ -2018,33 +2150,31 @@ app2 🧪 test:
2018
2150
  ENV_TYPE: |-
2019
2151
  review
2020
2152
  BUILD_INFO_BUILD_ID: |-
2021
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2153
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2022
2154
  BUILD_INFO_BUILD_TIME: |-
2023
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2155
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2024
2156
  BUILD_INFO_CURRENT_VERSION: |-
2025
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2026
- HOST: |-
2027
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2157
+ $(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/^/ /')
2158
+ HOSTNAME: |-
2159
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2028
2160
  ROOT_URL: |-
2029
- $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2030
- HOST_INTERNAL: |-
2031
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2032
- HOST_CANONICAL: |-
2033
- $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2161
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2162
+ HOSTNAME_INTERNAL: |-
2163
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2034
2164
  ROOT_URL_INTERNAL: |-
2035
- $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2165
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2036
2166
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2037
2167
  asdf
2038
2168
  DEPLOY_CLOUD_RUN_REGION: |-
2039
2169
  asia-east1
2040
2170
  SECRET2: |-
2041
- $(printf %s "$CL_review_app2_SECRET2" | sed 's/^/ /')
2171
+ $(printf %s "$CL_review_app2_SECRET2" | sed '1!s/^/ /')
2042
2172
  GCLOUD_RUN_canonicalHostSuffix: |-
2043
- $(printf %s "$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2173
+ $(printf %s "$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
2044
2174
  foo2: |-
2045
2175
  foo-value-2
2046
2176
  referencingSecret: |-
2047
- $(printf %s "secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2" | sed 's/^/ /')
2177
+ secret1: $(printf %s "$CL_review_app1_SECRET1" | sed '1!s/^/ /'), secret2: $(printf %s "$CL_review_app2_SECRET2" | sed '1!s/^/ /')
2048
2178
  foo1: |-
2049
2179
  this is from app1: foo-value
2050
2180
  selfReference: |-
@@ -2052,23 +2182,23 @@ app2 🧪 test:
2052
2182
  selfReference2: |-
2053
2183
  this is from self: this is from app1: foo-value
2054
2184
  app1Api: |-
2055
- $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
2185
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')/graphql
2056
2186
  _ALL_ENV_VAR_KEYS: |-
2057
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2187
+ ["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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2058
2188
 
2059
2189
  EOF
2060
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2061
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2190
+ - collapseable_section_end "writeenvvars"
2191
+ - collapseable_section_start "deploy" "Deploy to cloud run"
2062
2192
  - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2" | awk '{print tolower($0)}') --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app2,app-name=test-app,env-type=review,env-name=review,build-type=node,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2063
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2064
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2193
+ - collapseable_section_end "deploy"
2194
+ - collapseable_section_start "cleanup" "Cleanup"
2065
2195
  - gcloud run revisions list --project=asdf --region=asia-east1 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
2066
2196
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
2067
2197
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2@$version --quiet --delete-tags; done
2068
2198
  - set +e
2069
2199
  - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/app2 --quiet --delete-tags
2070
2200
  - set -e
2071
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2201
+ - collapseable_section_end "cleanup"
2072
2202
  - echo 'Uploading SBOM to Dependency Track'
2073
2203
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2074
2204
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -2108,9 +2238,9 @@ app2 🧪 test:
2108
2238
  KUBERNETES_MEMORY_LIMIT: 400Mi
2109
2239
  GIT_STRATEGY: none
2110
2240
  script:
2111
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2241
+ - collapseable_section_start "injectvars" "Injecting variables"
2112
2242
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2113
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2243
+ - collapseable_section_end "injectvars"
2114
2244
  - set +e
2115
2245
  - gcloud auth activate-service-account --key-file=<(echo "$CL_review_app2_GCLOUD_DEPLOY_credentialsKey")
2116
2246
  - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2" | awk '{print tolower($0)}') --project=asdf --region=asia-east1
@@ -2147,17 +2277,16 @@ app2 🧪 test:
2147
2277
  KUBERNETES_MEMORY_REQUEST: 1Gi
2148
2278
  KUBERNETES_MEMORY_LIMIT: 4Gi
2149
2279
  script:
2150
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2280
+ - collapseable_section_start "injectvars" "Injecting variables"
2151
2281
  - export ENV_SHORT="stage"
2152
2282
  - export APP_DIR="app2"
2153
2283
  - export ENV_TYPE="stage"
2154
2284
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2155
2285
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2156
2286
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2157
- - export HOST="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2287
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2158
2288
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2159
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2160
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2289
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2161
2290
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2162
2291
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2163
2292
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -2170,21 +2299,45 @@ app2 🧪 test:
2170
2299
  - 'export selfReference="this is from self: foo-value-2"'
2171
2300
  - 'export selfReference2="this is from self: this is from app1: foo-value"'
2172
2301
  - export app1Api="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
2173
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2174
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2302
+ - 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2303
+ - collapseable_section_end "injectvars"
2304
+ - collapseable_section_start "write-dotenv-app2" "write dot env for app2"
2305
+ - |-
2306
+ cat <<EOF > app2/.env
2307
+ ENV_SHORT=stage
2308
+ APP_DIR=app2
2309
+ ENV_TYPE=stage
2310
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2311
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2312
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2313
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2314
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
2315
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
2316
+ SECRET2=$(printf %s "$CL_stage_app2_SECRET2" | escapeForDotEnv)
2317
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
2318
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
2319
+ foo2=foo-value-2
2320
+ referencingSecret=$(printf %s "secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2" | escapeForDotEnv)
2321
+ foo1=this is from app1: foo-value
2322
+ selfReference=this is from self: foo-value-2
2323
+ selfReference2=this is from self: this is from app1: foo-value
2324
+ app1Api=$(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | escapeForDotEnv)
2325
+ _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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2326
+ EOF
2327
+ - collapseable_section_end "write-dotenv-app2"
2175
2328
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
2176
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2329
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2177
2330
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2178
2331
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2179
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2332
+ - collapseable_section_end "nodeinstall"
2180
2333
  - cd app2
2181
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2334
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2182
2335
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2183
2336
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2184
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2185
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2337
+ - collapseable_section_end "nodeinstall"
2338
+ - collapseable_section_start "yarninstall" "Yarn install"
2186
2339
  - yarn install --immutable
2187
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2340
+ - collapseable_section_end "yarninstall"
2188
2341
  - yarn build
2189
2342
  cache:
2190
2343
  - key: app2-yarn
@@ -2195,15 +2348,13 @@ app2 🧪 test:
2195
2348
  policy: pull-push
2196
2349
  paths:
2197
2350
  - app2/node_modules
2198
- - key: app2-next-cache
2199
- policy: pull-push
2200
- paths:
2201
- - app2/.next/cache
2202
2351
  artifacts:
2203
2352
  paths:
2204
2353
  - app2/__build_info.json
2205
2354
  - app2/.next
2206
2355
  - app2/dist
2356
+ exclude:
2357
+ - app2/.env
2207
2358
  expire_in: 1 day
2208
2359
  when: always
2209
2360
  reports: {}
@@ -2229,7 +2380,7 @@ app2 🧪 test:
2229
2380
  KUBERNETES_MEMORY_REQUEST: 1Gi
2230
2381
  KUBERNETES_MEMORY_LIMIT: 2Gi
2231
2382
  script:
2232
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2383
+ - collapseable_section_start "injectvars" "Injecting variables"
2233
2384
  - export APP_DIR="app2"
2234
2385
  - export DOCKER_BUILD_CONTEXT="."
2235
2386
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
@@ -2245,20 +2396,20 @@ app2 🧪 test:
2245
2396
  COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
2246
2397
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2247
2398
  COPY --chown=node:node .yarn /app/.yarn"
2248
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2399
+ - collapseable_section_end "injectvars"
2249
2400
  - ensureNodeDockerfile
2250
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2401
+ - collapseable_section_start "docker-login" "Docker Login"
2251
2402
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey")
2252
2403
  - gcloud auth configure-docker asia-east1-docker.pkg.dev
2253
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2254
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2404
+ - collapseable_section_end "docker-login"
2405
+ - collapseable_section_start "docker-build" "Docker build"
2255
2406
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2256
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2257
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2407
+ - collapseable_section_end "docker-build"
2408
+ - collapseable_section_start "docker-push" "Docker push and tag"
2258
2409
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2259
2410
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2260
2411
  - docker push $DOCKER_CACHE_IMAGE
2261
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2412
+ - collapseable_section_end "docker-push"
2262
2413
  cache:
2263
2414
  - key: app2-yarn
2264
2415
  policy: pull
@@ -2275,8 +2426,8 @@ app2 🧪 test:
2275
2426
  image: aquasec/trivy:0.38.3
2276
2427
  variables: {}
2277
2428
  script:
2278
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2279
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2429
+ - collapseable_section_start "injectvars" "Injecting variables"
2430
+ - collapseable_section_end "injectvars"
2280
2431
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
2281
2432
  artifacts:
2282
2433
  paths:
@@ -2295,17 +2446,16 @@ app2 🧪 test:
2295
2446
  KUBERNETES_MEMORY_REQUEST: 200Mi
2296
2447
  KUBERNETES_MEMORY_LIMIT: 400Mi
2297
2448
  script:
2298
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2449
+ - collapseable_section_start "injectvars" "Injecting variables"
2299
2450
  - export ENV_SHORT="stage"
2300
2451
  - export APP_DIR="app2"
2301
2452
  - export ENV_TYPE="stage"
2302
2453
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2303
2454
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2304
2455
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2305
- - export HOST="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2456
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2306
2457
  - export ROOT_URL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2307
- - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2308
- - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2458
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2309
2459
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2310
2460
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2311
2461
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -2318,19 +2468,19 @@ app2 🧪 test:
2318
2468
  - 'export selfReference="this is from self: foo-value-2"'
2319
2469
  - 'export selfReference2="this is from self: this is from app1: foo-value"'
2320
2470
  - export app1Api="https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
2321
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2471
+ - 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2322
2472
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2323
2473
  - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2"
2324
2474
  - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
2325
2475
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2326
2476
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2327
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2328
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2477
+ - collapseable_section_end "injectvars"
2478
+ - collapseable_section_start "prepare" "Prepare..."
2329
2479
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey")
2330
2480
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
2331
2481
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2332
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2333
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2482
+ - collapseable_section_end "prepare"
2483
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
2334
2484
  - |
2335
2485
  cat > ____envvars.yaml <<EOF
2336
2486
  ENV_SHORT: |-
@@ -2340,33 +2490,31 @@ app2 🧪 test:
2340
2490
  ENV_TYPE: |-
2341
2491
  stage
2342
2492
  BUILD_INFO_BUILD_ID: |-
2343
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2493
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2344
2494
  BUILD_INFO_BUILD_TIME: |-
2345
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2495
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2346
2496
  BUILD_INFO_CURRENT_VERSION: |-
2347
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2348
- HOST: |-
2349
- $(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2497
+ $(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/^/ /')
2498
+ HOSTNAME: |-
2499
+ $(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2350
2500
  ROOT_URL: |-
2351
- $(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2352
- HOST_INTERNAL: |-
2353
- $(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2354
- HOST_CANONICAL: |-
2355
- $(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2501
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2502
+ HOSTNAME_INTERNAL: |-
2503
+ $(printf %s "$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2356
2504
  ROOT_URL_INTERNAL: |-
2357
- $(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2505
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2358
2506
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2359
2507
  asdf
2360
2508
  DEPLOY_CLOUD_RUN_REGION: |-
2361
2509
  asia-east1
2362
2510
  SECRET2: |-
2363
- $(printf %s "$CL_stage_app2_SECRET2" | sed 's/^/ /')
2511
+ $(printf %s "$CL_stage_app2_SECRET2" | sed '1!s/^/ /')
2364
2512
  GCLOUD_RUN_canonicalHostSuffix: |-
2365
- $(printf %s "$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2513
+ $(printf %s "$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
2366
2514
  foo2: |-
2367
2515
  foo-value-2
2368
2516
  referencingSecret: |-
2369
- $(printf %s "secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2" | sed 's/^/ /')
2517
+ secret1: $(printf %s "$CL_stage_app1_SECRET1" | sed '1!s/^/ /'), secret2: $(printf %s "$CL_stage_app2_SECRET2" | sed '1!s/^/ /')
2370
2518
  foo1: |-
2371
2519
  this is from app1: foo-value
2372
2520
  selfReference: |-
@@ -2374,20 +2522,20 @@ app2 🧪 test:
2374
2522
  selfReference2: |-
2375
2523
  this is from self: this is from app1: foo-value
2376
2524
  app1Api: |-
2377
- $(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
2525
+ $(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')/graphql
2378
2526
  _ALL_ENV_VAR_KEYS: |-
2379
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2527
+ ["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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2380
2528
 
2381
2529
  EOF
2382
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2383
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2530
+ - collapseable_section_end "writeenvvars"
2531
+ - collapseable_section_start "deploy" "Deploy to cloud run"
2384
2532
  - gcloud run deploy pan-test-app-stage-app2 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app2,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-app2 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2385
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2386
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2533
+ - collapseable_section_end "deploy"
2534
+ - collapseable_section_start "cleanup" "Cleanup"
2387
2535
  - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-stage-app2 --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
2388
2536
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/app2@$version --quiet --delete-tags; done
2389
2537
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2@$version --quiet --delete-tags; done
2390
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2538
+ - collapseable_section_end "cleanup"
2391
2539
  - echo 'Uploading SBOM to Dependency Track'
2392
2540
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2393
2541
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -2420,9 +2568,9 @@ app2 🧪 test:
2420
2568
  KUBERNETES_MEMORY_LIMIT: 400Mi
2421
2569
  GIT_STRATEGY: none
2422
2570
  script:
2423
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2571
+ - collapseable_section_start "injectvars" "Injecting variables"
2424
2572
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2425
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2573
+ - collapseable_section_end "injectvars"
2426
2574
  - set +e
2427
2575
  - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_app2_GCLOUD_DEPLOY_credentialsKey")
2428
2576
  - gcloud run services delete pan-test-app-stage-app2 --project=asdf --region=asia-east1
@@ -2456,17 +2604,16 @@ app2 🧪 test:
2456
2604
  KUBERNETES_MEMORY_REQUEST: 1Gi
2457
2605
  KUBERNETES_MEMORY_LIMIT: 4Gi
2458
2606
  script:
2459
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2607
+ - collapseable_section_start "injectvars" "Injecting variables"
2460
2608
  - export ENV_SHORT="prod"
2461
2609
  - export APP_DIR="app2"
2462
2610
  - export ENV_TYPE="prod"
2463
2611
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2464
2612
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2465
2613
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2466
- - export HOST="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2614
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2467
2615
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2468
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2469
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2616
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2470
2617
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2471
2618
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2472
2619
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -2479,21 +2626,45 @@ app2 🧪 test:
2479
2626
  - 'export selfReference="this is from self: foo-value-2"'
2480
2627
  - 'export selfReference2="this is from self: this is from app1: foo-value"'
2481
2628
  - export app1Api="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
2482
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2483
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2629
+ - 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2630
+ - collapseable_section_end "injectvars"
2631
+ - collapseable_section_start "write-dotenv-app2" "write dot env for app2"
2632
+ - |-
2633
+ cat <<EOF > app2/.env
2634
+ ENV_SHORT=prod
2635
+ APP_DIR=app2
2636
+ ENV_TYPE=prod
2637
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2638
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2639
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2640
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
2641
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
2642
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
2643
+ SECRET2=$(printf %s "$CL_prod_app2_SECRET2" | escapeForDotEnv)
2644
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
2645
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
2646
+ foo2=foo-value-2
2647
+ referencingSecret=$(printf %s "secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2" | escapeForDotEnv)
2648
+ foo1=this is from app1: foo-value
2649
+ selfReference=this is from self: foo-value-2
2650
+ selfReference2=this is from self: this is from app1: foo-value
2651
+ app1Api=$(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | escapeForDotEnv)
2652
+ _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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2653
+ EOF
2654
+ - collapseable_section_end "write-dotenv-app2"
2484
2655
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app2/__build_info.json
2485
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2656
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2486
2657
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2487
2658
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2488
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2659
+ - collapseable_section_end "nodeinstall"
2489
2660
  - cd app2
2490
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2661
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2491
2662
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2492
2663
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2493
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2494
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2664
+ - collapseable_section_end "nodeinstall"
2665
+ - collapseable_section_start "yarninstall" "Yarn install"
2495
2666
  - yarn install --immutable
2496
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2667
+ - collapseable_section_end "yarninstall"
2497
2668
  - yarn build
2498
2669
  cache:
2499
2670
  - key: app2-yarn
@@ -2504,15 +2675,13 @@ app2 🧪 test:
2504
2675
  policy: pull-push
2505
2676
  paths:
2506
2677
  - app2/node_modules
2507
- - key: app2-next-cache
2508
- policy: pull-push
2509
- paths:
2510
- - app2/.next/cache
2511
2678
  artifacts:
2512
2679
  paths:
2513
2680
  - app2/__build_info.json
2514
2681
  - app2/.next
2515
2682
  - app2/dist
2683
+ exclude:
2684
+ - app2/.env
2516
2685
  expire_in: 1 day
2517
2686
  when: always
2518
2687
  reports: {}
@@ -2538,7 +2707,7 @@ app2 🧪 test:
2538
2707
  KUBERNETES_MEMORY_REQUEST: 1Gi
2539
2708
  KUBERNETES_MEMORY_LIMIT: 2Gi
2540
2709
  script:
2541
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2710
+ - collapseable_section_start "injectvars" "Injecting variables"
2542
2711
  - export APP_DIR="app2"
2543
2712
  - export DOCKER_BUILD_CONTEXT="."
2544
2713
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
@@ -2554,20 +2723,20 @@ app2 🧪 test:
2554
2723
  COPY --chown=node:node app2/yarn.lock /app/app2/yarn.lock
2555
2724
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2556
2725
  COPY --chown=node:node .yarn /app/.yarn"
2557
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2726
+ - collapseable_section_end "injectvars"
2558
2727
  - ensureNodeDockerfile
2559
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
2728
+ - collapseable_section_start "docker-login" "Docker Login"
2560
2729
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey")
2561
2730
  - gcloud auth configure-docker asia-east1-docker.pkg.dev
2562
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2563
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
2731
+ - collapseable_section_end "docker-login"
2732
+ - collapseable_section_start "docker-build" "Docker build"
2564
2733
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2565
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2566
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
2734
+ - collapseable_section_end "docker-build"
2735
+ - collapseable_section_start "docker-push" "Docker push and tag"
2567
2736
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2568
2737
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2569
2738
  - docker push $DOCKER_CACHE_IMAGE
2570
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
2739
+ - collapseable_section_end "docker-push"
2571
2740
  cache:
2572
2741
  - key: app2-yarn
2573
2742
  policy: pull
@@ -2584,8 +2753,8 @@ app2 🧪 test:
2584
2753
  image: aquasec/trivy:0.38.3
2585
2754
  variables: {}
2586
2755
  script:
2587
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2588
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2756
+ - collapseable_section_start "injectvars" "Injecting variables"
2757
+ - collapseable_section_end "injectvars"
2589
2758
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" app2
2590
2759
  artifacts:
2591
2760
  paths:
@@ -2604,17 +2773,16 @@ app2 🧪 test:
2604
2773
  KUBERNETES_MEMORY_REQUEST: 200Mi
2605
2774
  KUBERNETES_MEMORY_LIMIT: 400Mi
2606
2775
  script:
2607
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2776
+ - collapseable_section_start "injectvars" "Injecting variables"
2608
2777
  - export ENV_SHORT="prod"
2609
2778
  - export APP_DIR="app2"
2610
2779
  - export ENV_TYPE="prod"
2611
2780
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2612
2781
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2613
2782
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2614
- - export HOST="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2783
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2615
2784
  - export ROOT_URL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2616
- - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2617
- - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2785
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2618
2786
  - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2619
2787
  - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2620
2788
  - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
@@ -2627,19 +2795,19 @@ app2 🧪 test:
2627
2795
  - 'export selfReference="this is from self: foo-value-2"'
2628
2796
  - 'export selfReference2="this is from self: this is from app1: foo-value"'
2629
2797
  - export app1Api="https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
2630
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2798
+ - 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\\",\\"SECRET2\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\",\\"foo2\\",\\"referencingSecret\\",\\"foo1\\",\\"selfReference\\",\\"selfReference2\\",\\"app1Api\\"]"
2631
2799
  - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2632
2800
  - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2"
2633
2801
  - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2"
2634
2802
  - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2635
2803
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2636
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2637
- - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
2804
+ - collapseable_section_end "injectvars"
2805
+ - collapseable_section_start "prepare" "Prepare..."
2638
2806
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey")
2639
2807
  - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
2640
2808
  - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2641
- - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
2642
- - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
2809
+ - collapseable_section_end "prepare"
2810
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
2643
2811
  - |
2644
2812
  cat > ____envvars.yaml <<EOF
2645
2813
  ENV_SHORT: |-
@@ -2649,33 +2817,31 @@ app2 🧪 test:
2649
2817
  ENV_TYPE: |-
2650
2818
  prod
2651
2819
  BUILD_INFO_BUILD_ID: |-
2652
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2820
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2653
2821
  BUILD_INFO_BUILD_TIME: |-
2654
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2822
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2655
2823
  BUILD_INFO_CURRENT_VERSION: |-
2656
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2657
- HOST: |-
2658
- $(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2824
+ $(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/^/ /')
2825
+ HOSTNAME: |-
2826
+ $(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2659
2827
  ROOT_URL: |-
2660
- $(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2661
- HOST_INTERNAL: |-
2662
- $(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2663
- HOST_CANONICAL: |-
2664
- $(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2828
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2829
+ HOSTNAME_INTERNAL: |-
2830
+ $(printf %s "$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2665
2831
  ROOT_URL_INTERNAL: |-
2666
- $(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2832
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2667
2833
  DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2668
2834
  asdf
2669
2835
  DEPLOY_CLOUD_RUN_REGION: |-
2670
2836
  asia-east1
2671
2837
  SECRET2: |-
2672
- $(printf %s "$CL_prod_app2_SECRET2" | sed 's/^/ /')
2838
+ $(printf %s "$CL_prod_app2_SECRET2" | sed '1!s/^/ /')
2673
2839
  GCLOUD_RUN_canonicalHostSuffix: |-
2674
- $(printf %s "$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2840
+ $(printf %s "$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
2675
2841
  foo2: |-
2676
2842
  foo-value-2
2677
2843
  referencingSecret: |-
2678
- $(printf %s "secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2" | sed 's/^/ /')
2844
+ secret1: $(printf %s "$CL_prod_app1_SECRET1" | sed '1!s/^/ /'), secret2: $(printf %s "$CL_prod_app2_SECRET2" | sed '1!s/^/ /')
2679
2845
  foo1: |-
2680
2846
  this is from app1: foo-value
2681
2847
  selfReference: |-
@@ -2683,20 +2849,20 @@ app2 🧪 test:
2683
2849
  selfReference2: |-
2684
2850
  this is from self: this is from app1: foo-value
2685
2851
  app1Api: |-
2686
- $(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | sed 's/^/ /')
2852
+ $(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')/graphql
2687
2853
  _ALL_ENV_VAR_KEYS: |-
2688
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2854
+ ["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","SECRET2","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix","foo2","referencingSecret","foo1","selfReference","selfReference2","app1Api"]
2689
2855
 
2690
2856
  EOF
2691
- - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
2692
- - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
2857
+ - collapseable_section_end "writeenvvars"
2858
+ - collapseable_section_start "deploy" "Deploy to cloud run"
2693
2859
  - gcloud run deploy pan-test-app-prod-app2 --command="yarn,start" --image=asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2:$DOCKER_IMAGE_TAG --project=asdf --region=asia-east1 --labels=customer-name=pan,component-name=app2,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-app2 --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
2694
- - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
2695
- - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
2860
+ - collapseable_section_end "deploy"
2861
+ - collapseable_section_start "cleanup" "Cleanup"
2696
2862
  - gcloud run revisions list --project=asdf --region=asia-east1 --service=pan-test-app-prod-app2 --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=asdf --region=asia-east1 --quiet $revisionname ; done
2697
2863
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/app2@$version --quiet --delete-tags; done
2698
2864
  - gcloud artifacts docker images list asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2 --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/app2@$version --quiet --delete-tags; done
2699
- - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
2865
+ - collapseable_section_end "cleanup"
2700
2866
  - echo 'Uploading SBOM to Dependency Track'
2701
2867
  - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app2" "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
2702
2868
  - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
@@ -2729,9 +2895,9 @@ app2 🧪 test:
2729
2895
  KUBERNETES_MEMORY_LIMIT: 400Mi
2730
2896
  GIT_STRATEGY: none
2731
2897
  script:
2732
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2898
+ - collapseable_section_start "injectvars" "Injecting variables"
2733
2899
  - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2734
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2900
+ - collapseable_section_end "injectvars"
2735
2901
  - set +e
2736
2902
  - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_app2_GCLOUD_DEPLOY_credentialsKey")
2737
2903
  - gcloud run services delete pan-test-app-prod-app2 --project=asdf --region=asia-east1
@@ -2765,9 +2931,9 @@ app3 🛡 audit:
2765
2931
  KUBERNETES_MEMORY_REQUEST: 1Gi
2766
2932
  KUBERNETES_MEMORY_LIMIT: 4Gi
2767
2933
  script:
2768
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2934
+ - collapseable_section_start "injectvars" "Injecting variables"
2769
2935
  - export APP_PATH="kube"
2770
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2936
+ - collapseable_section_end "injectvars"
2771
2937
  - cd kube
2772
2938
  - yarn npm audit --environment production
2773
2939
  rules:
@@ -2787,21 +2953,21 @@ app3 👮 lint:
2787
2953
  KUBERNETES_MEMORY_REQUEST: 1Gi
2788
2954
  KUBERNETES_MEMORY_LIMIT: 4Gi
2789
2955
  script:
2790
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2956
+ - collapseable_section_start "injectvars" "Injecting variables"
2791
2957
  - export APP_PATH="kube"
2792
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2793
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2958
+ - collapseable_section_end "injectvars"
2959
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2794
2960
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2795
2961
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2796
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2962
+ - collapseable_section_end "nodeinstall"
2797
2963
  - cd kube
2798
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2964
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2799
2965
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2800
2966
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2801
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2802
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
2967
+ - collapseable_section_end "nodeinstall"
2968
+ - collapseable_section_start "yarninstall" "Yarn install"
2803
2969
  - yarn install --immutable
2804
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
2970
+ - collapseable_section_end "yarninstall"
2805
2971
  - yarn lint
2806
2972
  cache:
2807
2973
  - key: kube-yarn
@@ -2828,21 +2994,21 @@ app3 🧪 test:
2828
2994
  KUBERNETES_MEMORY_REQUEST: 1Gi
2829
2995
  KUBERNETES_MEMORY_LIMIT: 4Gi
2830
2996
  script:
2831
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
2997
+ - collapseable_section_start "injectvars" "Injecting variables"
2832
2998
  - export APP_PATH="kube"
2833
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
2834
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
2999
+ - collapseable_section_end "injectvars"
3000
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2835
3001
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2836
3002
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2837
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3003
+ - collapseable_section_end "nodeinstall"
2838
3004
  - cd kube
2839
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3005
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2840
3006
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2841
3007
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2842
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2843
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
3008
+ - collapseable_section_end "nodeinstall"
3009
+ - collapseable_section_start "yarninstall" "Yarn install"
2844
3010
  - yarn install --immutable
2845
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
3011
+ - collapseable_section_end "yarninstall"
2846
3012
  - yarn test
2847
3013
  cache:
2848
3014
  - key: kube-yarn
@@ -2869,17 +3035,16 @@ app3 🧪 test:
2869
3035
  KUBERNETES_MEMORY_REQUEST: 1Gi
2870
3036
  KUBERNETES_MEMORY_LIMIT: 4Gi
2871
3037
  script:
2872
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3038
+ - collapseable_section_start "injectvars" "Injecting variables"
2873
3039
  - export ENV_SHORT="dev"
2874
3040
  - export APP_DIR="kube"
2875
3041
  - export ENV_TYPE="dev"
2876
3042
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2877
3043
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2878
3044
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
2879
- - export HOST="app3.dev.test-app.pan.panter.cloud"
3045
+ - export HOSTNAME="app3.dev.test-app.pan.panter.cloud"
2880
3046
  - export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
2881
- - export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
2882
- - export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
3047
+ - export HOSTNAME_INTERNAL="app3.dev.test-app.pan.panter.cloud"
2883
3048
  - export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
2884
3049
  - export KUBE_NAMESPACE="pan-test-app-dev"
2885
3050
  - export KUBE_APP_NAME="app3"
@@ -2889,21 +3054,42 @@ app3 🧪 test:
2889
3054
  - 'export transitive="this is from app2: this is from app1: foo-value"'
2890
3055
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
2891
3056
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
2892
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
2893
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3057
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3058
+ - collapseable_section_end "injectvars"
3059
+ - collapseable_section_start "write-dotenv-app3" "write dot env for app3"
3060
+ - |-
3061
+ cat <<EOF > kube/.env
3062
+ ENV_SHORT=dev
3063
+ APP_DIR=kube
3064
+ ENV_TYPE=dev
3065
+ HOSTNAME=app3.dev.test-app.pan.panter.cloud
3066
+ ROOT_URL=https://app3.dev.test-app.pan.panter.cloud
3067
+ HOSTNAME_INTERNAL=app3.dev.test-app.pan.panter.cloud
3068
+ ROOT_URL_INTERNAL=https://app3.dev.test-app.pan.panter.cloud
3069
+ KUBE_NAMESPACE=pan-test-app-dev
3070
+ KUBE_APP_NAME=app3
3071
+ KUBE_APP_NAME_PREFIX=
3072
+ foo3=foo-value-3
3073
+ foo2=this is from app2: foo-value-2
3074
+ transitive=this is from app2: this is from app1: foo-value
3075
+ transitiveWithSecret=$(printf %s "this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2" | escapeForDotEnv)
3076
+ someJson=$(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]" | escapeForDotEnv)
3077
+ _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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3078
+ EOF
3079
+ - collapseable_section_end "write-dotenv-app3"
2894
3080
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
2895
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3081
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2896
3082
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2897
3083
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2898
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3084
+ - collapseable_section_end "nodeinstall"
2899
3085
  - cd kube
2900
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3086
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2901
3087
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2902
3088
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2903
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
2904
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
3089
+ - collapseable_section_end "nodeinstall"
3090
+ - collapseable_section_start "yarninstall" "Yarn install"
2905
3091
  - yarn install --immutable
2906
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
3092
+ - collapseable_section_end "yarninstall"
2907
3093
  - yarn build
2908
3094
  cache:
2909
3095
  - key: kube-yarn
@@ -2914,15 +3100,13 @@ app3 🧪 test:
2914
3100
  policy: pull-push
2915
3101
  paths:
2916
3102
  - kube/node_modules
2917
- - key: app3-next-cache
2918
- policy: pull-push
2919
- paths:
2920
- - kube/.next/cache
2921
3103
  artifacts:
2922
3104
  paths:
2923
3105
  - kube/__build_info.json
2924
3106
  - kube/.next
2925
3107
  - kube/dist
3108
+ exclude:
3109
+ - kube/.env
2926
3110
  expire_in: 1 day
2927
3111
  when: always
2928
3112
  reports: {}
@@ -2950,7 +3134,7 @@ app3 🧪 test:
2950
3134
  KUBERNETES_MEMORY_REQUEST: 1Gi
2951
3135
  KUBERNETES_MEMORY_LIMIT: 2Gi
2952
3136
  script:
2953
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3137
+ - collapseable_section_start "injectvars" "Injecting variables"
2954
3138
  - export APP_DIR="kube"
2955
3139
  - export DOCKER_BUILD_CONTEXT="."
2956
3140
  - export DOCKER_REGISTRY="$CI_REGISTRY"
@@ -2967,19 +3151,19 @@ app3 🧪 test:
2967
3151
  COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
2968
3152
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2969
3153
  COPY --chown=node:node .yarn /app/.yarn"
2970
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3154
+ - collapseable_section_end "injectvars"
2971
3155
  - ensureNodeDockerfile
2972
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
3156
+ - collapseable_section_start "docker-login" "Docker Login"
2973
3157
  - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
2974
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
2975
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
3158
+ - collapseable_section_end "docker-login"
3159
+ - collapseable_section_start "docker-build" "Docker build"
2976
3160
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
2977
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
2978
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
3161
+ - collapseable_section_end "docker-build"
3162
+ - collapseable_section_start "docker-push" "Docker push and tag"
2979
3163
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2980
3164
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2981
3165
  - docker push $DOCKER_CACHE_IMAGE
2982
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
3166
+ - collapseable_section_end "docker-push"
2983
3167
  cache:
2984
3168
  - key: kube-yarn
2985
3169
  policy: pull
@@ -2998,8 +3182,8 @@ app3 🧪 test:
2998
3182
  image: aquasec/trivy:0.38.3
2999
3183
  variables: {}
3000
3184
  script:
3001
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3002
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3185
+ - collapseable_section_start "injectvars" "Injecting variables"
3186
+ - collapseable_section_end "injectvars"
3003
3187
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
3004
3188
  artifacts:
3005
3189
  paths:
@@ -3020,17 +3204,16 @@ app3 🧪 test:
3020
3204
  KUBERNETES_MEMORY_REQUEST: 200Mi
3021
3205
  KUBERNETES_MEMORY_LIMIT: 400Mi
3022
3206
  script:
3023
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3207
+ - collapseable_section_start "injectvars" "Injecting variables"
3024
3208
  - export ENV_SHORT="dev"
3025
3209
  - export APP_DIR="kube"
3026
3210
  - export ENV_TYPE="dev"
3027
3211
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3028
3212
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3029
3213
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3030
- - export HOST="app3.dev.test-app.pan.panter.cloud"
3214
+ - export HOSTNAME="app3.dev.test-app.pan.panter.cloud"
3031
3215
  - export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
3032
- - export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
3033
- - export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
3216
+ - export HOSTNAME_INTERNAL="app3.dev.test-app.pan.panter.cloud"
3034
3217
  - export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
3035
3218
  - export KUBE_NAMESPACE="pan-test-app-dev"
3036
3219
  - export KUBE_APP_NAME="app3"
@@ -3040,7 +3223,7 @@ app3 🧪 test:
3040
3223
  - 'export transitive="this is from app2: this is from app1: foo-value"'
3041
3224
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
3042
3225
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
3043
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3226
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3044
3227
  - export DOCKER_REGISTRY="$CI_REGISTRY"
3045
3228
  - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
3046
3229
  - export DOCKER_IMAGE_NAME="dev/app3"
@@ -3052,21 +3235,20 @@ app3 🧪 test:
3052
3235
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3053
3236
  - export HELM_ARGS=""
3054
3237
  - export COMPONENT_NAME="app3"
3055
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3056
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3238
+ - collapseable_section_end "injectvars"
3057
3239
  - kubectl config set-cluster "kube-pan-test-app-dev-app3" --server="$CL_dev_app3_KUBE_URL" --certificate-authority <(echo $CL_dev_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3058
3240
  - kubectl config set-credentials "kube-pan-test-app-dev-app3" --token="$CL_dev_app3_KUBE_TOKEN"
3059
3241
  - kubectl config set-context "kube-pan-test-app-dev-app3" --cluster="kube-pan-test-app-dev-app3" --user="kube-pan-test-app-dev-app3" --namespace="pan-test-app-dev"
3060
3242
  - kubectl config use-context "kube-pan-test-app-dev-app3"
3061
- - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
3243
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
3062
3244
  - |
3063
3245
  cat > __all_values.yml <<EOF
3064
3246
  env:
3065
3247
  secret:
3066
3248
  transitiveWithSecret: |-
3067
- $(printf %s "this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2" | sed 's/^/ /')
3249
+ this is from app2: secret1: $(printf %s "$CL_dev_app1_SECRET1" | sed '1!s/^/ /'), secret2: $(printf %s "$CL_dev_app2_SECRET2" | sed '1!s/^/ /')
3068
3250
  someJson: |-
3069
- $(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
3251
+ [{"name": "app1", "url": "$(printf %s "https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')"}, {"name": "app2", "url": "$(printf %s "https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')"}, {"name": "app3", "url": "https://app3.dev.test-app.pan.panter.cloud"}]
3070
3252
  public:
3071
3253
  ENV_SHORT: |-
3072
3254
  dev
@@ -3075,18 +3257,16 @@ app3 🧪 test:
3075
3257
  ENV_TYPE: |-
3076
3258
  dev
3077
3259
  BUILD_INFO_BUILD_ID: |-
3078
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3260
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
3079
3261
  BUILD_INFO_BUILD_TIME: |-
3080
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3262
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
3081
3263
  BUILD_INFO_CURRENT_VERSION: |-
3082
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
3083
- HOST: |-
3264
+ $(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/^/ /')
3265
+ HOSTNAME: |-
3084
3266
  app3.dev.test-app.pan.panter.cloud
3085
3267
  ROOT_URL: |-
3086
3268
  https://app3.dev.test-app.pan.panter.cloud
3087
- HOST_INTERNAL: |-
3088
- app3.dev.test-app.pan.panter.cloud
3089
- HOST_CANONICAL: |-
3269
+ HOSTNAME_INTERNAL: |-
3090
3270
  app3.dev.test-app.pan.panter.cloud
3091
3271
  ROOT_URL_INTERNAL: |-
3092
3272
  https://app3.dev.test-app.pan.panter.cloud
@@ -3102,7 +3282,7 @@ app3 🧪 test:
3102
3282
  transitive: |-
3103
3283
  this is from app2: this is from app1: foo-value
3104
3284
  _ALL_ENV_VAR_KEYS: |-
3105
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3285
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3106
3286
  application:
3107
3287
  host: |-
3108
3288
  app3.dev.test-app.pan.panter.cloud
@@ -3122,7 +3302,7 @@ app3 🧪 test:
3122
3302
  __health
3123
3303
 
3124
3304
  EOF
3125
- - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
3305
+ - collapseable_section_end "writeallvalues"
3126
3306
  - kubernetesCreateSecret
3127
3307
  - kubernetesDeploy
3128
3308
  - echo 'Uploading SBOM to Dependency Track'
@@ -3167,17 +3347,16 @@ app3 🧪 test:
3167
3347
  KUBERNETES_MEMORY_LIMIT: 400Mi
3168
3348
  GIT_STRATEGY: none
3169
3349
  script:
3170
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3350
+ - collapseable_section_start "injectvars" "Injecting variables"
3171
3351
  - export ENV_SHORT="dev"
3172
3352
  - export APP_DIR="kube"
3173
3353
  - export ENV_TYPE="dev"
3174
3354
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3175
3355
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3176
3356
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3177
- - export HOST="app3.dev.test-app.pan.panter.cloud"
3357
+ - export HOSTNAME="app3.dev.test-app.pan.panter.cloud"
3178
3358
  - export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
3179
- - export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
3180
- - export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
3359
+ - export HOSTNAME_INTERNAL="app3.dev.test-app.pan.panter.cloud"
3181
3360
  - export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
3182
3361
  - export KUBE_NAMESPACE="pan-test-app-dev"
3183
3362
  - export KUBE_APP_NAME="app3"
@@ -3187,15 +3366,14 @@ app3 🧪 test:
3187
3366
  - 'export transitive="this is from app2: this is from app1: foo-value"'
3188
3367
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
3189
3368
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
3190
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3369
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3191
3370
  - export RELEASE_NAME="pan-test-app-dev-app3"
3192
3371
  - export HELM_EXPERIMENTAL_OCI="1"
3193
3372
  - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3194
3373
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3195
3374
  - export HELM_ARGS=""
3196
3375
  - export COMPONENT_NAME="app3"
3197
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3198
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3376
+ - collapseable_section_end "injectvars"
3199
3377
  - kubectl config set-cluster "kube-pan-test-app-dev-app3" --server="$CL_dev_app3_KUBE_URL" --certificate-authority <(echo $CL_dev_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3200
3378
  - kubectl config set-credentials "kube-pan-test-app-dev-app3" --token="$CL_dev_app3_KUBE_TOKEN"
3201
3379
  - kubectl config set-context "kube-pan-test-app-dev-app3" --cluster="kube-pan-test-app-dev-app3" --user="kube-pan-test-app-dev-app3" --namespace="pan-test-app-dev"
@@ -3231,17 +3409,16 @@ app3 🧪 test:
3231
3409
  KUBERNETES_MEMORY_LIMIT: 400Mi
3232
3410
  GIT_STRATEGY: none
3233
3411
  script:
3234
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3412
+ - collapseable_section_start "injectvars" "Injecting variables"
3235
3413
  - export ENV_SHORT="dev"
3236
3414
  - export APP_DIR="kube"
3237
3415
  - export ENV_TYPE="dev"
3238
3416
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3239
3417
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3240
3418
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3241
- - export HOST="app3.dev.test-app.pan.panter.cloud"
3419
+ - export HOSTNAME="app3.dev.test-app.pan.panter.cloud"
3242
3420
  - export ROOT_URL="https://app3.dev.test-app.pan.panter.cloud"
3243
- - export HOST_INTERNAL="app3.dev.test-app.pan.panter.cloud"
3244
- - export HOST_CANONICAL="app3.dev.test-app.pan.panter.cloud"
3421
+ - export HOSTNAME_INTERNAL="app3.dev.test-app.pan.panter.cloud"
3245
3422
  - export ROOT_URL_INTERNAL="https://app3.dev.test-app.pan.panter.cloud"
3246
3423
  - export KUBE_NAMESPACE="pan-test-app-dev"
3247
3424
  - export KUBE_APP_NAME="app3"
@@ -3251,15 +3428,14 @@ app3 🧪 test:
3251
3428
  - 'export transitive="this is from app2: this is from app1: foo-value"'
3252
3429
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_dev_app1_SECRET1, secret2: $CL_dev_app2_SECRET2"'
3253
3430
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app1-$CL_dev_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-dev-app2-$CL_dev_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.dev.test-app.pan.panter.cloud\\"}]"'
3254
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3431
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3255
3432
  - export RELEASE_NAME="pan-test-app-dev-app3"
3256
3433
  - export HELM_EXPERIMENTAL_OCI="1"
3257
3434
  - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3258
3435
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3259
3436
  - export HELM_ARGS=""
3260
3437
  - export COMPONENT_NAME="app3"
3261
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3262
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3438
+ - collapseable_section_end "injectvars"
3263
3439
  - kubectl config set-cluster "kube-pan-test-app-dev-app3" --server="$CL_dev_app3_KUBE_URL" --certificate-authority <(echo $CL_dev_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3264
3440
  - kubectl config set-credentials "kube-pan-test-app-dev-app3" --token="$CL_dev_app3_KUBE_TOKEN"
3265
3441
  - kubectl config set-context "kube-pan-test-app-dev-app3" --cluster="kube-pan-test-app-dev-app3" --user="kube-pan-test-app-dev-app3" --namespace="pan-test-app-dev"
@@ -3290,17 +3466,16 @@ app3 🧪 test:
3290
3466
  KUBERNETES_MEMORY_REQUEST: 1Gi
3291
3467
  KUBERNETES_MEMORY_LIMIT: 4Gi
3292
3468
  script:
3293
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3469
+ - collapseable_section_start "injectvars" "Injecting variables"
3294
3470
  - export ENV_SHORT="review"
3295
3471
  - export APP_DIR="kube"
3296
3472
  - export ENV_TYPE="review"
3297
3473
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3298
3474
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3299
3475
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3300
- - export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3476
+ - export HOSTNAME="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3301
3477
  - export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3302
- - export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3303
- - export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3478
+ - export HOSTNAME_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3304
3479
  - export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3305
3480
  - export KUBE_NAMESPACE="pan-test-app-review"
3306
3481
  - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
@@ -3310,21 +3485,42 @@ app3 🧪 test:
3310
3485
  - 'export transitive="this is from app2: this is from app1: foo-value"'
3311
3486
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
3312
3487
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
3313
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3314
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3488
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3489
+ - collapseable_section_end "injectvars"
3490
+ - collapseable_section_start "write-dotenv-app3" "write dot env for app3"
3491
+ - |-
3492
+ cat <<EOF > kube/.env
3493
+ ENV_SHORT=review
3494
+ APP_DIR=kube
3495
+ ENV_TYPE=review
3496
+ HOSTNAME=$(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | escapeForDotEnv)
3497
+ ROOT_URL=$(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | escapeForDotEnv)
3498
+ HOSTNAME_INTERNAL=$(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | escapeForDotEnv)
3499
+ ROOT_URL_INTERNAL=$(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | escapeForDotEnv)
3500
+ KUBE_NAMESPACE=pan-test-app-review
3501
+ KUBE_APP_NAME=$(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" | escapeForDotEnv)
3502
+ KUBE_APP_NAME_PREFIX=$(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | escapeForDotEnv)
3503
+ foo3=foo-value-3
3504
+ foo2=this is from app2: foo-value-2
3505
+ transitive=this is from app2: this is from app1: foo-value
3506
+ transitiveWithSecret=$(printf %s "this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2" | escapeForDotEnv)
3507
+ someJson=$(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]" | escapeForDotEnv)
3508
+ _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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3509
+ EOF
3510
+ - collapseable_section_end "write-dotenv-app3"
3315
3511
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
3316
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3512
+ - collapseable_section_start "nodeinstall" "Ensure node version"
3317
3513
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
3318
3514
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
3319
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3515
+ - collapseable_section_end "nodeinstall"
3320
3516
  - cd kube
3321
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3517
+ - collapseable_section_start "nodeinstall" "Ensure node version"
3322
3518
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
3323
3519
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
3324
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3325
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
3520
+ - collapseable_section_end "nodeinstall"
3521
+ - collapseable_section_start "yarninstall" "Yarn install"
3326
3522
  - yarn install --immutable
3327
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
3523
+ - collapseable_section_end "yarninstall"
3328
3524
  - yarn build
3329
3525
  cache:
3330
3526
  - key: kube-yarn
@@ -3335,15 +3531,13 @@ app3 🧪 test:
3335
3531
  policy: pull-push
3336
3532
  paths:
3337
3533
  - kube/node_modules
3338
- - key: app3-next-cache
3339
- policy: pull-push
3340
- paths:
3341
- - kube/.next/cache
3342
3534
  artifacts:
3343
3535
  paths:
3344
3536
  - kube/__build_info.json
3345
3537
  - kube/.next
3346
3538
  - kube/dist
3539
+ exclude:
3540
+ - kube/.env
3347
3541
  expire_in: 1 day
3348
3542
  when: always
3349
3543
  reports: {}
@@ -3369,7 +3563,7 @@ app3 🧪 test:
3369
3563
  KUBERNETES_MEMORY_REQUEST: 1Gi
3370
3564
  KUBERNETES_MEMORY_LIMIT: 2Gi
3371
3565
  script:
3372
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3566
+ - collapseable_section_start "injectvars" "Injecting variables"
3373
3567
  - export APP_DIR="kube"
3374
3568
  - export DOCKER_BUILD_CONTEXT="."
3375
3569
  - export DOCKER_REGISTRY="$CI_REGISTRY"
@@ -3386,19 +3580,19 @@ app3 🧪 test:
3386
3580
  COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
3387
3581
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
3388
3582
  COPY --chown=node:node .yarn /app/.yarn"
3389
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3583
+ - collapseable_section_end "injectvars"
3390
3584
  - ensureNodeDockerfile
3391
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
3585
+ - collapseable_section_start "docker-login" "Docker Login"
3392
3586
  - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
3393
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
3394
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
3587
+ - collapseable_section_end "docker-login"
3588
+ - collapseable_section_start "docker-build" "Docker build"
3395
3589
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
3396
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
3397
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
3590
+ - collapseable_section_end "docker-build"
3591
+ - collapseable_section_start "docker-push" "Docker push and tag"
3398
3592
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
3399
3593
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
3400
3594
  - docker push $DOCKER_CACHE_IMAGE
3401
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
3595
+ - collapseable_section_end "docker-push"
3402
3596
  cache:
3403
3597
  - key: kube-yarn
3404
3598
  policy: pull
@@ -3415,8 +3609,8 @@ app3 🧪 test:
3415
3609
  image: aquasec/trivy:0.38.3
3416
3610
  variables: {}
3417
3611
  script:
3418
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3419
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3612
+ - collapseable_section_start "injectvars" "Injecting variables"
3613
+ - collapseable_section_end "injectvars"
3420
3614
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
3421
3615
  artifacts:
3422
3616
  paths:
@@ -3435,17 +3629,16 @@ app3 🧪 test:
3435
3629
  KUBERNETES_MEMORY_REQUEST: 200Mi
3436
3630
  KUBERNETES_MEMORY_LIMIT: 400Mi
3437
3631
  script:
3438
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3632
+ - collapseable_section_start "injectvars" "Injecting variables"
3439
3633
  - export ENV_SHORT="review"
3440
3634
  - export APP_DIR="kube"
3441
3635
  - export ENV_TYPE="review"
3442
3636
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3443
3637
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3444
3638
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3445
- - export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3639
+ - export HOSTNAME="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3446
3640
  - export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3447
- - export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3448
- - export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3641
+ - export HOSTNAME_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3449
3642
  - export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3450
3643
  - export KUBE_NAMESPACE="pan-test-app-review"
3451
3644
  - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
@@ -3455,7 +3648,7 @@ app3 🧪 test:
3455
3648
  - 'export transitive="this is from app2: this is from app1: foo-value"'
3456
3649
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
3457
3650
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
3458
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3651
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3459
3652
  - export DOCKER_REGISTRY="$CI_REGISTRY"
3460
3653
  - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
3461
3654
  - export DOCKER_IMAGE_NAME="review/app3"
@@ -3467,21 +3660,20 @@ app3 🧪 test:
3467
3660
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3468
3661
  - export HELM_ARGS=""
3469
3662
  - export COMPONENT_NAME="app3"
3470
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3471
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3663
+ - collapseable_section_end "injectvars"
3472
3664
  - kubectl config set-cluster "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --server="$CL_review_app3_KUBE_URL" --certificate-authority <(echo $CL_review_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3473
3665
  - kubectl config set-credentials "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --token="$CL_review_app3_KUBE_TOKEN"
3474
3666
  - kubectl config set-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --cluster="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --user="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --namespace="pan-test-app-review"
3475
3667
  - kubectl config use-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
3476
- - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
3668
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
3477
3669
  - |
3478
3670
  cat > __all_values.yml <<EOF
3479
3671
  env:
3480
3672
  secret:
3481
3673
  transitiveWithSecret: |-
3482
- $(printf %s "this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2" | sed 's/^/ /')
3674
+ this is from app2: secret1: $(printf %s "$CL_review_app1_SECRET1" | sed '1!s/^/ /'), secret2: $(printf %s "$CL_review_app2_SECRET2" | sed '1!s/^/ /')
3483
3675
  someJson: |-
3484
- $(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
3676
+ [{"name": "app1", "url": "$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')"}, {"name": "app2", "url": "$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')"}, {"name": "app3", "url": "$(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')"}]
3485
3677
  public:
3486
3678
  ENV_SHORT: |-
3487
3679
  review
@@ -3490,27 +3682,25 @@ app3 🧪 test:
3490
3682
  ENV_TYPE: |-
3491
3683
  review
3492
3684
  BUILD_INFO_BUILD_ID: |-
3493
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3685
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
3494
3686
  BUILD_INFO_BUILD_TIME: |-
3495
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3687
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
3496
3688
  BUILD_INFO_CURRENT_VERSION: |-
3497
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
3498
- HOST: |-
3499
- $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3689
+ $(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/^/ /')
3690
+ HOSTNAME: |-
3691
+ $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
3500
3692
  ROOT_URL: |-
3501
- $(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3502
- HOST_INTERNAL: |-
3503
- $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3504
- HOST_CANONICAL: |-
3505
- $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3693
+ $(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
3694
+ HOSTNAME_INTERNAL: |-
3695
+ $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
3506
3696
  ROOT_URL_INTERNAL: |-
3507
- $(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3697
+ $(printf %s "https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
3508
3698
  KUBE_NAMESPACE: |-
3509
3699
  pan-test-app-review
3510
3700
  KUBE_APP_NAME: |-
3511
- $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" | sed 's/^/ /')
3701
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" | sed '1!s/^/ /')
3512
3702
  KUBE_APP_NAME_PREFIX: |-
3513
- $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | sed 's/^/ /')
3703
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | sed '1!s/^/ /')
3514
3704
  foo3: |-
3515
3705
  foo-value-3
3516
3706
  foo2: |-
@@ -3518,10 +3708,10 @@ app3 🧪 test:
3518
3708
  transitive: |-
3519
3709
  this is from app2: this is from app1: foo-value
3520
3710
  _ALL_ENV_VAR_KEYS: |-
3521
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3711
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3522
3712
  application:
3523
3713
  host: |-
3524
- $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed 's/^/ /')
3714
+ $(printf %s "app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
3525
3715
  command: |-
3526
3716
  yarn start
3527
3717
  livenessProbe:
@@ -3538,7 +3728,7 @@ app3 🧪 test:
3538
3728
  __health
3539
3729
 
3540
3730
  EOF
3541
- - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
3731
+ - collapseable_section_end "writeallvalues"
3542
3732
  - kubernetesCreateSecret
3543
3733
  - kubernetesDeploy
3544
3734
  - echo 'Uploading SBOM to Dependency Track'
@@ -3581,17 +3771,16 @@ app3 🧪 test:
3581
3771
  KUBERNETES_MEMORY_LIMIT: 400Mi
3582
3772
  GIT_STRATEGY: none
3583
3773
  script:
3584
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3774
+ - collapseable_section_start "injectvars" "Injecting variables"
3585
3775
  - export ENV_SHORT="review"
3586
3776
  - export APP_DIR="kube"
3587
3777
  - export ENV_TYPE="review"
3588
3778
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3589
3779
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3590
3780
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3591
- - export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3781
+ - export HOSTNAME="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3592
3782
  - export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3593
- - export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3594
- - export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3783
+ - export HOSTNAME_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3595
3784
  - export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3596
3785
  - export KUBE_NAMESPACE="pan-test-app-review"
3597
3786
  - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
@@ -3601,15 +3790,14 @@ app3 🧪 test:
3601
3790
  - 'export transitive="this is from app2: this is from app1: foo-value"'
3602
3791
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
3603
3792
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
3604
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3793
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3605
3794
  - export RELEASE_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
3606
3795
  - export HELM_EXPERIMENTAL_OCI="1"
3607
3796
  - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3608
3797
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3609
3798
  - export HELM_ARGS=""
3610
3799
  - export COMPONENT_NAME="app3"
3611
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3612
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3800
+ - collapseable_section_end "injectvars"
3613
3801
  - kubectl config set-cluster "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --server="$CL_review_app3_KUBE_URL" --certificate-authority <(echo $CL_review_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3614
3802
  - kubectl config set-credentials "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --token="$CL_review_app3_KUBE_TOKEN"
3615
3803
  - kubectl config set-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --cluster="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --user="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --namespace="pan-test-app-review"
@@ -3643,17 +3831,16 @@ app3 🧪 test:
3643
3831
  KUBERNETES_MEMORY_LIMIT: 400Mi
3644
3832
  GIT_STRATEGY: none
3645
3833
  script:
3646
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3834
+ - collapseable_section_start "injectvars" "Injecting variables"
3647
3835
  - export ENV_SHORT="review"
3648
3836
  - export APP_DIR="kube"
3649
3837
  - export ENV_TYPE="review"
3650
3838
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3651
3839
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3652
3840
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3653
- - export HOST="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3841
+ - export HOSTNAME="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3654
3842
  - export ROOT_URL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3655
- - export HOST_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3656
- - export HOST_CANONICAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3843
+ - export HOSTNAME_INTERNAL="app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3657
3844
  - export ROOT_URL_INTERNAL="https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
3658
3845
  - export KUBE_NAMESPACE="pan-test-app-review"
3659
3846
  - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
@@ -3663,15 +3850,14 @@ app3 🧪 test:
3663
3850
  - 'export transitive="this is from app2: this is from app1: foo-value"'
3664
3851
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_review_app1_SECRET1, secret2: $CL_review_app2_SECRET2"'
3665
3852
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app1-$CL_review_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app2-$CL_review_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud\\"}]"'
3666
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3853
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3667
3854
  - export RELEASE_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3"
3668
3855
  - export HELM_EXPERIMENTAL_OCI="1"
3669
3856
  - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
3670
3857
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3671
3858
  - export HELM_ARGS=""
3672
3859
  - export COMPONENT_NAME="app3"
3673
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3674
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3860
+ - collapseable_section_end "injectvars"
3675
3861
  - kubectl config set-cluster "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --server="$CL_review_app3_KUBE_URL" --certificate-authority <(echo $CL_review_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3676
3862
  - kubectl config set-credentials "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --token="$CL_review_app3_KUBE_TOKEN"
3677
3863
  - kubectl config set-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --cluster="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --user="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app3" --namespace="pan-test-app-review"
@@ -3700,17 +3886,16 @@ app3 🧪 test:
3700
3886
  KUBERNETES_MEMORY_REQUEST: 1Gi
3701
3887
  KUBERNETES_MEMORY_LIMIT: 4Gi
3702
3888
  script:
3703
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3889
+ - collapseable_section_start "injectvars" "Injecting variables"
3704
3890
  - export ENV_SHORT="stage"
3705
3891
  - export APP_DIR="kube"
3706
3892
  - export ENV_TYPE="stage"
3707
3893
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3708
3894
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3709
3895
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3710
- - export HOST="app3.stage.test-app.pan.panter.cloud"
3896
+ - export HOSTNAME="app3.stage.test-app.pan.panter.cloud"
3711
3897
  - export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
3712
- - export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
3713
- - export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
3898
+ - export HOSTNAME_INTERNAL="app3.stage.test-app.pan.panter.cloud"
3714
3899
  - export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
3715
3900
  - export KUBE_NAMESPACE="pan-test-app-stage"
3716
3901
  - export KUBE_APP_NAME="app3"
@@ -3720,21 +3905,42 @@ app3 🧪 test:
3720
3905
  - 'export transitive="this is from app2: this is from app1: foo-value"'
3721
3906
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
3722
3907
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
3723
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3724
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
3908
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3909
+ - collapseable_section_end "injectvars"
3910
+ - collapseable_section_start "write-dotenv-app3" "write dot env for app3"
3911
+ - |-
3912
+ cat <<EOF > kube/.env
3913
+ ENV_SHORT=stage
3914
+ APP_DIR=kube
3915
+ ENV_TYPE=stage
3916
+ HOSTNAME=app3.stage.test-app.pan.panter.cloud
3917
+ ROOT_URL=https://app3.stage.test-app.pan.panter.cloud
3918
+ HOSTNAME_INTERNAL=app3.stage.test-app.pan.panter.cloud
3919
+ ROOT_URL_INTERNAL=https://app3.stage.test-app.pan.panter.cloud
3920
+ KUBE_NAMESPACE=pan-test-app-stage
3921
+ KUBE_APP_NAME=app3
3922
+ KUBE_APP_NAME_PREFIX=
3923
+ foo3=foo-value-3
3924
+ foo2=this is from app2: foo-value-2
3925
+ transitive=this is from app2: this is from app1: foo-value
3926
+ transitiveWithSecret=$(printf %s "this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2" | escapeForDotEnv)
3927
+ someJson=$(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]" | escapeForDotEnv)
3928
+ _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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3929
+ EOF
3930
+ - collapseable_section_end "write-dotenv-app3"
3725
3931
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
3726
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3932
+ - collapseable_section_start "nodeinstall" "Ensure node version"
3727
3933
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
3728
3934
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
3729
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3935
+ - collapseable_section_end "nodeinstall"
3730
3936
  - cd kube
3731
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
3937
+ - collapseable_section_start "nodeinstall" "Ensure node version"
3732
3938
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
3733
3939
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
3734
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
3735
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
3940
+ - collapseable_section_end "nodeinstall"
3941
+ - collapseable_section_start "yarninstall" "Yarn install"
3736
3942
  - yarn install --immutable
3737
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
3943
+ - collapseable_section_end "yarninstall"
3738
3944
  - yarn build
3739
3945
  cache:
3740
3946
  - key: kube-yarn
@@ -3745,15 +3951,13 @@ app3 🧪 test:
3745
3951
  policy: pull-push
3746
3952
  paths:
3747
3953
  - kube/node_modules
3748
- - key: app3-next-cache
3749
- policy: pull-push
3750
- paths:
3751
- - kube/.next/cache
3752
3954
  artifacts:
3753
3955
  paths:
3754
3956
  - kube/__build_info.json
3755
3957
  - kube/.next
3756
3958
  - kube/dist
3959
+ exclude:
3960
+ - kube/.env
3757
3961
  expire_in: 1 day
3758
3962
  when: always
3759
3963
  reports: {}
@@ -3779,7 +3983,7 @@ app3 🧪 test:
3779
3983
  KUBERNETES_MEMORY_REQUEST: 1Gi
3780
3984
  KUBERNETES_MEMORY_LIMIT: 2Gi
3781
3985
  script:
3782
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3986
+ - collapseable_section_start "injectvars" "Injecting variables"
3783
3987
  - export APP_DIR="kube"
3784
3988
  - export DOCKER_BUILD_CONTEXT="."
3785
3989
  - export DOCKER_REGISTRY="$CI_REGISTRY"
@@ -3796,19 +4000,19 @@ app3 🧪 test:
3796
4000
  COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
3797
4001
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
3798
4002
  COPY --chown=node:node .yarn /app/.yarn"
3799
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4003
+ - collapseable_section_end "injectvars"
3800
4004
  - ensureNodeDockerfile
3801
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
4005
+ - collapseable_section_start "docker-login" "Docker Login"
3802
4006
  - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
3803
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
3804
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
4007
+ - collapseable_section_end "docker-login"
4008
+ - collapseable_section_start "docker-build" "Docker build"
3805
4009
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
3806
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
3807
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
4010
+ - collapseable_section_end "docker-build"
4011
+ - collapseable_section_start "docker-push" "Docker push and tag"
3808
4012
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
3809
4013
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
3810
4014
  - docker push $DOCKER_CACHE_IMAGE
3811
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
4015
+ - collapseable_section_end "docker-push"
3812
4016
  cache:
3813
4017
  - key: kube-yarn
3814
4018
  policy: pull
@@ -3825,8 +4029,8 @@ app3 🧪 test:
3825
4029
  image: aquasec/trivy:0.38.3
3826
4030
  variables: {}
3827
4031
  script:
3828
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
3829
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4032
+ - collapseable_section_start "injectvars" "Injecting variables"
4033
+ - collapseable_section_end "injectvars"
3830
4034
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
3831
4035
  artifacts:
3832
4036
  paths:
@@ -3845,17 +4049,16 @@ app3 🧪 test:
3845
4049
  KUBERNETES_MEMORY_REQUEST: 200Mi
3846
4050
  KUBERNETES_MEMORY_LIMIT: 400Mi
3847
4051
  script:
3848
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4052
+ - collapseable_section_start "injectvars" "Injecting variables"
3849
4053
  - export ENV_SHORT="stage"
3850
4054
  - export APP_DIR="kube"
3851
4055
  - export ENV_TYPE="stage"
3852
4056
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3853
4057
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3854
4058
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3855
- - export HOST="app3.stage.test-app.pan.panter.cloud"
4059
+ - export HOSTNAME="app3.stage.test-app.pan.panter.cloud"
3856
4060
  - export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
3857
- - export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
3858
- - export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
4061
+ - export HOSTNAME_INTERNAL="app3.stage.test-app.pan.panter.cloud"
3859
4062
  - export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
3860
4063
  - export KUBE_NAMESPACE="pan-test-app-stage"
3861
4064
  - export KUBE_APP_NAME="app3"
@@ -3865,7 +4068,7 @@ app3 🧪 test:
3865
4068
  - 'export transitive="this is from app2: this is from app1: foo-value"'
3866
4069
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
3867
4070
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
3868
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4071
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
3869
4072
  - export DOCKER_REGISTRY="$CI_REGISTRY"
3870
4073
  - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
3871
4074
  - export DOCKER_IMAGE_NAME="stage/app3"
@@ -3877,21 +4080,20 @@ app3 🧪 test:
3877
4080
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3878
4081
  - export HELM_ARGS=""
3879
4082
  - export COMPONENT_NAME="app3"
3880
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3881
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4083
+ - collapseable_section_end "injectvars"
3882
4084
  - kubectl config set-cluster "kube-pan-test-app-stage-app3" --server="$CL_stage_app3_KUBE_URL" --certificate-authority <(echo $CL_stage_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
3883
4085
  - kubectl config set-credentials "kube-pan-test-app-stage-app3" --token="$CL_stage_app3_KUBE_TOKEN"
3884
4086
  - kubectl config set-context "kube-pan-test-app-stage-app3" --cluster="kube-pan-test-app-stage-app3" --user="kube-pan-test-app-stage-app3" --namespace="pan-test-app-stage"
3885
4087
  - kubectl config use-context "kube-pan-test-app-stage-app3"
3886
- - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
4088
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
3887
4089
  - |
3888
4090
  cat > __all_values.yml <<EOF
3889
4091
  env:
3890
4092
  secret:
3891
4093
  transitiveWithSecret: |-
3892
- $(printf %s "this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2" | sed 's/^/ /')
4094
+ this is from app2: secret1: $(printf %s "$CL_stage_app1_SECRET1" | sed '1!s/^/ /'), secret2: $(printf %s "$CL_stage_app2_SECRET2" | sed '1!s/^/ /')
3893
4095
  someJson: |-
3894
- $(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
4096
+ [{"name": "app1", "url": "$(printf %s "https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')"}, {"name": "app2", "url": "$(printf %s "https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')"}, {"name": "app3", "url": "https://app3.stage.test-app.pan.panter.cloud"}]
3895
4097
  public:
3896
4098
  ENV_SHORT: |-
3897
4099
  stage
@@ -3900,18 +4102,16 @@ app3 🧪 test:
3900
4102
  ENV_TYPE: |-
3901
4103
  stage
3902
4104
  BUILD_INFO_BUILD_ID: |-
3903
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
4105
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
3904
4106
  BUILD_INFO_BUILD_TIME: |-
3905
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
4107
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
3906
4108
  BUILD_INFO_CURRENT_VERSION: |-
3907
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
3908
- HOST: |-
4109
+ $(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/^/ /')
4110
+ HOSTNAME: |-
3909
4111
  app3.stage.test-app.pan.panter.cloud
3910
4112
  ROOT_URL: |-
3911
4113
  https://app3.stage.test-app.pan.panter.cloud
3912
- HOST_INTERNAL: |-
3913
- app3.stage.test-app.pan.panter.cloud
3914
- HOST_CANONICAL: |-
4114
+ HOSTNAME_INTERNAL: |-
3915
4115
  app3.stage.test-app.pan.panter.cloud
3916
4116
  ROOT_URL_INTERNAL: |-
3917
4117
  https://app3.stage.test-app.pan.panter.cloud
@@ -3927,7 +4127,7 @@ app3 🧪 test:
3927
4127
  transitive: |-
3928
4128
  this is from app2: this is from app1: foo-value
3929
4129
  _ALL_ENV_VAR_KEYS: |-
3930
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
4130
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
3931
4131
  application:
3932
4132
  host: |-
3933
4133
  app3.stage.test-app.pan.panter.cloud
@@ -3947,7 +4147,7 @@ app3 🧪 test:
3947
4147
  __health
3948
4148
 
3949
4149
  EOF
3950
- - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
4150
+ - collapseable_section_end "writeallvalues"
3951
4151
  - kubernetesCreateSecret
3952
4152
  - kubernetesDeploy
3953
4153
  - echo 'Uploading SBOM to Dependency Track'
@@ -3983,17 +4183,16 @@ app3 🧪 test:
3983
4183
  KUBERNETES_MEMORY_LIMIT: 400Mi
3984
4184
  GIT_STRATEGY: none
3985
4185
  script:
3986
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4186
+ - collapseable_section_start "injectvars" "Injecting variables"
3987
4187
  - export ENV_SHORT="stage"
3988
4188
  - export APP_DIR="kube"
3989
4189
  - export ENV_TYPE="stage"
3990
4190
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3991
4191
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3992
4192
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
3993
- - export HOST="app3.stage.test-app.pan.panter.cloud"
4193
+ - export HOSTNAME="app3.stage.test-app.pan.panter.cloud"
3994
4194
  - export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
3995
- - export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
3996
- - export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
4195
+ - export HOSTNAME_INTERNAL="app3.stage.test-app.pan.panter.cloud"
3997
4196
  - export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
3998
4197
  - export KUBE_NAMESPACE="pan-test-app-stage"
3999
4198
  - export KUBE_APP_NAME="app3"
@@ -4003,15 +4202,14 @@ app3 🧪 test:
4003
4202
  - 'export transitive="this is from app2: this is from app1: foo-value"'
4004
4203
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
4005
4204
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
4006
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4205
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4007
4206
  - export RELEASE_NAME="pan-test-app-stage-app3"
4008
4207
  - export HELM_EXPERIMENTAL_OCI="1"
4009
4208
  - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
4010
4209
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
4011
4210
  - export HELM_ARGS=""
4012
4211
  - export COMPONENT_NAME="app3"
4013
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4014
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4212
+ - collapseable_section_end "injectvars"
4015
4213
  - kubectl config set-cluster "kube-pan-test-app-stage-app3" --server="$CL_stage_app3_KUBE_URL" --certificate-authority <(echo $CL_stage_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
4016
4214
  - kubectl config set-credentials "kube-pan-test-app-stage-app3" --token="$CL_stage_app3_KUBE_TOKEN"
4017
4215
  - kubectl config set-context "kube-pan-test-app-stage-app3" --cluster="kube-pan-test-app-stage-app3" --user="kube-pan-test-app-stage-app3" --namespace="pan-test-app-stage"
@@ -4045,17 +4243,16 @@ app3 🧪 test:
4045
4243
  KUBERNETES_MEMORY_LIMIT: 400Mi
4046
4244
  GIT_STRATEGY: none
4047
4245
  script:
4048
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4246
+ - collapseable_section_start "injectvars" "Injecting variables"
4049
4247
  - export ENV_SHORT="stage"
4050
4248
  - export APP_DIR="kube"
4051
4249
  - export ENV_TYPE="stage"
4052
4250
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4053
4251
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
4054
4252
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
4055
- - export HOST="app3.stage.test-app.pan.panter.cloud"
4253
+ - export HOSTNAME="app3.stage.test-app.pan.panter.cloud"
4056
4254
  - export ROOT_URL="https://app3.stage.test-app.pan.panter.cloud"
4057
- - export HOST_INTERNAL="app3.stage.test-app.pan.panter.cloud"
4058
- - export HOST_CANONICAL="app3.stage.test-app.pan.panter.cloud"
4255
+ - export HOSTNAME_INTERNAL="app3.stage.test-app.pan.panter.cloud"
4059
4256
  - export ROOT_URL_INTERNAL="https://app3.stage.test-app.pan.panter.cloud"
4060
4257
  - export KUBE_NAMESPACE="pan-test-app-stage"
4061
4258
  - export KUBE_APP_NAME="app3"
@@ -4065,15 +4262,14 @@ app3 🧪 test:
4065
4262
  - 'export transitive="this is from app2: this is from app1: foo-value"'
4066
4263
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_stage_app1_SECRET1, secret2: $CL_stage_app2_SECRET2"'
4067
4264
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app1-$CL_stage_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-stage-app2-$CL_stage_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.stage.test-app.pan.panter.cloud\\"}]"'
4068
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4265
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4069
4266
  - export RELEASE_NAME="pan-test-app-stage-app3"
4070
4267
  - export HELM_EXPERIMENTAL_OCI="1"
4071
4268
  - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
4072
4269
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
4073
4270
  - export HELM_ARGS=""
4074
4271
  - export COMPONENT_NAME="app3"
4075
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4076
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4272
+ - collapseable_section_end "injectvars"
4077
4273
  - kubectl config set-cluster "kube-pan-test-app-stage-app3" --server="$CL_stage_app3_KUBE_URL" --certificate-authority <(echo $CL_stage_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
4078
4274
  - kubectl config set-credentials "kube-pan-test-app-stage-app3" --token="$CL_stage_app3_KUBE_TOKEN"
4079
4275
  - kubectl config set-context "kube-pan-test-app-stage-app3" --cluster="kube-pan-test-app-stage-app3" --user="kube-pan-test-app-stage-app3" --namespace="pan-test-app-stage"
@@ -4102,17 +4298,16 @@ app3 🧪 test:
4102
4298
  KUBERNETES_MEMORY_REQUEST: 1Gi
4103
4299
  KUBERNETES_MEMORY_LIMIT: 4Gi
4104
4300
  script:
4105
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4301
+ - collapseable_section_start "injectvars" "Injecting variables"
4106
4302
  - export ENV_SHORT="prod"
4107
4303
  - export APP_DIR="kube"
4108
4304
  - export ENV_TYPE="prod"
4109
4305
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4110
4306
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
4111
4307
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
4112
- - export HOST="app3.prod.test-app.pan.panter.cloud"
4308
+ - export HOSTNAME="app3.prod.test-app.pan.panter.cloud"
4113
4309
  - export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
4114
- - export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4115
- - export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
4310
+ - export HOSTNAME_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4116
4311
  - export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
4117
4312
  - export KUBE_NAMESPACE="pan-test-app-prod"
4118
4313
  - export KUBE_APP_NAME="app3"
@@ -4122,21 +4317,42 @@ app3 🧪 test:
4122
4317
  - 'export transitive="this is from app2: this is from app1: foo-value"'
4123
4318
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
4124
4319
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
4125
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4126
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4320
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4321
+ - collapseable_section_end "injectvars"
4322
+ - collapseable_section_start "write-dotenv-app3" "write dot env for app3"
4323
+ - |-
4324
+ cat <<EOF > kube/.env
4325
+ ENV_SHORT=prod
4326
+ APP_DIR=kube
4327
+ ENV_TYPE=prod
4328
+ HOSTNAME=app3.prod.test-app.pan.panter.cloud
4329
+ ROOT_URL=https://app3.prod.test-app.pan.panter.cloud
4330
+ HOSTNAME_INTERNAL=app3.prod.test-app.pan.panter.cloud
4331
+ ROOT_URL_INTERNAL=https://app3.prod.test-app.pan.panter.cloud
4332
+ KUBE_NAMESPACE=pan-test-app-prod
4333
+ KUBE_APP_NAME=app3
4334
+ KUBE_APP_NAME_PREFIX=
4335
+ foo3=foo-value-3
4336
+ foo2=this is from app2: foo-value-2
4337
+ transitive=this is from app2: this is from app1: foo-value
4338
+ transitiveWithSecret=$(printf %s "this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2" | escapeForDotEnv)
4339
+ someJson=$(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]" | escapeForDotEnv)
4340
+ _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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
4341
+ EOF
4342
+ - collapseable_section_end "write-dotenv-app3"
4127
4343
  - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > kube/__build_info.json
4128
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
4344
+ - collapseable_section_start "nodeinstall" "Ensure node version"
4129
4345
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
4130
4346
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
4131
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
4347
+ - collapseable_section_end "nodeinstall"
4132
4348
  - cd kube
4133
- - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
4349
+ - collapseable_section_start "nodeinstall" "Ensure node version"
4134
4350
  - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
4135
4351
  - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
4136
- - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
4137
- - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
4352
+ - collapseable_section_end "nodeinstall"
4353
+ - collapseable_section_start "yarninstall" "Yarn install"
4138
4354
  - yarn install --immutable
4139
- - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
4355
+ - collapseable_section_end "yarninstall"
4140
4356
  - yarn build
4141
4357
  cache:
4142
4358
  - key: kube-yarn
@@ -4147,15 +4363,13 @@ app3 🧪 test:
4147
4363
  policy: pull-push
4148
4364
  paths:
4149
4365
  - kube/node_modules
4150
- - key: app3-next-cache
4151
- policy: pull-push
4152
- paths:
4153
- - kube/.next/cache
4154
4366
  artifacts:
4155
4367
  paths:
4156
4368
  - kube/__build_info.json
4157
4369
  - kube/.next
4158
4370
  - kube/dist
4371
+ exclude:
4372
+ - kube/.env
4159
4373
  expire_in: 1 day
4160
4374
  when: always
4161
4375
  reports: {}
@@ -4181,7 +4395,7 @@ app3 🧪 test:
4181
4395
  KUBERNETES_MEMORY_REQUEST: 1Gi
4182
4396
  KUBERNETES_MEMORY_LIMIT: 2Gi
4183
4397
  script:
4184
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4398
+ - collapseable_section_start "injectvars" "Injecting variables"
4185
4399
  - export APP_DIR="kube"
4186
4400
  - export DOCKER_BUILD_CONTEXT="."
4187
4401
  - export DOCKER_REGISTRY="$CI_REGISTRY"
@@ -4198,19 +4412,19 @@ app3 🧪 test:
4198
4412
  COPY --chown=node:node kube/yarn.lock /app/kube/yarn.lock
4199
4413
  COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
4200
4414
  COPY --chown=node:node .yarn /app/.yarn"
4201
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4415
+ - collapseable_section_end "injectvars"
4202
4416
  - ensureNodeDockerfile
4203
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
4417
+ - collapseable_section_start "docker-login" "Docker Login"
4204
4418
  - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
4205
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
4206
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
4419
+ - collapseable_section_end "docker-login"
4420
+ - collapseable_section_start "docker-build" "Docker build"
4207
4421
  - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
4208
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
4209
- - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
4422
+ - collapseable_section_end "docker-build"
4423
+ - collapseable_section_start "docker-push" "Docker push and tag"
4210
4424
  - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
4211
4425
  - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
4212
4426
  - docker push $DOCKER_CACHE_IMAGE
4213
- - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
4427
+ - collapseable_section_end "docker-push"
4214
4428
  cache:
4215
4429
  - key: kube-yarn
4216
4430
  policy: pull
@@ -4227,8 +4441,8 @@ app3 🧪 test:
4227
4441
  image: aquasec/trivy:0.38.3
4228
4442
  variables: {}
4229
4443
  script:
4230
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4231
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4444
+ - collapseable_section_start "injectvars" "Injecting variables"
4445
+ - collapseable_section_end "injectvars"
4232
4446
  - trivy fs --quiet --format cyclonedx --output "__sbom.json" kube
4233
4447
  artifacts:
4234
4448
  paths:
@@ -4247,17 +4461,16 @@ app3 🧪 test:
4247
4461
  KUBERNETES_MEMORY_REQUEST: 200Mi
4248
4462
  KUBERNETES_MEMORY_LIMIT: 400Mi
4249
4463
  script:
4250
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4464
+ - collapseable_section_start "injectvars" "Injecting variables"
4251
4465
  - export ENV_SHORT="prod"
4252
4466
  - export APP_DIR="kube"
4253
4467
  - export ENV_TYPE="prod"
4254
4468
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4255
4469
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
4256
4470
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
4257
- - export HOST="app3.prod.test-app.pan.panter.cloud"
4471
+ - export HOSTNAME="app3.prod.test-app.pan.panter.cloud"
4258
4472
  - export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
4259
- - export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4260
- - export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
4473
+ - export HOSTNAME_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4261
4474
  - export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
4262
4475
  - export KUBE_NAMESPACE="pan-test-app-prod"
4263
4476
  - export KUBE_APP_NAME="app3"
@@ -4267,7 +4480,7 @@ app3 🧪 test:
4267
4480
  - 'export transitive="this is from app2: this is from app1: foo-value"'
4268
4481
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
4269
4482
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
4270
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4483
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4271
4484
  - export DOCKER_REGISTRY="$CI_REGISTRY"
4272
4485
  - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app3"
4273
4486
  - export DOCKER_IMAGE_NAME="prod/app3"
@@ -4279,21 +4492,20 @@ app3 🧪 test:
4279
4492
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
4280
4493
  - export HELM_ARGS=""
4281
4494
  - export COMPONENT_NAME="app3"
4282
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4283
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4495
+ - collapseable_section_end "injectvars"
4284
4496
  - kubectl config set-cluster "kube-pan-test-app-prod-app3" --server="$CL_prod_app3_KUBE_URL" --certificate-authority <(echo $CL_prod_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
4285
4497
  - kubectl config set-credentials "kube-pan-test-app-prod-app3" --token="$CL_prod_app3_KUBE_TOKEN"
4286
4498
  - kubectl config set-context "kube-pan-test-app-prod-app3" --cluster="kube-pan-test-app-prod-app3" --user="kube-pan-test-app-prod-app3" --namespace="pan-test-app-prod"
4287
4499
  - kubectl config use-context "kube-pan-test-app-prod-app3"
4288
- - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
4500
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
4289
4501
  - |
4290
4502
  cat > __all_values.yml <<EOF
4291
4503
  env:
4292
4504
  secret:
4293
4505
  transitiveWithSecret: |-
4294
- $(printf %s "this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2" | sed 's/^/ /')
4506
+ this is from app2: secret1: $(printf %s "$CL_prod_app1_SECRET1" | sed '1!s/^/ /'), secret2: $(printf %s "$CL_prod_app2_SECRET2" | sed '1!s/^/ /')
4295
4507
  someJson: |-
4296
- $(printf %s "[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]" | sed 's/^/ /')
4508
+ [{"name": "app1", "url": "$(printf %s "https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')"}, {"name": "app2", "url": "$(printf %s "https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')"}, {"name": "app3", "url": "https://app3.prod.test-app.pan.panter.cloud"}]
4297
4509
  public:
4298
4510
  ENV_SHORT: |-
4299
4511
  prod
@@ -4302,18 +4514,16 @@ app3 🧪 test:
4302
4514
  ENV_TYPE: |-
4303
4515
  prod
4304
4516
  BUILD_INFO_BUILD_ID: |-
4305
- $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
4517
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
4306
4518
  BUILD_INFO_BUILD_TIME: |-
4307
- $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
4519
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
4308
4520
  BUILD_INFO_CURRENT_VERSION: |-
4309
- $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
4310
- HOST: |-
4521
+ $(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/^/ /')
4522
+ HOSTNAME: |-
4311
4523
  app3.prod.test-app.pan.panter.cloud
4312
4524
  ROOT_URL: |-
4313
4525
  https://app3.prod.test-app.pan.panter.cloud
4314
- HOST_INTERNAL: |-
4315
- app3.prod.test-app.pan.panter.cloud
4316
- HOST_CANONICAL: |-
4526
+ HOSTNAME_INTERNAL: |-
4317
4527
  app3.prod.test-app.pan.panter.cloud
4318
4528
  ROOT_URL_INTERNAL: |-
4319
4529
  https://app3.prod.test-app.pan.panter.cloud
@@ -4329,7 +4539,7 @@ app3 🧪 test:
4329
4539
  transitive: |-
4330
4540
  this is from app2: this is from app1: foo-value
4331
4541
  _ALL_ENV_VAR_KEYS: |-
4332
- ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
4542
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","foo3","foo2","transitive","transitiveWithSecret","someJson"]
4333
4543
  application:
4334
4544
  host: |-
4335
4545
  app3.prod.test-app.pan.panter.cloud
@@ -4349,7 +4559,7 @@ app3 🧪 test:
4349
4559
  __health
4350
4560
 
4351
4561
  EOF
4352
- - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
4562
+ - collapseable_section_end "writeallvalues"
4353
4563
  - kubernetesCreateSecret
4354
4564
  - kubernetesDeploy
4355
4565
  - echo 'Uploading SBOM to Dependency Track'
@@ -4385,17 +4595,16 @@ app3 🧪 test:
4385
4595
  KUBERNETES_MEMORY_LIMIT: 400Mi
4386
4596
  GIT_STRATEGY: none
4387
4597
  script:
4388
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4598
+ - collapseable_section_start "injectvars" "Injecting variables"
4389
4599
  - export ENV_SHORT="prod"
4390
4600
  - export APP_DIR="kube"
4391
4601
  - export ENV_TYPE="prod"
4392
4602
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4393
4603
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
4394
4604
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
4395
- - export HOST="app3.prod.test-app.pan.panter.cloud"
4605
+ - export HOSTNAME="app3.prod.test-app.pan.panter.cloud"
4396
4606
  - export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
4397
- - export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4398
- - export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
4607
+ - export HOSTNAME_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4399
4608
  - export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
4400
4609
  - export KUBE_NAMESPACE="pan-test-app-prod"
4401
4610
  - export KUBE_APP_NAME="app3"
@@ -4405,15 +4614,14 @@ app3 🧪 test:
4405
4614
  - 'export transitive="this is from app2: this is from app1: foo-value"'
4406
4615
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
4407
4616
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
4408
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4617
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4409
4618
  - export RELEASE_NAME="pan-test-app-prod-app3"
4410
4619
  - export HELM_EXPERIMENTAL_OCI="1"
4411
4620
  - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
4412
4621
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
4413
4622
  - export HELM_ARGS=""
4414
4623
  - export COMPONENT_NAME="app3"
4415
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4416
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4624
+ - collapseable_section_end "injectvars"
4417
4625
  - kubectl config set-cluster "kube-pan-test-app-prod-app3" --server="$CL_prod_app3_KUBE_URL" --certificate-authority <(echo $CL_prod_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
4418
4626
  - kubectl config set-credentials "kube-pan-test-app-prod-app3" --token="$CL_prod_app3_KUBE_TOKEN"
4419
4627
  - kubectl config set-context "kube-pan-test-app-prod-app3" --cluster="kube-pan-test-app-prod-app3" --user="kube-pan-test-app-prod-app3" --namespace="pan-test-app-prod"
@@ -4447,17 +4655,16 @@ app3 🧪 test:
4447
4655
  KUBERNETES_MEMORY_LIMIT: 400Mi
4448
4656
  GIT_STRATEGY: none
4449
4657
  script:
4450
- - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
4658
+ - collapseable_section_start "injectvars" "Injecting variables"
4451
4659
  - export ENV_SHORT="prod"
4452
4660
  - export APP_DIR="kube"
4453
4661
  - export ENV_TYPE="prod"
4454
4662
  - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4455
4663
  - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
4456
4664
  - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
4457
- - export HOST="app3.prod.test-app.pan.panter.cloud"
4665
+ - export HOSTNAME="app3.prod.test-app.pan.panter.cloud"
4458
4666
  - export ROOT_URL="https://app3.prod.test-app.pan.panter.cloud"
4459
- - export HOST_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4460
- - export HOST_CANONICAL="app3.prod.test-app.pan.panter.cloud"
4667
+ - export HOSTNAME_INTERNAL="app3.prod.test-app.pan.panter.cloud"
4461
4668
  - export ROOT_URL_INTERNAL="https://app3.prod.test-app.pan.panter.cloud"
4462
4669
  - export KUBE_NAMESPACE="pan-test-app-prod"
4463
4670
  - export KUBE_APP_NAME="app3"
@@ -4467,15 +4674,14 @@ app3 🧪 test:
4467
4674
  - 'export transitive="this is from app2: this is from app1: foo-value"'
4468
4675
  - 'export transitiveWithSecret="this is from app2: secret1: $CL_prod_app1_SECRET1, secret2: $CL_prod_app2_SECRET2"'
4469
4676
  - 'export someJson="[{\\"name\\": \\"app1\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app1-$CL_prod_app1_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app2\\", \\"url\\": \\"https://$(printf %s "pan-test-app-prod-app2-$CL_prod_app2_GCLOUD_RUN_canonicalHostSuffix" | awk ''{print tolower($0)}'')\\"}, {\\"name\\": \\"app3\\", \\"url\\": \\"https://app3.prod.test-app.pan.panter.cloud\\"}]"'
4470
- - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4677
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"foo3\\",\\"foo2\\",\\"transitive\\",\\"transitiveWithSecret\\",\\"someJson\\"]"
4471
4678
  - export RELEASE_NAME="pan-test-app-prod-app3"
4472
4679
  - export HELM_EXPERIMENTAL_OCI="1"
4473
4680
  - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app3"
4474
4681
  - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
4475
4682
  - export HELM_ARGS=""
4476
4683
  - export COMPONENT_NAME="app3"
4477
- - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
4478
- - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
4684
+ - collapseable_section_end "injectvars"
4479
4685
  - kubectl config set-cluster "kube-pan-test-app-prod-app3" --server="$CL_prod_app3_KUBE_URL" --certificate-authority <(echo $CL_prod_app3_KUBE_CA_PEM | base64 -d) --embed-certs=true
4480
4686
  - kubectl config set-credentials "kube-pan-test-app-prod-app3" --token="$CL_prod_app3_KUBE_TOKEN"
4481
4687
  - kubectl config set-context "kube-pan-test-app-prod-app3" --cluster="kube-pan-test-app-prod-app3" --user="kube-pan-test-app-prod-app3" --namespace="pan-test-app-prod"