@catladder/pipeline 1.144.0 โ†’ 1.145.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/dist/bash/BashExpression.d.ts +40 -0
  2. package/dist/bash/BashExpression.js +124 -0
  3. package/dist/bash/bashExpressionPerPipelineType.d.ts +6 -0
  4. package/dist/bash/bashExpressionPerPipelineType.js +11 -0
  5. package/dist/bash/bashYaml.d.ts +10 -0
  6. package/dist/bash/bashYaml.js +46 -0
  7. package/dist/bash/getInjectVarsScript.d.ts +2 -0
  8. package/dist/bash/getInjectVarsScript.js +45 -0
  9. package/dist/bash/replaceAsync.d.ts +2 -0
  10. package/dist/{pipeline/commitInfo/getCommitInfo.js โ†’ bash/replaceAsync.js} +49 -21
  11. package/dist/build/base/__tests__/createArtifactsConfig.test.js +3 -1
  12. package/dist/build/base/constants.js +3 -1
  13. package/dist/build/base/createAppBuildJob.d.ts +2 -1
  14. package/dist/build/base/createAppBuildJob.js +10 -6
  15. package/dist/build/base/createArtifactsConfig.d.ts +1 -1
  16. package/dist/build/base/createArtifactsConfig.js +3 -1
  17. package/dist/build/base/index.js +3 -1
  18. package/dist/build/base/writeBuildInfo.js +4 -3
  19. package/dist/build/base/writeDotEnv.js +12 -3
  20. package/dist/build/custom/__tests__/testJob.test.js +3 -1
  21. package/dist/build/custom/buildJob.js +4 -12
  22. package/dist/build/custom/index.js +3 -1
  23. package/dist/build/custom/testJob.d.ts +1 -1
  24. package/dist/build/custom/testJob.js +18 -14
  25. package/dist/build/docker.d.ts +5 -31
  26. package/dist/build/docker.js +16 -9
  27. package/dist/build/index.d.ts +1 -1
  28. package/dist/build/index.js +13 -7
  29. package/dist/build/node/buildJob.js +4 -12
  30. package/dist/build/node/cache.js +6 -3
  31. package/dist/build/node/constants.js +3 -1
  32. package/dist/build/node/index.js +3 -1
  33. package/dist/build/node/meteor.js +5 -2
  34. package/dist/build/node/testJob.js +18 -14
  35. package/dist/build/node/yarn.d.ts +3 -2
  36. package/dist/build/node/yarn.js +6 -3
  37. package/dist/build/rails/build.js +3 -1
  38. package/dist/build/rails/index.js +3 -1
  39. package/dist/build/rails/test.js +15 -11
  40. package/dist/build/sbom.js +3 -1
  41. package/dist/build/types.d.ts +24 -18
  42. package/dist/build/types.js +3 -1
  43. package/dist/bundles/catladder-gitlab/index.js +3 -3
  44. package/dist/catladder-gitlab.js +10 -54
  45. package/dist/config/__tests__/configruedEnvs.test.js +3 -1
  46. package/dist/config/configruedEnvs.js +3 -1
  47. package/dist/config/index.js +13 -7
  48. package/dist/config/readConfig.js +6 -5
  49. package/dist/constants.js +5 -3
  50. package/dist/context/__tests__/resolveReferences.test.js +40 -8
  51. package/dist/context/getBuildInfoVariables.d.ts +7 -0
  52. package/dist/context/getBuildInfoVariables.js +29 -0
  53. package/dist/context/getEnvConfig.js +3 -1
  54. package/dist/context/getEnvType.js +3 -1
  55. package/dist/context/getEnvironment.d.ts +3 -3
  56. package/dist/context/getEnvironment.js +10 -14
  57. package/dist/context/getEnvironmentContext.d.ts +7 -3
  58. package/dist/context/getEnvironmentContext.js +21 -11
  59. package/dist/context/getEnvironmentVariables.d.ts +26 -5
  60. package/dist/context/getEnvironmentVariables.js +41 -25
  61. package/dist/context/getLabels.js +4 -2
  62. package/dist/context/getReviewSlug.d.ts +4 -0
  63. package/dist/context/getReviewSlug.js +22 -0
  64. package/dist/context/index.d.ts +12 -3
  65. package/dist/context/index.js +21 -15
  66. package/dist/context/resolveReferences.d.ts +3 -1
  67. package/dist/context/resolveReferences.js +53 -21
  68. package/dist/context/transformJobOnlyVars.d.ts +5 -2
  69. package/dist/context/transformJobOnlyVars.js +4 -2
  70. package/dist/context/utils/envVars.d.ts +1 -1
  71. package/dist/context/utils/envVars.js +5 -2
  72. package/dist/defaults/index.js +3 -1
  73. package/dist/deploy/base/deploy.d.ts +1 -1
  74. package/dist/deploy/base/deploy.js +12 -11
  75. package/dist/deploy/base/index.js +3 -1
  76. package/dist/deploy/base/rollback.d.ts +1 -1
  77. package/dist/deploy/base/rollback.js +13 -9
  78. package/dist/deploy/base/stop.d.ts +1 -1
  79. package/dist/deploy/base/stop.js +16 -11
  80. package/dist/deploy/base/types.d.ts +1 -1
  81. package/dist/deploy/base/types.js +3 -1
  82. package/dist/deploy/base/variables.js +3 -1
  83. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +2 -1
  84. package/dist/deploy/cloudRun/artifactsRegistry.js +6 -4
  85. package/dist/deploy/cloudRun/cleanup.js +3 -1
  86. package/dist/deploy/cloudRun/cloudRunRevisions.js +3 -1
  87. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +8 -5
  88. package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +2 -2
  89. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +6 -3
  90. package/dist/deploy/cloudRun/createJobs/common.d.ts +3 -3
  91. package/dist/deploy/cloudRun/createJobs/common.js +3 -1
  92. package/dist/deploy/cloudRun/createJobs/constants.d.ts +1 -0
  93. package/dist/deploy/cloudRun/createJobs/constants.js +7 -0
  94. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +9 -2
  95. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +3 -1
  96. package/dist/deploy/cloudRun/createJobs/index.js +25 -8
  97. package/dist/deploy/cloudRun/createJobs/volumes.js +3 -1
  98. package/dist/deploy/cloudRun/index.js +5 -3
  99. package/dist/deploy/cloudRun/utils/createArgsString.d.ts +2 -1
  100. package/dist/deploy/cloudRun/utils/createArgsString.js +3 -1
  101. package/dist/deploy/cloudRun/utils/database.js +13 -13
  102. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +3 -1
  103. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +1 -1
  104. package/dist/deploy/cloudRun/utils/getServiceName.js +3 -1
  105. package/dist/deploy/cloudRun/utils/jobName.d.ts +2 -1
  106. package/dist/deploy/cloudRun/utils/jobName.js +4 -2
  107. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +3 -1
  108. package/dist/deploy/cloudSql/utils.d.ts +2 -1
  109. package/dist/deploy/cloudSql/utils.js +7 -2
  110. package/dist/deploy/custom/deployJob.js +3 -1
  111. package/dist/deploy/custom/index.js +3 -1
  112. package/dist/deploy/dockerTag/deployJob.js +3 -1
  113. package/dist/deploy/dockerTag/index.js +3 -1
  114. package/dist/deploy/index.d.ts +4 -3
  115. package/dist/deploy/index.js +13 -7
  116. package/dist/deploy/kubernetes/additionalSecretKeys.js +3 -1
  117. package/dist/deploy/kubernetes/cloudSql/index.d.ts +3 -2
  118. package/dist/deploy/kubernetes/cloudSql/index.js +6 -4
  119. package/dist/deploy/kubernetes/deployJob.js +22 -15
  120. package/dist/deploy/kubernetes/index.js +51 -14
  121. package/dist/deploy/kubernetes/kubeEnv.d.ts +3 -2
  122. package/dist/deploy/kubernetes/kubeEnv.js +7 -4
  123. package/dist/deploy/kubernetes/kubeValues.d.ts +2 -2
  124. package/dist/deploy/kubernetes/kubeValues.js +3 -2
  125. package/dist/deploy/kubernetes/mongodb.js +3 -1
  126. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +2 -1
  127. package/dist/deploy/kubernetes/processSecretsAsFiles.js +3 -1
  128. package/dist/deploy/sbom.js +3 -1
  129. package/dist/deploy/types/base.d.ts +8 -2
  130. package/dist/deploy/types/base.js +3 -1
  131. package/dist/deploy/types/custom.d.ts +1 -1
  132. package/dist/deploy/types/custom.js +3 -1
  133. package/dist/deploy/types/dockerTag.d.ts +1 -1
  134. package/dist/deploy/types/dockerTag.js +3 -1
  135. package/dist/deploy/types/googleCloudRun.d.ts +19 -18
  136. package/dist/deploy/types/googleCloudRun.js +3 -1
  137. package/dist/deploy/types/index.d.ts +6 -6
  138. package/dist/deploy/types/index.js +13 -7
  139. package/dist/deploy/types/kubernetes.d.ts +22 -22
  140. package/dist/deploy/types/kubernetes.js +3 -1
  141. package/dist/deploy/utils.js +3 -1
  142. package/dist/index.d.ts +3 -2
  143. package/dist/index.js +16 -9
  144. package/dist/packageInfos.d.ts +2 -0
  145. package/dist/packageInfos.js +14 -0
  146. package/dist/pipeline/createAllJobs.d.ts +13 -5
  147. package/dist/pipeline/createAllJobs.js +21 -10
  148. package/dist/pipeline/createChildPipeline.d.ts +1 -1
  149. package/dist/pipeline/createChildPipeline.js +24 -7
  150. package/dist/pipeline/createJobsForComponent.d.ts +3 -3
  151. package/dist/pipeline/createJobsForComponent.js +19 -18
  152. package/dist/pipeline/createMainPipeline.d.ts +3 -0
  153. package/dist/pipeline/createMainPipeline.js +248 -0
  154. package/dist/pipeline/generatePipelineFiles.d.ts +2 -0
  155. package/dist/pipeline/generatePipelineFiles.js +178 -0
  156. package/dist/pipeline/getPipelineStages.js +3 -1
  157. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +15 -5
  158. package/dist/pipeline/gitlab/createGitlabJobs.js +98 -25
  159. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +7 -2
  160. package/dist/pipeline/gitlab/createGitlabPipeline.js +34 -17
  161. package/dist/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.d.ts +1 -0
  162. package/dist/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.js +29 -0
  163. package/dist/pipeline/gitlab/gitlabReleaseJobs.d.ts +33 -0
  164. package/dist/pipeline/gitlab/gitlabReleaseJobs.js +24 -0
  165. package/dist/pipeline/index.d.ts +3 -1
  166. package/dist/pipeline/index.js +16 -8
  167. package/dist/pipeline/packageManager.js +4 -2
  168. package/dist/pipeline/yarn/yarnUtils.js +6 -4
  169. package/dist/rules/index.d.ts +4 -1
  170. package/dist/rules/index.js +25 -18
  171. package/dist/runner/index.d.ts +1 -1
  172. package/dist/runner/index.js +3 -1
  173. package/dist/tsconfig.tsbuildinfo +1 -1
  174. package/dist/types/config.d.ts +18 -15
  175. package/dist/types/config.js +5 -2
  176. package/dist/types/context.d.ts +37 -32
  177. package/dist/types/context.js +3 -1
  178. package/dist/types/environmentContext.d.ts +11 -7
  179. package/dist/types/environmentContext.js +3 -1
  180. package/dist/types/gitlab-ci-yml.d.ts +30 -30
  181. package/dist/types/gitlab-ci-yml.js +3 -2
  182. package/dist/types/gitlab-types.d.ts +4 -6
  183. package/dist/types/gitlab-types.js +3 -1
  184. package/dist/types/index.js +13 -7
  185. package/dist/types/jobs.d.ts +23 -6
  186. package/dist/types/jobs.js +3 -1
  187. package/dist/types/pipeline.d.ts +4 -3
  188. package/dist/types/pipeline.js +3 -1
  189. package/dist/types/utils.d.ts +1 -1
  190. package/dist/types/utils.js +3 -1
  191. package/dist/utils/gitlab.js +3 -1
  192. package/dist/utils/index.d.ts +1 -1
  193. package/dist/utils/index.js +3 -1
  194. package/dist/utils/writeFiles.d.ts +7 -0
  195. package/dist/{pipeline/commitInfo/getBuildId.js โ†’ utils/writeFiles.js} +39 -22
  196. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +480 -384
  197. package/examples/__snapshots__/cloud-run-meteor-with-worker.ts.snap +462 -366
  198. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +480 -384
  199. package/examples/__snapshots__/cloud-run-no-service.ts.snap +501 -393
  200. package/examples/__snapshots__/cloud-run-non-public.ts.snap +480 -384
  201. package/examples/__snapshots__/cloud-run-post-stop-job.ts.snap +489 -392
  202. package/examples/__snapshots__/cloud-run-service-gen2.ts.snap +480 -384
  203. package/examples/__snapshots__/cloud-run-service-with-volumes.ts.snap +501 -401
  204. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +1155 -915
  205. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +1116 -888
  206. package/examples/__snapshots__/cloud-run-with-worker.ts.snap +482 -386
  207. package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +452 -356
  208. package/examples/__snapshots__/custom-build-job.ts.snap +434 -350
  209. package/examples/__snapshots__/custom-deploy.ts.snap +319 -223
  210. package/examples/__snapshots__/custom-envs.ts.snap +123 -81
  211. package/examples/__snapshots__/custom-sbom-java.ts.snap +434 -350
  212. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +846 -969
  213. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +886 -957
  214. package/examples/__snapshots__/kubernetes-with-cloud-sql.ts.snap +894 -969
  215. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +1626 -1728
  216. package/examples/__snapshots__/kubernetes-with-mongodb.ts.snap +974 -1137
  217. package/examples/__snapshots__/local-dot-env.ts.snap +480 -384
  218. package/examples/__snapshots__/meteor-kubernetes.ts.snap +906 -1069
  219. package/examples/__snapshots__/multiline-var.ts.snap +4500 -0
  220. package/examples/__snapshots__/native-app.ts.snap +706 -578
  221. package/examples/__snapshots__/node-build-with-custom-image.ts.snap +480 -384
  222. package/examples/__snapshots__/node-build-with-docker-additions.ts.snap +488 -384
  223. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +1656 -1942
  224. package/examples/__snapshots__/wait-for-other-deploy.ts.snap +287 -231
  225. package/examples/custom-deploy.ts +7 -7
  226. package/examples/multiline-var.ts +64 -0
  227. package/package.json +5 -8
  228. package/src/bash/BashExpression.ts +81 -0
  229. package/src/bash/bashExpressionPerPipelineType.ts +16 -0
  230. package/src/bash/bashYaml.ts +46 -0
  231. package/src/bash/getInjectVarsScript.ts +12 -0
  232. package/src/bash/replaceAsync.ts +50 -0
  233. package/src/build/base/createAppBuildJob.ts +6 -2
  234. package/src/build/base/writeBuildInfo.ts +1 -1
  235. package/src/build/base/writeDotEnv.ts +6 -1
  236. package/src/build/custom/buildJob.ts +2 -4
  237. package/src/build/custom/testJob.ts +3 -2
  238. package/src/build/docker.ts +15 -7
  239. package/src/build/node/buildJob.ts +1 -3
  240. package/src/build/node/testJob.ts +3 -2
  241. package/src/build/node/yarn.ts +9 -4
  242. package/src/build/rails/test.ts +2 -1
  243. package/src/build/types.ts +8 -1
  244. package/src/catladder-gitlab.ts +8 -55
  245. package/src/config/readConfig.ts +2 -3
  246. package/src/constants.ts +5 -2
  247. package/src/context/__tests__/resolveReferences.test.ts +11 -6
  248. package/src/context/getBuildInfoVariables.ts +40 -0
  249. package/src/context/getEnvironment.ts +7 -30
  250. package/src/context/getEnvironmentContext.ts +25 -29
  251. package/src/context/getEnvironmentVariables.ts +61 -36
  252. package/src/context/getReviewSlug.ts +27 -0
  253. package/src/context/index.ts +24 -23
  254. package/src/context/resolveReferences.ts +28 -8
  255. package/src/context/transformJobOnlyVars.ts +5 -2
  256. package/src/context/utils/envVars.ts +2 -1
  257. package/src/deploy/base/deploy.ts +20 -18
  258. package/src/deploy/base/rollback.ts +8 -10
  259. package/src/deploy/base/stop.ts +8 -9
  260. package/src/deploy/cloudRun/artifactsRegistry.ts +9 -4
  261. package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +12 -7
  262. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +3 -2
  263. package/src/deploy/cloudRun/createJobs/constants.ts +1 -0
  264. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +20 -2
  265. package/src/deploy/cloudRun/createJobs/index.ts +17 -8
  266. package/src/deploy/cloudRun/index.ts +14 -6
  267. package/src/deploy/cloudRun/utils/createArgsString.ts +2 -1
  268. package/src/deploy/cloudRun/utils/database.ts +2 -2
  269. package/src/deploy/cloudRun/utils/jobName.ts +7 -2
  270. package/src/deploy/cloudSql/utils.ts +12 -9
  271. package/src/deploy/index.ts +2 -1
  272. package/src/deploy/kubernetes/cloudSql/index.ts +3 -2
  273. package/src/deploy/kubernetes/deployJob.ts +24 -10
  274. package/src/deploy/kubernetes/index.ts +15 -8
  275. package/src/deploy/kubernetes/kubeEnv.ts +8 -6
  276. package/src/deploy/kubernetes/kubeValues.ts +0 -1
  277. package/src/deploy/kubernetes/processSecretsAsFiles.ts +2 -1
  278. package/src/deploy/types/base.ts +6 -0
  279. package/src/deploy/types/googleCloudRun.ts +2 -0
  280. package/src/index.ts +2 -1
  281. package/src/packageInfos.ts +10 -0
  282. package/src/pipeline/createAllJobs.ts +24 -10
  283. package/src/pipeline/createChildPipeline.ts +19 -8
  284. package/src/pipeline/createJobsForComponent.ts +14 -22
  285. package/src/pipeline/createMainPipeline.ts +88 -0
  286. package/src/pipeline/generatePipelineFiles.ts +29 -0
  287. package/src/pipeline/gitlab/createGitlabJobs.ts +174 -51
  288. package/src/pipeline/gitlab/createGitlabPipeline.ts +16 -14
  289. package/src/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.ts +46 -0
  290. package/src/pipeline/gitlab/gitlabReleaseJobs.ts +20 -0
  291. package/src/pipeline/index.ts +2 -0
  292. package/src/rules/index.ts +15 -9
  293. package/src/types/config.ts +11 -2
  294. package/src/types/context.ts +39 -26
  295. package/src/types/environmentContext.ts +12 -6
  296. package/src/types/gitlab-ci-yml.ts +0 -1
  297. package/src/types/gitlab-types.ts +5 -4
  298. package/src/types/jobs.ts +28 -3
  299. package/src/types/pipeline.ts +4 -0
  300. package/src/utils/writeFiles.ts +40 -0
  301. package/dist/deploy/cloudRun/createJobs/variables.d.ts +0 -5
  302. package/dist/deploy/cloudRun/createJobs/variables.js +0 -19
  303. package/dist/pipeline/commitInfo/getBuildId.d.ts +0 -6
  304. package/dist/pipeline/commitInfo/getCommitInfo.d.ts +0 -2
  305. package/src/deploy/cloudRun/createJobs/variables.ts +0 -21
  306. package/src/pipeline/commitInfo/getBuildId.ts +0 -17
  307. package/src/pipeline/commitInfo/getCommitInfo.ts +0 -15
