@catladder/pipeline 1.144.1 โ†’ 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,86 +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: 'skynet-164509:europe-west6:pan-test-app-dev'
97
- proxyCredentials: '$CL_dev_api_cloudsqlProxyCredentials'
98
- fullDbName: 'api'
99
- ",
100
- "POSTGRESQL_PASSWORD": "$CL_dev_api_POSTGRESQL_PASSWORD",
101
- "RELEASE_NAME": "pan-test-app-dev-api",
102
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
103
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
104
- "_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"]",
105
- "cloudsqlProxyCredentials": "$CL_dev_api_cloudsqlProxyCredentials",
106
75
  },
107
76
  },
108
77
  "api ๐Ÿ‘ฎ lint": {
@@ -133,6 +102,9 @@ cloudsql:
133
102
  ],
134
103
  },
135
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"",
136
108
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
137
109
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
138
110
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -149,7 +121,6 @@ cloudsql:
149
121
  ],
150
122
  "stage": "test",
151
123
  "variables": {
152
- "APP_PATH": "api",
153
124
  "KUBERNETES_CPU_REQUEST": "0.5",
154
125
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
155
126
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -202,7 +173,26 @@ cloudsql:
202
173
  ],
203
174
  },
204
175
  "script": [
205
- "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",
206
196
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
207
197
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
208
198
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -219,26 +209,9 @@ cloudsql:
219
209
  ],
220
210
  "stage": "build",
221
211
  "variables": {
222
- "APP_DIR": "api",
223
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
224
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
225
- "BUILD_INFO_ID": "some-id",
226
- "ENV_SHORT": "dev",
227
- "ENV_TYPE": "dev",
228
- "HOST": "api.dev.test-app.pan.panter.cloud",
229
- "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
230
- "HOST_INTERNAL": "api.dev.test-app.pan.panter.cloud",
231
212
  "KUBERNETES_CPU_REQUEST": "0.5",
232
213
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
233
214
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
234
- "KUBE_APP_NAME": "api",
235
- "KUBE_APP_NAME_PREFIX": "",
236
- "KUBE_NAMESPACE": "pan-test-app-dev",
237
- "POSTGRESQL_PASSWORD": "$CL_dev_api_POSTGRESQL_PASSWORD",
238
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
239
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
240
- "_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"]",
241
- "cloudsqlProxyCredentials": "$CL_dev_api_cloudsqlProxyCredentials",
242
215
  },
243
216
  },
244
217
  "api ๐Ÿ”จ docker | dev ": {
@@ -264,6 +237,22 @@ cloudsql:
264
237
  ],
265
238
  },
266
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"",
267
256
  "ensureNodeDockerfile",
268
257
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
269
258
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -287,25 +276,9 @@ cloudsql:
287
276
  ],
288
277
  "stage": "build",
289
278
  "variables": {
290
- "APP_DIR": "api",
291
- "DOCKERFILE_ADDITIONS": undefined,
292
- "DOCKERFILE_ADDITIONS_END": undefined,
293
279
  "DOCKER_BUILDKIT": "1",
294
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
295
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
296
- RUN yarn plugin import workspace-tools
297
- RUN yarn workspaces focus --production && yarn rebuild",
298
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
299
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
300
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
301
- COPY --chown=node:node .yarn /app/.yarn",
302
- "DOCKER_DIR": ".",
303
280
  "DOCKER_DRIVER": "overlay2",
304
281
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
305
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
306
- "DOCKER_IMAGE_NAME": "dev/api",
307
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
308
- "DOCKER_REGISTRY": "$CI_REGISTRY",
309
282
  "DOCKER_TLS_CERTDIR": "",
310
283
  "KUBERNETES_CPU_REQUEST": "0.5",
311
284
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -314,11 +287,16 @@ COPY --chown=node:node .yarn /app/.yarn",
314
287
  },
315
288
  "api ๐Ÿš€ Deploy | dev ": {
316
289
  "allow_failure": false,
290
+ "artifacts": {
291
+ "reports": {
292
+ "dotenv": "gitlab_environment.env",
293
+ },
294
+ },
317
295
  "environment": {
318
296
  "auto_stop_in": "4 weeks",
319
297
  "name": "dev/api",
320
298
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | dev ",
321
- "url": "https://api.dev.test-app.pan.panter.cloud",
299
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
322
300
  },
323
301
  "image": "path/to/docker/kubernetes:the-version",
324
302
  "interruptible": true,
@@ -361,96 +339,135 @@ COPY --chown=node:node .yarn /app/.yarn",
361
339
  },
362
340
  ],
363
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"",
364
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",
365
374
  "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
366
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"",
367
376
  "kubectl config use-context "kube-pan-test-app-dev-api"",
368
- "kubernetesCreateSecret",
369
- "kubernetesDeploy",
370
- "echo Uploading SBOM to Dependency Track",
371
- "/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",
372
- "echo deployment successful ๐Ÿ˜ป",
373
- ],
374
- "stage": "deploy dev",
375
- "variables": {
376
- "APP_DIR": "api",
377
- "BUILD_ID": "some-id",
378
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
379
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
380
- "BUILD_INFO_ID": "some-id",
381
- "COMPONENT_NAME": "api",
382
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
383
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
384
- "DOCKER_IMAGE_NAME": "dev/api",
385
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
386
- "DOCKER_REGISTRY": "$CI_REGISTRY",
387
- "ENV_SHORT": "dev",
388
- "ENV_TYPE": "dev",
389
- "HELM_ARGS": "",
390
- "HELM_EXPERIMENTAL_OCI": "1",
391
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
392
- "HOST": "api.dev.test-app.pan.panter.cloud",
393
- "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
394
- "HOST_INTERNAL": "api.dev.test-app.pan.panter.cloud",
395
- "KUBERNETES_CPU_REQUEST": "0.5",
396
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
397
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
398
- "KUBE_APP_NAME": "api",
399
- "KUBE_APP_NAME_PREFIX": "",
400
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
401
- "KUBE_NAMESPACE": "pan-test-app-dev",
402
- "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:
403
380
  secret:
404
- POSTGRESQL_PASSWORD: '$CL_dev_api_POSTGRESQL_PASSWORD'
405
- 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/^/ /')
406
385
  public:
407
- ENV_SHORT: 'dev'
408
- APP_DIR: 'api'
409
- ENV_TYPE: 'dev'
410
- BUILD_INFO_ID: 'some-id'
411
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
412
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
413
- HOST: 'api.dev.test-app.pan.panter.cloud'
414
- ROOT_URL: 'https://api.dev.test-app.pan.panter.cloud'
415
- HOST_CANONICAL: 'api.dev.test-app.pan.panter.cloud'
416
- ROOT_URL_INTERNAL: 'https://api.dev.test-app.pan.panter.cloud'
417
- KUBE_NAMESPACE: 'pan-test-app-dev'
418
- KUBE_APP_NAME: 'api'
419
- KUBE_APP_NAME_PREFIX: ''
420
- HOST_INTERNAL: 'api.dev.test-app.pan.panter.cloud'
421
- _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"]
422
415
  application:
423
- host: 'api.dev.test-app.pan.panter.cloud'
424
- command: 'yarn start'
416
+ host: |-
417
+ api.dev.test-app.pan.panter.cloud
418
+ command: |-
419
+ yarn start
425
420
  livenessProbe:
426
421
  httpGet:
427
- path: '__health'
422
+ path: |-
423
+ __health
428
424
  readinessProbe:
429
425
  httpGet:
430
- path: '__health'
426
+ path: |-
427
+ __health
431
428
  startupProbe:
432
429
  httpGet:
433
- path: '__health'
430
+ path: |-
431
+ __health
434
432
  cloudsql:
435
433
  enabled: true
436
- dbUser: 'postgres'
437
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-dev'
438
- proxyCredentials: '$CL_dev_api_cloudsqlProxyCredentials'
439
- fullDbName: 'api'
434
+ dbUser: |-
435
+ postgres
436
+ instanceConnectionName: |-
437
+ skynet-164509:europe-west6:pan-test-app-dev
438
+ proxyCredentials: |-
439
+ $CL_dev_api_cloudsqlProxyCredentials
440
+ fullDbName: |-
441
+ api
442
+
443
+ EOF
440
444
  ",
441
- "POSTGRESQL_PASSWORD": "$CL_dev_api_POSTGRESQL_PASSWORD",
442
- "RELEASE_NAME": "pan-test-app-dev-api",
443
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
444
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
445
- "_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"]",
446
- "cloudsqlProxyCredentials": "$CL_dev_api_cloudsqlProxyCredentials",
445
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
446
+ "kubernetesCreateSecret",
447
+ "kubernetesDeploy",
448
+ "echo Uploading SBOM to Dependency Track",
449
+ "/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",
450
+ "echo deployment successful ๐Ÿ˜ป",
451
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
452
+ ],
453
+ "stage": "deploy dev",
454
+ "variables": {
455
+ "KUBERNETES_CPU_REQUEST": "0.5",
456
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
457
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
447
458
  },
448
459
  },
449
460
  "api ๐Ÿ›‘ Stop โš ๏ธ | dev ": {
461
+ "allow_failure": true,
462
+ "artifacts": {
463
+ "reports": {
464
+ "dotenv": "gitlab_environment.env",
465
+ },
466
+ },
450
467
  "environment": {
451
468
  "action": "stop",
452
469
  "name": "dev/api",
453
- "url": "https://api.dev.test-app.pan.panter.cloud",
470
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
454
471
  },
455
472
  "image": "path/to/docker/kubernetes:the-version",
456
473
  "interruptible": true,
@@ -464,16 +481,40 @@ cloudsql:
464
481
  },
465
482
  "rules": [
466
483
  {
467
- "allow_failure": true,
468
484
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
469
485
  "when": "on_success",
470
486
  },
471
487
  {
472
- "allow_failure": true,
473
488
  "when": "manual",
474
489
  },
475
490
  ],
476
491
  "script": [
492
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
493
+ "export ENV_SHORT="dev"",
494
+ "export APP_DIR="api"",
495
+ "export ENV_TYPE="dev"",
496
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
497
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
498
+ "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")"",
499
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
500
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
501
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
502
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
503
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
504
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
505
+ "export KUBE_APP_NAME="api"",
506
+ "export KUBE_APP_NAME_PREFIX=""",
507
+ "export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"",
508
+ "export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"",
509
+ "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\\"]"",
510
+ "export RELEASE_NAME="pan-test-app-dev-api"",
511
+ "export HELM_EXPERIMENTAL_OCI="1"",
512
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
513
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
514
+ "export HELM_ARGS=""",
515
+ "export COMPONENT_NAME="api"",
516
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
517
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
477
518
  "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",