@@ -6,10 +6,16 @@ exports[`matches snapshot 1`] = `
6
6
  "image": "path/to/docker/jobs-default:the-version",
7
7
  "jobs": {
8
8
  "api โ†ฉ๏ธ Rollback โš ๏ธ | dev ": {
9
+ "allow_failure": true,
10
+ "artifacts": {
11
+ "reports": {
12
+ "dotenv": "gitlab_environment.env",
13
+ },
14
+ },
9
15
  "environment": {
10
16
  "action": "access",
11
17
  "name": "dev/api",
12
- "url": "https://api.dev.test-app.pan.panter.cloud",
18
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
13
19
  },
14
20
  "image": "path/to/docker/kubernetes:the-version",
15
21
  "interruptible": true,
@@ -23,87 +29,49 @@ exports[`matches snapshot 1`] = `
23
29
  },
24
30
  "rules": [
25
31
  {
26
- "allow_failure": true,
27
32
  "when": "manual",
28
33
  },
29
34
  ],
30
35
  "script": [
36
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
37
+ "export ENV_SHORT="dev"",
38
+ "export APP_DIR="api"",
39
+ "export ENV_TYPE="dev"",
40
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
41
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
42
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
43
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
44
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
45
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
46
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
47
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
48
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
49
+ "export KUBE_APP_NAME="api"",
50
+ "export KUBE_APP_NAME_PREFIX=""",
51
+ "export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"",
52
+ "export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"",
53
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
54
+ "export RELEASE_NAME="pan-test-app-dev-api"",
55
+ "export HELM_EXPERIMENTAL_OCI="1"",
56
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
57
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
58
+ "export HELM_ARGS=""",
59
+ "export COMPONENT_NAME="api"",
60
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
61
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
31
62
  "kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
32
63
  "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
33
64
  "kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"",
34
65
  "kubectl config use-context "kube-pan-test-app-dev-api"",
35
66
  "kubernetesRollback",
67
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
36
68
  ],
37
69
  "stage": "rollback dev",
38
70
  "variables": {
39
- "APP_DIR": "api",
40
- "BUILD_ID": "some-id",
41
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
42
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
43
- "BUILD_INFO_ID": "some-id",
44
- "COMPONENT_NAME": "api",
45
- "ENV_SHORT": "dev",
46
- "ENV_TYPE": "dev",
47
71
  "GIT_STRATEGY": "none",
48
- "HELM_ARGS": "",
49
- "HELM_EXPERIMENTAL_OCI": "1",
50
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
51
- "HOST": "api.dev.test-app.pan.panter.cloud",
52
- "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
53
- "HOST_INTERNAL": "api.dev.test-app.pan.panter.cloud",
54
72
  "KUBERNETES_CPU_REQUEST": "0.5",
55
73
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
56
74
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
57
- "KUBE_APP_NAME": "api",
58
- "KUBE_APP_NAME_PREFIX": "",
59
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
60
- "KUBE_NAMESPACE": "pan-test-app-dev",
61
- "KUBE_VALUES": "env:
62
- secret:
63
- POSTGRESQL_PASSWORD: '$CL_dev_api_POSTGRESQL_PASSWORD'
64
- cloudsqlProxyCredentials: '$CL_dev_api_cloudsqlProxyCredentials'
65
- public:
66
- ENV_SHORT: 'dev'
67
- APP_DIR: 'api'
68
- ENV_TYPE: 'dev'
69
- BUILD_INFO_ID: 'some-id'
70
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
71
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
72
- HOST: 'api.dev.test-app.pan.panter.cloud'
73
- ROOT_URL: 'https://api.dev.test-app.pan.panter.cloud'
74
- HOST_CANONICAL: 'api.dev.test-app.pan.panter.cloud'
75
- ROOT_URL_INTERNAL: 'https://api.dev.test-app.pan.panter.cloud'
76
- KUBE_NAMESPACE: 'pan-test-app-dev'
77
- KUBE_APP_NAME: 'api'
78
- KUBE_APP_NAME_PREFIX: ''
79
- HOST_INTERNAL: 'api.dev.test-app.pan.panter.cloud'
80
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
81
- application:
82
- host: 'api.dev.test-app.pan.panter.cloud'
83
- command: 'yarn start'
84
- livenessProbe:
85
- httpGet:
86
- path: '__health'
87
- readinessProbe:
88
- httpGet:
89
- path: '__health'
90
- startupProbe:
91
- httpGet:
92
- path: '__health'
93
- cloudsql:
94
- enabled: true
95
- dbUser: 'postgres'
96
- instanceConnectionName: 'myproject:europe-west6:instance-name'
97
- proxyCredentials: '$CL_dev_api_cloudsqlProxyCredentials'
98
- fullDbName: 'pan-test-app-dev-api'
99
- type: 'unmanaged'
100
- ",
101
- "POSTGRESQL_PASSWORD": "$CL_dev_api_POSTGRESQL_PASSWORD",
102
- "RELEASE_NAME": "pan-test-app-dev-api",
103
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
104
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
105
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
106
- "cloudsqlProxyCredentials": "$CL_dev_api_cloudsqlProxyCredentials",
107
75
  },
108
76
  },
109
77
  "api ๐Ÿ‘ฎ lint": {
@@ -134,6 +102,9 @@ cloudsql:
134
102
  ],
135
103
  },
136
104
  "script": [
105
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
106
+ "export APP_PATH="api"",
107
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
137
108
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
138
109
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
139
110
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -150,7 +121,6 @@ cloudsql:
150
121
  ],
151
122
  "stage": "test",
152
123
  "variables": {
153
- "APP_PATH": "api",
154
124
  "KUBERNETES_CPU_REQUEST": "0.5",
155
125
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
156
126
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -203,7 +173,26 @@ cloudsql:
203
173
  ],
204
174
  },
205
175
  "script": [
206
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
176
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
177
+ "export ENV_SHORT="dev"",
178
+ "export APP_DIR="api"",
179
+ "export ENV_TYPE="dev"",
180
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
181
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
182
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
183
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
184
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
185
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
186
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
187
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
188
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
189
+ "export KUBE_APP_NAME="api"",
190
+ "export KUBE_APP_NAME_PREFIX=""",
191
+ "export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"",
192
+ "export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"",
193
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
194
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
195
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
207
196
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
208
197
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
209
198
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -220,26 +209,9 @@ cloudsql:
220
209
  ],
221
210
  "stage": "build",
222
211
  "variables": {
223
- "APP_DIR": "api",
224
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
225
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
226
- "BUILD_INFO_ID": "some-id",
227
- "ENV_SHORT": "dev",
228
- "ENV_TYPE": "dev",
229
- "HOST": "api.dev.test-app.pan.panter.cloud",
230
- "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
231
- "HOST_INTERNAL": "api.dev.test-app.pan.panter.cloud",
232
212
  "KUBERNETES_CPU_REQUEST": "0.5",
233
213
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
234
214
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
235
- "KUBE_APP_NAME": "api",
236
- "KUBE_APP_NAME_PREFIX": "",
237
- "KUBE_NAMESPACE": "pan-test-app-dev",
238
- "POSTGRESQL_PASSWORD": "$CL_dev_api_POSTGRESQL_PASSWORD",
239
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
240
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
241
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
242
- "cloudsqlProxyCredentials": "$CL_dev_api_cloudsqlProxyCredentials",
243
215
  },
244
216
  },
245
217
  "api ๐Ÿ”จ docker | dev ": {
@@ -265,6 +237,22 @@ cloudsql:
265
237
  ],
266
238
  },
267
239
  "script": [
240
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
241
+ "export APP_DIR="api"",
242
+ "export DOCKER_DIR="."",
243
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
244
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
245
+ "export DOCKER_IMAGE_NAME="dev/api"",
246
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
247
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
248
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
249
+ RUN yarn plugin import workspace-tools
250
+ RUN yarn workspaces focus --production && yarn rebuild"",
251
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
252
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
253
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
254
+ COPY --chown=node:node .yarn /app/.yarn"",
255
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
268
256
  "ensureNodeDockerfile",
269
257
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
270
258
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -288,25 +276,9 @@ cloudsql:
288
276
  ],
289
277
  "stage": "build",
290
278
  "variables": {
291
- "APP_DIR": "api",
292
- "DOCKERFILE_ADDITIONS": undefined,
293
- "DOCKERFILE_ADDITIONS_END": undefined,
294
279
  "DOCKER_BUILDKIT": "1",
295
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
296
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
297
- RUN yarn plugin import workspace-tools
298
- RUN yarn workspaces focus --production && yarn rebuild",
299
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
300
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
301
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
302
- COPY --chown=node:node .yarn /app/.yarn",
303
- "DOCKER_DIR": ".",
304
280
  "DOCKER_DRIVER": "overlay2",
305
281
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
306
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
307
- "DOCKER_IMAGE_NAME": "dev/api",
308
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
309
- "DOCKER_REGISTRY": "$CI_REGISTRY",
310
282
  "DOCKER_TLS_CERTDIR": "",
311
283
  "KUBERNETES_CPU_REQUEST": "0.5",
312
284
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -315,11 +287,16 @@ COPY --chown=node:node .yarn /app/.yarn",
315
287
  },
316
288
  "api ๐Ÿš€ Deploy | dev ": {
317
289
  "allow_failure": false,
290
+ "artifacts": {
291
+ "reports": {
292
+ "dotenv": "gitlab_environment.env",
293
+ },
294
+ },
318
295
  "environment": {
319
296
  "auto_stop_in": "4 weeks",
320
297
  "name": "dev/api",
321
298
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | dev ",
322
- "url": "https://api.dev.test-app.pan.panter.cloud",
299
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
323
300
  },
324
301
  "image": "path/to/docker/kubernetes:the-version",
325
302
  "interruptible": true,
@@ -362,97 +339,137 @@ COPY --chown=node:node .yarn /app/.yarn",
362
339
  },
363
340
  ],
364
341
  "script": [
342
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
343
+ "export ENV_SHORT="dev"",
344
+ "export APP_DIR="api"",
345
+ "export ENV_TYPE="dev"",
346
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
347
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
348
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
349
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
350
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
351
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
352
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
353
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
354
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
355
+ "export KUBE_APP_NAME="api"",
356
+ "export KUBE_APP_NAME_PREFIX=""",
357
+ "export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"",
358
+ "export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"",
359
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
360
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
361
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
362
+ "export DOCKER_IMAGE_NAME="dev/api"",
363
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
364
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
365
+ "export RELEASE_NAME="pan-test-app-dev-api"",
366
+ "export HELM_EXPERIMENTAL_OCI="1"",
367
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
368
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
369
+ "export HELM_ARGS=""",
370
+ "export COMPONENT_NAME="api"",
371
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
372
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
365
373
  "kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
366
374
  "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
367
375
  "kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"",
368
376
  "kubectl config use-context "kube-pan-test-app-dev-api"",
369
- "kubernetesCreateSecret",
370
- "kubernetesDeploy",
371
- "echo Uploading SBOM to Dependency Track",
372
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
373
- "echo deployment successful ๐Ÿ˜ป",
374
- ],
375
- "stage": "deploy dev",
376
- "variables": {
377
- "APP_DIR": "api",
378
- "BUILD_ID": "some-id",
379
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
380
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
381
- "BUILD_INFO_ID": "some-id",
382
- "COMPONENT_NAME": "api",
383
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
384
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
385
- "DOCKER_IMAGE_NAME": "dev/api",
386
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
387
- "DOCKER_REGISTRY": "$CI_REGISTRY",
388
- "ENV_SHORT": "dev",
389
- "ENV_TYPE": "dev",
390
- "HELM_ARGS": "",
391
- "HELM_EXPERIMENTAL_OCI": "1",
392
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
393
- "HOST": "api.dev.test-app.pan.panter.cloud",
394
- "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
395
- "HOST_INTERNAL": "api.dev.test-app.pan.panter.cloud",
396
- "KUBERNETES_CPU_REQUEST": "0.5",
397
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
398
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
399
- "KUBE_APP_NAME": "api",
400
- "KUBE_APP_NAME_PREFIX": "",
401
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
402
- "KUBE_NAMESPACE": "pan-test-app-dev",
403
- "KUBE_VALUES": "env:
377
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
378
+ "cat > __all_values.yml <<EOF
379
+ env:
404
380
  secret:
405
- POSTGRESQL_PASSWORD: '$CL_dev_api_POSTGRESQL_PASSWORD'
406
- cloudsqlProxyCredentials: '$CL_dev_api_cloudsqlProxyCredentials'
381
+ POSTGRESQL_PASSWORD: |-
382
+ $(printf %s "$CL_dev_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
383
+ cloudsqlProxyCredentials: |-
384
+ $(printf %s "$CL_dev_api_cloudsqlProxyCredentials" | sed 's/^/ /')
407
385
  public:
408
- ENV_SHORT: 'dev'
409
- APP_DIR: 'api'
410
- ENV_TYPE: 'dev'
411
- BUILD_INFO_ID: 'some-id'
412
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
413
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
414
- HOST: 'api.dev.test-app.pan.panter.cloud'
415
- ROOT_URL: 'https://api.dev.test-app.pan.panter.cloud'
416
- HOST_CANONICAL: 'api.dev.test-app.pan.panter.cloud'
417
- ROOT_URL_INTERNAL: 'https://api.dev.test-app.pan.panter.cloud'
418
- KUBE_NAMESPACE: 'pan-test-app-dev'
419
- KUBE_APP_NAME: 'api'
420
- KUBE_APP_NAME_PREFIX: ''
421
- HOST_INTERNAL: 'api.dev.test-app.pan.panter.cloud'
422
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
386
+ ENV_SHORT: |-
387
+ dev
388
+ APP_DIR: |-
389
+ api
390
+ ENV_TYPE: |-
391
+ dev
392
+ BUILD_INFO_BUILD_ID: |-
393
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
394
+ BUILD_INFO_BUILD_TIME: |-
395
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
396
+ BUILD_INFO_CURRENT_VERSION: |-
397
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")" | sed 's/^/ /')
398
+ HOST: |-
399
+ api.dev.test-app.pan.panter.cloud
400
+ ROOT_URL: |-
401
+ https://api.dev.test-app.pan.panter.cloud
402
+ HOST_INTERNAL: |-
403
+ api.dev.test-app.pan.panter.cloud
404
+ HOST_CANONICAL: |-
405
+ api.dev.test-app.pan.panter.cloud
406
+ ROOT_URL_INTERNAL: |-
407
+ https://api.dev.test-app.pan.panter.cloud
408
+ KUBE_NAMESPACE: |-
409
+ pan-test-app-dev
410
+ KUBE_APP_NAME: |-
411
+ api
412
+ KUBE_APP_NAME_PREFIX: ""
413
+ _ALL_ENV_VAR_KEYS: |-
414
+ ["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","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
423
415
  application:
424
- host: 'api.dev.test-app.pan.panter.cloud'
425
- command: 'yarn start'
416
+ host: |-
417
+ api.dev.test-app.pan.panter.cloud
418
+ command: |-
419
+ yarn start
426
420
  livenessProbe:
427
421
  httpGet:
428
- path: '__health'
422
+ path: |-
423
+ __health
429
424
  readinessProbe:
430
425
  httpGet:
431
- path: '__health'
426
+ path: |-
427
+ __health
432
428
  startupProbe:
433
429
  httpGet:
434
- path: '__health'
430
+ path: |-
431
+ __health
435
432
  cloudsql:
436
433
  enabled: true
437
- dbUser: 'postgres'
438
- instanceConnectionName: 'myproject:europe-west6:instance-name'
439
- proxyCredentials: '$CL_dev_api_cloudsqlProxyCredentials'
440
- fullDbName: 'pan-test-app-dev-api'
441
- type: 'unmanaged'
434
+ dbUser: |-
435
+ postgres
436
+ instanceConnectionName: |-
437
+ myproject:europe-west6:instance-name
438
+ proxyCredentials: |-
439
+ $CL_dev_api_cloudsqlProxyCredentials
440
+ fullDbName: |-
441
+ pan-test-app-dev-api
442
+ type: |-
443
+ unmanaged
444
+
445
+ EOF
442
446
  ",
443
- "POSTGRESQL_PASSWORD": "$CL_dev_api_POSTGRESQL_PASSWORD",
444
- "RELEASE_NAME": "pan-test-app-dev-api",
445
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
446
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
447
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
448
- "cloudsqlProxyCredentials": "$CL_dev_api_cloudsqlProxyCredentials",
447
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
448
+ "kubernetesCreateSecret",
449
+ "kubernetesDeploy",
450
+ "echo Uploading SBOM to Dependency Track",
451
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
452
+ "echo deployment successful ๐Ÿ˜ป",
453
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
454
+ ],
455
+ "stage": "deploy dev",
456
+ "variables": {
457
+ "KUBERNETES_CPU_REQUEST": "0.5",
458
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
459
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
449
460
  },
450
461
  },
451
462
  "api ๐Ÿ›‘ Stop โš ๏ธ | dev ": {
463
+ "allow_failure": true,
464
+ "artifacts": {
465
+ "reports": {
466
+ "dotenv": "gitlab_environment.env",
467
+ },
468
+ },
452
469
  "environment": {
453
470
  "action": "stop",
454
471
  "name": "dev/api",
455
- "url": "https://api.dev.test-app.pan.panter.cloud",
472
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
456
473
  },
457
474
  "image": "path/to/docker/kubernetes:the-version",
458
475
  "interruptible": true,
@@ -466,16 +483,40 @@ cloudsql:
466
483
  },
467
484
  "rules": [
468
485
  {
469
- "allow_failure": true,
470
486
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
471
487
  "when": "on_success",
472
488
  },
473
489
  {
474
- "allow_failure": true,
475
490
  "when": "manual",
476
491
  },
477
492
  ],
478
493
  "script": [
494
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
495
+ "export ENV_SHORT="dev"",
496
+ "export APP_DIR="api"",
497
+ "export ENV_TYPE="dev"",
498
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
499
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
500
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
501
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
502
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
503
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
504
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
505
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
506
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
507
+ "export KUBE_APP_NAME="api"",
508
+ "export KUBE_APP_NAME_PREFIX=""",
509
+ "export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"",
510
+ "export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"",
511
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
512
+ "export RELEASE_NAME="pan-test-app-dev-api"",
513
+ "export HELM_EXPERIMENTAL_OCI="1"",
514
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
515
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
516
+ "export HELM_ARGS=""",
517
+ "export COMPONENT_NAME="api"",
518
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
519
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
479
520
  "kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
480
521
  "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
481
522
  "kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"",
@@ -483,77 +524,14 @@ cloudsql:
483
524
  "kubernetesDelete",
484
525
  "echo Disabling component in Dependency Track",
485
526
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" || true",
527
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
486
528
  ],
487
529
  "stage": "stop dev",
488
530
  "variables": {
489
- "APP_DIR": "api",
490
- "BUILD_ID": "some-id",
491
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
492
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
493
- "BUILD_INFO_ID": "some-id",
494
- "COMPONENT_NAME": "api",
495
- "ENV_SHORT": "dev",
496
- "ENV_TYPE": "dev",
497
531
  "GIT_STRATEGY": "none",
498
- "HELM_ARGS": "",
499
- "HELM_EXPERIMENTAL_OCI": "1",
500
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
501
- "HOST": "api.dev.test-app.pan.panter.cloud",
502
- "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
503
- "HOST_INTERNAL": "api.dev.test-app.pan.panter.cloud",
504
532
  "KUBERNETES_CPU_REQUEST": "0.5",
505
533
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
506
534
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
507
- "KUBE_APP_NAME": "api",
508
- "KUBE_APP_NAME_PREFIX": "",
509
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
510
- "KUBE_NAMESPACE": "pan-test-app-dev",
511
- "KUBE_VALUES": "env:
512
- secret:
513
- POSTGRESQL_PASSWORD: '$CL_dev_api_POSTGRESQL_PASSWORD'
514
- cloudsqlProxyCredentials: '$CL_dev_api_cloudsqlProxyCredentials'
515
- public:
516
- ENV_SHORT: 'dev'
517
- APP_DIR: 'api'
518
- ENV_TYPE: 'dev'
519
- BUILD_INFO_ID: 'some-id'
520
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
521
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
522
- HOST: 'api.dev.test-app.pan.panter.cloud'
523
- ROOT_URL: 'https://api.dev.test-app.pan.panter.cloud'
524
- HOST_CANONICAL: 'api.dev.test-app.pan.panter.cloud'
525
- ROOT_URL_INTERNAL: 'https://api.dev.test-app.pan.panter.cloud'
526
- KUBE_NAMESPACE: 'pan-test-app-dev'
527
- KUBE_APP_NAME: 'api'
528
- KUBE_APP_NAME_PREFIX: ''
529
- HOST_INTERNAL: 'api.dev.test-app.pan.panter.cloud'
530
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
531
- application:
532
- host: 'api.dev.test-app.pan.panter.cloud'
533
- command: 'yarn start'
534
- livenessProbe:
535
- httpGet:
536
- path: '__health'
537
- readinessProbe:
538
- httpGet:
539
- path: '__health'
540
- startupProbe:
541
- httpGet:
542
- path: '__health'
543
- cloudsql:
544
- enabled: true
545
- dbUser: 'postgres'
546
- instanceConnectionName: 'myproject:europe-west6:instance-name'
547
- proxyCredentials: '$CL_dev_api_cloudsqlProxyCredentials'
548
- fullDbName: 'pan-test-app-dev-api'
549
- type: 'unmanaged'
550
- ",
551
- "POSTGRESQL_PASSWORD": "$CL_dev_api_POSTGRESQL_PASSWORD",
552
- "RELEASE_NAME": "pan-test-app-dev-api",
553
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
554
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
555
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
556
- "cloudsqlProxyCredentials": "$CL_dev_api_cloudsqlProxyCredentials",
557
535
  },
558
536
  },
559
537
  "api ๐Ÿ›ก audit": {
@@ -569,12 +547,14 @@ cloudsql:
569
547
  ],
570
548
  },
571
549
  "script": [
550
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
551
+ "export APP_PATH="api"",
552
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
572
553
  "cd api",
573
554
  "yarn npm audit --environment production",
574
555
  ],
575
556
  "stage": "test",
576
557
  "variables": {
577
- "APP_PATH": "api",
578
558
  "KUBERNETES_CPU_REQUEST": "0.5",
579
559
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
580
560
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -608,6 +588,9 @@ cloudsql:
608
588
  ],
609
589
  },