478
519
  "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
479
520
  "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"",
@@ -481,76 +522,14 @@ cloudsql:
481
522
  "kubernetesDelete",
482
523
  "echo Disabling component in Dependency Track",
483
524
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" || true",
525
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
484
526
  ],
485
527
  "stage": "stop dev",
486
528
  "variables": {
487
- "APP_DIR": "api",
488
- "BUILD_ID": "some-id",
489
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
490
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
491
- "BUILD_INFO_ID": "some-id",
492
- "COMPONENT_NAME": "api",
493
- "ENV_SHORT": "dev",
494
- "ENV_TYPE": "dev",
495
529
  "GIT_STRATEGY": "none",
496
- "HELM_ARGS": "",
497
- "HELM_EXPERIMENTAL_OCI": "1",
498
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
499
- "HOST": "api.dev.test-app.pan.panter.cloud",
500
- "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
501
- "HOST_INTERNAL": "api.dev.test-app.pan.panter.cloud",
502
530
  "KUBERNETES_CPU_REQUEST": "0.5",
503
531
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
504
532
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
505
- "KUBE_APP_NAME": "api",
506
- "KUBE_APP_NAME_PREFIX": "",
507
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
508
- "KUBE_NAMESPACE": "pan-test-app-dev",
509
- "KUBE_VALUES": "env:
510
- secret:
511
- POSTGRESQL_PASSWORD: '$CL_dev_api_POSTGRESQL_PASSWORD'
512
- cloudsqlProxyCredentials: '$CL_dev_api_cloudsqlProxyCredentials'
513
- public:
514
- ENV_SHORT: 'dev'
515
- APP_DIR: 'api'
516
- ENV_TYPE: 'dev'
517
- BUILD_INFO_ID: 'some-id'
518
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
519
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
520
- HOST: 'api.dev.test-app.pan.panter.cloud'
521
- ROOT_URL: 'https://api.dev.test-app.pan.panter.cloud'
522
- HOST_CANONICAL: 'api.dev.test-app.pan.panter.cloud'
523
- ROOT_URL_INTERNAL: 'https://api.dev.test-app.pan.panter.cloud'
524
- KUBE_NAMESPACE: 'pan-test-app-dev'
525
- KUBE_APP_NAME: 'api'
526
- KUBE_APP_NAME_PREFIX: ''
527
- HOST_INTERNAL: 'api.dev.test-app.pan.panter.cloud'
528
- _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"]'
529
- application:
530
- host: 'api.dev.test-app.pan.panter.cloud'
531
- command: 'yarn start'
532
- livenessProbe:
533
- httpGet:
534
- path: '__health'
535
- readinessProbe:
536
- httpGet:
537
- path: '__health'
538
- startupProbe:
539
- httpGet:
540
- path: '__health'
541
- cloudsql:
542
- enabled: true
543
- dbUser: 'postgres'
544
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-dev'
545
- proxyCredentials: '$CL_dev_api_cloudsqlProxyCredentials'
546
- fullDbName: 'api'
547
- ",
548
- "POSTGRESQL_PASSWORD": "$CL_dev_api_POSTGRESQL_PASSWORD",
549
- "RELEASE_NAME": "pan-test-app-dev-api",
550
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
551
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
552
- "_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"]",
553
- "cloudsqlProxyCredentials": "$CL_dev_api_cloudsqlProxyCredentials",
554
533
  },
555
534
  },
556
535
  "api ๐Ÿ›ก audit": {
@@ -566,12 +545,14 @@ cloudsql:
566
545
  ],
567
546
  },
568
547
  "script": [
548
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
549
+ "export APP_PATH="api"",
550
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
569
551
  "cd api",
570
552
  "yarn npm audit --environment production",
571
553
  ],
572
554
  "stage": "test",
573
555
  "variables": {
574
- "APP_PATH": "api",
575
556
  "KUBERNETES_CPU_REQUEST": "0.5",
576
557
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
577
558
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -605,6 +586,9 @@ cloudsql:
605
586
  ],
606
587
  },
607
588
  "script": [
589
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
590
+ "export APP_PATH="api"",
591
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
608
592
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
609
593
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
610
594
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -621,7 +605,6 @@ cloudsql:
621
605
  ],
622
606
  "stage": "test",
623
607
  "variables": {
624
- "APP_PATH": "api",
625
608
  "KUBERNETES_CPU_REQUEST": "0.5",
626
609
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
627
610
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -645,6 +628,8 @@ cloudsql:
645
628
  ],
646
629
  },
647
630
  "script": [
631
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
632
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
648
633
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
649
634
  ],
650
635
  "stage": "build",
@@ -697,7 +682,7 @@ cloudsql:
697
682
  ],
698
683
  "variables": {
699
684
  "FF_USE_FASTZIP": "true",
700
- "GIT_DEPTH": 1,
685
+ "GIT_DEPTH": "1",
701
686
  },
702
687
  "workflow": {
703
688
  "rules": [
@@ -728,10 +713,16 @@ cloudsql:
728
713
  "image": "path/to/docker/jobs-default:the-version",
729
714
  "jobs": {
730
715
  "api โ†ฉ๏ธ Rollback โš ๏ธ | review ": {
716
+ "allow_failure": true,
717
+ "artifacts": {
718
+ "reports": {
719
+ "dotenv": "gitlab_environment.env",
720
+ },
721
+ },
731
722
  "environment": {
732
723
  "action": "access",
733
- "name": "review/some-commit/api",
734
- "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
724
+ "name": "review/$CI_COMMIT_REF_NAME/api",
725
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
735
726
  },
736
727
  "image": "path/to/docker/kubernetes:the-version",
737
728
  "interruptible": true,
@@ -745,86 +736,49 @@ cloudsql:
745
736
  },
746
737
  "rules": [
747
738
  {
748
- "allow_failure": true,
749
739
  "when": "manual",
750
740
  },
751
741
  ],
752
742
  "script": [
753
- "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",
754
- "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
755
- "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"",
756
- "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
743
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
744
+ "export ENV_SHORT="review"",
745
+ "export APP_DIR="api"",
746
+ "export ENV_TYPE="review"",
747
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
748
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
749
+ "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")"",
750
+ "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"",
751
+ "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"",
752
+ "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"",
753
+ "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"",
754
+ "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"",
755
+ "export KUBE_NAMESPACE="pan-test-app-review"",
756
+ "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"",
757
+ "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"; })-"",
758
+ "export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"",
759
+ "export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"",
760
+ "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\\"]"",
761
+ "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"",
762
+ "export HELM_EXPERIMENTAL_OCI="1"",
763
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
764
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
765
+ "export HELM_ARGS=""",
766
+ "export COMPONENT_NAME="api"",
767
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
768
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
769
+ "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",
770
+ "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"",
771
+ "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"",
772
+ "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"",
757
773
  "kubernetesRollback",
774
+ "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",
758
775
  ],
759
776
  "stage": "rollback review",
760
777
  "variables": {
761
- "APP_DIR": "api",
762
- "BUILD_ID": "some-id",
763
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
764
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
765
- "BUILD_INFO_ID": "some-id",
766
- "COMPONENT_NAME": "api",
767
- "ENV_SHORT": "review",
768
- "ENV_TYPE": "review",
769
778
  "GIT_STRATEGY": "none",
770
- "HELM_ARGS": "",
771
- "HELM_EXPERIMENTAL_OCI": "1",
772
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
773
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
774
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
775
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
776
779
  "KUBERNETES_CPU_REQUEST": "0.5",
777
780
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
778
781
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
779
- "KUBE_APP_NAME": "mr1234-api",
780
- "KUBE_APP_NAME_PREFIX": "mr1234-",
781
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
782
- "KUBE_NAMESPACE": "pan-test-app-review",
783
- "KUBE_VALUES": "env:
784
- secret:
785
- POSTGRESQL_PASSWORD: '$CL_review_api_POSTGRESQL_PASSWORD'
786
- cloudsqlProxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
787
- public:
788
- ENV_SHORT: 'review'
789
- APP_DIR: 'api'
790
- ENV_TYPE: 'review'
791
- BUILD_INFO_ID: 'some-id'
792
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
793
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
794
- HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
795
- ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
796
- HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
797
- ROOT_URL_INTERNAL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
798
- KUBE_NAMESPACE: 'pan-test-app-review'
799
- KUBE_APP_NAME: 'mr1234-api'
800
- KUBE_APP_NAME_PREFIX: 'mr1234-'
801
- HOST_INTERNAL: 'api.mr1234.review.test-app.pan.panter.cloud'
802
- _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"]'
803
- application:
804
- host: 'api.mr1234.review.test-app.pan.panter.cloud'
805
- command: 'yarn start'
806
- livenessProbe:
807
- httpGet:
808
- path: '__health'
809
- readinessProbe:
810
- httpGet:
811
- path: '__health'
812
- startupProbe:
813
- httpGet:
814
- path: '__health'
815
- cloudsql:
816
- enabled: true
817
- dbUser: 'postgres'
818
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-review'
819
- proxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
820
- fullDbName: 'mr1234-api'
821
- ",
822
- "POSTGRESQL_PASSWORD": "$CL_review_api_POSTGRESQL_PASSWORD",
823
- "RELEASE_NAME": "pan-test-app-review-mr1234-api",
824
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
825
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
826
- "_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"]",
827
- "cloudsqlProxyCredentials": "$CL_review_api_cloudsqlProxyCredentials",
828
782
  },
829
783
  },
830
784
  "api ๐Ÿ‘ฎ lint": {
@@ -855,6 +809,9 @@ cloudsql:
855
809
  ],
856
810
  },
857
811
  "script": [
812
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
813
+ "export APP_PATH="api"",
814
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
858
815
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
859
816
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
860
817
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -871,7 +828,6 @@ cloudsql:
871
828
  ],
872
829
  "stage": "test",
873
830
  "variables": {
874
- "APP_PATH": "api",
875
831
  "KUBERNETES_CPU_REQUEST": "0.5",
876
832
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
877
833
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -924,7 +880,26 @@ cloudsql:
924
880
  ],