610
590
  "script": [
591
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
592
+ "export APP_PATH="api"",
593
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
611
594
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
612
595
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
613
596
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -624,7 +607,6 @@ cloudsql:
624
607
  ],
625
608
  "stage": "test",
626
609
  "variables": {
627
- "APP_PATH": "api",
628
610
  "KUBERNETES_CPU_REQUEST": "0.5",
629
611
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
630
612
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -648,6 +630,8 @@ cloudsql:
648
630
  ],
649
631
  },
650
632
  "script": [
633
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
634
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
651
635
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
652
636
  ],
653
637
  "stage": "build",
@@ -700,7 +684,7 @@ cloudsql:
700
684
  ],
701
685
  "variables": {
702
686
  "FF_USE_FASTZIP": "true",
703
- "GIT_DEPTH": 1,
687
+ "GIT_DEPTH": "1",
704
688
  },
705
689
  "workflow": {
706
690
  "rules": [
@@ -731,10 +715,16 @@ cloudsql:
731
715
  "image": "path/to/docker/jobs-default:the-version",
732
716
  "jobs": {
733
717
  "api โ†ฉ๏ธ Rollback โš ๏ธ | review ": {
718
+ "allow_failure": true,
719
+ "artifacts": {
720
+ "reports": {
721
+ "dotenv": "gitlab_environment.env",
722
+ },
723
+ },
734
724
  "environment": {
735
725
  "action": "access",
736
- "name": "review/some-commit/api",
737
- "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
726
+ "name": "review/$CI_COMMIT_REF_NAME/api",
727
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
738
728
  },
739
729
  "image": "path/to/docker/kubernetes:the-version",
740
730
  "interruptible": true,
@@ -748,87 +738,49 @@ cloudsql:
748
738
  },
749
739
  "rules": [
750
740
  {
751
- "allow_failure": true,
752
741
  "when": "manual",
753
742
  },
754
743
  ],
755
744
  "script": [
756
- "kubectl config set-cluster "kube-pan-test-app-review-mr1234-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
757
- "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
758
- "kubectl config set-context "kube-pan-test-app-review-mr1234-api" --cluster="kube-pan-test-app-review-mr1234-api" --user="kube-pan-test-app-review-mr1234-api" --namespace="pan-test-app-review"",
759
- "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
745
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
746
+ "export ENV_SHORT="review"",
747
+ "export APP_DIR="api"",
748
+ "export ENV_TYPE="review"",
749
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
750
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
751
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
752
+ "export HOST="api.$([ -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"",
753
+ "export ROOT_URL="https://api.$([ -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"",
754
+ "export HOST_INTERNAL="api.$([ -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"",
755
+ "export HOST_CANONICAL="api.$([ -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"",
756
+ "export ROOT_URL_INTERNAL="https://api.$([ -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"",
757
+ "export KUBE_NAMESPACE="pan-test-app-review"",
758
+ "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"; })-api"",
759
+ "export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"",
760
+ "export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"",
761
+ "export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"",
762
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
763
+ "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"; })-api"",
764
+ "export HELM_EXPERIMENTAL_OCI="1"",
765
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
766
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
767
+ "export HELM_ARGS=""",
768
+ "export COMPONENT_NAME="api"",
769
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
770
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
771
+ "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"; })-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
772
+ "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"; })-api" --token="$CL_review_api_KUBE_TOKEN"",
773
+ "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"; })-api" --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"; })-api" --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"; })-api" --namespace="pan-test-app-review"",
774
+ "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"; })-api"",
760
775
  "kubernetesRollback",
776
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.$([ -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" >> gitlab_environment.env",
761
777
  ],
762
778
  "stage": "rollback review",
763
779
  "variables": {
764
- "APP_DIR": "api",
765
- "BUILD_ID": "some-id",
766
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
767
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
768
- "BUILD_INFO_ID": "some-id",
769
- "COMPONENT_NAME": "api",
770
- "ENV_SHORT": "review",
771
- "ENV_TYPE": "review",
772
780
  "GIT_STRATEGY": "none",
773
- "HELM_ARGS": "",
774
- "HELM_EXPERIMENTAL_OCI": "1",
775
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
776
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
777
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
778
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
779
781
  "KUBERNETES_CPU_REQUEST": "0.5",
780
782
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
781
783
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
782
- "KUBE_APP_NAME": "mr1234-api",
783
- "KUBE_APP_NAME_PREFIX": "mr1234-",
784
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
785
- "KUBE_NAMESPACE": "pan-test-app-review",
786
- "KUBE_VALUES": "env:
787
- secret:
788
- POSTGRESQL_PASSWORD: '$CL_review_api_POSTGRESQL_PASSWORD'
789
- cloudsqlProxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
790
- public:
791
- ENV_SHORT: 'review'
792
- APP_DIR: 'api'
793
- ENV_TYPE: 'review'
794
- BUILD_INFO_ID: 'some-id'
795
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
796
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
797
- HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
798
- ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
799
- HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
800
- ROOT_URL_INTERNAL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
801
- KUBE_NAMESPACE: 'pan-test-app-review'
802
- KUBE_APP_NAME: 'mr1234-api'
803
- KUBE_APP_NAME_PREFIX: 'mr1234-'
804
- HOST_INTERNAL: 'api.mr1234.review.test-app.pan.panter.cloud'
805
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
806
- application:
807
- host: 'api.mr1234.review.test-app.pan.panter.cloud'
808
- command: 'yarn start'
809
- livenessProbe:
810
- httpGet:
811
- path: '__health'
812
- readinessProbe:
813
- httpGet:
814
- path: '__health'
815
- startupProbe:
816
- httpGet:
817
- path: '__health'
818
- cloudsql:
819
- enabled: true
820
- dbUser: 'postgres'
821
- instanceConnectionName: 'myproject:europe-west6:instance-name'
822
- proxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
823
- fullDbName: 'pan-test-app-review-mr1234-api'
824
- type: 'unmanaged'
825
- ",
826
- "POSTGRESQL_PASSWORD": "$CL_review_api_POSTGRESQL_PASSWORD",
827
- "RELEASE_NAME": "pan-test-app-review-mr1234-api",
828
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
829
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
830
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
831
- "cloudsqlProxyCredentials": "$CL_review_api_cloudsqlProxyCredentials",
832
784
  },
833
785
  },
834
786
  "api ๐Ÿ‘ฎ lint": {
@@ -859,6 +811,9 @@ cloudsql:
859
811
  ],
860
812
  },
861
813
  "script": [
814
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
815
+ "export APP_PATH="api"",
816
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
862
817
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
863
818
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
864
819
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -875,7 +830,6 @@ cloudsql:
875
830
  ],
876
831
  "stage": "test",
877
832
  "variables": {
878
- "APP_PATH": "api",
879
833
  "KUBERNETES_CPU_REQUEST": "0.5",
880
834
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
881
835
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -928,7 +882,26 @@ cloudsql:
928
882
  ],
929
883
  },
930
884
  "script": [
931
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
885
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
886
+ "export ENV_SHORT="review"",
887
+ "export APP_DIR="api"",
888
+ "export ENV_TYPE="review"",
889
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
890
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
891
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
892
+ "export HOST="api.$([ -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"",
893
+ "export ROOT_URL="https://api.$([ -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"",
894
+ "export HOST_INTERNAL="api.$([ -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"",
895
+ "export HOST_CANONICAL="api.$([ -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"",
896
+ "export ROOT_URL_INTERNAL="https://api.$([ -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"",
897
+ "export KUBE_NAMESPACE="pan-test-app-review"",
898
+ "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"; })-api"",
899
+ "export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"",
900
+ "export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"",
901
+ "export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"",
902
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
903
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
904
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
932
905
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
933
906
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
934
907
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -945,26 +918,9 @@ cloudsql:
945
918
  ],
946
919
  "stage": "build",
947
920
  "variables": {
948
- "APP_DIR": "api",
949
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
950
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
951
- "BUILD_INFO_ID": "some-id",
952
- "ENV_SHORT": "review",
953
- "ENV_TYPE": "review",
954
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
955
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
956
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
957
921
  "KUBERNETES_CPU_REQUEST": "0.5",
958
922
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
959
923
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
960
- "KUBE_APP_NAME": "mr1234-api",
961
- "KUBE_APP_NAME_PREFIX": "mr1234-",
962
- "KUBE_NAMESPACE": "pan-test-app-review",
963
- "POSTGRESQL_PASSWORD": "$CL_review_api_POSTGRESQL_PASSWORD",
964
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
965
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
966
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
967
- "cloudsqlProxyCredentials": "$CL_review_api_cloudsqlProxyCredentials",
968
924
  },
969
925
  },
970
926
  "api ๐Ÿ”จ docker | review ": {
@@ -990,6 +946,22 @@ cloudsql:
990
946
  ],
991
947
  },
992
948
  "script": [
949
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
950
+ "export APP_DIR="api"",
951
+ "export DOCKER_DIR="."",
952
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
953
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
954
+ "export DOCKER_IMAGE_NAME="review/api"",
955
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
956
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
957
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
958
+ RUN yarn plugin import workspace-tools
959
+ RUN yarn workspaces focus --production && yarn rebuild"",
960
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
961
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
962
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
963
+ COPY --chown=node:node .yarn /app/.yarn"",
964
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
993
965
  "ensureNodeDockerfile",
994
966
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
995
967
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -1013,25 +985,9 @@ cloudsql:
1013
985
  ],
1014
986
  "stage": "build",
1015
987
  "variables": {
1016
- "APP_DIR": "api",
1017
- "DOCKERFILE_ADDITIONS": undefined,
1018
- "DOCKERFILE_ADDITIONS_END": undefined,
1019
988
  "DOCKER_BUILDKIT": "1",
1020
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1021
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1022
- RUN yarn plugin import workspace-tools
1023
- RUN yarn workspaces focus --production && yarn rebuild",
1024
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1025
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1026
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1027
- COPY --chown=node:node .yarn /app/.yarn",
1028
- "DOCKER_DIR": ".",
1029
989
  "DOCKER_DRIVER": "overlay2",
1030
990
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
1031
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1032
- "DOCKER_IMAGE_NAME": "review/api",
1033
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1034
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1035
991
  "DOCKER_TLS_CERTDIR": "",
1036
992
  "KUBERNETES_CPU_REQUEST": "0.5",
1037
993
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -1040,11 +996,16 @@ COPY --chown=node:node .yarn /app/.yarn",
1040
996
  },
1041
997
  "api ๐Ÿš€ Deploy | review ": {
1042
998
  "allow_failure": false,
999
+ "artifacts": {
1000
+ "reports": {
1001
+ "dotenv": "gitlab_environment.env",
1002
+ },
1003
+ },
1043
1004
  "environment": {
1044
1005
  "auto_stop_in": "1 week",
1045
- "name": "review/some-commit/api",
1006
+ "name": "review/$CI_COMMIT_REF_NAME/api",
1046
1007
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | review ",
1047
- "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
1008
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1048
1009
  },
1049
1010
  "image": "path/to/docker/kubernetes:the-version",
1050
1011
  "interruptible": true,
@@ -1087,97 +1048,138 @@ COPY --chown=node:node .yarn /app/.yarn",
1087
1048
  },
1088
1049
  ],
1089
1050
  "script": [
1090
- "kubectl config set-cluster "kube-pan-test-app-review-mr1234-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1091
- "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
1092
- "kubectl config set-context "kube-pan-test-app-review-mr1234-api" --cluster="kube-pan-test-app-review-mr1234-api" --user="kube-pan-test-app-review-mr1234-api" --namespace="pan-test-app-review"",
1093
- "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
1094
- "kubernetesCreateSecret",
1095
- "kubernetesDeploy",
1096
- "echo Uploading SBOM to Dependency Track",
1097
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.mr1234.review.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
1098
- "echo deployment successful ๐Ÿ˜ป",
1099
- ],
1100
- "stage": "deploy review",
1101
- "variables": {
1102
- "APP_DIR": "api",
1103
- "BUILD_ID": "some-id",
1104
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1105
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1106
- "BUILD_INFO_ID": "some-id",
1107
- "COMPONENT_NAME": "api",
1108
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1109
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1110
- "DOCKER_IMAGE_NAME": "review/api",
1111
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1112
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1113
- "ENV_SHORT": "review",
1114
- "ENV_TYPE": "review",
1115
- "HELM_ARGS": "",
1116
- "HELM_EXPERIMENTAL_OCI": "1",
1117
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1118
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
1119
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
1120
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
1121
- "KUBERNETES_CPU_REQUEST": "0.5",
1122
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1123
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1124
- "KUBE_APP_NAME": "mr1234-api",
1125
- "KUBE_APP_NAME_PREFIX": "mr1234-",
1126
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1127
- "KUBE_NAMESPACE": "pan-test-app-review",
1128
- "KUBE_VALUES": "env:
1051
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1052
+ "export ENV_SHORT="review"",
1053
+ "export APP_DIR="api"",
1054
+ "export ENV_TYPE="review"",
1055
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1056
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1057
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
1058
+ "export HOST="api.$([ -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"",
1059
+ "export ROOT_URL="https://api.$([ -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"",
1060
+ "export HOST_INTERNAL="api.$([ -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"",
1061
+ "export HOST_CANONICAL="api.$([ -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"",
1062
+ "export ROOT_URL_INTERNAL="https://api.$([ -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"",
1063
+ "export KUBE_NAMESPACE="pan-test-app-review"",
1064
+ "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"; })-api"",
1065
+ "export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"",
1066
+ "export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"",
1067
+ "export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"",
1068
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
1069
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1070
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1071
+ "export DOCKER_IMAGE_NAME="review/api"",
1072
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1073
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1074
+ "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"; })-api"",
1075
+ "export HELM_EXPERIMENTAL_OCI="1"",
1076
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1077
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1078
+ "export HELM_ARGS=""",
1079
+ "export COMPONENT_NAME="api"",
1080
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1081
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1082
+ "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"; })-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1083
+ "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"; })-api" --token="$CL_review_api_KUBE_TOKEN"",
1084
+ "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"; })-api" --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"; })-api" --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"; })-api" --namespace="pan-test-app-review"",
1085
+ "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"; })-api"",
1086
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
1087
+ "cat > __all_values.yml <<EOF
1088
+ env:
1129
1089
  secret:
1130
- POSTGRESQL_PASSWORD: '$CL_review_api_POSTGRESQL_PASSWORD'
1131
- cloudsqlProxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
1090
+ POSTGRESQL_PASSWORD: |-
1091
+ $(printf %s "$CL_review_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1092
+ cloudsqlProxyCredentials: |-
1093
+ $(printf %s "$CL_review_api_cloudsqlProxyCredentials" | sed 's/^/ /')
1132
1094
  public:
1133
- ENV_SHORT: 'review'
1134
- APP_DIR: 'api'
1135
- ENV_TYPE: 'review'
1136
- BUILD_INFO_ID: 'some-id'
1137
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1138
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1139
- HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
1140
- ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1141
- HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1142
- ROOT_URL_INTERNAL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1143
- KUBE_NAMESPACE: 'pan-test-app-review'
1144
- KUBE_APP_NAME: 'mr1234-api'
1145
- KUBE_APP_NAME_PREFIX: 'mr1234-'
1146
- HOST_INTERNAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1147
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
1095
+ ENV_SHORT: |-
1096
+ review
1097
+ APP_DIR: |-
1098
+ api
1099
+ ENV_TYPE: |-
1100
+ review
1101
+ BUILD_INFO_BUILD_ID: |-
1102
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1103
+ BUILD_INFO_BUILD_TIME: |-
1104
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1105
+ BUILD_INFO_CURRENT_VERSION: |-
1106
+ $(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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")" | sed 's/^/ /')
1107
+ HOST: |-
1108
+ $(printf %s "api.$([ -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/^/ /')
1109
+ ROOT_URL: |-
1110
+ $(printf %s "https://api.$([ -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/^/ /')
1111
+ HOST_INTERNAL: |-
1112
+ $(printf %s "api.$([ -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/^/ /')
1113
+ HOST_CANONICAL: |-
1114
+ $(printf %s "api.$([ -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/^/ /')
1115
+ ROOT_URL_INTERNAL: |-
1116
+ $(printf %s "https://api.$([ -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/^/ /')
1117
+ KUBE_NAMESPACE: |-
1118
+ pan-test-app-review
1119
+ KUBE_APP_NAME: |-
1120
+ $(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"; })-api" | sed 's/^/ /')
1121
+ KUBE_APP_NAME_PREFIX: |-
1122
+ $(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/^/ /')
1123
+ _ALL_ENV_VAR_KEYS: |-
1124
+ ["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","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
1148
1125
  application:
1149
- host: 'api.mr1234.review.test-app.pan.panter.cloud'
1150
- command: 'yarn start'
1126
+ host: |-
1127
+ $(printf %s "api.$([ -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/^/ /')
1128
+ command: |-
1129
+ yarn start
1151
1130
  livenessProbe:
1152
1131
  httpGet:
1153
- path: '__health'
1132
+ path: |-
1133
+ __health
1154
1134
  readinessProbe:
1155
1135
  httpGet:
1156
- path: '__health'
1136
+ path: |-
1137
+ __health
1157
1138
  startupProbe:
1158
1139
  httpGet:
1159
- path: '__health'
1140
+ path: |-
1141
+ __health
1160
1142
  cloudsql:
1161
1143
  enabled: true
1162
- dbUser: 'postgres'
1163
- instanceConnectionName: 'myproject:europe-west6:instance-name'
1164
- proxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
1165
- fullDbName: 'pan-test-app-review-mr1234-api'
1166
- type: 'unmanaged'
1144
+ dbUser: |-
1145
+ postgres
1146
+ instanceConnectionName: |-
1147
+ myproject:europe-west6:instance-name
1148
+ proxyCredentials: |-
1149
+ $CL_review_api_cloudsqlProxyCredentials
1150
+ fullDbName: |-
1151
+ $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed 's/^/ /')
1152
+ type: |-
1153
+ unmanaged
1154
+
1155
+ EOF
1167
1156
  ",
1168
- "POSTGRESQL_PASSWORD": "$CL_review_api_POSTGRESQL_PASSWORD",
1169
- "RELEASE_NAME": "pan-test-app-review-mr1234-api",
1170
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1171
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1172
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
1173
- "cloudsqlProxyCredentials": "$CL_review_api_cloudsqlProxyCredentials",
1157
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
1158
+ "kubernetesCreateSecret",
1159
+ "kubernetesDeploy",
1160
+ "echo Uploading SBOM to Dependency Track",
1161
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.$([ -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" "__sbom.json" vex.json || true",
1162
+ "echo deployment successful ๐Ÿ˜ป",
1163
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.$([ -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" >> gitlab_environment.env",
1164
+ ],
1165
+ "stage": "deploy review",
1166
+ "variables": {
1167
+ "KUBERNETES_CPU_REQUEST": "0.5",
1168
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1169
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1174
1170
  },
1175
1171
  },
1176
1172
  "api ๐Ÿ›‘ Stop โš ๏ธ | review ": {
1173
+ "allow_failure": true,
1174
+ "artifacts": {
1175
+ "reports": {
1176
+ "dotenv": "gitlab_environment.env",
1177
+ },
1178
+ },
1177
1179
  "environment": {
1178
1180
  "action": "stop",
1179
- "name": "review/some-commit/api",
1180
- "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
1181
+ "name": "review/$CI_COMMIT_REF_NAME/api",
1182
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1181
1183
  },
1182
1184
  "image": "path/to/docker/kubernetes:the-version",
1183
1185
  "interruptible": true,
@@ -1191,94 +1193,55 @@ cloudsql:
1191
1193
  },
1192
1194
  "rules": [
1193
1195
  {
1194
- "allow_failure": true,
1195
1196
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1196
1197
  "when": "on_success",
1197
1198
  },
1198
1199
  {
1199
- "allow_failure": true,
1200
1200
  "when": "manual",
1201
1201
  },
1202
1202
  ],
1203
1203
  "script": [
1204
- "kubectl config set-cluster "kube-pan-test-app-review-mr1234-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1205
- "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
1206
- "kubectl config set-context "kube-pan-test-app-review-mr1234-api" --cluster="kube-pan-test-app-review-mr1234-api" --user="kube-pan-test-app-review-mr1234-api" --namespace="pan-test-app-review"",
1207
- "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
1204
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1205
+ "export ENV_SHORT="review"",
1206
+ "export APP_DIR="api"",
1207
+ "export ENV_TYPE="review"",
1208
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1209
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1210
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
1211
+ "export HOST="api.$([ -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"",
1212
+ "export ROOT_URL="https://api.$([ -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"",
1213
+ "export HOST_INTERNAL="api.$([ -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"",
1214
+ "export HOST_CANONICAL="api.$([ -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"",
1215
+ "export ROOT_URL_INTERNAL="https://api.$([ -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"",
1216
+ "export KUBE_NAMESPACE="pan-test-app-review"",
1217
+ "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"; })-api"",
1218
+ "export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"",
1219
+ "export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"",
1220
+ "export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"",
1221
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
1222
+ "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"; })-api"",
1223
+ "export HELM_EXPERIMENTAL_OCI="1"",
1224
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1225
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1226
+ "export HELM_ARGS=""",
1227
+ "export COMPONENT_NAME="api"",
1228
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1229
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1230
+ "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"; })-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1231
+ "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"; })-api" --token="$CL_review_api_KUBE_TOKEN"",
1232
+ "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"; })-api" --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"; })-api" --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"; })-api" --namespace="pan-test-app-review"",
1233
+ "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"; })-api"",
1208
1234
  "kubernetesDelete",
1209
1235
  "echo Disabling component in Dependency Track",
1210
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.mr1234.review.test-app.pan.panter.cloud" || true",
1236
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.$([ -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" || true",
1237
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.$([ -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" >> gitlab_environment.env",
1211
1238
  ],
1212
1239
  "stage": "stop review",
1213
1240
  "variables": {
1214
- "APP_DIR": "api",
1215
- "BUILD_ID": "some-id",
1216
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1217
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1218
- "BUILD_INFO_ID": "some-id",
1219
- "COMPONENT_NAME": "api",
1220
- "ENV_SHORT": "review",
1221
- "ENV_TYPE": "review",
1222
1241
  "GIT_STRATEGY": "none",
1223
- "HELM_ARGS": "",
1224
- "HELM_EXPERIMENTAL_OCI": "1",
1225
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1226
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
1227
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
1228
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
1229
1242
  "KUBERNETES_CPU_REQUEST": "0.5",
1230
1243
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
1231
1244
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
1232
- "KUBE_APP_NAME": "mr1234-api",
1233
- "KUBE_APP_NAME_PREFIX": "mr1234-",
1234
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1235
- "KUBE_NAMESPACE": "pan-test-app-review",
1236
- "KUBE_VALUES": "env:
1237
- secret:
1238
- POSTGRESQL_PASSWORD: '$CL_review_api_POSTGRESQL_PASSWORD'
1239
- cloudsqlProxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
1240
- public:
1241
- ENV_SHORT: 'review'
1242
- APP_DIR: 'api'
1243
- ENV_TYPE: 'review'
1244
- BUILD_INFO_ID: 'some-id'
1245
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1246
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1247
- HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
1248
- ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1249
- HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1250
- ROOT_URL_INTERNAL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1251
- KUBE_NAMESPACE: 'pan-test-app-review'
1252
- KUBE_APP_NAME: 'mr1234-api'
1253
- KUBE_APP_NAME_PREFIX: 'mr1234-'
1254
- HOST_INTERNAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1255
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
1256
- application:
1257
- host: 'api.mr1234.review.test-app.pan.panter.cloud'
1258
- command: 'yarn start'
1259
- livenessProbe:
1260
- httpGet:
1261
- path: '__health'
1262
- readinessProbe:
1263
- httpGet:
1264
- path: '__health'
1265
- startupProbe:
1266
- httpGet:
1267
- path: '__health'
1268
- cloudsql:
1269
- enabled: true
1270
- dbUser: 'postgres'
1271
- instanceConnectionName: 'myproject:europe-west6:instance-name'
1272
- proxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
1273
- fullDbName: 'pan-test-app-review-mr1234-api'
1274
- type: 'unmanaged'
1275
- ",
1276
- "POSTGRESQL_PASSWORD": "$CL_review_api_POSTGRESQL_PASSWORD",
1277
- "RELEASE_NAME": "pan-test-app-review-mr1234-api",
1278
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1279
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1280
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
1281
- "cloudsqlProxyCredentials": "$CL_review_api_cloudsqlProxyCredentials",
1282
1245
  },
1283
1246
  },
1284
1247
  "api ๐Ÿ›ก audit": {
@@ -1294,12 +1257,14 @@ cloudsql:
1294
1257
  ],
1295
1258
  },
1296
1259
  "script": [
1260
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1261
+ "export APP_PATH="api"",
1262
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1297
1263
  "cd api",
1298
1264
  "yarn npm audit --environment production",
1299
1265
  ],
1300
1266
  "stage": "test",
1301
1267
  "variables": {
1302
- "APP_PATH": "api",
1303
1268
  "KUBERNETES_CPU_REQUEST": "0.5",
1304
1269
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1305
1270
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -1333,6 +1298,9 @@ cloudsql:
1333
1298
  ],
1334
1299
  },
1335
1300
  "script": [
1301
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1302
+ "export APP_PATH="api"",
1303
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1336
1304
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1337
1305
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1338
1306
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -1349,7 +1317,6 @@ cloudsql:
1349
1317
  ],
1350
1318
  "stage": "test",
1351
1319
  "variables": {
1352
- "APP_PATH": "api",
1353
1320
  "KUBERNETES_CPU_REQUEST": "0.5",
1354
1321
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1355
1322
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -1373,6 +1340,8 @@ cloudsql:
1373
1340
  ],
1374
1341
  },
1375
1342
  "script": [
1343
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1344
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1376
1345
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
1377
1346
  ],
1378
1347
  "stage": "build",
@@ -1425,7 +1394,7 @@ cloudsql:
1425
1394
  ],
1426
1395
  "variables": {
1427
1396
  "FF_USE_FASTZIP": "true",
1428
- "GIT_DEPTH": 1,
1397
+ "GIT_DEPTH": "1",
1429
1398
  },
1430
1399
  "workflow": {
1431
1400
  "rules": [
@@ -1456,10 +1425,16 @@ cloudsql:
1456
1425
  "image": "path/to/docker/jobs-default:the-version",
1457
1426
  "jobs": {
1458
1427
  "api โ†ฉ๏ธ Rollback โš ๏ธ | prod ": {
1428
+ "allow_failure": true,
1429
+ "artifacts": {
1430
+ "reports": {
1431
+ "dotenv": "gitlab_environment.env",
1432
+ },
1433
+ },
1459
1434
  "environment": {
1460
1435
  "action": "access",
1461
1436
  "name": "prod/api",
1462
- "url": "https://api.prod.test-app.pan.panter.cloud",
1437
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1463
1438
  },
1464
1439
  "image": "path/to/docker/kubernetes:the-version",
1465
1440
  "interruptible": true,
@@ -1473,94 +1448,62 @@ cloudsql:
1473
1448
  },
1474
1449
  "rules": [
1475
1450
  {
1476
- "allow_failure": true,
1477
1451
  "when": "manual",
1478
1452
  },
1479
1453
  ],
1480
1454
  "script": [
1455
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1456
+ "export ENV_SHORT="prod"",
1457
+ "export APP_DIR="api"",
1458
+ "export ENV_TYPE="prod"",
1459
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1460
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1461
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
1462
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
1463
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
1464
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
1465
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
1466
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
1467
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
1468
+ "export KUBE_APP_NAME="api"",
1469
+ "export KUBE_APP_NAME_PREFIX=""",
1470
+ "export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"",
1471
+ "export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"",
1472
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
1473
+ "export RELEASE_NAME="pan-test-app-prod-api"",
1474
+ "export HELM_EXPERIMENTAL_OCI="1"",
1475
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1476
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1477
+ "export HELM_ARGS=""",
1478
+ "export COMPONENT_NAME="api"",
1479
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1480
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1481
1481
  "kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1482
1482
  "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
1483
1483
  "kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"",
1484
1484
  "kubectl config use-context "kube-pan-test-app-prod-api"",
1485
1485
  "kubernetesRollback",
1486
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
1486
1487
  ],
1487
1488
  "stage": "rollback prod",
1488
1489
  "variables": {
1489
- "APP_DIR": "api",
1490
- "BUILD_ID": "some-id",
1491
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1492
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1493
- "BUILD_INFO_ID": "some-id",
1494
- "COMPONENT_NAME": "api",
1495
- "ENV_SHORT": "prod",
1496
- "ENV_TYPE": "prod",
1497
1490
  "GIT_STRATEGY": "none",
1498
- "HELM_ARGS": "",
1499
- "HELM_EXPERIMENTAL_OCI": "1",
1500
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1501
- "HOST": "api.prod.test-app.pan.panter.cloud",
1502
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
1503
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
1504
1491
  "KUBERNETES_CPU_REQUEST": "0.5",
1505
1492
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
1506
1493
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
1507
- "KUBE_APP_NAME": "api",
1508
- "KUBE_APP_NAME_PREFIX": "",
1509
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1510
- "KUBE_NAMESPACE": "pan-test-app-prod",
1511
- "KUBE_VALUES": "env:
1512
- secret:
1513
- POSTGRESQL_PASSWORD: '$CL_prod_api_POSTGRESQL_PASSWORD'
1514
- cloudsqlProxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
1515
- public:
1516
- ENV_SHORT: 'prod'
1517
- APP_DIR: 'api'
1518
- ENV_TYPE: 'prod'
1519
- BUILD_INFO_ID: 'some-id'
1520
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1521
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1522
- HOST: 'api.prod.test-app.pan.panter.cloud'
1523
- ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
1524
- HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
1525
- ROOT_URL_INTERNAL: 'https://api.prod.test-app.pan.panter.cloud'
1526
- KUBE_NAMESPACE: 'pan-test-app-prod'
1527
- KUBE_APP_NAME: 'api'
1528
- KUBE_APP_NAME_PREFIX: ''
1529
- HOST_INTERNAL: 'api.prod.test-app.pan.panter.cloud'
1530
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
1531
- application:
1532
- host: 'api.prod.test-app.pan.panter.cloud'
1533
- command: 'yarn start'
1534
- livenessProbe:
1535
- httpGet:
1536
- path: '__health'
1537
- readinessProbe:
1538
- httpGet:
1539
- path: '__health'
1540
- startupProbe:
1541
- httpGet:
1542
- path: '__health'
1543
- cloudsql:
1544
- enabled: true
1545
- dbUser: 'postgres'
1546
- instanceConnectionName: 'myproject:europe-west6:instance-name'
1547
- proxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
1548
- fullDbName: 'pan-test-app-prod-api'
1549
- type: 'unmanaged'
1550
- ",
1551
- "POSTGRESQL_PASSWORD": "$CL_prod_api_POSTGRESQL_PASSWORD",
1552
- "RELEASE_NAME": "pan-test-app-prod-api",
1553
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
1554
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
1555
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
1556
- "cloudsqlProxyCredentials": "$CL_prod_api_cloudsqlProxyCredentials",
1557
1494
  },
1558
1495
  },
1559
1496
  "api โ†ฉ๏ธ Rollback โš ๏ธ | stage ": {
1497
+ "allow_failure": true,
1498
+ "artifacts": {
1499
+ "reports": {
1500
+ "dotenv": "gitlab_environment.env",
1501
+ },
1502
+ },
1560
1503
  "environment": {
1561
1504
  "action": "access",
1562
1505
  "name": "stage/api",
1563
- "url": "https://api.stage.test-app.pan.panter.cloud",
1506
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1564
1507
  },
1565
1508
  "image": "path/to/docker/kubernetes:the-version",
1566
1509
  "interruptible": true,
@@ -1574,87 +1517,49 @@ cloudsql:
1574
1517
  },
1575
1518
  "rules": [
1576
1519
  {
1577
- "allow_failure": true,
1578
1520
  "when": "manual",
1579
1521
  },
1580
1522
  ],
1581
1523
  "script": [
1524
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1525
+ "export ENV_SHORT="stage"",
1526
+ "export APP_DIR="api"",
1527
+ "export ENV_TYPE="stage"",
1528
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1529
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1530
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
1531
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
1532
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
1533
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
1534
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
1535
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
1536
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
1537
+ "export KUBE_APP_NAME="api"",
1538
+ "export KUBE_APP_NAME_PREFIX=""",
1539
+ "export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"",
1540
+ "export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"",
1541
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
1542
+ "export RELEASE_NAME="pan-test-app-stage-api"",
1543
+ "export HELM_EXPERIMENTAL_OCI="1"",
1544
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1545
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1546
+ "export HELM_ARGS=""",
1547
+ "export COMPONENT_NAME="api"",
1548
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1549
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1582
1550
  "kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
1583
1551
  "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
1584
1552
  "kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"",
1585
1553
  "kubectl config use-context "kube-pan-test-app-stage-api"",
1586
1554
  "kubernetesRollback",
1555
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
1587
1556
  ],
1588
1557
  "stage": "rollback stage",
1589
1558
  "variables": {
1590
- "APP_DIR": "api",
1591
- "BUILD_ID": "some-id",
1592
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1593
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1594
- "BUILD_INFO_ID": "some-id",
1595
- "COMPONENT_NAME": "api",
1596
- "ENV_SHORT": "stage",
1597
- "ENV_TYPE": "stage",
1598
1559
  "GIT_STRATEGY": "none",
1599
- "HELM_ARGS": "",
1600
- "HELM_EXPERIMENTAL_OCI": "1",
1601
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1602
- "HOST": "api.stage.test-app.pan.panter.cloud",
1603
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
1604
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
1605
1560
  "KUBERNETES_CPU_REQUEST": "0.5",
1606
1561
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
1607
1562
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
1608
- "KUBE_APP_NAME": "api",
1609
- "KUBE_APP_NAME_PREFIX": "",
1610
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1611
- "KUBE_NAMESPACE": "pan-test-app-stage",
1612
- "KUBE_VALUES": "env:
1613
- secret:
1614
- POSTGRESQL_PASSWORD: '$CL_stage_api_POSTGRESQL_PASSWORD'
1615
- cloudsqlProxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
1616
- public:
1617
- ENV_SHORT: 'stage'
1618
- APP_DIR: 'api'
1619
- ENV_TYPE: 'stage'
1620
- BUILD_INFO_ID: 'some-id'
1621
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1622
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1623
- HOST: 'api.stage.test-app.pan.panter.cloud'
1624
- ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
1625
- HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
1626
- ROOT_URL_INTERNAL: 'https://api.stage.test-app.pan.panter.cloud'
1627
- KUBE_NAMESPACE: 'pan-test-app-stage'
1628
- KUBE_APP_NAME: 'api'
1629
- KUBE_APP_NAME_PREFIX: ''
1630
- HOST_INTERNAL: 'api.stage.test-app.pan.panter.cloud'
1631
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
1632
- application:
1633
- host: 'api.stage.test-app.pan.panter.cloud'
1634
- command: 'yarn start'
1635
- livenessProbe:
1636
- httpGet:
1637
- path: '__health'
1638
- readinessProbe:
1639
- httpGet:
1640
- path: '__health'
1641
- startupProbe:
1642
- httpGet:
1643
- path: '__health'
1644
- cloudsql:
1645
- enabled: true
1646
- dbUser: 'postgres'
1647
- instanceConnectionName: 'myproject:europe-west6:instance-name'
1648
- proxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
1649
- fullDbName: 'pan-test-app-stage-api'
1650
- type: 'unmanaged'
1651
- ",
1652
- "POSTGRESQL_PASSWORD": "$CL_stage_api_POSTGRESQL_PASSWORD",
1653
- "RELEASE_NAME": "pan-test-app-stage-api",
1654
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
1655
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
1656
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
1657
- "cloudsqlProxyCredentials": "$CL_stage_api_cloudsqlProxyCredentials",
1658
1563
  },
1659
1564
  },
1660
1565
  "api ๐Ÿ”จ app | prod ": {
@@ -1704,7 +1609,26 @@ cloudsql:
1704
1609
  ],
1705
1610
  },
1706
1611
  "script": [
1707
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1612
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1613
+ "export ENV_SHORT="prod"",
1614
+ "export APP_DIR="api"",
1615
+ "export ENV_TYPE="prod"",
1616
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1617
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1618
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
1619
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
1620
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
1621
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
1622
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
1623
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
1624
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
1625
+ "export KUBE_APP_NAME="api"",
1626
+ "export KUBE_APP_NAME_PREFIX=""",
1627
+ "export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"",
1628
+ "export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"",
1629
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
1630
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1631
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
1708
1632
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1709
1633
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1710
1634
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -1721,26 +1645,9 @@ cloudsql:
1721
1645
  ],
1722
1646
  "stage": "build",
1723
1647
  "variables": {
1724
- "APP_DIR": "api",
1725
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1726
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1727
- "BUILD_INFO_ID": "some-id",
1728
- "ENV_SHORT": "prod",
1729
- "ENV_TYPE": "prod",
1730
- "HOST": "api.prod.test-app.pan.panter.cloud",
1731
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
1732
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
1733
1648
  "KUBERNETES_CPU_REQUEST": "0.5",
1734
1649
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1735
1650
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
1736
- "KUBE_APP_NAME": "api",
1737
- "KUBE_APP_NAME_PREFIX": "",
1738
- "KUBE_NAMESPACE": "pan-test-app-prod",
1739
- "POSTGRESQL_PASSWORD": "$CL_prod_api_POSTGRESQL_PASSWORD",
1740
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
1741
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
1742
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
1743
- "cloudsqlProxyCredentials": "$CL_prod_api_cloudsqlProxyCredentials",
1744
1651
  },
1745
1652
  },
1746
1653
  "api ๐Ÿ”จ app | stage ": {
@@ -1790,7 +1697,26 @@ cloudsql:
1790
1697
  ],
1791
1698
  },
1792
1699
  "script": [
1793
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1700
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1701
+ "export ENV_SHORT="stage"",
1702
+ "export APP_DIR="api"",
1703
+ "export ENV_TYPE="stage"",
1704
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1705
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1706
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
1707
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
1708
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
1709
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
1710
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
1711
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
1712
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
1713
+ "export KUBE_APP_NAME="api"",
1714
+ "export KUBE_APP_NAME_PREFIX=""",
1715
+ "export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"",
1716
+ "export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"",
1717
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
1718
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1719
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
1794
1720
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1795
1721
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1796
1722
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -1807,26 +1733,9 @@ cloudsql:
1807
1733
  ],
1808
1734
  "stage": "build",
1809
1735
  "variables": {
1810
- "APP_DIR": "api",
1811
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1812
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1813
- "BUILD_INFO_ID": "some-id",
1814
- "ENV_SHORT": "stage",
1815
- "ENV_TYPE": "stage",
1816
- "HOST": "api.stage.test-app.pan.panter.cloud",
1817
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
1818
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
1819
1736
  "KUBERNETES_CPU_REQUEST": "0.5",
1820
1737
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1821
1738
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
1822
- "KUBE_APP_NAME": "api",
1823
- "KUBE_APP_NAME_PREFIX": "",
1824
- "KUBE_NAMESPACE": "pan-test-app-stage",
1825
- "POSTGRESQL_PASSWORD": "$CL_stage_api_POSTGRESQL_PASSWORD",
1826
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
1827
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
1828
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
1829
- "cloudsqlProxyCredentials": "$CL_stage_api_cloudsqlProxyCredentials",
1830
1739
  },
1831
1740
  },
1832
1741
  "api ๐Ÿ”จ docker | prod ": {
@@ -1852,6 +1761,22 @@ cloudsql:
1852
1761
  ],
1853
1762
  },
1854
1763
  "script": [
1764
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1765
+ "export APP_DIR="api"",
1766
+ "export DOCKER_DIR="."",
1767
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1768
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1769
+ "export DOCKER_IMAGE_NAME="prod/api"",
1770
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1771
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1772
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1773
+ RUN yarn plugin import workspace-tools
1774
+ RUN yarn workspaces focus --production && yarn rebuild"",
1775
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1776
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1777
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1778
+ COPY --chown=node:node .yarn /app/.yarn"",
1779
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1855
1780
  "ensureNodeDockerfile",
1856
1781
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1857
1782
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -1875,25 +1800,9 @@ cloudsql:
1875
1800
  ],
1876
1801
  "stage": "build",
1877
1802
  "variables": {
1878
- "APP_DIR": "api",
1879
- "DOCKERFILE_ADDITIONS": undefined,
1880
- "DOCKERFILE_ADDITIONS_END": undefined,
1881
1803
  "DOCKER_BUILDKIT": "1",
1882
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1883
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1884
- RUN yarn plugin import workspace-tools
1885
- RUN yarn workspaces focus --production && yarn rebuild",
1886
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1887
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1888
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1889
- COPY --chown=node:node .yarn /app/.yarn",
1890
- "DOCKER_DIR": ".",
1891
1804
  "DOCKER_DRIVER": "overlay2",
1892
1805
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
1893
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1894
- "DOCKER_IMAGE_NAME": "prod/api",
1895
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1896
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1897
1806
  "DOCKER_TLS_CERTDIR": "",
1898
1807
  "KUBERNETES_CPU_REQUEST": "0.5",
1899
1808
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -1923,6 +1832,22 @@ COPY --chown=node:node .yarn /app/.yarn",
1923
1832
  ],
1924
1833
  },
1925
1834
  "script": [
1835
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1836
+ "export APP_DIR="api"",
1837
+ "export DOCKER_DIR="."",
1838
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1839
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1840
+ "export DOCKER_IMAGE_NAME="stage/api"",
1841
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1842
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1843
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1844
+ RUN yarn plugin import workspace-tools
1845
+ RUN yarn workspaces focus --production && yarn rebuild"",
1846
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1847
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1848
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1849
+ COPY --chown=node:node .yarn /app/.yarn"",
1850
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1926
1851
  "ensureNodeDockerfile",
1927
1852
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1928
1853
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -1946,25 +1871,9 @@ COPY --chown=node:node .yarn /app/.yarn",
1946
1871
  ],