925
881
  },
926
882
  "script": [
927
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
883
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
884
+ "export ENV_SHORT="review"",
885
+ "export APP_DIR="api"",
886
+ "export ENV_TYPE="review"",
887
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
888
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
889
+ "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")"",
890
+ "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"",
891
+ "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"",
892
+ "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"",
893
+ "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"",
894
+ "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"",
895
+ "export KUBE_NAMESPACE="pan-test-app-review"",
896
+ "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"",
897
+ "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"; })-"",
898
+ "export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"",
899
+ "export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"",
900
+ "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\\"]"",
901
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
902
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
928
903
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
929
904
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
930
905
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -941,26 +916,9 @@ cloudsql:
941
916
  ],
942
917
  "stage": "build",
943
918
  "variables": {
944
- "APP_DIR": "api",
945
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
946
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
947
- "BUILD_INFO_ID": "some-id",
948
- "ENV_SHORT": "review",
949
- "ENV_TYPE": "review",
950
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
951
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
952
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
953
919
  "KUBERNETES_CPU_REQUEST": "0.5",
954
920
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
955
921
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
956
- "KUBE_APP_NAME": "mr1234-api",
957
- "KUBE_APP_NAME_PREFIX": "mr1234-",
958
- "KUBE_NAMESPACE": "pan-test-app-review",
959
- "POSTGRESQL_PASSWORD": "$CL_review_api_POSTGRESQL_PASSWORD",
960
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
961
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
962
- "_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"]",
963
- "cloudsqlProxyCredentials": "$CL_review_api_cloudsqlProxyCredentials",
964
922
  },
965
923
  },
966
924
  "api ๐Ÿ”จ docker | review ": {
@@ -986,6 +944,22 @@ cloudsql:
986
944
  ],
987
945
  },
988
946
  "script": [
947
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
948
+ "export APP_DIR="api"",
949
+ "export DOCKER_DIR="."",
950
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
951
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
952
+ "export DOCKER_IMAGE_NAME="review/api"",
953
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
954
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
955
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
956
+ RUN yarn plugin import workspace-tools
957
+ RUN yarn workspaces focus --production && yarn rebuild"",
958
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
959
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
960
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
961
+ COPY --chown=node:node .yarn /app/.yarn"",
962
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
989
963
  "ensureNodeDockerfile",
990
964
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
991
965
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -1009,25 +983,9 @@ cloudsql:
1009
983
  ],
1010
984
  "stage": "build",
1011
985
  "variables": {
1012
- "APP_DIR": "api",
1013
- "DOCKERFILE_ADDITIONS": undefined,
1014
- "DOCKERFILE_ADDITIONS_END": undefined,
1015
986
  "DOCKER_BUILDKIT": "1",
1016
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1017
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1018
- RUN yarn plugin import workspace-tools
1019
- RUN yarn workspaces focus --production && yarn rebuild",
1020
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1021
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1022
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1023
- COPY --chown=node:node .yarn /app/.yarn",
1024
- "DOCKER_DIR": ".",
1025
987
  "DOCKER_DRIVER": "overlay2",
1026
988
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
1027
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1028
- "DOCKER_IMAGE_NAME": "review/api",
1029
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1030
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1031
989
  "DOCKER_TLS_CERTDIR": "",
1032
990
  "KUBERNETES_CPU_REQUEST": "0.5",
1033
991
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -1036,11 +994,16 @@ COPY --chown=node:node .yarn /app/.yarn",
1036
994
  },
1037
995
  "api ๐Ÿš€ Deploy | review ": {
1038
996
  "allow_failure": false,
997
+ "artifacts": {
998
+ "reports": {
999
+ "dotenv": "gitlab_environment.env",
1000
+ },
1001
+ },
1039
1002
  "environment": {
1040
1003
  "auto_stop_in": "1 week",
1041
- "name": "review/some-commit/api",
1004
+ "name": "review/$CI_COMMIT_REF_NAME/api",
1042
1005
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | review ",
1043
- "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
1006
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1044
1007
  },
1045
1008
  "image": "path/to/docker/kubernetes:the-version",
1046
1009
  "interruptible": true,
@@ -1083,96 +1046,136 @@ COPY --chown=node:node .yarn /app/.yarn",
1083
1046
  },
1084
1047
  ],
1085
1048
  "script": [
1086
- "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",
1087
- "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
1088
- "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"",
1089
- "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
1090
- "kubernetesCreateSecret",
1091
- "kubernetesDeploy",
1092
- "echo Uploading SBOM to Dependency Track",
1093
- "/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",
1094
- "echo deployment successful ๐Ÿ˜ป",
1095
- ],
1096
- "stage": "deploy review",
1097
- "variables": {
1098
- "APP_DIR": "api",
1099
- "BUILD_ID": "some-id",
1100
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1101
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1102
- "BUILD_INFO_ID": "some-id",
1103
- "COMPONENT_NAME": "api",
1104
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1105
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1106
- "DOCKER_IMAGE_NAME": "review/api",
1107
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1108
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1109
- "ENV_SHORT": "review",
1110
- "ENV_TYPE": "review",
1111
- "HELM_ARGS": "",
1112
- "HELM_EXPERIMENTAL_OCI": "1",
1113
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1114
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
1115
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
1116
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
1117
- "KUBERNETES_CPU_REQUEST": "0.5",
1118
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1119
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1120
- "KUBE_APP_NAME": "mr1234-api",
1121
- "KUBE_APP_NAME_PREFIX": "mr1234-",
1122
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1123
- "KUBE_NAMESPACE": "pan-test-app-review",
1124
- "KUBE_VALUES": "env:
1049
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1050
+ "export ENV_SHORT="review"",
1051
+ "export APP_DIR="api"",
1052
+ "export ENV_TYPE="review"",
1053
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1054
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1055
+ "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")"",
1056
+ "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"",
1057
+ "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"",
1058
+ "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"",
1059
+ "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"",
1060
+ "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"",
1061
+ "export KUBE_NAMESPACE="pan-test-app-review"",
1062
+ "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"",
1063
+ "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"; })-"",
1064
+ "export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"",
1065
+ "export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"",
1066
+ "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\\"]"",
1067
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1068
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1069
+ "export DOCKER_IMAGE_NAME="review/api"",
1070
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1071
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1072
+ "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"",
1073
+ "export HELM_EXPERIMENTAL_OCI="1"",
1074
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1075
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1076
+ "export HELM_ARGS=""",
1077
+ "export COMPONENT_NAME="api"",
1078
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1079
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1080
+ "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",
1081
+ "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"",
1082
+ "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"",
1083
+ "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"",
1084
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
1085
+ "cat > __all_values.yml <<EOF
1086
+ env:
1125
1087
  secret:
1126
- POSTGRESQL_PASSWORD: '$CL_review_api_POSTGRESQL_PASSWORD'
1127
- cloudsqlProxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
1088
+ POSTGRESQL_PASSWORD: |-
1089
+ $(printf %s "$CL_review_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1090
+ cloudsqlProxyCredentials: |-
1091
+ $(printf %s "$CL_review_api_cloudsqlProxyCredentials" | sed 's/^/ /')
1128
1092
  public:
1129
- ENV_SHORT: 'review'
1130
- APP_DIR: 'api'
1131
- ENV_TYPE: 'review'
1132
- BUILD_INFO_ID: 'some-id'
1133
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1134
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1135
- HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
1136
- ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1137
- HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1138
- ROOT_URL_INTERNAL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1139
- KUBE_NAMESPACE: 'pan-test-app-review'
1140
- KUBE_APP_NAME: 'mr1234-api'
1141
- KUBE_APP_NAME_PREFIX: 'mr1234-'
1142
- HOST_INTERNAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1143
- _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"]'
1093
+ ENV_SHORT: |-
1094
+ review
1095
+ APP_DIR: |-
1096
+ api
1097
+ ENV_TYPE: |-
1098
+ review
1099
+ BUILD_INFO_BUILD_ID: |-
1100
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1101
+ BUILD_INFO_BUILD_TIME: |-
1102
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1103
+ BUILD_INFO_CURRENT_VERSION: |-
1104
+ $(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/^/ /')
1105
+ HOST: |-
1106
+ $(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/^/ /')
1107
+ ROOT_URL: |-
1108
+ $(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/^/ /')
1109
+ HOST_INTERNAL: |-
1110
+ $(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/^/ /')
1111
+ HOST_CANONICAL: |-
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
+ ROOT_URL_INTERNAL: |-
1114
+ $(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/^/ /')
1115
+ KUBE_NAMESPACE: |-
1116
+ pan-test-app-review
1117
+ KUBE_APP_NAME: |-
1118
+ $(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/^/ /')
1119
+ KUBE_APP_NAME_PREFIX: |-
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"; })-" | sed 's/^/ /')
1121
+ _ALL_ENV_VAR_KEYS: |-
1122
+ ["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"]
1144
1123
  application:
1145
- host: 'api.mr1234.review.test-app.pan.panter.cloud'
1146
- command: 'yarn start'
1124
+ host: |-
1125
+ $(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/^/ /')
1126
+ command: |-
1127
+ yarn start
1147
1128
  livenessProbe:
1148
1129
  httpGet:
1149
- path: '__health'
1130
+ path: |-
1131
+ __health
1150
1132
  readinessProbe:
1151
1133
  httpGet:
1152
- path: '__health'
1134
+ path: |-
1135
+ __health
1153
1136
  startupProbe:
1154
1137
  httpGet:
1155
- path: '__health'
1138
+ path: |-
1139
+ __health
1156
1140
  cloudsql:
1157
1141
  enabled: true
1158
- dbUser: 'postgres'
1159
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-review'
1160
- proxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
1161
- fullDbName: 'mr1234-api'
1142
+ dbUser: |-
1143
+ postgres
1144
+ instanceConnectionName: |-
1145
+ skynet-164509:europe-west6:pan-test-app-review
1146
+ proxyCredentials: |-
1147
+ $CL_review_api_cloudsqlProxyCredentials
1148
+ fullDbName: |-
1149
+ $(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/^/ /')
1150
+
1151
+ EOF
1162
1152
  ",
1163
- "POSTGRESQL_PASSWORD": "$CL_review_api_POSTGRESQL_PASSWORD",
1164
- "RELEASE_NAME": "pan-test-app-review-mr1234-api",
1165
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1166
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1167
- "_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"]",
1168
- "cloudsqlProxyCredentials": "$CL_review_api_cloudsqlProxyCredentials",
1153
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
1154
+ "kubernetesCreateSecret",
1155
+ "kubernetesDeploy",
1156
+ "echo Uploading SBOM to Dependency Track",
1157
+ "/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",
1158
+ "echo deployment successful ๐Ÿ˜ป",
1159
+ "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",
1160
+ ],
1161
+ "stage": "deploy review",
1162
+ "variables": {
1163
+ "KUBERNETES_CPU_REQUEST": "0.5",
1164
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1165
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1169
1166
  },
1170
1167
  },
1171
1168
  "api ๐Ÿ›‘ Stop โš ๏ธ | review ": {
1169
+ "allow_failure": true,
1170
+ "artifacts": {
1171
+ "reports": {
1172
+ "dotenv": "gitlab_environment.env",
1173
+ },
1174
+ },
1172
1175
  "environment": {
1173
1176
  "action": "stop",
1174
- "name": "review/some-commit/api",
1175
- "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
1177
+ "name": "review/$CI_COMMIT_REF_NAME/api",
1178
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1176
1179
  },
1177
1180
  "image": "path/to/docker/kubernetes:the-version",
1178
1181
  "interruptible": true,
@@ -1186,93 +1189,55 @@ cloudsql:
1186
1189
  },
1187
1190
  "rules": [
1188
1191
  {
1189
- "allow_failure": true,
1190
1192
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1191
1193
  "when": "on_success",
1192
1194
  },
1193
1195
  {
1194
- "allow_failure": true,
1195
1196
  "when": "manual",
1196
1197
  },
1197
1198
  ],
1198
1199
  "script": [
1199
- "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",
1200
- "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
1201
- "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"",
1202
- "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
1200
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1201
+ "export ENV_SHORT="review"",
1202
+ "export APP_DIR="api"",
1203
+ "export ENV_TYPE="review"",
1204
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1205
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1206
+ "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")"",
1207
+ "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"",
1208
+ "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"",
1209
+ "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"",
1210
+ "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"",
1211
+ "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"",
1212
+ "export KUBE_NAMESPACE="pan-test-app-review"",
1213
+ "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"",
1214
+ "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"; })-"",
1215
+ "export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"",
1216
+ "export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"",
1217
+ "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\\"]"",
1218
+ "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"",
1219
+ "export HELM_EXPERIMENTAL_OCI="1"",
1220
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1221
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1222
+ "export HELM_ARGS=""",
1223
+ "export COMPONENT_NAME="api"",
1224
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1225
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1226
+ "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",
1227
+ "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"",
1228
+ "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"",
1229
+ "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"",
1203
1230
  "kubernetesDelete",
1204
1231
  "echo Disabling component in Dependency Track",
1205
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.mr1234.review.test-app.pan.panter.cloud" || true",
1232
+ "/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",
1233
+ "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",
1206
1234
  ],
1207
1235
  "stage": "stop review",
1208
1236
  "variables": {
1209
- "APP_DIR": "api",
1210
- "BUILD_ID": "some-id",
1211
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1212
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1213
- "BUILD_INFO_ID": "some-id",
1214
- "COMPONENT_NAME": "api",
1215
- "ENV_SHORT": "review",
1216
- "ENV_TYPE": "review",
1217
1237
  "GIT_STRATEGY": "none",
1218
- "HELM_ARGS": "",
1219
- "HELM_EXPERIMENTAL_OCI": "1",
1220
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1221
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
1222
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
1223
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
1224
1238
  "KUBERNETES_CPU_REQUEST": "0.5",
1225
1239
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
1226
1240
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
1227
- "KUBE_APP_NAME": "mr1234-api",
1228
- "KUBE_APP_NAME_PREFIX": "mr1234-",
1229
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1230
- "KUBE_NAMESPACE": "pan-test-app-review",
1231
- "KUBE_VALUES": "env:
1232
- secret:
1233
- POSTGRESQL_PASSWORD: '$CL_review_api_POSTGRESQL_PASSWORD'
1234
- cloudsqlProxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
1235
- public:
1236
- ENV_SHORT: 'review'
1237
- APP_DIR: 'api'
1238
- ENV_TYPE: 'review'
1239
- BUILD_INFO_ID: 'some-id'
1240
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1241
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1242
- HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
1243
- ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1244
- HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1245
- ROOT_URL_INTERNAL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1246
- KUBE_NAMESPACE: 'pan-test-app-review'
1247
- KUBE_APP_NAME: 'mr1234-api'
1248
- KUBE_APP_NAME_PREFIX: 'mr1234-'
1249
- HOST_INTERNAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1250
- _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"]'
1251
- application:
1252
- host: 'api.mr1234.review.test-app.pan.panter.cloud'
1253
- command: 'yarn start'
1254
- livenessProbe:
1255
- httpGet:
1256
- path: '__health'
1257
- readinessProbe:
1258
- httpGet:
1259
- path: '__health'
1260
- startupProbe:
1261
- httpGet:
1262
- path: '__health'
1263
- cloudsql:
1264
- enabled: true
1265
- dbUser: 'postgres'
1266
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-review'
1267
- proxyCredentials: '$CL_review_api_cloudsqlProxyCredentials'
1268
- fullDbName: 'mr1234-api'
1269
- ",
1270
- "POSTGRESQL_PASSWORD": "$CL_review_api_POSTGRESQL_PASSWORD",
1271
- "RELEASE_NAME": "pan-test-app-review-mr1234-api",
1272
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1273
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1274
- "_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"]",
1275
- "cloudsqlProxyCredentials": "$CL_review_api_cloudsqlProxyCredentials",
1276
1241
  },
1277
1242
  },
1278
1243
  "api ๐Ÿ›ก audit": {
@@ -1288,12 +1253,14 @@ cloudsql:
1288
1253
  ],
1289
1254
  },
1290
1255
  "script": [
1256
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1257
+ "export APP_PATH="api"",
1258
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1291
1259
  "cd api",
1292
1260
  "yarn npm audit --environment production",
1293
1261
  ],
1294
1262
  "stage": "test",
1295
1263
  "variables": {
1296
- "APP_PATH": "api",
1297
1264
  "KUBERNETES_CPU_REQUEST": "0.5",
1298
1265
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1299
1266
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -1327,6 +1294,9 @@ cloudsql:
1327
1294
  ],
1328
1295
  },
1329
1296
  "script": [
1297
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1298
+ "export APP_PATH="api"",
1299
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1330
1300
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1331
1301
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1332
1302
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -1343,7 +1313,6 @@ cloudsql:
1343
1313
  ],
1344
1314
  "stage": "test",
1345
1315
  "variables": {
1346
- "APP_PATH": "api",
1347
1316
  "KUBERNETES_CPU_REQUEST": "0.5",
1348
1317
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1349
1318
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -1367,6 +1336,8 @@ cloudsql:
1367
1336
  ],
1368
1337
  },
1369
1338
  "script": [
1339
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1340
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1370
1341
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
1371
1342
  ],
1372
1343
  "stage": "build",
@@ -1419,7 +1390,7 @@ cloudsql:
1419
1390
  ],
1420
1391
  "variables": {
1421
1392
  "FF_USE_FASTZIP": "true",
1422
- "GIT_DEPTH": 1,
1393
+ "GIT_DEPTH": "1",
1423
1394
  },
1424
1395
  "workflow": {
1425
1396
  "rules": [
@@ -1450,10 +1421,16 @@ cloudsql:
1450
1421
  "image": "path/to/docker/jobs-default:the-version",
1451
1422
  "jobs": {
1452
1423
  "api โ†ฉ๏ธ Rollback โš ๏ธ | prod ": {
1424
+ "allow_failure": true,
1425
+ "artifacts": {
1426
+ "reports": {
1427
+ "dotenv": "gitlab_environment.env",
1428
+ },
1429
+ },
1453
1430
  "environment": {
1454
1431
  "action": "access",
1455
1432
  "name": "prod/api",
1456
- "url": "https://api.prod.test-app.pan.panter.cloud",
1433
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1457
1434
  },
1458
1435
  "image": "path/to/docker/kubernetes:the-version",
1459
1436
  "interruptible": true,
@@ -1467,93 +1444,62 @@ cloudsql:
1467
1444
  },
1468
1445
  "rules": [
1469
1446
  {
1470
- "allow_failure": true,
1471
1447
  "when": "manual",
1472
1448
  },
1473
1449
  ],
1474
1450
  "script": [
1451
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1452
+ "export ENV_SHORT="prod"",
1453
+ "export APP_DIR="api"",
1454
+ "export ENV_TYPE="prod"",
1455
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1456
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1457
+ "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")"",
1458
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
1459
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
1460
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
1461
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
1462
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
1463
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
1464
+ "export KUBE_APP_NAME="api"",
1465
+ "export KUBE_APP_NAME_PREFIX=""",
1466
+ "export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"",
1467
+ "export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"",
1468
+ "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\\"]"",
1469
+ "export RELEASE_NAME="pan-test-app-prod-api"",
1470
+ "export HELM_EXPERIMENTAL_OCI="1"",
1471
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1472
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1473
+ "export HELM_ARGS=""",
1474
+ "export COMPONENT_NAME="api"",
1475
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1476
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1475
1477
  "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",
1476
1478
  "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
1477
1479
  "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"",
1478
1480
  "kubectl config use-context "kube-pan-test-app-prod-api"",
1479
1481
  "kubernetesRollback",
1482
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
1480
1483
  ],
1481
1484
  "stage": "rollback prod",
1482
1485
  "variables": {
1483
- "APP_DIR": "api",
1484
- "BUILD_ID": "some-id",
1485
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1486
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1487
- "BUILD_INFO_ID": "some-id",
1488
- "COMPONENT_NAME": "api",
1489
- "ENV_SHORT": "prod",
1490
- "ENV_TYPE": "prod",
1491
1486
  "GIT_STRATEGY": "none",
1492
- "HELM_ARGS": "",
1493
- "HELM_EXPERIMENTAL_OCI": "1",
1494
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1495
- "HOST": "api.prod.test-app.pan.panter.cloud",
1496
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
1497
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
1498
1487
  "KUBERNETES_CPU_REQUEST": "0.5",
1499
1488
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
1500
1489
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
1501
- "KUBE_APP_NAME": "api",
1502
- "KUBE_APP_NAME_PREFIX": "",
1503
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1504
- "KUBE_NAMESPACE": "pan-test-app-prod",
1505
- "KUBE_VALUES": "env:
1506
- secret:
1507
- POSTGRESQL_PASSWORD: '$CL_prod_api_POSTGRESQL_PASSWORD'
1508
- cloudsqlProxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
1509
- public:
1510
- ENV_SHORT: 'prod'
1511
- APP_DIR: 'api'
1512
- ENV_TYPE: 'prod'
1513
- BUILD_INFO_ID: 'some-id'
1514
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1515
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1516
- HOST: 'api.prod.test-app.pan.panter.cloud'
1517
- ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
1518
- HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
1519
- ROOT_URL_INTERNAL: 'https://api.prod.test-app.pan.panter.cloud'
1520
- KUBE_NAMESPACE: 'pan-test-app-prod'
1521
- KUBE_APP_NAME: 'api'
1522
- KUBE_APP_NAME_PREFIX: ''
1523
- HOST_INTERNAL: 'api.prod.test-app.pan.panter.cloud'
1524
- _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"]'
1525
- application:
1526
- host: 'api.prod.test-app.pan.panter.cloud'
1527
- command: 'yarn start'
1528
- livenessProbe:
1529
- httpGet:
1530
- path: '__health'
1531
- readinessProbe:
1532
- httpGet:
1533
- path: '__health'
1534
- startupProbe:
1535
- httpGet:
1536
- path: '__health'
1537
- cloudsql:
1538
- enabled: true
1539
- dbUser: 'postgres'
1540
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-prod'
1541
- proxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
1542
- fullDbName: 'api'
1543
- ",
1544
- "POSTGRESQL_PASSWORD": "$CL_prod_api_POSTGRESQL_PASSWORD",
1545
- "RELEASE_NAME": "pan-test-app-prod-api",
1546
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
1547
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
1548
- "_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"]",
1549
- "cloudsqlProxyCredentials": "$CL_prod_api_cloudsqlProxyCredentials",
1550
1490
  },
1551
1491
  },
1552
1492
  "api โ†ฉ๏ธ Rollback โš ๏ธ | stage ": {
1493
+ "allow_failure": true,
1494
+ "artifacts": {
1495
+ "reports": {
1496
+ "dotenv": "gitlab_environment.env",
1497
+ },
1498
+ },
1553
1499
  "environment": {
1554
1500
  "action": "access",
1555
1501
  "name": "stage/api",
1556
- "url": "https://api.stage.test-app.pan.panter.cloud",
1502
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1557
1503
  },
1558
1504
  "image": "path/to/docker/kubernetes:the-version",
1559
1505
  "interruptible": true,
@@ -1567,86 +1513,49 @@ cloudsql:
1567
1513
  },
1568
1514
  "rules": [
1569
1515
  {
1570
- "allow_failure": true,
1571
1516
  "when": "manual",
1572
1517
  },
1573
1518
  ],
1574
1519
  "script": [
1520
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1521
+ "export ENV_SHORT="stage"",
1522
+ "export APP_DIR="api"",
1523
+ "export ENV_TYPE="stage"",
1524
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1525
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1526
+ "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")"",
1527
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
1528
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
1529
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
1530
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
1531
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
1532
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
1533
+ "export KUBE_APP_NAME="api"",
1534
+ "export KUBE_APP_NAME_PREFIX=""",
1535
+ "export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"",
1536
+ "export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"",
1537
+ "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\\"]"",
1538
+ "export RELEASE_NAME="pan-test-app-stage-api"",
1539
+ "export HELM_EXPERIMENTAL_OCI="1"",
1540
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1541
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1542
+ "export HELM_ARGS=""",
1543
+ "export COMPONENT_NAME="api"",
1544
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1545
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1575
1546
  "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",
1576
1547
  "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
1577
1548
  "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"",
1578
1549
  "kubectl config use-context "kube-pan-test-app-stage-api"",
1579
1550
  "kubernetesRollback",
1551
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
1580
1552
  ],
1581
1553
  "stage": "rollback stage",
1582
1554
  "variables": {
1583
- "APP_DIR": "api",
1584
- "BUILD_ID": "some-id",
1585
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1586
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1587
- "BUILD_INFO_ID": "some-id",
1588
- "COMPONENT_NAME": "api",
1589
- "ENV_SHORT": "stage",
1590
- "ENV_TYPE": "stage",
1591
1555
  "GIT_STRATEGY": "none",
1592
- "HELM_ARGS": "",
1593
- "HELM_EXPERIMENTAL_OCI": "1",
1594
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1595
- "HOST": "api.stage.test-app.pan.panter.cloud",
1596
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
1597
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
1598
1556
  "KUBERNETES_CPU_REQUEST": "0.5",
1599
1557
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
1600
1558
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
1601
- "KUBE_APP_NAME": "api",
1602
- "KUBE_APP_NAME_PREFIX": "",
1603
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1604
- "KUBE_NAMESPACE": "pan-test-app-stage",
1605
- "KUBE_VALUES": "env:
1606
- secret:
1607
- POSTGRESQL_PASSWORD: '$CL_stage_api_POSTGRESQL_PASSWORD'
1608
- cloudsqlProxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
1609
- public:
1610
- ENV_SHORT: 'stage'
1611
- APP_DIR: 'api'
1612
- ENV_TYPE: 'stage'
1613
- BUILD_INFO_ID: 'some-id'
1614
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1615
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1616
- HOST: 'api.stage.test-app.pan.panter.cloud'
1617
- ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
1618
- HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
1619
- ROOT_URL_INTERNAL: 'https://api.stage.test-app.pan.panter.cloud'
1620
- KUBE_NAMESPACE: 'pan-test-app-stage'
1621
- KUBE_APP_NAME: 'api'
1622
- KUBE_APP_NAME_PREFIX: ''
1623
- HOST_INTERNAL: 'api.stage.test-app.pan.panter.cloud'
1624
- _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"]'
1625
- application:
1626
- host: 'api.stage.test-app.pan.panter.cloud'
1627
- command: 'yarn start'
1628
- livenessProbe:
1629
- httpGet:
1630
- path: '__health'
1631
- readinessProbe:
1632
- httpGet:
1633
- path: '__health'
1634
- startupProbe:
1635
- httpGet:
1636
- path: '__health'
1637
- cloudsql:
1638
- enabled: true
1639
- dbUser: 'postgres'
1640
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-stage'
1641
- proxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
1642
- fullDbName: 'api'
1643
- ",
1644
- "POSTGRESQL_PASSWORD": "$CL_stage_api_POSTGRESQL_PASSWORD",
1645
- "RELEASE_NAME": "pan-test-app-stage-api",
1646
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
1647
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
1648
- "_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"]",
1649
- "cloudsqlProxyCredentials": "$CL_stage_api_cloudsqlProxyCredentials",
1650
1559
  },
1651
1560
  },
1652
1561
  "api ๐Ÿ”จ app | prod ": {
@@ -1696,7 +1605,26 @@ cloudsql:
1696
1605
  ],
1697
1606
  },
1698
1607
  "script": [
1699
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1608
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1609
+ "export ENV_SHORT="prod"",
1610
+ "export APP_DIR="api"",
1611
+ "export ENV_TYPE="prod"",
1612
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1613
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1614
+ "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")"",
1615
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
1616
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
1617
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
1618
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
1619
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
1620
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
1621
+ "export KUBE_APP_NAME="api"",
1622
+ "export KUBE_APP_NAME_PREFIX=""",
1623
+ "export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"",
1624
+ "export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"",
1625
+ "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\\"]"",
1626
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1627
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
1700
1628
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1701
1629
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1702
1630
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -1713,26 +1641,9 @@ cloudsql:
1713
1641
  ],
1714
1642
  "stage": "build",
1715
1643
  "variables": {
1716
- "APP_DIR": "api",
1717
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1718
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1719
- "BUILD_INFO_ID": "some-id",
1720
- "ENV_SHORT": "prod",
1721
- "ENV_TYPE": "prod",
1722
- "HOST": "api.prod.test-app.pan.panter.cloud",
1723
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
1724
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
1725
1644
  "KUBERNETES_CPU_REQUEST": "0.5",
1726
1645
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1727
1646
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
1728
- "KUBE_APP_NAME": "api",
1729
- "KUBE_APP_NAME_PREFIX": "",
1730
- "KUBE_NAMESPACE": "pan-test-app-prod",
1731
- "POSTGRESQL_PASSWORD": "$CL_prod_api_POSTGRESQL_PASSWORD",
1732
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
1733
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
1734
- "_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"]",
1735
- "cloudsqlProxyCredentials": "$CL_prod_api_cloudsqlProxyCredentials",
1736
1647
  },
1737
1648
  },
1738
1649
  "api ๐Ÿ”จ app | stage ": {
@@ -1782,7 +1693,26 @@ cloudsql:
1782
1693
  ],
1783
1694
  },
1784
1695
  "script": [
1785
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1696
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1697
+ "export ENV_SHORT="stage"",
1698
+ "export APP_DIR="api"",
1699
+ "export ENV_TYPE="stage"",
1700
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1701
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1702
+ "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")"",
1703
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
1704
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
1705
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
1706
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
1707
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
1708
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
1709
+ "export KUBE_APP_NAME="api"",
1710
+ "export KUBE_APP_NAME_PREFIX=""",
1711
+ "export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"",
1712
+ "export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"",
1713
+ "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\\"]"",
1714
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1715
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
1786
1716
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1787
1717
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1788
1718
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -1799,26 +1729,9 @@ cloudsql:
1799
1729
  ],
1800
1730
  "stage": "build",
1801
1731
  "variables": {
1802
- "APP_DIR": "api",
1803
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1804
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1805
- "BUILD_INFO_ID": "some-id",
1806
- "ENV_SHORT": "stage",
1807
- "ENV_TYPE": "stage",
1808
- "HOST": "api.stage.test-app.pan.panter.cloud",
1809
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
1810
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
1811
1732
  "KUBERNETES_CPU_REQUEST": "0.5",
1812
1733
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1813
1734
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
1814
- "KUBE_APP_NAME": "api",
1815
- "KUBE_APP_NAME_PREFIX": "",
1816
- "KUBE_NAMESPACE": "pan-test-app-stage",
1817
- "POSTGRESQL_PASSWORD": "$CL_stage_api_POSTGRESQL_PASSWORD",
1818
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
1819
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
1820
- "_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"]",
1821
- "cloudsqlProxyCredentials": "$CL_stage_api_cloudsqlProxyCredentials",
1822
1735
  },