1947
1872
  "stage": "build",
1948
1873
  "variables": {
1949
- "APP_DIR": "api",
1950
- "DOCKERFILE_ADDITIONS": undefined,
1951
- "DOCKERFILE_ADDITIONS_END": undefined,
1952
1874
  "DOCKER_BUILDKIT": "1",
1953
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1954
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1955
- RUN yarn plugin import workspace-tools
1956
- RUN yarn workspaces focus --production && yarn rebuild",
1957
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1958
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1959
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1960
- COPY --chown=node:node .yarn /app/.yarn",
1961
- "DOCKER_DIR": ".",
1962
1875
  "DOCKER_DRIVER": "overlay2",
1963
1876
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
1964
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1965
- "DOCKER_IMAGE_NAME": "stage/api",
1966
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1967
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1968
1877
  "DOCKER_TLS_CERTDIR": "",
1969
1878
  "KUBERNETES_CPU_REQUEST": "0.5",
1970
1879
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -1973,11 +1882,16 @@ COPY --chown=node:node .yarn /app/.yarn",
1973
1882
  },
1974
1883
  "api ๐Ÿš€ Deploy | prod ": {
1975
1884
  "allow_failure": true,
1885
+ "artifacts": {
1886
+ "reports": {
1887
+ "dotenv": "gitlab_environment.env",
1888
+ },
1889
+ },
1976
1890
  "environment": {
1977
1891
  "auto_stop_in": undefined,
1978
1892
  "name": "prod/api",
1979
1893
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | prod ",
1980
- "url": "https://api.prod.test-app.pan.panter.cloud",
1894
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1981
1895
  },
1982
1896
  "image": "path/to/docker/kubernetes:the-version",
1983
1897
  "interruptible": true,
@@ -2008,99 +1922,138 @@ COPY --chown=node:node .yarn /app/.yarn",
2008
1922
  },
2009
1923
  ],
2010
1924
  "script": [
1925
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1926
+ "export ENV_SHORT="prod"",
1927
+ "export APP_DIR="api"",
1928
+ "export ENV_TYPE="prod"",
1929
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1930
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1931
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
1932
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
1933
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
1934
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
1935
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
1936
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
1937
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
1938
+ "export KUBE_APP_NAME="api"",
1939
+ "export KUBE_APP_NAME_PREFIX=""",
1940
+ "export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"",
1941
+ "export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"",
1942
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
1943
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1944
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1945
+ "export DOCKER_IMAGE_NAME="prod/api"",
1946
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1947
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1948
+ "export RELEASE_NAME="pan-test-app-prod-api"",
1949
+ "export HELM_EXPERIMENTAL_OCI="1"",
1950
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1951
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1952
+ "export HELM_ARGS=""",
1953
+ "export COMPONENT_NAME="api"",
1954
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1955
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2011
1956
  "kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2012
1957
  "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
2013
1958
  "kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"",
2014
1959
  "kubectl config use-context "kube-pan-test-app-prod-api"",
2015
- "kubernetesCreateSecret",
2016
- "kubernetesDeploy",
2017
- "echo Uploading SBOM to Dependency Track",
2018
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
2019
- "echo deployment successful ๐Ÿ˜ป",
2020
- ],
2021
- "stage": "deploy prod",
2022
- "variables": {
2023
- "APP_DIR": "api",
2024
- "BUILD_ID": "some-id",
2025
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2026
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2027
- "BUILD_INFO_ID": "some-id",
2028
- "COMPONENT_NAME": "api",
2029
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
2030
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
2031
- "DOCKER_IMAGE_NAME": "prod/api",
2032
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2033
- "DOCKER_REGISTRY": "$CI_REGISTRY",
2034
- "ENV_SHORT": "prod",
2035
- "ENV_TYPE": "prod",
2036
- "HELM_ARGS": "",
2037
- "HELM_EXPERIMENTAL_OCI": "1",
2038
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2039
- "HOST": "api.prod.test-app.pan.panter.cloud",
2040
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
2041
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
2042
- "KUBERNETES_CPU_REQUEST": "0.5",
2043
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2044
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2045
- "KUBE_APP_NAME": "api",
2046
- "KUBE_APP_NAME_PREFIX": "",
2047
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2048
- "KUBE_NAMESPACE": "pan-test-app-prod",
2049
- "KUBE_VALUES": "env:
1960
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
1961
+ "cat > __all_values.yml <<EOF
1962
+ env:
2050
1963
  secret:
2051
- POSTGRESQL_PASSWORD: '$CL_prod_api_POSTGRESQL_PASSWORD'
2052
- cloudsqlProxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
1964
+ POSTGRESQL_PASSWORD: |-
1965
+ $(printf %s "$CL_prod_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1966
+ cloudsqlProxyCredentials: |-
1967
+ $(printf %s "$CL_prod_api_cloudsqlProxyCredentials" | sed 's/^/ /')
2053
1968
  public:
2054
- ENV_SHORT: 'prod'
2055
- APP_DIR: 'api'
2056
- ENV_TYPE: 'prod'
2057
- BUILD_INFO_ID: 'some-id'
2058
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2059
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2060
- HOST: 'api.prod.test-app.pan.panter.cloud'
2061
- ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
2062
- HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
2063
- ROOT_URL_INTERNAL: 'https://api.prod.test-app.pan.panter.cloud'
2064
- KUBE_NAMESPACE: 'pan-test-app-prod'
2065
- KUBE_APP_NAME: 'api'
2066
- KUBE_APP_NAME_PREFIX: ''
2067
- HOST_INTERNAL: 'api.prod.test-app.pan.panter.cloud'
2068
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
1969
+ ENV_SHORT: |-
1970
+ prod
1971
+ APP_DIR: |-
1972
+ api
1973
+ ENV_TYPE: |-
1974
+ prod
1975
+ BUILD_INFO_BUILD_ID: |-
1976
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1977
+ BUILD_INFO_BUILD_TIME: |-
1978
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1979
+ BUILD_INFO_CURRENT_VERSION: |-
1980
+ $(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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")" | sed 's/^/ /')
1981
+ HOST: |-
1982
+ api.prod.test-app.pan.panter.cloud
1983
+ ROOT_URL: |-
1984
+ https://api.prod.test-app.pan.panter.cloud
1985
+ HOST_INTERNAL: |-
1986
+ api.prod.test-app.pan.panter.cloud
1987
+ HOST_CANONICAL: |-
1988
+ api.prod.test-app.pan.panter.cloud
1989
+ ROOT_URL_INTERNAL: |-
1990
+ https://api.prod.test-app.pan.panter.cloud
1991
+ KUBE_NAMESPACE: |-
1992
+ pan-test-app-prod
1993
+ KUBE_APP_NAME: |-
1994
+ api
1995
+ KUBE_APP_NAME_PREFIX: ""
1996
+ _ALL_ENV_VAR_KEYS: |-
1997
+ ["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","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
2069
1998
  application:
2070
- host: 'api.prod.test-app.pan.panter.cloud'
2071
- command: 'yarn start'
1999
+ host: |-
2000
+ api.prod.test-app.pan.panter.cloud
2001
+ command: |-
2002
+ yarn start
2072
2003
  livenessProbe:
2073
2004
  httpGet:
2074
- path: '__health'
2005
+ path: |-
2006
+ __health
2075
2007
  readinessProbe:
2076
2008
  httpGet:
2077
- path: '__health'
2009
+ path: |-
2010
+ __health
2078
2011
  startupProbe:
2079
2012
  httpGet:
2080
- path: '__health'
2013
+ path: |-
2014
+ __health
2081
2015
  cloudsql:
2082
2016
  enabled: true
2083
- dbUser: 'postgres'
2084
- instanceConnectionName: 'myproject:europe-west6:instance-name'
2085
- proxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
2086
- fullDbName: 'pan-test-app-prod-api'
2087
- type: 'unmanaged'
2017
+ dbUser: |-
2018
+ postgres
2019
+ instanceConnectionName: |-
2020
+ myproject:europe-west6:instance-name
2021
+ proxyCredentials: |-
2022
+ $CL_prod_api_cloudsqlProxyCredentials
2023
+ fullDbName: |-
2024
+ pan-test-app-prod-api
2025
+ type: |-
2026
+ unmanaged
2027
+
2028
+ EOF
2088
2029
  ",
2089
- "POSTGRESQL_PASSWORD": "$CL_prod_api_POSTGRESQL_PASSWORD",
2090
- "RELEASE_NAME": "pan-test-app-prod-api",
2091
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
2092
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
2093
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
2094
- "cloudsqlProxyCredentials": "$CL_prod_api_cloudsqlProxyCredentials",
2030
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
2031
+ "kubernetesCreateSecret",
2032
+ "kubernetesDeploy",
2033
+ "echo Uploading SBOM to Dependency Track",
2034
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
2035
+ "echo deployment successful ๐Ÿ˜ป",
2036
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
2037
+ ],
2038
+ "stage": "deploy prod",
2039
+ "variables": {
2040
+ "KUBERNETES_CPU_REQUEST": "0.5",
2041
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2042
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2095
2043
  },
2096
2044
  },
2097
2045
  "api ๐Ÿš€ Deploy | stage ": {
2098
2046
  "allow_failure": false,
2047
+ "artifacts": {
2048
+ "reports": {
2049
+ "dotenv": "gitlab_environment.env",
2050
+ },
2051
+ },
2099
2052
  "environment": {
2100
2053
  "auto_stop_in": undefined,
2101
2054
  "name": "stage/api",
2102
2055
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | stage ",
2103
- "url": "https://api.stage.test-app.pan.panter.cloud",
2056
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2104
2057
  },
2105
2058
  "image": "path/to/docker/kubernetes:the-version",
2106
2059
  "interruptible": true,
@@ -2131,97 +2084,137 @@ cloudsql:
2131
2084
  },
2132
2085
  ],