1823
1736
  },
1824
1737
  "api ๐Ÿ”จ docker | prod ": {
@@ -1844,6 +1757,22 @@ cloudsql:
1844
1757
  ],
1845
1758
  },
1846
1759
  "script": [
1760
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1761
+ "export APP_DIR="api"",
1762
+ "export DOCKER_DIR="."",
1763
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1764
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1765
+ "export DOCKER_IMAGE_NAME="prod/api"",
1766
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1767
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1768
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1769
+ RUN yarn plugin import workspace-tools
1770
+ RUN yarn workspaces focus --production && yarn rebuild"",
1771
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1772
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1773
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1774
+ COPY --chown=node:node .yarn /app/.yarn"",
1775
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1847
1776
  "ensureNodeDockerfile",
1848
1777
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1849
1778
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -1867,25 +1796,9 @@ cloudsql:
1867
1796
  ],
1868
1797
  "stage": "build",
1869
1798
  "variables": {
1870
- "APP_DIR": "api",
1871
- "DOCKERFILE_ADDITIONS": undefined,
1872
- "DOCKERFILE_ADDITIONS_END": undefined,
1873
1799
  "DOCKER_BUILDKIT": "1",
1874
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1875
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1876
- RUN yarn plugin import workspace-tools
1877
- RUN yarn workspaces focus --production && yarn rebuild",
1878
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1879
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1880
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1881
- COPY --chown=node:node .yarn /app/.yarn",
1882
- "DOCKER_DIR": ".",
1883
1800
  "DOCKER_DRIVER": "overlay2",
1884
1801
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
1885
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1886
- "DOCKER_IMAGE_NAME": "prod/api",
1887
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1888
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1889
1802
  "DOCKER_TLS_CERTDIR": "",
1890
1803
  "KUBERNETES_CPU_REQUEST": "0.5",
1891
1804
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -1915,6 +1828,22 @@ COPY --chown=node:node .yarn /app/.yarn",
1915
1828
  ],
1916
1829
  },
1917
1830
  "script": [
1831
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1832
+ "export APP_DIR="api"",
1833
+ "export DOCKER_DIR="."",
1834
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1835
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1836
+ "export DOCKER_IMAGE_NAME="stage/api"",
1837
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1838
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1839
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1840
+ RUN yarn plugin import workspace-tools
1841
+ RUN yarn workspaces focus --production && yarn rebuild"",
1842
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1843
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1844
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1845
+ COPY --chown=node:node .yarn /app/.yarn"",
1846
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1918
1847
  "ensureNodeDockerfile",
1919
1848
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1920
1849
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -1938,25 +1867,9 @@ COPY --chown=node:node .yarn /app/.yarn",
1938
1867
  ],
1939
1868
  "stage": "build",
1940
1869
  "variables": {
1941
- "APP_DIR": "api",
1942
- "DOCKERFILE_ADDITIONS": undefined,
1943
- "DOCKERFILE_ADDITIONS_END": undefined,
1944
1870
  "DOCKER_BUILDKIT": "1",
1945
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1946
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1947
- RUN yarn plugin import workspace-tools
1948
- RUN yarn workspaces focus --production && yarn rebuild",
1949
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1950
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1951
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1952
- COPY --chown=node:node .yarn /app/.yarn",
1953
- "DOCKER_DIR": ".",
1954
1871
  "DOCKER_DRIVER": "overlay2",
1955
1872
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
1956
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1957
- "DOCKER_IMAGE_NAME": "stage/api",
1958
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1959
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1960
1873
  "DOCKER_TLS_CERTDIR": "",
1961
1874
  "KUBERNETES_CPU_REQUEST": "0.5",
1962
1875
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -1965,11 +1878,16 @@ COPY --chown=node:node .yarn /app/.yarn",
1965
1878
  },
1966
1879
  "api ๐Ÿš€ Deploy | prod ": {
1967
1880
  "allow_failure": true,
1881
+ "artifacts": {
1882
+ "reports": {
1883
+ "dotenv": "gitlab_environment.env",
1884
+ },
1885
+ },
1968
1886
  "environment": {
1969
1887
  "auto_stop_in": undefined,
1970
1888
  "name": "prod/api",
1971
1889
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | prod ",
1972
- "url": "https://api.prod.test-app.pan.panter.cloud",
1890
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1973
1891
  },
1974
1892
  "image": "path/to/docker/kubernetes:the-version",
1975
1893
  "interruptible": true,
@@ -2000,98 +1918,136 @@ COPY --chown=node:node .yarn /app/.yarn",
2000
1918
  },
2001
1919
  ],
2002
1920
  "script": [
1921
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1922
+ "export ENV_SHORT="prod"",
1923
+ "export APP_DIR="api"",
1924
+ "export ENV_TYPE="prod"",
1925
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1926
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1927
+ "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")"",
1928
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
1929
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
1930
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
1931
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
1932
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
1933
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
1934
+ "export KUBE_APP_NAME="api"",
1935
+ "export KUBE_APP_NAME_PREFIX=""",
1936
+ "export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"",
1937
+ "export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"",
1938
+ "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\\"]"",
1939
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1940
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1941
+ "export DOCKER_IMAGE_NAME="prod/api"",
1942
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1943
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1944
+ "export RELEASE_NAME="pan-test-app-prod-api"",
1945
+ "export HELM_EXPERIMENTAL_OCI="1"",
1946
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1947
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1948
+ "export HELM_ARGS=""",
1949
+ "export COMPONENT_NAME="api"",
1950
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1951
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2003
1952
  "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",
2004
1953
  "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
2005
1954
  "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"",
2006
1955
  "kubectl config use-context "kube-pan-test-app-prod-api"",
2007
- "kubernetesCreateSecret",
2008
- "kubernetesDeploy",
2009
- "echo Uploading SBOM to Dependency Track",
2010
- "/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",
2011
- "echo deployment successful ๐Ÿ˜ป",
2012
- ],
2013
- "stage": "deploy prod",
2014
- "variables": {
2015
- "APP_DIR": "api",
2016
- "BUILD_ID": "some-id",
2017
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2018
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2019
- "BUILD_INFO_ID": "some-id",
2020
- "COMPONENT_NAME": "api",
2021
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
2022
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
2023
- "DOCKER_IMAGE_NAME": "prod/api",
2024
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2025
- "DOCKER_REGISTRY": "$CI_REGISTRY",
2026
- "ENV_SHORT": "prod",
2027
- "ENV_TYPE": "prod",
2028
- "HELM_ARGS": "",
2029
- "HELM_EXPERIMENTAL_OCI": "1",
2030
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2031
- "HOST": "api.prod.test-app.pan.panter.cloud",
2032
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
2033
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
2034
- "KUBERNETES_CPU_REQUEST": "0.5",
2035
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2036
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2037
- "KUBE_APP_NAME": "api",
2038
- "KUBE_APP_NAME_PREFIX": "",
2039
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2040
- "KUBE_NAMESPACE": "pan-test-app-prod",
2041
- "KUBE_VALUES": "env:
1956
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
1957
+ "cat > __all_values.yml <<EOF
1958
+ env:
2042
1959
  secret:
2043
- POSTGRESQL_PASSWORD: '$CL_prod_api_POSTGRESQL_PASSWORD'
2044
- cloudsqlProxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
1960
+ POSTGRESQL_PASSWORD: |-
1961
+ $(printf %s "$CL_prod_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
1962
+ cloudsqlProxyCredentials: |-
1963
+ $(printf %s "$CL_prod_api_cloudsqlProxyCredentials" | sed 's/^/ /')
2045
1964
  public:
2046
- ENV_SHORT: 'prod'
2047
- APP_DIR: 'api'
2048
- ENV_TYPE: 'prod'
2049
- BUILD_INFO_ID: 'some-id'
2050
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2051
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2052
- HOST: 'api.prod.test-app.pan.panter.cloud'
2053
- ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
2054
- HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
2055
- ROOT_URL_INTERNAL: 'https://api.prod.test-app.pan.panter.cloud'
2056
- KUBE_NAMESPACE: 'pan-test-app-prod'
2057
- KUBE_APP_NAME: 'api'
2058
- KUBE_APP_NAME_PREFIX: ''
2059
- HOST_INTERNAL: 'api.prod.test-app.pan.panter.cloud'
2060
- _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"]'
1965
+ ENV_SHORT: |-
1966
+ prod
1967
+ APP_DIR: |-
1968
+ api
1969
+ ENV_TYPE: |-
1970
+ prod
1971
+ BUILD_INFO_BUILD_ID: |-
1972
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1973
+ BUILD_INFO_BUILD_TIME: |-
1974
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1975
+ BUILD_INFO_CURRENT_VERSION: |-
1976
+ $(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/^/ /')
1977
+ HOST: |-
1978
+ api.prod.test-app.pan.panter.cloud
1979
+ ROOT_URL: |-
1980
+ https://api.prod.test-app.pan.panter.cloud
1981
+ HOST_INTERNAL: |-
1982
+ api.prod.test-app.pan.panter.cloud
1983
+ HOST_CANONICAL: |-
1984
+ api.prod.test-app.pan.panter.cloud
1985
+ ROOT_URL_INTERNAL: |-
1986
+ https://api.prod.test-app.pan.panter.cloud
1987
+ KUBE_NAMESPACE: |-
1988
+ pan-test-app-prod
1989
+ KUBE_APP_NAME: |-
1990
+ api
1991
+ KUBE_APP_NAME_PREFIX: ""
1992
+ _ALL_ENV_VAR_KEYS: |-
1993
+ ["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"]
2061
1994
  application:
2062
- host: 'api.prod.test-app.pan.panter.cloud'
2063
- command: 'yarn start'
1995
+ host: |-
1996
+ api.prod.test-app.pan.panter.cloud
1997
+ command: |-
1998
+ yarn start
2064
1999
  livenessProbe:
2065
2000
  httpGet:
2066
- path: '__health'
2001
+ path: |-
2002
+ __health
2067
2003
  readinessProbe:
2068
2004
  httpGet:
2069
- path: '__health'
2005
+ path: |-
2006
+ __health
2070
2007
  startupProbe:
2071
2008
  httpGet:
2072
- path: '__health'
2009
+ path: |-
2010
+ __health
2073
2011
  cloudsql:
2074
2012
  enabled: true
2075
- dbUser: 'postgres'
2076
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-prod'
2077
- proxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
2078
- fullDbName: 'api'
2013
+ dbUser: |-
2014
+ postgres
2015
+ instanceConnectionName: |-
2016
+ skynet-164509:europe-west6:pan-test-app-prod
2017
+ proxyCredentials: |-
2018
+ $CL_prod_api_cloudsqlProxyCredentials
2019
+ fullDbName: |-
2020
+ api
2021
+
2022
+ EOF
2079
2023
  ",
2080
- "POSTGRESQL_PASSWORD": "$CL_prod_api_POSTGRESQL_PASSWORD",
2081
- "RELEASE_NAME": "pan-test-app-prod-api",
2082
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
2083
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
2084
- "_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"]",
2085
- "cloudsqlProxyCredentials": "$CL_prod_api_cloudsqlProxyCredentials",
2024
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
2025
+ "kubernetesCreateSecret",
2026
+ "kubernetesDeploy",
2027
+ "echo Uploading SBOM to Dependency Track",
2028
+ "/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",
2029
+ "echo deployment successful ๐Ÿ˜ป",
2030
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
2031
+ ],
2032
+ "stage": "deploy prod",
2033
+ "variables": {
2034
+ "KUBERNETES_CPU_REQUEST": "0.5",
2035
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2036
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2086
2037
  },
2087
2038
  },
2088
2039
  "api ๐Ÿš€ Deploy | stage ": {
2089
2040
  "allow_failure": false,
2041
+ "artifacts": {
2042
+ "reports": {
2043
+ "dotenv": "gitlab_environment.env",
2044
+ },
2045
+ },
2090
2046
  "environment": {
2091
2047
  "auto_stop_in": undefined,
2092
2048
  "name": "stage/api",
2093
2049
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | stage ",
2094
- "url": "https://api.stage.test-app.pan.panter.cloud",
2050
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2095
2051
  },
2096
2052
  "image": "path/to/docker/kubernetes:the-version",
2097
2053
  "interruptible": true,
@@ -2122,96 +2078,135 @@ cloudsql:
2122
2078
  },
2123
2079
  ],
2124
2080
  "script": [
2081
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2082
+ "export ENV_SHORT="stage"",
2083
+ "export APP_DIR="api"",
2084
+ "export ENV_TYPE="stage"",
2085
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2086
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2087
+ "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")"",
2088
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
2089
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
2090
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
2091
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
2092
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
2093
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
2094
+ "export KUBE_APP_NAME="api"",
2095
+ "export KUBE_APP_NAME_PREFIX=""",
2096
+ "export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"",
2097
+ "export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"",
2098
+ "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\\"]"",
2099
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
2100
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
2101
+ "export DOCKER_IMAGE_NAME="stage/api"",
2102
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2103
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2104
+ "export RELEASE_NAME="pan-test-app-stage-api"",
2105
+ "export HELM_EXPERIMENTAL_OCI="1"",
2106
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2107
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2108
+ "export HELM_ARGS=""",
2109
+ "export COMPONENT_NAME="api"",
2110
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2111
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2125
2112
  "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",
2126
2113
  "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
2127
2114
  "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"",
2128
2115
  "kubectl config use-context "kube-pan-test-app-stage-api"",
2129
- "kubernetesCreateSecret",
2130
- "kubernetesDeploy",
2131
- "echo Uploading SBOM to Dependency Track",
2132
- "/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",
2133
- "echo deployment successful ๐Ÿ˜ป",
2134
- ],
2135
- "stage": "deploy stage",
2136
- "variables": {
2137
- "APP_DIR": "api",
2138
- "BUILD_ID": "some-id",
2139
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2140
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2141
- "BUILD_INFO_ID": "some-id",
2142
- "COMPONENT_NAME": "api",
2143
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
2144
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
2145
- "DOCKER_IMAGE_NAME": "stage/api",
2146
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2147
- "DOCKER_REGISTRY": "$CI_REGISTRY",
2148
- "ENV_SHORT": "stage",
2149
- "ENV_TYPE": "stage",
2150
- "HELM_ARGS": "",
2151
- "HELM_EXPERIMENTAL_OCI": "1",
2152
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2153
- "HOST": "api.stage.test-app.pan.panter.cloud",
2154
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
2155
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
2156
- "KUBERNETES_CPU_REQUEST": "0.5",
2157
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2158
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2159
- "KUBE_APP_NAME": "api",
2160
- "KUBE_APP_NAME_PREFIX": "",
2161
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2162
- "KUBE_NAMESPACE": "pan-test-app-stage",
2163
- "KUBE_VALUES": "env:
2116
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
2117
+ "cat > __all_values.yml <<EOF
2118
+ env:
2164
2119
  secret:
2165
- POSTGRESQL_PASSWORD: '$CL_stage_api_POSTGRESQL_PASSWORD'
2166
- cloudsqlProxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
2120
+ POSTGRESQL_PASSWORD: |-
2121
+ $(printf %s "$CL_stage_api_POSTGRESQL_PASSWORD" | sed 's/^/ /')
2122
+ cloudsqlProxyCredentials: |-
2123
+ $(printf %s "$CL_stage_api_cloudsqlProxyCredentials" | sed 's/^/ /')
2167
2124
  public:
2168
- ENV_SHORT: 'stage'
2169
- APP_DIR: 'api'
2170
- ENV_TYPE: 'stage'
2171
- BUILD_INFO_ID: 'some-id'
2172
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2173
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2174
- HOST: 'api.stage.test-app.pan.panter.cloud'
2175
- ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
2176
- HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
2177
- ROOT_URL_INTERNAL: 'https://api.stage.test-app.pan.panter.cloud'
2178
- KUBE_NAMESPACE: 'pan-test-app-stage'
2179
- KUBE_APP_NAME: 'api'
2180
- KUBE_APP_NAME_PREFIX: ''
2181
- HOST_INTERNAL: 'api.stage.test-app.pan.panter.cloud'
2182
- _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"]'
2125
+ ENV_SHORT: |-
2126
+ stage
2127
+ APP_DIR: |-
2128
+ api
2129
+ ENV_TYPE: |-
2130
+ stage
2131
+ BUILD_INFO_BUILD_ID: |-
2132
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2133
+ BUILD_INFO_BUILD_TIME: |-
2134
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2135
+ BUILD_INFO_CURRENT_VERSION: |-
2136
+ $(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/^/ /')
2137
+ HOST: |-
2138
+ api.stage.test-app.pan.panter.cloud
2139
+ ROOT_URL: |-
2140
+ https://api.stage.test-app.pan.panter.cloud
2141
+ HOST_INTERNAL: |-
2142
+ api.stage.test-app.pan.panter.cloud
2143
+ HOST_CANONICAL: |-
2144
+ api.stage.test-app.pan.panter.cloud
2145
+ ROOT_URL_INTERNAL: |-
2146
+ https://api.stage.test-app.pan.panter.cloud
2147
+ KUBE_NAMESPACE: |-
2148
+ pan-test-app-stage
2149
+ KUBE_APP_NAME: |-
2150
+ api
2151
+ KUBE_APP_NAME_PREFIX: ""
2152
+ _ALL_ENV_VAR_KEYS: |-
2153
+ ["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"]
2183
2154
  application:
2184
- host: 'api.stage.test-app.pan.panter.cloud'
2185
- command: 'yarn start'
2155
+ host: |-
2156
+ api.stage.test-app.pan.panter.cloud
2157
+ command: |-
2158
+ yarn start
2186
2159
  livenessProbe:
2187
2160
  httpGet:
2188
- path: '__health'
2161
+ path: |-
2162
+ __health
2189
2163
  readinessProbe:
2190
2164
  httpGet:
2191
- path: '__health'
2165
+ path: |-
2166
+ __health
2192
2167
  startupProbe:
2193
2168
  httpGet:
2194
- path: '__health'
2169
+ path: |-
2170
+ __health
2195
2171
  cloudsql:
2196
2172
  enabled: true
2197
- dbUser: 'postgres'
2198
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-stage'
2199
- proxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
2200
- fullDbName: 'api'
2173
+ dbUser: |-
2174
+ postgres
2175
+ instanceConnectionName: |-
2176
+ skynet-164509:europe-west6:pan-test-app-stage
2177
+ proxyCredentials: |-
2178
+ $CL_stage_api_cloudsqlProxyCredentials
2179
+ fullDbName: |-
2180
+ api
2181
+
2182
+ EOF
2201
2183
  ",
2202
- "POSTGRESQL_PASSWORD": "$CL_stage_api_POSTGRESQL_PASSWORD",
2203
- "RELEASE_NAME": "pan-test-app-stage-api",
2204
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
2205
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
2206
- "_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"]",
2207
- "cloudsqlProxyCredentials": "$CL_stage_api_cloudsqlProxyCredentials",
2184
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
2185
+ "kubernetesCreateSecret",
2186
+ "kubernetesDeploy",
2187
+ "echo Uploading SBOM to Dependency Track",
2188
+ "/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",
2189
+ "echo deployment successful ๐Ÿ˜ป",
2190
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
2191
+ ],
2192
+ "stage": "deploy stage",
2193
+ "variables": {
2194
+ "KUBERNETES_CPU_REQUEST": "0.5",
2195
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2196
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2208
2197
  },
2209
2198
  },
2210
2199
  "api ๐Ÿ›‘ Stop โš ๏ธ | prod ": {
2200
+ "allow_failure": true,
2201
+ "artifacts": {
2202
+ "reports": {
2203
+ "dotenv": "gitlab_environment.env",
2204
+ },
2205
+ },
2211
2206
  "environment": {
2212
2207
  "action": "stop",
2213
2208
  "name": "prod/api",
2214
- "url": "https://api.prod.test-app.pan.panter.cloud",
2209
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2215
2210
  },
2216
2211
  "image": "path/to/docker/kubernetes:the-version",
2217
2212
  "interruptible": true,
@@ -2225,16 +2220,40 @@ cloudsql:
2225
2220
  },