2133
2086
  "script": [
2087
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2088
+ "export ENV_SHORT="stage"",
2089
+ "export APP_DIR="api"",
2090
+ "export ENV_TYPE="stage"",
2091
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2092
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2093
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
2094
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
2095
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
2096
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
2097
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
2098
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
2099
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
2100
+ "export KUBE_APP_NAME="api"",
2101
+ "export KUBE_APP_NAME_PREFIX=""",
2102
+ "export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"",
2103
+ "export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"",
2104
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
2105
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
2106
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
2107
+ "export DOCKER_IMAGE_NAME="stage/api"",
2108
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2109
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2110
+ "export RELEASE_NAME="pan-test-app-stage-api"",
2111
+ "export HELM_EXPERIMENTAL_OCI="1"",
2112
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2113
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2114
+ "export HELM_ARGS=""",
2115
+ "export COMPONENT_NAME="api"",
2116
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2117
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2134
2118
  "kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2135
2119
  "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
2136
2120
  "kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"",
2137
2121
  "kubectl config use-context "kube-pan-test-app-stage-api"",
2138
- "kubernetesCreateSecret",
2139
- "kubernetesDeploy",
2140
- "echo Uploading SBOM to Dependency Track",
2141
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
2142
- "echo deployment successful ๐Ÿ˜ป",
2143
- ],
2144
- "stage": "deploy stage",
2145
- "variables": {
2146
- "APP_DIR": "api",
2147
- "BUILD_ID": "some-id",
2148
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2149
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2150
- "BUILD_INFO_ID": "some-id",
2151
- "COMPONENT_NAME": "api",
2152
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
2153
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
2154
- "DOCKER_IMAGE_NAME": "stage/api",
2155
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2156
- "DOCKER_REGISTRY": "$CI_REGISTRY",
2157
- "ENV_SHORT": "stage",
2158
- "ENV_TYPE": "stage",
2159
- "HELM_ARGS": "",
2160
- "HELM_EXPERIMENTAL_OCI": "1",
2161
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2162
- "HOST": "api.stage.test-app.pan.panter.cloud",
2163
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
2164
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
2165
- "KUBERNETES_CPU_REQUEST": "0.5",
2166
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2167
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2168
- "KUBE_APP_NAME": "api",
2169
- "KUBE_APP_NAME_PREFIX": "",
2170
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2171
- "KUBE_NAMESPACE": "pan-test-app-stage",
2172
- "KUBE_VALUES": "env:
2122
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
2123
+ "cat > __all_values.yml <<EOF
2124
+ env:
2173
2125
  secret:
2174
- POSTGRESQL_PASSWORD: '$CL_stage_api_POSTGRESQL_PASSWORD'
2175
- cloudsqlProxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
2126
+ POSTGRESQL_PASSWORD: |-
2127
+ $(printf %s "$CL_stage_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
2128
+ cloudsqlProxyCredentials: |-
2129
+ $(printf %s "$CL_stage_api_cloudsqlProxyCredentials" | sed 's/^/ /')
2176
2130
  public:
2177
- ENV_SHORT: 'stage'
2178
- APP_DIR: 'api'
2179
- ENV_TYPE: 'stage'
2180
- BUILD_INFO_ID: 'some-id'
2181
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2182
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2183
- HOST: 'api.stage.test-app.pan.panter.cloud'
2184
- ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
2185
- HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
2186
- ROOT_URL_INTERNAL: 'https://api.stage.test-app.pan.panter.cloud'
2187
- KUBE_NAMESPACE: 'pan-test-app-stage'
2188
- KUBE_APP_NAME: 'api'
2189
- KUBE_APP_NAME_PREFIX: ''
2190
- HOST_INTERNAL: 'api.stage.test-app.pan.panter.cloud'
2191
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
2131
+ ENV_SHORT: |-
2132
+ stage
2133
+ APP_DIR: |-
2134
+ api
2135
+ ENV_TYPE: |-
2136
+ stage
2137
+ BUILD_INFO_BUILD_ID: |-
2138
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2139
+ BUILD_INFO_BUILD_TIME: |-
2140
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2141
+ BUILD_INFO_CURRENT_VERSION: |-
2142
+ $(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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")" | sed 's/^/ /')
2143
+ HOST: |-
2144
+ api.stage.test-app.pan.panter.cloud
2145
+ ROOT_URL: |-
2146
+ https://api.stage.test-app.pan.panter.cloud
2147
+ HOST_INTERNAL: |-
2148
+ api.stage.test-app.pan.panter.cloud
2149
+ HOST_CANONICAL: |-
2150
+ api.stage.test-app.pan.panter.cloud
2151
+ ROOT_URL_INTERNAL: |-
2152
+ https://api.stage.test-app.pan.panter.cloud
2153
+ KUBE_NAMESPACE: |-
2154
+ pan-test-app-stage
2155
+ KUBE_APP_NAME: |-
2156
+ api
2157
+ KUBE_APP_NAME_PREFIX: ""
2158
+ _ALL_ENV_VAR_KEYS: |-
2159
+ ["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","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
2192
2160
  application:
2193
- host: 'api.stage.test-app.pan.panter.cloud'
2194
- command: 'yarn start'
2161
+ host: |-
2162
+ api.stage.test-app.pan.panter.cloud
2163
+ command: |-
2164
+ yarn start
2195
2165
  livenessProbe:
2196
2166
  httpGet:
2197
- path: '__health'
2167
+ path: |-
2168
+ __health
2198
2169
  readinessProbe:
2199
2170
  httpGet:
2200
- path: '__health'
2171
+ path: |-
2172
+ __health
2201
2173
  startupProbe:
2202
2174
  httpGet:
2203
- path: '__health'
2175
+ path: |-
2176
+ __health
2204
2177
  cloudsql:
2205
2178
  enabled: true
2206
- dbUser: 'postgres'
2207
- instanceConnectionName: 'myproject:europe-west6:instance-name'
2208
- proxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
2209
- fullDbName: 'pan-test-app-stage-api'
2210
- type: 'unmanaged'
2179
+ dbUser: |-
2180
+ postgres
2181
+ instanceConnectionName: |-
2182
+ myproject:europe-west6:instance-name
2183
+ proxyCredentials: |-
2184
+ $CL_stage_api_cloudsqlProxyCredentials
2185
+ fullDbName: |-
2186
+ pan-test-app-stage-api
2187
+ type: |-
2188
+ unmanaged
2189
+
2190
+ EOF
2211
2191
  ",
2212
- "POSTGRESQL_PASSWORD": "$CL_stage_api_POSTGRESQL_PASSWORD",
2213
- "RELEASE_NAME": "pan-test-app-stage-api",
2214
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
2215
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
2216
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
2217
- "cloudsqlProxyCredentials": "$CL_stage_api_cloudsqlProxyCredentials",
2192
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
2193
+ "kubernetesCreateSecret",
2194
+ "kubernetesDeploy",
2195
+ "echo Uploading SBOM to Dependency Track",
2196
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
2197
+ "echo deployment successful ๐Ÿ˜ป",
2198
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
2199
+ ],
2200
+ "stage": "deploy stage",
2201
+ "variables": {
2202
+ "KUBERNETES_CPU_REQUEST": "0.5",
2203
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2204
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2218
2205
  },
2219
2206
  },
2220
2207
  "api ๐Ÿ›‘ Stop โš ๏ธ | prod ": {
2208
+ "allow_failure": true,
2209
+ "artifacts": {
2210
+ "reports": {
2211
+ "dotenv": "gitlab_environment.env",
2212
+ },
2213
+ },
2221
2214
  "environment": {
2222
2215
  "action": "stop",
2223
2216
  "name": "prod/api",
2224
- "url": "https://api.prod.test-app.pan.panter.cloud",
2217
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2225
2218
  },
2226
2219
  "image": "path/to/docker/kubernetes:the-version",
2227
2220
  "interruptible": true,
@@ -2235,16 +2228,40 @@ cloudsql:
2235
2228
  },
2236
2229
  "rules": [
2237
2230
  {
2238
- "allow_failure": true,
2239
2231
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2240
2232
  "when": "on_success",
2241
2233
  },
2242
2234
  {
2243
- "allow_failure": true,
2244
2235
  "when": "manual",
2245
2236
  },
2246
2237
  ],
2247
2238
  "script": [
2239
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2240
+ "export ENV_SHORT="prod"",
2241
+ "export APP_DIR="api"",
2242
+ "export ENV_TYPE="prod"",
2243
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2244
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2245
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
2246
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
2247
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
2248
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
2249
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
2250
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
2251
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
2252
+ "export KUBE_APP_NAME="api"",
2253
+ "export KUBE_APP_NAME_PREFIX=""",
2254
+ "export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"",
2255
+ "export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"",
2256
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
2257
+ "export RELEASE_NAME="pan-test-app-prod-api"",
2258
+ "export HELM_EXPERIMENTAL_OCI="1"",
2259
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2260
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2261
+ "export HELM_ARGS=""",
2262
+ "export COMPONENT_NAME="api"",
2263
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2264
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2248
2265
  "kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2249
2266
  "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
2250
2267
  "kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"",
@@ -2252,84 +2269,27 @@ cloudsql:
2252
2269
  "kubernetesDelete",
2253
2270
  "echo Disabling component in Dependency Track",
2254
2271
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" || true",
2272
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
2255
2273
  ],
2256
2274
  "stage": "stop prod",
2257
2275
  "variables": {
2258
- "APP_DIR": "api",
2259
- "BUILD_ID": "some-id",
2260
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2261
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2262
- "BUILD_INFO_ID": "some-id",
2263
- "COMPONENT_NAME": "api",
2264
- "ENV_SHORT": "prod",
2265
- "ENV_TYPE": "prod",
2266
2276
  "GIT_STRATEGY": "none",
2267
- "HELM_ARGS": "",
2268
- "HELM_EXPERIMENTAL_OCI": "1",
2269
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2270
- "HOST": "api.prod.test-app.pan.panter.cloud",
2271
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
2272
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
2273
2277
  "KUBERNETES_CPU_REQUEST": "0.5",
2274
2278
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
2275
2279
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
2276
- "KUBE_APP_NAME": "api",
2277
- "KUBE_APP_NAME_PREFIX": "",
2278
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2279
- "KUBE_NAMESPACE": "pan-test-app-prod",
2280
- "KUBE_VALUES": "env:
2281
- secret:
2282
- POSTGRESQL_PASSWORD: '$CL_prod_api_POSTGRESQL_PASSWORD'
2283
- cloudsqlProxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
2284
- public:
2285
- ENV_SHORT: 'prod'
2286
- APP_DIR: 'api'
2287
- ENV_TYPE: 'prod'
2288
- BUILD_INFO_ID: 'some-id'
2289
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2290
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2291
- HOST: 'api.prod.test-app.pan.panter.cloud'
2292
- ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
2293
- HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
2294
- ROOT_URL_INTERNAL: 'https://api.prod.test-app.pan.panter.cloud'
2295
- KUBE_NAMESPACE: 'pan-test-app-prod'
2296
- KUBE_APP_NAME: 'api'
2297
- KUBE_APP_NAME_PREFIX: ''
2298
- HOST_INTERNAL: 'api.prod.test-app.pan.panter.cloud'
2299
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
2300
- application:
2301
- host: 'api.prod.test-app.pan.panter.cloud'
2302
- command: 'yarn start'
2303
- livenessProbe:
2304
- httpGet:
2305
- path: '__health'
2306
- readinessProbe:
2307
- httpGet:
2308
- path: '__health'
2309
- startupProbe:
2310
- httpGet:
2311
- path: '__health'
2312
- cloudsql:
2313
- enabled: true
2314
- dbUser: 'postgres'
2315
- instanceConnectionName: 'myproject:europe-west6:instance-name'
2316
- proxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
2317
- fullDbName: 'pan-test-app-prod-api'
2318
- type: 'unmanaged'
2319
- ",
2320
- "POSTGRESQL_PASSWORD": "$CL_prod_api_POSTGRESQL_PASSWORD",
2321
- "RELEASE_NAME": "pan-test-app-prod-api",
2322
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
2323
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
2324
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
2325
- "cloudsqlProxyCredentials": "$CL_prod_api_cloudsqlProxyCredentials",
2326
2280
  },
2327
2281
  },
2328
2282
  "api ๐Ÿ›‘ Stop โš ๏ธ | stage ": {
2283
+ "allow_failure": true,
2284
+ "artifacts": {
2285
+ "reports": {
2286
+ "dotenv": "gitlab_environment.env",
2287
+ },
2288
+ },
2329
2289
  "environment": {
2330
2290
  "action": "stop",
2331
2291
  "name": "stage/api",
2332
- "url": "https://api.stage.test-app.pan.panter.cloud",
2292
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2333
2293
  },
2334
2294
  "image": "path/to/docker/kubernetes:the-version",
2335
2295
  "interruptible": true,
@@ -2343,16 +2303,40 @@ cloudsql:
2343
2303
  },
2344
2304
  "rules": [
2345
2305
  {
2346
- "allow_failure": true,
2347
2306
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2348
2307
  "when": "on_success",
2349
2308
  },
2350
2309
  {
2351
- "allow_failure": true,
2352
2310
  "when": "manual",
2353
2311
  },
2354
2312
  ],
2355
2313
  "script": [
2314
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2315
+ "export ENV_SHORT="stage"",
2316
+ "export APP_DIR="api"",
2317
+ "export ENV_TYPE="stage"",
2318
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2319
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2320
+ "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\\///'); [ -z "$tag" ] && echo "v0.0.0" || echo "$tag")"",
2321
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
2322
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
2323
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
2324
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
2325
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
2326
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
2327
+ "export KUBE_APP_NAME="api"",
2328
+ "export KUBE_APP_NAME_PREFIX=""",
2329
+ "export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"",
2330
+ "export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"",
2331
+ "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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"",
2332
+ "export RELEASE_NAME="pan-test-app-stage-api"",
2333
+ "export HELM_EXPERIMENTAL_OCI="1"",
2334
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2335
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2336
+ "export HELM_ARGS=""",
2337
+ "export COMPONENT_NAME="api"",
2338
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2339
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2356
2340
  "kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true",
2357
2341
  "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
2358
2342
  "kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"",
@@ -2360,77 +2344,14 @@ cloudsql:
2360
2344
  "kubernetesDelete",
2361
2345
  "echo Disabling component in Dependency Track",
2362
2346
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" || true",
2347
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
2363
2348
  ],
2364
2349
  "stage": "stop stage",
2365
2350
  "variables": {
2366
- "APP_DIR": "api",
2367
- "BUILD_ID": "some-id",
2368
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2369
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2370
- "BUILD_INFO_ID": "some-id",
2371
- "COMPONENT_NAME": "api",
2372
- "ENV_SHORT": "stage",
2373
- "ENV_TYPE": "stage",
2374
2351
  "GIT_STRATEGY": "none",
2375
- "HELM_ARGS": "",
2376
- "HELM_EXPERIMENTAL_OCI": "1",
2377
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2378
- "HOST": "api.stage.test-app.pan.panter.cloud",
2379
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
2380
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
2381
2352
  "KUBERNETES_CPU_REQUEST": "0.5",
2382
2353
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
2383
2354
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
2384
- "KUBE_APP_NAME": "api",
2385
- "KUBE_APP_NAME_PREFIX": "",
2386
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2387
- "KUBE_NAMESPACE": "pan-test-app-stage",
2388
- "KUBE_VALUES": "env:
2389
- secret:
2390
- POSTGRESQL_PASSWORD: '$CL_stage_api_POSTGRESQL_PASSWORD'
2391
- cloudsqlProxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
2392
- public:
2393
- ENV_SHORT: 'stage'
2394
- APP_DIR: 'api'
2395
- ENV_TYPE: 'stage'
2396
- BUILD_INFO_ID: 'some-id'
2397
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2398
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2399
- HOST: 'api.stage.test-app.pan.panter.cloud'
2400
- ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
2401
- HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
2402
- ROOT_URL_INTERNAL: 'https://api.stage.test-app.pan.panter.cloud'
2403
- KUBE_NAMESPACE: 'pan-test-app-stage'
2404
- KUBE_APP_NAME: 'api'
2405
- KUBE_APP_NAME_PREFIX: ''
2406
- HOST_INTERNAL: 'api.stage.test-app.pan.panter.cloud'
2407
- _ALL_ENV_VAR_KEYS: '["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]'
2408
- application:
2409
- host: 'api.stage.test-app.pan.panter.cloud'
2410
- command: 'yarn start'
2411
- livenessProbe:
2412
- httpGet:
2413
- path: '__health'
2414
- readinessProbe:
2415
- httpGet:
2416
- path: '__health'
2417
- startupProbe:
2418
- httpGet:
2419
- path: '__health'
2420
- cloudsql:
2421
- enabled: true
2422
- dbUser: 'postgres'
2423
- instanceConnectionName: 'myproject:europe-west6:instance-name'
2424
- proxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
2425
- fullDbName: 'pan-test-app-stage-api'
2426
- type: 'unmanaged'
2427
- ",
2428
- "POSTGRESQL_PASSWORD": "$CL_stage_api_POSTGRESQL_PASSWORD",
2429
- "RELEASE_NAME": "pan-test-app-stage-api",
2430
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
2431
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
2432
- "_ALL_ENV_VAR_KEYS": "["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_CANONICAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","HOST_INTERNAL","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]",
2433
- "cloudsqlProxyCredentials": "$CL_stage_api_cloudsqlProxyCredentials",
2434
2355
  },
2435
2356
  },
2436
2357
  "api ๐Ÿงพ sbom | prod ": {
@@ -2451,6 +2372,8 @@ cloudsql:
2451
2372
  ],
2452
2373
  },
2453
2374
  "script": [
2375
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2376
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2454
2377
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
2455
2378
  ],
2456
2379
  "stage": "build",
@@ -2474,6 +2397,8 @@ cloudsql:
2474
2397
  ],
2475
2398
  },
2476
2399
  "script": [
2400
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2401
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2477
2402
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
2478
2403
  ],
2479
2404
  "stage": "build",
@@ -2526,7 +2451,7 @@ cloudsql:
2526
2451
  ],
2527
2452
  "variables": {
2528
2453
  "FF_USE_FASTZIP": "true",
2529
- "GIT_DEPTH": 1,
2454
+ "GIT_DEPTH": "1",
2530
2455
  },
2531
2456
  "workflow": {
2532
2457
  "rules": [