2226
2221
  "rules": [
2227
2222
  {
2228
- "allow_failure": true,
2229
2223
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2230
2224
  "when": "on_success",
2231
2225
  },
2232
2226
  {
2233
- "allow_failure": true,
2234
2227
  "when": "manual",
2235
2228
  },
2236
2229
  ],
2237
2230
  "script": [
2231
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2232
+ "export ENV_SHORT="prod"",
2233
+ "export APP_DIR="api"",
2234
+ "export ENV_TYPE="prod"",
2235
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2236
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2237
+ "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")"",
2238
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
2239
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
2240
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
2241
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
2242
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
2243
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
2244
+ "export KUBE_APP_NAME="api"",
2245
+ "export KUBE_APP_NAME_PREFIX=""",
2246
+ "export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"",
2247
+ "export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"",
2248
+ "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\\"]"",
2249
+ "export RELEASE_NAME="pan-test-app-prod-api"",
2250
+ "export HELM_EXPERIMENTAL_OCI="1"",
2251
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2252
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2253
+ "export HELM_ARGS=""",
2254
+ "export COMPONENT_NAME="api"",
2255
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2256
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2238
2257
  "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",
2239
2258
  "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
2240
2259
  "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"",
@@ -2242,83 +2261,27 @@ cloudsql:
2242
2261
  "kubernetesDelete",
2243
2262
  "echo Disabling component in Dependency Track",
2244
2263
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" || true",
2264
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
2245
2265
  ],
2246
2266
  "stage": "stop prod",
2247
2267
  "variables": {
2248
- "APP_DIR": "api",
2249
- "BUILD_ID": "some-id",
2250
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2251
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2252
- "BUILD_INFO_ID": "some-id",
2253
- "COMPONENT_NAME": "api",
2254
- "ENV_SHORT": "prod",
2255
- "ENV_TYPE": "prod",
2256
2268
  "GIT_STRATEGY": "none",
2257
- "HELM_ARGS": "",
2258
- "HELM_EXPERIMENTAL_OCI": "1",
2259
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2260
- "HOST": "api.prod.test-app.pan.panter.cloud",
2261
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
2262
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
2263
2269
  "KUBERNETES_CPU_REQUEST": "0.5",
2264
2270
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
2265
2271
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
2266
- "KUBE_APP_NAME": "api",
2267
- "KUBE_APP_NAME_PREFIX": "",
2268
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2269
- "KUBE_NAMESPACE": "pan-test-app-prod",
2270
- "KUBE_VALUES": "env:
2271
- secret:
2272
- POSTGRESQL_PASSWORD: '$CL_prod_api_POSTGRESQL_PASSWORD'
2273
- cloudsqlProxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
2274
- public:
2275
- ENV_SHORT: 'prod'
2276
- APP_DIR: 'api'
2277
- ENV_TYPE: 'prod'
2278
- BUILD_INFO_ID: 'some-id'
2279
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2280
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2281
- HOST: 'api.prod.test-app.pan.panter.cloud'
2282
- ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
2283
- HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
2284
- ROOT_URL_INTERNAL: 'https://api.prod.test-app.pan.panter.cloud'
2285
- KUBE_NAMESPACE: 'pan-test-app-prod'
2286
- KUBE_APP_NAME: 'api'
2287
- KUBE_APP_NAME_PREFIX: ''
2288
- HOST_INTERNAL: 'api.prod.test-app.pan.panter.cloud'
2289
- _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"]'
2290
- application:
2291
- host: 'api.prod.test-app.pan.panter.cloud'
2292
- command: 'yarn start'
2293
- livenessProbe:
2294
- httpGet:
2295
- path: '__health'
2296
- readinessProbe:
2297
- httpGet:
2298
- path: '__health'
2299
- startupProbe:
2300
- httpGet:
2301
- path: '__health'
2302
- cloudsql:
2303
- enabled: true
2304
- dbUser: 'postgres'
2305
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-prod'
2306
- proxyCredentials: '$CL_prod_api_cloudsqlProxyCredentials'
2307
- fullDbName: 'api'
2308
- ",
2309
- "POSTGRESQL_PASSWORD": "$CL_prod_api_POSTGRESQL_PASSWORD",
2310
- "RELEASE_NAME": "pan-test-app-prod-api",
2311
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
2312
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
2313
- "_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"]",
2314
- "cloudsqlProxyCredentials": "$CL_prod_api_cloudsqlProxyCredentials",
2315
2272
  },
2316
2273
  },
2317
2274
  "api ๐Ÿ›‘ Stop โš ๏ธ | stage ": {
2275
+ "allow_failure": true,
2276
+ "artifacts": {
2277
+ "reports": {
2278
+ "dotenv": "gitlab_environment.env",
2279
+ },
2280
+ },
2318
2281
  "environment": {
2319
2282
  "action": "stop",
2320
2283
  "name": "stage/api",
2321
- "url": "https://api.stage.test-app.pan.panter.cloud",
2284
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2322
2285
  },
2323
2286
  "image": "path/to/docker/kubernetes:the-version",
2324
2287
  "interruptible": true,
@@ -2332,16 +2295,40 @@ cloudsql:
2332
2295
  },
2333
2296
  "rules": [
2334
2297
  {
2335
- "allow_failure": true,
2336
2298
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2337
2299
  "when": "on_success",
2338
2300
  },
2339
2301
  {
2340
- "allow_failure": true,
2341
2302
  "when": "manual",
2342
2303
  },
2343
2304
  ],
2344
2305
  "script": [
2306
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2307
+ "export ENV_SHORT="stage"",
2308
+ "export APP_DIR="api"",
2309
+ "export ENV_TYPE="stage"",
2310
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2311
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2312
+ "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")"",
2313
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
2314
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
2315
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
2316
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
2317
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
2318
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
2319
+ "export KUBE_APP_NAME="api"",
2320
+ "export KUBE_APP_NAME_PREFIX=""",
2321
+ "export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"",
2322
+ "export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"",
2323
+ "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\\"]"",
2324
+ "export RELEASE_NAME="pan-test-app-stage-api"",
2325
+ "export HELM_EXPERIMENTAL_OCI="1"",
2326
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2327
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2328
+ "export HELM_ARGS=""",
2329
+ "export COMPONENT_NAME="api"",
2330
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2331
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2345
2332
  "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",
2346
2333
  "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
2347
2334
  "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"",
@@ -2349,76 +2336,14 @@ cloudsql:
2349
2336
  "kubernetesDelete",
2350
2337
  "echo Disabling component in Dependency Track",
2351
2338
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" || true",
2339
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
2352
2340
  ],
2353
2341
  "stage": "stop stage",
2354
2342
  "variables": {
2355
- "APP_DIR": "api",
2356
- "BUILD_ID": "some-id",
2357
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2358
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2359
- "BUILD_INFO_ID": "some-id",
2360
- "COMPONENT_NAME": "api",
2361
- "ENV_SHORT": "stage",
2362
- "ENV_TYPE": "stage",
2363
2343
  "GIT_STRATEGY": "none",
2364
- "HELM_ARGS": "",
2365
- "HELM_EXPERIMENTAL_OCI": "1",
2366
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2367
- "HOST": "api.stage.test-app.pan.panter.cloud",
2368
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
2369
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
2370
2344
  "KUBERNETES_CPU_REQUEST": "0.5",
2371
2345
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
2372
2346
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
2373
- "KUBE_APP_NAME": "api",
2374
- "KUBE_APP_NAME_PREFIX": "",
2375
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2376
- "KUBE_NAMESPACE": "pan-test-app-stage",
2377
- "KUBE_VALUES": "env:
2378
- secret:
2379
- POSTGRESQL_PASSWORD: '$CL_stage_api_POSTGRESQL_PASSWORD'
2380
- cloudsqlProxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
2381
- public:
2382
- ENV_SHORT: 'stage'
2383
- APP_DIR: 'api'
2384
- ENV_TYPE: 'stage'
2385
- BUILD_INFO_ID: 'some-id'
2386
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2387
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2388
- HOST: 'api.stage.test-app.pan.panter.cloud'
2389
- ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
2390
- HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
2391
- ROOT_URL_INTERNAL: 'https://api.stage.test-app.pan.panter.cloud'
2392
- KUBE_NAMESPACE: 'pan-test-app-stage'
2393
- KUBE_APP_NAME: 'api'
2394
- KUBE_APP_NAME_PREFIX: ''
2395
- HOST_INTERNAL: 'api.stage.test-app.pan.panter.cloud'
2396
- _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"]'
2397
- application:
2398
- host: 'api.stage.test-app.pan.panter.cloud'
2399
- command: 'yarn start'
2400
- livenessProbe:
2401
- httpGet:
2402
- path: '__health'
2403
- readinessProbe:
2404
- httpGet:
2405
- path: '__health'
2406
- startupProbe:
2407
- httpGet:
2408
- path: '__health'
2409
- cloudsql:
2410
- enabled: true
2411
- dbUser: 'postgres'
2412
- instanceConnectionName: 'skynet-164509:europe-west6:pan-test-app-stage'
2413
- proxyCredentials: '$CL_stage_api_cloudsqlProxyCredentials'
2414
- fullDbName: 'api'
2415
- ",
2416
- "POSTGRESQL_PASSWORD": "$CL_stage_api_POSTGRESQL_PASSWORD",
2417
- "RELEASE_NAME": "pan-test-app-stage-api",
2418
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
2419
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
2420
- "_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"]",
2421
- "cloudsqlProxyCredentials": "$CL_stage_api_cloudsqlProxyCredentials",
2422
2347
  },
2423
2348
  },
2424
2349
  "api ๐Ÿงพ sbom | prod ": {
@@ -2439,6 +2364,8 @@ cloudsql:
2439
2364
  ],
2440
2365
  },
2441
2366
  "script": [
2367
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2368
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2442
2369
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
2443
2370
  ],
2444
2371
  "stage": "build",
@@ -2462,6 +2389,8 @@ cloudsql:
2462
2389
  ],
2463
2390
  },
2464
2391
  "script": [
2392
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2393
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2465
2394
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
2466
2395
  ],
2467
2396
  "stage": "build",
@@ -2514,7 +2443,7 @@ cloudsql:
2514
2443
  ],
2515
2444
  "variables": {
2516
2445
  "FF_USE_FASTZIP": "true",
2517
- "GIT_DEPTH": 1,
2446
+ "GIT_DEPTH": "1",
2518
2447
  },
2519
2448
  "workflow": {
2520
2449
  "rules": [