@catladder/pipeline 1.144.0 โ†’ 1.145.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. package/dist/bash/BashExpression.d.ts +40 -0
  2. package/dist/bash/BashExpression.js +124 -0
  3. package/dist/bash/bashExpressionPerPipelineType.d.ts +6 -0
  4. package/dist/bash/bashExpressionPerPipelineType.js +11 -0
  5. package/dist/bash/bashYaml.d.ts +10 -0
  6. package/dist/bash/bashYaml.js +46 -0
  7. package/dist/bash/getInjectVarsScript.d.ts +2 -0
  8. package/dist/bash/getInjectVarsScript.js +45 -0
  9. package/dist/bash/replaceAsync.d.ts +2 -0
  10. package/dist/{pipeline/commitInfo/getCommitInfo.js โ†’ bash/replaceAsync.js} +49 -21
  11. package/dist/build/base/__tests__/createArtifactsConfig.test.js +3 -1
  12. package/dist/build/base/constants.js +3 -1
  13. package/dist/build/base/createAppBuildJob.d.ts +2 -1
  14. package/dist/build/base/createAppBuildJob.js +10 -6
  15. package/dist/build/base/createArtifactsConfig.d.ts +1 -1
  16. package/dist/build/base/createArtifactsConfig.js +3 -1
  17. package/dist/build/base/index.js +3 -1
  18. package/dist/build/base/writeBuildInfo.js +4 -3
  19. package/dist/build/base/writeDotEnv.js +12 -3
  20. package/dist/build/custom/__tests__/testJob.test.js +3 -1
  21. package/dist/build/custom/buildJob.js +4 -12
  22. package/dist/build/custom/index.js +3 -1
  23. package/dist/build/custom/testJob.d.ts +1 -1
  24. package/dist/build/custom/testJob.js +18 -14
  25. package/dist/build/docker.d.ts +5 -31
  26. package/dist/build/docker.js +16 -9
  27. package/dist/build/index.d.ts +1 -1
  28. package/dist/build/index.js +13 -7
  29. package/dist/build/node/buildJob.js +4 -12
  30. package/dist/build/node/cache.js +6 -3
  31. package/dist/build/node/constants.js +3 -1
  32. package/dist/build/node/index.js +3 -1
  33. package/dist/build/node/meteor.js +5 -2
  34. package/dist/build/node/testJob.js +18 -14
  35. package/dist/build/node/yarn.d.ts +3 -2
  36. package/dist/build/node/yarn.js +6 -3
  37. package/dist/build/rails/build.js +3 -1
  38. package/dist/build/rails/index.js +3 -1
  39. package/dist/build/rails/test.js +15 -11
  40. package/dist/build/sbom.js +3 -1
  41. package/dist/build/types.d.ts +24 -18
  42. package/dist/build/types.js +3 -1
  43. package/dist/bundles/catladder-gitlab/index.js +3 -3
  44. package/dist/catladder-gitlab.js +10 -54
  45. package/dist/config/__tests__/configruedEnvs.test.js +3 -1
  46. package/dist/config/configruedEnvs.js +3 -1
  47. package/dist/config/index.js +13 -7
  48. package/dist/config/readConfig.js +6 -5
  49. package/dist/constants.js +5 -3
  50. package/dist/context/__tests__/resolveReferences.test.js +40 -8
  51. package/dist/context/getBuildInfoVariables.d.ts +7 -0
  52. package/dist/context/getBuildInfoVariables.js +29 -0
  53. package/dist/context/getEnvConfig.js +3 -1
  54. package/dist/context/getEnvType.js +3 -1
  55. package/dist/context/getEnvironment.d.ts +3 -3
  56. package/dist/context/getEnvironment.js +10 -14
  57. package/dist/context/getEnvironmentContext.d.ts +7 -3
  58. package/dist/context/getEnvironmentContext.js +21 -11
  59. package/dist/context/getEnvironmentVariables.d.ts +26 -5
  60. package/dist/context/getEnvironmentVariables.js +41 -25
  61. package/dist/context/getLabels.js +4 -2
  62. package/dist/context/getReviewSlug.d.ts +4 -0
  63. package/dist/context/getReviewSlug.js +22 -0
  64. package/dist/context/index.d.ts +12 -3
  65. package/dist/context/index.js +21 -15
  66. package/dist/context/resolveReferences.d.ts +3 -1
  67. package/dist/context/resolveReferences.js +53 -21
  68. package/dist/context/transformJobOnlyVars.d.ts +5 -2
  69. package/dist/context/transformJobOnlyVars.js +4 -2
  70. package/dist/context/utils/envVars.d.ts +1 -1
  71. package/dist/context/utils/envVars.js +5 -2
  72. package/dist/defaults/index.js +3 -1
  73. package/dist/deploy/base/deploy.d.ts +1 -1
  74. package/dist/deploy/base/deploy.js +12 -11
  75. package/dist/deploy/base/index.js +3 -1
  76. package/dist/deploy/base/rollback.d.ts +1 -1
  77. package/dist/deploy/base/rollback.js +13 -9
  78. package/dist/deploy/base/stop.d.ts +1 -1
  79. package/dist/deploy/base/stop.js +16 -11
  80. package/dist/deploy/base/types.d.ts +1 -1
  81. package/dist/deploy/base/types.js +3 -1
  82. package/dist/deploy/base/variables.js +3 -1
  83. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +2 -1
  84. package/dist/deploy/cloudRun/artifactsRegistry.js +6 -4
  85. package/dist/deploy/cloudRun/cleanup.js +3 -1
  86. package/dist/deploy/cloudRun/cloudRunRevisions.js +3 -1
  87. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +8 -5
  88. package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +2 -2
  89. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +6 -3
  90. package/dist/deploy/cloudRun/createJobs/common.d.ts +3 -3
  91. package/dist/deploy/cloudRun/createJobs/common.js +3 -1
  92. package/dist/deploy/cloudRun/createJobs/constants.d.ts +1 -0
  93. package/dist/deploy/cloudRun/createJobs/constants.js +7 -0
  94. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +9 -2
  95. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +3 -1
  96. package/dist/deploy/cloudRun/createJobs/index.js +25 -8
  97. package/dist/deploy/cloudRun/createJobs/volumes.js +3 -1
  98. package/dist/deploy/cloudRun/index.js +5 -3
  99. package/dist/deploy/cloudRun/utils/createArgsString.d.ts +2 -1
  100. package/dist/deploy/cloudRun/utils/createArgsString.js +3 -1
  101. package/dist/deploy/cloudRun/utils/database.js +13 -13
  102. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +3 -1
  103. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +1 -1
  104. package/dist/deploy/cloudRun/utils/getServiceName.js +3 -1
  105. package/dist/deploy/cloudRun/utils/jobName.d.ts +2 -1
  106. package/dist/deploy/cloudRun/utils/jobName.js +4 -2
  107. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +3 -1
  108. package/dist/deploy/cloudSql/utils.d.ts +2 -1
  109. package/dist/deploy/cloudSql/utils.js +7 -2
  110. package/dist/deploy/custom/deployJob.js +3 -1
  111. package/dist/deploy/custom/index.js +3 -1
  112. package/dist/deploy/dockerTag/deployJob.js +3 -1
  113. package/dist/deploy/dockerTag/index.js +3 -1
  114. package/dist/deploy/index.d.ts +4 -3
  115. package/dist/deploy/index.js +13 -7
  116. package/dist/deploy/kubernetes/additionalSecretKeys.js +3 -1
  117. package/dist/deploy/kubernetes/cloudSql/index.d.ts +3 -2
  118. package/dist/deploy/kubernetes/cloudSql/index.js +6 -4
  119. package/dist/deploy/kubernetes/deployJob.js +22 -15
  120. package/dist/deploy/kubernetes/index.js +51 -14
  121. package/dist/deploy/kubernetes/kubeEnv.d.ts +3 -2
  122. package/dist/deploy/kubernetes/kubeEnv.js +7 -4
  123. package/dist/deploy/kubernetes/kubeValues.d.ts +2 -2
  124. package/dist/deploy/kubernetes/kubeValues.js +3 -2
  125. package/dist/deploy/kubernetes/mongodb.js +3 -1
  126. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +2 -1
  127. package/dist/deploy/kubernetes/processSecretsAsFiles.js +3 -1
  128. package/dist/deploy/sbom.js +3 -1
  129. package/dist/deploy/types/base.d.ts +8 -2
  130. package/dist/deploy/types/base.js +3 -1
  131. package/dist/deploy/types/custom.d.ts +1 -1
  132. package/dist/deploy/types/custom.js +3 -1
  133. package/dist/deploy/types/dockerTag.d.ts +1 -1
  134. package/dist/deploy/types/dockerTag.js +3 -1
  135. package/dist/deploy/types/googleCloudRun.d.ts +19 -18
  136. package/dist/deploy/types/googleCloudRun.js +3 -1
  137. package/dist/deploy/types/index.d.ts +6 -6
  138. package/dist/deploy/types/index.js +13 -7
  139. package/dist/deploy/types/kubernetes.d.ts +22 -22
  140. package/dist/deploy/types/kubernetes.js +3 -1
  141. package/dist/deploy/utils.js +3 -1
  142. package/dist/index.d.ts +3 -2
  143. package/dist/index.js +16 -9
  144. package/dist/packageInfos.d.ts +2 -0
  145. package/dist/packageInfos.js +14 -0
  146. package/dist/pipeline/createAllJobs.d.ts +13 -5
  147. package/dist/pipeline/createAllJobs.js +21 -10
  148. package/dist/pipeline/createChildPipeline.d.ts +1 -1
  149. package/dist/pipeline/createChildPipeline.js +24 -7
  150. package/dist/pipeline/createJobsForComponent.d.ts +3 -3
  151. package/dist/pipeline/createJobsForComponent.js +19 -18
  152. package/dist/pipeline/createMainPipeline.d.ts +3 -0
  153. package/dist/pipeline/createMainPipeline.js +248 -0
  154. package/dist/pipeline/generatePipelineFiles.d.ts +2 -0
  155. package/dist/pipeline/generatePipelineFiles.js +178 -0
  156. package/dist/pipeline/getPipelineStages.js +3 -1
  157. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +15 -5
  158. package/dist/pipeline/gitlab/createGitlabJobs.js +98 -25
  159. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +7 -2
  160. package/dist/pipeline/gitlab/createGitlabPipeline.js +34 -17
  161. package/dist/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.d.ts +1 -0
  162. package/dist/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.js +29 -0
  163. package/dist/pipeline/gitlab/gitlabReleaseJobs.d.ts +33 -0
  164. package/dist/pipeline/gitlab/gitlabReleaseJobs.js +24 -0
  165. package/dist/pipeline/index.d.ts +3 -1
  166. package/dist/pipeline/index.js +16 -8
  167. package/dist/pipeline/packageManager.js +4 -2
  168. package/dist/pipeline/yarn/yarnUtils.js +6 -4
  169. package/dist/rules/index.d.ts +4 -1
  170. package/dist/rules/index.js +25 -18
  171. package/dist/runner/index.d.ts +1 -1
  172. package/dist/runner/index.js +3 -1
  173. package/dist/tsconfig.tsbuildinfo +1 -1
  174. package/dist/types/config.d.ts +18 -15
  175. package/dist/types/config.js +5 -2
  176. package/dist/types/context.d.ts +37 -32
  177. package/dist/types/context.js +3 -1
  178. package/dist/types/environmentContext.d.ts +11 -7
  179. package/dist/types/environmentContext.js +3 -1
  180. package/dist/types/gitlab-ci-yml.d.ts +30 -30
  181. package/dist/types/gitlab-ci-yml.js +3 -2
  182. package/dist/types/gitlab-types.d.ts +4 -6
  183. package/dist/types/gitlab-types.js +3 -1
  184. package/dist/types/index.js +13 -7
  185. package/dist/types/jobs.d.ts +23 -6
  186. package/dist/types/jobs.js +3 -1
  187. package/dist/types/pipeline.d.ts +4 -3
  188. package/dist/types/pipeline.js +3 -1
  189. package/dist/types/utils.d.ts +1 -1
  190. package/dist/types/utils.js +3 -1
  191. package/dist/utils/gitlab.js +3 -1
  192. package/dist/utils/index.d.ts +1 -1
  193. package/dist/utils/index.js +3 -1
  194. package/dist/utils/writeFiles.d.ts +7 -0
  195. package/dist/{pipeline/commitInfo/getBuildId.js โ†’ utils/writeFiles.js} +39 -22
  196. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +480 -384
  197. package/examples/__snapshots__/cloud-run-meteor-with-worker.ts.snap +462 -366
  198. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +480 -384
  199. package/examples/__snapshots__/cloud-run-no-service.ts.snap +501 -393
  200. package/examples/__snapshots__/cloud-run-non-public.ts.snap +480 -384
  201. package/examples/__snapshots__/cloud-run-post-stop-job.ts.snap +489 -392
  202. package/examples/__snapshots__/cloud-run-service-gen2.ts.snap +480 -384
  203. package/examples/__snapshots__/cloud-run-service-with-volumes.ts.snap +501 -401
  204. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +1155 -915
  205. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +1116 -888
  206. package/examples/__snapshots__/cloud-run-with-worker.ts.snap +482 -386
  207. package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +452 -356
  208. package/examples/__snapshots__/custom-build-job.ts.snap +434 -350
  209. package/examples/__snapshots__/custom-deploy.ts.snap +319 -223
  210. package/examples/__snapshots__/custom-envs.ts.snap +123 -81
  211. package/examples/__snapshots__/custom-sbom-java.ts.snap +434 -350
  212. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +846 -969
  213. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +886 -957
  214. package/examples/__snapshots__/kubernetes-with-cloud-sql.ts.snap +894 -969
  215. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +1626 -1728
  216. package/examples/__snapshots__/kubernetes-with-mongodb.ts.snap +974 -1137
  217. package/examples/__snapshots__/local-dot-env.ts.snap +480 -384
  218. package/examples/__snapshots__/meteor-kubernetes.ts.snap +906 -1069
  219. package/examples/__snapshots__/multiline-var.ts.snap +4500 -0
  220. package/examples/__snapshots__/native-app.ts.snap +706 -578
  221. package/examples/__snapshots__/node-build-with-custom-image.ts.snap +480 -384
  222. package/examples/__snapshots__/node-build-with-docker-additions.ts.snap +488 -384
  223. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +1656 -1942
  224. package/examples/__snapshots__/wait-for-other-deploy.ts.snap +287 -231
  225. package/examples/custom-deploy.ts +7 -7
  226. package/examples/multiline-var.ts +64 -0
  227. package/package.json +5 -8
  228. package/src/bash/BashExpression.ts +81 -0
  229. package/src/bash/bashExpressionPerPipelineType.ts +16 -0
  230. package/src/bash/bashYaml.ts +46 -0
  231. package/src/bash/getInjectVarsScript.ts +12 -0
  232. package/src/bash/replaceAsync.ts +50 -0
  233. package/src/build/base/createAppBuildJob.ts +6 -2
  234. package/src/build/base/writeBuildInfo.ts +1 -1
  235. package/src/build/base/writeDotEnv.ts +6 -1
  236. package/src/build/custom/buildJob.ts +2 -4
  237. package/src/build/custom/testJob.ts +3 -2
  238. package/src/build/docker.ts +15 -7
  239. package/src/build/node/buildJob.ts +1 -3
  240. package/src/build/node/testJob.ts +3 -2
  241. package/src/build/node/yarn.ts +9 -4
  242. package/src/build/rails/test.ts +2 -1
  243. package/src/build/types.ts +8 -1
  244. package/src/catladder-gitlab.ts +8 -55
  245. package/src/config/readConfig.ts +2 -3
  246. package/src/constants.ts +5 -2
  247. package/src/context/__tests__/resolveReferences.test.ts +11 -6
  248. package/src/context/getBuildInfoVariables.ts +40 -0
  249. package/src/context/getEnvironment.ts +7 -30
  250. package/src/context/getEnvironmentContext.ts +25 -29
  251. package/src/context/getEnvironmentVariables.ts +61 -36
  252. package/src/context/getReviewSlug.ts +27 -0
  253. package/src/context/index.ts +24 -23
  254. package/src/context/resolveReferences.ts +28 -8
  255. package/src/context/transformJobOnlyVars.ts +5 -2
  256. package/src/context/utils/envVars.ts +2 -1
  257. package/src/deploy/base/deploy.ts +20 -18
  258. package/src/deploy/base/rollback.ts +8 -10
  259. package/src/deploy/base/stop.ts +8 -9
  260. package/src/deploy/cloudRun/artifactsRegistry.ts +9 -4
  261. package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +12 -7
  262. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +3 -2
  263. package/src/deploy/cloudRun/createJobs/constants.ts +1 -0
  264. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +20 -2
  265. package/src/deploy/cloudRun/createJobs/index.ts +17 -8
  266. package/src/deploy/cloudRun/index.ts +14 -6
  267. package/src/deploy/cloudRun/utils/createArgsString.ts +2 -1
  268. package/src/deploy/cloudRun/utils/database.ts +2 -2
  269. package/src/deploy/cloudRun/utils/jobName.ts +7 -2
  270. package/src/deploy/cloudSql/utils.ts +12 -9
  271. package/src/deploy/index.ts +2 -1
  272. package/src/deploy/kubernetes/cloudSql/index.ts +3 -2
  273. package/src/deploy/kubernetes/deployJob.ts +24 -10
  274. package/src/deploy/kubernetes/index.ts +15 -8
  275. package/src/deploy/kubernetes/kubeEnv.ts +8 -6
  276. package/src/deploy/kubernetes/kubeValues.ts +0 -1
  277. package/src/deploy/kubernetes/processSecretsAsFiles.ts +2 -1
  278. package/src/deploy/types/base.ts +6 -0
  279. package/src/deploy/types/googleCloudRun.ts +2 -0
  280. package/src/index.ts +2 -1
  281. package/src/packageInfos.ts +10 -0
  282. package/src/pipeline/createAllJobs.ts +24 -10
  283. package/src/pipeline/createChildPipeline.ts +19 -8
  284. package/src/pipeline/createJobsForComponent.ts +14 -22
  285. package/src/pipeline/createMainPipeline.ts +88 -0
  286. package/src/pipeline/generatePipelineFiles.ts +29 -0
  287. package/src/pipeline/gitlab/createGitlabJobs.ts +174 -51
  288. package/src/pipeline/gitlab/createGitlabPipeline.ts +16 -14
  289. package/src/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.ts +46 -0
  290. package/src/pipeline/gitlab/gitlabReleaseJobs.ts +20 -0
  291. package/src/pipeline/index.ts +2 -0
  292. package/src/rules/index.ts +15 -9
  293. package/src/types/config.ts +11 -2
  294. package/src/types/context.ts +39 -26
  295. package/src/types/environmentContext.ts +12 -6
  296. package/src/types/gitlab-ci-yml.ts +0 -1
  297. package/src/types/gitlab-types.ts +5 -4
  298. package/src/types/jobs.ts +28 -3
  299. package/src/types/pipeline.ts +4 -0
  300. package/src/utils/writeFiles.ts +40 -0
  301. package/dist/deploy/cloudRun/createJobs/variables.d.ts +0 -5
  302. package/dist/deploy/cloudRun/createJobs/variables.js +0 -19
  303. package/dist/pipeline/commitInfo/getBuildId.d.ts +0 -6
  304. package/dist/pipeline/commitInfo/getCommitInfo.d.ts +0 -2
  305. package/src/deploy/cloudRun/createJobs/variables.ts +0 -21
  306. package/src/pipeline/commitInfo/getBuildId.ts +0 -17
  307. package/src/pipeline/commitInfo/getCommitInfo.ts +0 -15
@@ -6,10 +6,16 @@ exports[`matches snapshot 1`] = `
6
6
  "image": "path/to/docker/jobs-default:the-version",
7
7
  "jobs": {
8
8
  "api โ†ฉ๏ธ Rollback โš ๏ธ | dev ": {
9
+ "allow_failure": true,
10
+ "artifacts": {
11
+ "reports": {
12
+ "dotenv": "gitlab_environment.env",
13
+ },
14
+ },
9
15
  "environment": {
10
16
  "action": "access",
11
17
  "name": "dev/api",
12
- "url": "https://api.dev.test-app.pan.panter.cloud",
18
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
13
19
  },
14
20
  "image": "path/to/docker/kubernetes:the-version",
15
21
  "interruptible": true,
@@ -23,90 +29,47 @@ 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 _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\\"]"",
52
+ "export RELEASE_NAME="pan-test-app-dev-api"",
53
+ "export HELM_EXPERIMENTAL_OCI="1"",
54
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
55
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
56
+ "export HELM_ARGS=""",
57
+ "export COMPONENT_NAME="api"",
58
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
59
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
31
60
  "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
61
  "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
33
62
  "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
63
  "kubectl config use-context "kube-pan-test-app-dev-api"",
35
64
  "kubernetesRollback",
65
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
36
66
  ],
37
67
  "stage": "rollback dev",
38
68
  "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
69
  "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
70
  "KUBERNETES_CPU_REQUEST": "0.5",
55
71
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
56
72
  "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
- public:
64
- ENV_SHORT: 'dev'
65
- APP_DIR: 'api'
66
- ENV_TYPE: 'dev'
67
- BUILD_INFO_ID: 'some-id'
68
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
69
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
70
- HOST: 'api.dev.test-app.pan.panter.cloud'
71
- ROOT_URL: 'https://api.dev.test-app.pan.panter.cloud'
72
- HOST_CANONICAL: 'api.dev.test-app.pan.panter.cloud'
73
- ROOT_URL_INTERNAL: 'https://api.dev.test-app.pan.panter.cloud'
74
- KUBE_NAMESPACE: 'pan-test-app-dev'
75
- KUBE_APP_NAME: 'api'
76
- KUBE_APP_NAME_PREFIX: ''
77
- HOST_INTERNAL: 'api.dev.test-app.pan.panter.cloud'
78
- _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"]'
79
- application:
80
- host: 'api.dev.test-app.pan.panter.cloud'
81
- command: 'node main.js'
82
- livenessProbe:
83
- httpGet:
84
- path: '__health'
85
- readinessProbe:
86
- httpGet:
87
- path: '__health'
88
- startupProbe:
89
- httpGet:
90
- path: '__health'
91
- autoscale:
92
- minReplicas: 2
93
- maxReplicas: 5
94
- metrics:
95
- - type: 'Resource'
96
- resource:
97
- name: 'cpu'
98
- target:
99
- type: 'Utilization'
100
- averageUtilization: 0.5
101
- resources:
102
- limits:
103
- cpu: '1'
104
- memory: '2048Mi'
105
- ",
106
- "RELEASE_NAME": "pan-test-app-dev-api",
107
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
108
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
109
- "_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"]",
110
73
  },
111
74
  },
112
75
  "api ๐Ÿ‘ฎ lint": {
@@ -137,6 +100,9 @@ application:
137
100
  ],
138
101
  },
139
102
  "script": [
103
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
104
+ "export APP_PATH="api"",
105
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
140
106
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
141
107
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
142
108
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -153,7 +119,6 @@ application:
153
119
  ],
154
120
  "stage": "test",
155
121
  "variables": {
156
- "APP_PATH": "api",
157
122
  "KUBERNETES_CPU_REQUEST": "0.5",
158
123
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
159
124
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -206,7 +171,24 @@ application:
206
171
  ],
207
172
  },
208
173
  "script": [
209
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
174
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
175
+ "export ENV_SHORT="dev"",
176
+ "export APP_DIR="api"",
177
+ "export ENV_TYPE="dev"",
178
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
179
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
180
+ "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")"",
181
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
182
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
183
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
184
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
185
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
186
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
187
+ "export KUBE_APP_NAME="api"",
188
+ "export KUBE_APP_NAME_PREFIX=""",
189
+ "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\\"]"",
190
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
191
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
210
192
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
211
193
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
212
194
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -223,24 +205,9 @@ application:
223
205
  ],
224
206
  "stage": "build",
225
207
  "variables": {
226
- "APP_DIR": "api",
227
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
228
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
229
- "BUILD_INFO_ID": "some-id",
230
- "ENV_SHORT": "dev",
231
- "ENV_TYPE": "dev",
232
- "HOST": "api.dev.test-app.pan.panter.cloud",
233
- "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
234
- "HOST_INTERNAL": "api.dev.test-app.pan.panter.cloud",
235
208
  "KUBERNETES_CPU_REQUEST": "0.5",
236
209
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
237
210
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
238
- "KUBE_APP_NAME": "api",
239
- "KUBE_APP_NAME_PREFIX": "",
240
- "KUBE_NAMESPACE": "pan-test-app-dev",
241
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
242
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
243
- "_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"]",
244
211
  },
245
212
  },
246
213
  "api ๐Ÿ”จ docker | dev ": {
@@ -266,6 +233,22 @@ application:
266
233
  ],
267
234
  },
268
235
  "script": [
236
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
237
+ "export APP_DIR="api"",
238
+ "export DOCKER_DIR="."",
239
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
240
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
241
+ "export DOCKER_IMAGE_NAME="dev/api"",
242
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
243
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
244
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
245
+ RUN yarn plugin import workspace-tools
246
+ RUN yarn workspaces focus --production && yarn rebuild"",
247
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
248
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
249
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
250
+ COPY --chown=node:node .yarn /app/.yarn"",
251
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
269
252
  "ensureNodeDockerfile",
270
253
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
271
254
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -289,25 +272,9 @@ application:
289
272
  ],
290
273
  "stage": "build",
291
274
  "variables": {
292
- "APP_DIR": "api",
293
- "DOCKERFILE_ADDITIONS": undefined,
294
- "DOCKERFILE_ADDITIONS_END": undefined,
295
275
  "DOCKER_BUILDKIT": "1",
296
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
297
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
298
- RUN yarn plugin import workspace-tools
299
- RUN yarn workspaces focus --production && yarn rebuild",
300
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
301
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
302
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
303
- COPY --chown=node:node .yarn /app/.yarn",
304
- "DOCKER_DIR": ".",
305
276
  "DOCKER_DRIVER": "overlay2",
306
277
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
307
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
308
- "DOCKER_IMAGE_NAME": "dev/api",
309
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
310
- "DOCKER_REGISTRY": "$CI_REGISTRY",
311
278
  "DOCKER_TLS_CERTDIR": "",
312
279
  "KUBERNETES_CPU_REQUEST": "0.5",
313
280
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -316,11 +283,16 @@ COPY --chown=node:node .yarn /app/.yarn",
316
283
  },
317
284
  "api ๐Ÿš€ Deploy | dev ": {
318
285
  "allow_failure": false,
286
+ "artifacts": {
287
+ "reports": {
288
+ "dotenv": "gitlab_environment.env",
289
+ },
290
+ },
319
291
  "environment": {
320
292
  "auto_stop_in": "4 weeks",
321
293
  "name": "dev/api",
322
294
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | dev ",
323
- "url": "https://api.dev.test-app.pan.panter.cloud",
295
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
324
296
  },
325
297
  "image": "path/to/docker/kubernetes:the-version",
326
298
  "interruptible": true,
@@ -363,100 +335,138 @@ COPY --chown=node:node .yarn /app/.yarn",
363
335
  },
364
336
  ],
365
337
  "script": [
338
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
339
+ "export ENV_SHORT="dev"",
340
+ "export APP_DIR="api"",
341
+ "export ENV_TYPE="dev"",
342
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
343
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
344
+ "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")"",
345
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
346
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
347
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
348
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
349
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
350
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
351
+ "export KUBE_APP_NAME="api"",
352
+ "export KUBE_APP_NAME_PREFIX=""",
353
+ "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\\"]"",
354
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
355
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
356
+ "export DOCKER_IMAGE_NAME="dev/api"",
357
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
358
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
359
+ "export RELEASE_NAME="pan-test-app-dev-api"",
360
+ "export HELM_EXPERIMENTAL_OCI="1"",
361
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
362
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
363
+ "export HELM_ARGS=""",
364
+ "export COMPONENT_NAME="api"",
365
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
366
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
366
367
  "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",
367
368
  "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
368
369
  "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"",
369
370
  "kubectl config use-context "kube-pan-test-app-dev-api"",
370
- "kubernetesCreateSecret",
371
- "kubernetesDeploy",
372
- "echo Uploading SBOM to Dependency Track",
373
- "/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",
374
- "echo deployment successful ๐Ÿ˜ป",
375
- ],
376
- "stage": "deploy dev",
377
- "variables": {
378
- "APP_DIR": "api",
379
- "BUILD_ID": "some-id",
380
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
381
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
382
- "BUILD_INFO_ID": "some-id",
383
- "COMPONENT_NAME": "api",
384
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
385
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
386
- "DOCKER_IMAGE_NAME": "dev/api",
387
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
388
- "DOCKER_REGISTRY": "$CI_REGISTRY",
389
- "ENV_SHORT": "dev",
390
- "ENV_TYPE": "dev",
391
- "HELM_ARGS": "",
392
- "HELM_EXPERIMENTAL_OCI": "1",
393
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
394
- "HOST": "api.dev.test-app.pan.panter.cloud",
395
- "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
396
- "HOST_INTERNAL": "api.dev.test-app.pan.panter.cloud",
397
- "KUBERNETES_CPU_REQUEST": "0.5",
398
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
399
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
400
- "KUBE_APP_NAME": "api",
401
- "KUBE_APP_NAME_PREFIX": "",
402
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
403
- "KUBE_NAMESPACE": "pan-test-app-dev",
404
- "KUBE_VALUES": "env:
371
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
372
+ "cat > __all_values.yml <<EOF
373
+ env:
405
374
  secret: {}
406
375
  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"]'
376
+ ENV_SHORT: |-
377
+ dev
378
+ APP_DIR: |-
379
+ api
380
+ ENV_TYPE: |-
381
+ dev
382
+ BUILD_INFO_BUILD_ID: |-
383
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
384
+ BUILD_INFO_BUILD_TIME: |-
385
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
386
+ BUILD_INFO_CURRENT_VERSION: |-
387
+ $(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/^/ /')
388
+ HOST: |-
389
+ api.dev.test-app.pan.panter.cloud
390
+ ROOT_URL: |-
391
+ https://api.dev.test-app.pan.panter.cloud
392
+ HOST_INTERNAL: |-
393
+ api.dev.test-app.pan.panter.cloud
394
+ HOST_CANONICAL: |-
395
+ api.dev.test-app.pan.panter.cloud
396
+ ROOT_URL_INTERNAL: |-
397
+ https://api.dev.test-app.pan.panter.cloud
398
+ KUBE_NAMESPACE: |-
399
+ pan-test-app-dev
400
+ KUBE_APP_NAME: |-
401
+ api
402
+ KUBE_APP_NAME_PREFIX: ""
403
+ _ALL_ENV_VAR_KEYS: |-
404
+ ["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"]
422
405
  application:
423
- host: 'api.dev.test-app.pan.panter.cloud'
424
- command: 'node main.js'
406
+ host: |-
407
+ api.dev.test-app.pan.panter.cloud
408
+ command: |-
409
+ node main.js
425
410
  livenessProbe:
426
411
  httpGet:
427
- path: '__health'
412
+ path: |-
413
+ __health
428
414
  readinessProbe:
429
415
  httpGet:
430
- path: '__health'
416
+ path: |-
417
+ __health
431
418
  startupProbe:
432
419
  httpGet:
433
- path: '__health'
420
+ path: |-
421
+ __health
434
422
  autoscale:
435
423
  minReplicas: 2
436
424
  maxReplicas: 5
437
425
  metrics:
438
- - type: 'Resource'
426
+ - type: |-
427
+ Resource
439
428
  resource:
440
- name: 'cpu'
429
+ name: |-
430
+ cpu
441
431
  target:
442
- type: 'Utilization'
432
+ type: |-
433
+ Utilization
443
434
  averageUtilization: 0.5
444
435
  resources:
445
436
  limits:
446
- cpu: '1'
447
- memory: '2048Mi'
437
+ cpu: |-
438
+ 1
439
+ memory: |-
440
+ 2048Mi
441
+
442
+ EOF
448
443
  ",
449
- "RELEASE_NAME": "pan-test-app-dev-api",
450
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
451
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
452
- "_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"]",
444
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
445
+ "kubernetesCreateSecret",
446
+ "kubernetesDeploy",
447
+ "echo Uploading SBOM to Dependency Track",
448
+ "/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",
449
+ "echo deployment successful ๐Ÿ˜ป",
450
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
451
+ ],
452
+ "stage": "deploy dev",
453
+ "variables": {
454
+ "KUBERNETES_CPU_REQUEST": "0.5",
455
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
456
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
453
457
  },
454
458
  },
455
459
  "api ๐Ÿ›‘ Stop โš ๏ธ | dev ": {
460
+ "allow_failure": true,
461
+ "artifacts": {
462
+ "reports": {
463
+ "dotenv": "gitlab_environment.env",
464
+ },
465
+ },
456
466
  "environment": {
457
467
  "action": "stop",
458
468
  "name": "dev/api",
459
- "url": "https://api.dev.test-app.pan.panter.cloud",
469
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
460
470
  },
461
471
  "image": "path/to/docker/kubernetes:the-version",
462
472
  "interruptible": true,
@@ -470,16 +480,38 @@ application:
470
480
  },
471
481
  "rules": [
472
482
  {
473
- "allow_failure": true,
474
483
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
475
484
  "when": "on_success",
476
485
  },
477
486
  {
478
- "allow_failure": true,
479
487
  "when": "manual",
480
488
  },
481
489
  ],
482
490
  "script": [
491
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
492
+ "export ENV_SHORT="dev"",
493
+ "export APP_DIR="api"",
494
+ "export ENV_TYPE="dev"",
495
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
496
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
497
+ "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")"",
498
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
499
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
500
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
501
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
502
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
503
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
504
+ "export KUBE_APP_NAME="api"",
505
+ "export KUBE_APP_NAME_PREFIX=""",
506
+ "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\\"]"",
507
+ "export RELEASE_NAME="pan-test-app-dev-api"",
508
+ "export HELM_EXPERIMENTAL_OCI="1"",
509
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
510
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
511
+ "export HELM_ARGS=""",
512
+ "export COMPONENT_NAME="api"",
513
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
514
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
483
515
  "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",
484
516
  "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
485
517
  "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"",
@@ -487,80 +519,14 @@ application:
487
519
  "kubernetesDelete",
488
520
  "echo Disabling component in Dependency Track",
489
521
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" || true",
522
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
490
523
  ],
491
524
  "stage": "stop dev",
492
525
  "variables": {
493
- "APP_DIR": "api",
494
- "BUILD_ID": "some-id",
495
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
496
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
497
- "BUILD_INFO_ID": "some-id",
498
- "COMPONENT_NAME": "api",
499
- "ENV_SHORT": "dev",
500
- "ENV_TYPE": "dev",
501
526
  "GIT_STRATEGY": "none",
502
- "HELM_ARGS": "",
503
- "HELM_EXPERIMENTAL_OCI": "1",
504
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
505
- "HOST": "api.dev.test-app.pan.panter.cloud",
506
- "HOST_CANONICAL": "api.dev.test-app.pan.panter.cloud",
507
- "HOST_INTERNAL": "api.dev.test-app.pan.panter.cloud",
508
527
  "KUBERNETES_CPU_REQUEST": "0.5",
509
528
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
510
529
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
511
- "KUBE_APP_NAME": "api",
512
- "KUBE_APP_NAME_PREFIX": "",
513
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
514
- "KUBE_NAMESPACE": "pan-test-app-dev",
515
- "KUBE_VALUES": "env:
516
- secret: {}
517
- public:
518
- ENV_SHORT: 'dev'
519
- APP_DIR: 'api'
520
- ENV_TYPE: 'dev'
521
- BUILD_INFO_ID: 'some-id'
522
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
523
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
524
- HOST: 'api.dev.test-app.pan.panter.cloud'
525
- ROOT_URL: 'https://api.dev.test-app.pan.panter.cloud'
526
- HOST_CANONICAL: 'api.dev.test-app.pan.panter.cloud'
527
- ROOT_URL_INTERNAL: 'https://api.dev.test-app.pan.panter.cloud'
528
- KUBE_NAMESPACE: 'pan-test-app-dev'
529
- KUBE_APP_NAME: 'api'
530
- KUBE_APP_NAME_PREFIX: ''
531
- HOST_INTERNAL: 'api.dev.test-app.pan.panter.cloud'
532
- _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"]'
533
- application:
534
- host: 'api.dev.test-app.pan.panter.cloud'
535
- command: 'node main.js'
536
- livenessProbe:
537
- httpGet:
538
- path: '__health'
539
- readinessProbe:
540
- httpGet:
541
- path: '__health'
542
- startupProbe:
543
- httpGet:
544
- path: '__health'
545
- autoscale:
546
- minReplicas: 2
547
- maxReplicas: 5
548
- metrics:
549
- - type: 'Resource'
550
- resource:
551
- name: 'cpu'
552
- target:
553
- type: 'Utilization'
554
- averageUtilization: 0.5
555
- resources:
556
- limits:
557
- cpu: '1'
558
- memory: '2048Mi'
559
- ",
560
- "RELEASE_NAME": "pan-test-app-dev-api",
561
- "ROOT_URL": "https://api.dev.test-app.pan.panter.cloud",
562
- "ROOT_URL_INTERNAL": "https://api.dev.test-app.pan.panter.cloud",
563
- "_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"]",
564
530
  },
565
531
  },
566
532
  "api ๐Ÿ›ก audit": {
@@ -576,12 +542,14 @@ application:
576
542
  ],
577
543
  },
578
544
  "script": [
545
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
546
+ "export APP_PATH="api"",
547
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
579
548
  "cd api",
580
549
  "yarn npm audit --environment production",
581
550
  ],
582
551
  "stage": "test",
583
552
  "variables": {
584
- "APP_PATH": "api",
585
553
  "KUBERNETES_CPU_REQUEST": "0.5",
586
554
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
587
555
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -615,6 +583,9 @@ application:
615
583
  ],
616
584
  },
617
585
  "script": [
586
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
587
+ "export APP_PATH="api"",
588
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
618
589
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
619
590
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
620
591
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -631,7 +602,6 @@ application:
631
602
  ],
632
603
  "stage": "test",
633
604
  "variables": {
634
- "APP_PATH": "api",
635
605
  "KUBERNETES_CPU_REQUEST": "0.5",
636
606
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
637
607
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -655,6 +625,8 @@ application:
655
625
  ],
656
626
  },
657
627
  "script": [
628
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
629
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
658
630
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
659
631
  ],
660
632
  "stage": "build",
@@ -707,7 +679,7 @@ application:
707
679
  ],
708
680
  "variables": {
709
681
  "FF_USE_FASTZIP": "true",
710
- "GIT_DEPTH": 1,
682
+ "GIT_DEPTH": "1",
711
683
  },
712
684
  "workflow": {
713
685
  "rules": [
@@ -738,10 +710,16 @@ application:
738
710
  "image": "path/to/docker/jobs-default:the-version",
739
711
  "jobs": {
740
712
  "api โ†ฉ๏ธ Rollback โš ๏ธ | review ": {
713
+ "allow_failure": true,
714
+ "artifacts": {
715
+ "reports": {
716
+ "dotenv": "gitlab_environment.env",
717
+ },
718
+ },
741
719
  "environment": {
742
720
  "action": "access",
743
- "name": "review/some-commit/api",
744
- "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
721
+ "name": "review/$CI_COMMIT_REF_NAME/api",
722
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
745
723
  },
746
724
  "image": "path/to/docker/kubernetes:the-version",
747
725
  "interruptible": true,
@@ -755,90 +733,47 @@ application:
755
733
  },
756
734
  "rules": [
757
735
  {
758
- "allow_failure": true,
759
736
  "when": "manual",
760
737
  },
761
738
  ],
762
739
  "script": [
763
- "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",
764
- "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
765
- "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"",
766
- "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
740
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
741
+ "export ENV_SHORT="review"",
742
+ "export APP_DIR="api"",
743
+ "export ENV_TYPE="review"",
744
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
745
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
746
+ "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")"",
747
+ "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"",
748
+ "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"",
749
+ "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"",
750
+ "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"",
751
+ "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"",
752
+ "export KUBE_NAMESPACE="pan-test-app-review"",
753
+ "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"",
754
+ "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"; })-"",
755
+ "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\\"]"",
756
+ "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"",
757
+ "export HELM_EXPERIMENTAL_OCI="1"",
758
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
759
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
760
+ "export HELM_ARGS=""",
761
+ "export COMPONENT_NAME="api"",
762
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
763
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
764
+ "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",
765
+ "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"",
766
+ "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"",
767
+ "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"",
767
768
  "kubernetesRollback",
769
+ "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",
768
770
  ],
769
771
  "stage": "rollback review",
770
772
  "variables": {
771
- "APP_DIR": "api",
772
- "BUILD_ID": "some-id",
773
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
774
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
775
- "BUILD_INFO_ID": "some-id",
776
- "COMPONENT_NAME": "api",
777
- "ENV_SHORT": "review",
778
- "ENV_TYPE": "review",
779
773
  "GIT_STRATEGY": "none",
780
- "HELM_ARGS": "",
781
- "HELM_EXPERIMENTAL_OCI": "1",
782
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
783
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
784
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
785
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
786
774
  "KUBERNETES_CPU_REQUEST": "0.5",
787
775
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
788
776
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
789
- "KUBE_APP_NAME": "mr1234-api",
790
- "KUBE_APP_NAME_PREFIX": "mr1234-",
791
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
792
- "KUBE_NAMESPACE": "pan-test-app-review",
793
- "KUBE_VALUES": "env:
794
- secret: {}
795
- public:
796
- ENV_SHORT: 'review'
797
- APP_DIR: 'api'
798
- ENV_TYPE: 'review'
799
- BUILD_INFO_ID: 'some-id'
800
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
801
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
802
- HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
803
- ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
804
- HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
805
- ROOT_URL_INTERNAL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
806
- KUBE_NAMESPACE: 'pan-test-app-review'
807
- KUBE_APP_NAME: 'mr1234-api'
808
- KUBE_APP_NAME_PREFIX: 'mr1234-'
809
- HOST_INTERNAL: 'api.mr1234.review.test-app.pan.panter.cloud'
810
- _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"]'
811
- application:
812
- host: 'api.mr1234.review.test-app.pan.panter.cloud'
813
- command: 'node main.js'
814
- livenessProbe:
815
- httpGet:
816
- path: '__health'
817
- readinessProbe:
818
- httpGet:
819
- path: '__health'
820
- startupProbe:
821
- httpGet:
822
- path: '__health'
823
- autoscale:
824
- minReplicas: 2
825
- maxReplicas: 5
826
- metrics:
827
- - type: 'Resource'
828
- resource:
829
- name: 'cpu'
830
- target:
831
- type: 'Utilization'
832
- averageUtilization: 0.5
833
- resources:
834
- limits:
835
- cpu: '1'
836
- memory: '2048Mi'
837
- ",
838
- "RELEASE_NAME": "pan-test-app-review-mr1234-api",
839
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
840
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
841
- "_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"]",
842
777
  },
843
778
  },
844
779
  "api ๐Ÿ‘ฎ lint": {
@@ -869,6 +804,9 @@ application:
869
804
  ],
870
805
  },
871
806
  "script": [
807
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
808
+ "export APP_PATH="api"",
809
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
872
810
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
873
811
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
874
812
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -885,7 +823,6 @@ application:
885
823
  ],
886
824
  "stage": "test",
887
825
  "variables": {
888
- "APP_PATH": "api",
889
826
  "KUBERNETES_CPU_REQUEST": "0.5",
890
827
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
891
828
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -938,7 +875,24 @@ application:
938
875
  ],
939
876
  },
940
877
  "script": [
941
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
878
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
879
+ "export ENV_SHORT="review"",
880
+ "export APP_DIR="api"",
881
+ "export ENV_TYPE="review"",
882
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
883
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
884
+ "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")"",
885
+ "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"",
886
+ "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"",
887
+ "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"",
888
+ "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"",
889
+ "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"",
890
+ "export KUBE_NAMESPACE="pan-test-app-review"",
891
+ "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"",
892
+ "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"; })-"",
893
+ "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\\"]"",
894
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
895
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
942
896
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
943
897
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
944
898
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -955,24 +909,9 @@ application:
955
909
  ],
956
910
  "stage": "build",
957
911
  "variables": {
958
- "APP_DIR": "api",
959
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
960
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
961
- "BUILD_INFO_ID": "some-id",
962
- "ENV_SHORT": "review",
963
- "ENV_TYPE": "review",
964
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
965
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
966
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
967
912
  "KUBERNETES_CPU_REQUEST": "0.5",
968
913
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
969
914
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
970
- "KUBE_APP_NAME": "mr1234-api",
971
- "KUBE_APP_NAME_PREFIX": "mr1234-",
972
- "KUBE_NAMESPACE": "pan-test-app-review",
973
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
974
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
975
- "_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"]",
976
915
  },
977
916
  },
978
917
  "api ๐Ÿ”จ docker | review ": {
@@ -998,6 +937,22 @@ application:
998
937
  ],
999
938
  },
1000
939
  "script": [
940
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
941
+ "export APP_DIR="api"",
942
+ "export DOCKER_DIR="."",
943
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
944
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
945
+ "export DOCKER_IMAGE_NAME="review/api"",
946
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
947
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
948
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
949
+ RUN yarn plugin import workspace-tools
950
+ RUN yarn workspaces focus --production && yarn rebuild"",
951
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
952
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
953
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
954
+ COPY --chown=node:node .yarn /app/.yarn"",
955
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1001
956
  "ensureNodeDockerfile",
1002
957
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1003
958
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -1021,25 +976,9 @@ application:
1021
976
  ],
1022
977
  "stage": "build",
1023
978
  "variables": {
1024
- "APP_DIR": "api",
1025
- "DOCKERFILE_ADDITIONS": undefined,
1026
- "DOCKERFILE_ADDITIONS_END": undefined,
1027
979
  "DOCKER_BUILDKIT": "1",
1028
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1029
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1030
- RUN yarn plugin import workspace-tools
1031
- RUN yarn workspaces focus --production && yarn rebuild",
1032
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1033
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1034
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1035
- COPY --chown=node:node .yarn /app/.yarn",
1036
- "DOCKER_DIR": ".",
1037
980
  "DOCKER_DRIVER": "overlay2",
1038
981
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
1039
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1040
- "DOCKER_IMAGE_NAME": "review/api",
1041
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1042
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1043
982
  "DOCKER_TLS_CERTDIR": "",
1044
983
  "KUBERNETES_CPU_REQUEST": "0.5",
1045
984
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -1048,11 +987,16 @@ COPY --chown=node:node .yarn /app/.yarn",
1048
987
  },
1049
988
  "api ๐Ÿš€ Deploy | review ": {
1050
989
  "allow_failure": false,
990
+ "artifacts": {
991
+ "reports": {
992
+ "dotenv": "gitlab_environment.env",
993
+ },
994
+ },
1051
995
  "environment": {
1052
996
  "auto_stop_in": "1 week",
1053
- "name": "review/some-commit/api",
997
+ "name": "review/$CI_COMMIT_REF_NAME/api",
1054
998
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | review ",
1055
- "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
999
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1056
1000
  },
1057
1001
  "image": "path/to/docker/kubernetes:the-version",
1058
1002
  "interruptible": true,
@@ -1095,100 +1039,139 @@ COPY --chown=node:node .yarn /app/.yarn",
1095
1039
  },
1096
1040
  ],
1097
1041
  "script": [
1098
- "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",
1099
- "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
1100
- "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"",
1101
- "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
1102
- "kubernetesCreateSecret",
1103
- "kubernetesDeploy",
1104
- "echo Uploading SBOM to Dependency Track",
1105
- "/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",
1106
- "echo deployment successful ๐Ÿ˜ป",
1107
- ],
1108
- "stage": "deploy review",
1109
- "variables": {
1110
- "APP_DIR": "api",
1111
- "BUILD_ID": "some-id",
1112
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1113
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1114
- "BUILD_INFO_ID": "some-id",
1115
- "COMPONENT_NAME": "api",
1116
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1117
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1118
- "DOCKER_IMAGE_NAME": "review/api",
1119
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1120
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1121
- "ENV_SHORT": "review",
1122
- "ENV_TYPE": "review",
1123
- "HELM_ARGS": "",
1124
- "HELM_EXPERIMENTAL_OCI": "1",
1125
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1126
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
1127
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
1128
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
1129
- "KUBERNETES_CPU_REQUEST": "0.5",
1130
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
1131
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
1132
- "KUBE_APP_NAME": "mr1234-api",
1133
- "KUBE_APP_NAME_PREFIX": "mr1234-",
1134
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1135
- "KUBE_NAMESPACE": "pan-test-app-review",
1136
- "KUBE_VALUES": "env:
1042
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1043
+ "export ENV_SHORT="review"",
1044
+ "export APP_DIR="api"",
1045
+ "export ENV_TYPE="review"",
1046
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1047
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1048
+ "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")"",
1049
+ "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"",
1050
+ "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"",
1051
+ "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"",
1052
+ "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"",
1053
+ "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"",
1054
+ "export KUBE_NAMESPACE="pan-test-app-review"",
1055
+ "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"",
1056
+ "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"; })-"",
1057
+ "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\\"]"",
1058
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1059
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1060
+ "export DOCKER_IMAGE_NAME="review/api"",
1061
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1062
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1063
+ "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"",
1064
+ "export HELM_EXPERIMENTAL_OCI="1"",
1065
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1066
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1067
+ "export HELM_ARGS=""",
1068
+ "export COMPONENT_NAME="api"",
1069
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1070
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1071
+ "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",
1072
+ "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"",
1073
+ "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"",
1074
+ "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"",
1075
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
1076
+ "cat > __all_values.yml <<EOF
1077
+ env:
1137
1078
  secret: {}
1138
1079
  public:
1139
- ENV_SHORT: 'review'
1140
- APP_DIR: 'api'
1141
- ENV_TYPE: 'review'
1142
- BUILD_INFO_ID: 'some-id'
1143
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1144
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1145
- HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
1146
- ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1147
- HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1148
- ROOT_URL_INTERNAL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1149
- KUBE_NAMESPACE: 'pan-test-app-review'
1150
- KUBE_APP_NAME: 'mr1234-api'
1151
- KUBE_APP_NAME_PREFIX: 'mr1234-'
1152
- HOST_INTERNAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1153
- _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"]'
1080
+ ENV_SHORT: |-
1081
+ review
1082
+ APP_DIR: |-
1083
+ api
1084
+ ENV_TYPE: |-
1085
+ review
1086
+ BUILD_INFO_BUILD_ID: |-
1087
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1088
+ BUILD_INFO_BUILD_TIME: |-
1089
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1090
+ BUILD_INFO_CURRENT_VERSION: |-
1091
+ $(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/^/ /')
1092
+ HOST: |-
1093
+ $(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/^/ /')
1094
+ ROOT_URL: |-
1095
+ $(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/^/ /')
1096
+ HOST_INTERNAL: |-
1097
+ $(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/^/ /')
1098
+ HOST_CANONICAL: |-
1099
+ $(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/^/ /')
1100
+ ROOT_URL_INTERNAL: |-
1101
+ $(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/^/ /')
1102
+ KUBE_NAMESPACE: |-
1103
+ pan-test-app-review
1104
+ KUBE_APP_NAME: |-
1105
+ $(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/^/ /')
1106
+ KUBE_APP_NAME_PREFIX: |-
1107
+ $(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/^/ /')
1108
+ _ALL_ENV_VAR_KEYS: |-
1109
+ ["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"]
1154
1110
  application:
1155
- host: 'api.mr1234.review.test-app.pan.panter.cloud'
1156
- command: 'node main.js'
1111
+ host: |-
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
+ command: |-
1114
+ node main.js
1157
1115
  livenessProbe:
1158
1116
  httpGet:
1159
- path: '__health'
1117
+ path: |-
1118
+ __health
1160
1119
  readinessProbe:
1161
1120
  httpGet:
1162
- path: '__health'
1121
+ path: |-
1122
+ __health
1163
1123
  startupProbe:
1164
1124
  httpGet:
1165
- path: '__health'
1125
+ path: |-
1126
+ __health
1166
1127
  autoscale:
1167
1128
  minReplicas: 2
1168
1129
  maxReplicas: 5
1169
1130
  metrics:
1170
- - type: 'Resource'
1131
+ - type: |-
1132
+ Resource
1171
1133
  resource:
1172
- name: 'cpu'
1134
+ name: |-
1135
+ cpu
1173
1136
  target:
1174
- type: 'Utilization'
1137
+ type: |-
1138
+ Utilization
1175
1139
  averageUtilization: 0.5
1176
1140
  resources:
1177
1141
  limits:
1178
- cpu: '1'
1179
- memory: '2048Mi'
1142
+ cpu: |-
1143
+ 1
1144
+ memory: |-
1145
+ 2048Mi
1146
+
1147
+ EOF
1180
1148
  ",
1181
- "RELEASE_NAME": "pan-test-app-review-mr1234-api",
1182
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1183
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1184
- "_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"]",
1149
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
1150
+ "kubernetesCreateSecret",
1151
+ "kubernetesDeploy",
1152
+ "echo Uploading SBOM to Dependency Track",
1153
+ "/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",
1154
+ "echo deployment successful ๐Ÿ˜ป",
1155
+ "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",
1156
+ ],
1157
+ "stage": "deploy review",
1158
+ "variables": {
1159
+ "KUBERNETES_CPU_REQUEST": "0.5",
1160
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1161
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1185
1162
  },
1186
1163
  },
1187
1164
  "api ๐Ÿ›‘ Stop โš ๏ธ | review ": {
1165
+ "allow_failure": true,
1166
+ "artifacts": {
1167
+ "reports": {
1168
+ "dotenv": "gitlab_environment.env",
1169
+ },
1170
+ },
1188
1171
  "environment": {
1189
1172
  "action": "stop",
1190
- "name": "review/some-commit/api",
1191
- "url": "https://api.mr1234.review.test-app.pan.panter.cloud",
1173
+ "name": "review/$CI_COMMIT_REF_NAME/api",
1174
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1192
1175
  },
1193
1176
  "image": "path/to/docker/kubernetes:the-version",
1194
1177
  "interruptible": true,
@@ -1202,97 +1185,53 @@ application:
1202
1185
  },
1203
1186
  "rules": [
1204
1187
  {
1205
- "allow_failure": true,
1206
1188
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1207
1189
  "when": "on_success",
1208
1190
  },
1209
1191
  {
1210
- "allow_failure": true,
1211
1192
  "when": "manual",
1212
1193
  },
1213
1194
  ],
1214
1195
  "script": [
1215
- "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",
1216
- "kubectl config set-credentials "kube-pan-test-app-review-mr1234-api" --token="$CL_review_api_KUBE_TOKEN"",
1217
- "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"",
1218
- "kubectl config use-context "kube-pan-test-app-review-mr1234-api"",
1196
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1197
+ "export ENV_SHORT="review"",
1198
+ "export APP_DIR="api"",
1199
+ "export ENV_TYPE="review"",
1200
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1201
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1202
+ "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")"",
1203
+ "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"",
1204
+ "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"",
1205
+ "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"",
1206
+ "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"",
1207
+ "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"",
1208
+ "export KUBE_NAMESPACE="pan-test-app-review"",
1209
+ "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"",
1210
+ "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"; })-"",
1211
+ "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\\"]"",
1212
+ "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"",
1213
+ "export HELM_EXPERIMENTAL_OCI="1"",
1214
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1215
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1216
+ "export HELM_ARGS=""",
1217
+ "export COMPONENT_NAME="api"",
1218
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1219
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1220
+ "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",
1221
+ "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"",
1222
+ "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"",
1223
+ "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"",
1219
1224
  "kubernetesDelete",
1220
1225
  "echo Disabling component in Dependency Track",
1221
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.mr1234.review.test-app.pan.panter.cloud" || true",
1226
+ "/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",
1227
+ "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",
1222
1228
  ],
1223
1229
  "stage": "stop review",
1224
1230
  "variables": {
1225
- "APP_DIR": "api",
1226
- "BUILD_ID": "some-id",
1227
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1228
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1229
- "BUILD_INFO_ID": "some-id",
1230
- "COMPONENT_NAME": "api",
1231
- "ENV_SHORT": "review",
1232
- "ENV_TYPE": "review",
1233
1231
  "GIT_STRATEGY": "none",
1234
- "HELM_ARGS": "",
1235
- "HELM_EXPERIMENTAL_OCI": "1",
1236
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1237
- "HOST": "api.mr1234.review.test-app.pan.panter.cloud",
1238
- "HOST_CANONICAL": "api.mr1234.review.test-app.pan.panter.cloud",
1239
- "HOST_INTERNAL": "api.mr1234.review.test-app.pan.panter.cloud",
1240
1232
  "KUBERNETES_CPU_REQUEST": "0.5",
1241
1233
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
1242
1234
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
1243
- "KUBE_APP_NAME": "mr1234-api",
1244
- "KUBE_APP_NAME_PREFIX": "mr1234-",
1245
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1246
- "KUBE_NAMESPACE": "pan-test-app-review",
1247
- "KUBE_VALUES": "env:
1248
- secret: {}
1249
- public:
1250
- ENV_SHORT: 'review'
1251
- APP_DIR: 'api'
1252
- ENV_TYPE: 'review'
1253
- BUILD_INFO_ID: 'some-id'
1254
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1255
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1256
- HOST: 'api.mr1234.review.test-app.pan.panter.cloud'
1257
- ROOT_URL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1258
- HOST_CANONICAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1259
- ROOT_URL_INTERNAL: 'https://api.mr1234.review.test-app.pan.panter.cloud'
1260
- KUBE_NAMESPACE: 'pan-test-app-review'
1261
- KUBE_APP_NAME: 'mr1234-api'
1262
- KUBE_APP_NAME_PREFIX: 'mr1234-'
1263
- HOST_INTERNAL: 'api.mr1234.review.test-app.pan.panter.cloud'
1264
- _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"]'
1265
- application:
1266
- host: 'api.mr1234.review.test-app.pan.panter.cloud'
1267
- command: 'node main.js'
1268
- livenessProbe:
1269
- httpGet:
1270
- path: '__health'
1271
- readinessProbe:
1272
- httpGet:
1273
- path: '__health'
1274
- startupProbe:
1275
- httpGet:
1276
- path: '__health'
1277
- autoscale:
1278
- minReplicas: 2
1279
- maxReplicas: 5
1280
- metrics:
1281
- - type: 'Resource'
1282
- resource:
1283
- name: 'cpu'
1284
- target:
1285
- type: 'Utilization'
1286
- averageUtilization: 0.5
1287
- resources:
1288
- limits:
1289
- cpu: '1'
1290
- memory: '2048Mi'
1291
- ",
1292
- "RELEASE_NAME": "pan-test-app-review-mr1234-api",
1293
- "ROOT_URL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1294
- "ROOT_URL_INTERNAL": "https://api.mr1234.review.test-app.pan.panter.cloud",
1295
- "_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"]",
1296
1235
  },
1297
1236
  },
1298
1237
  "api ๐Ÿ›ก audit": {
@@ -1308,12 +1247,14 @@ application:
1308
1247
  ],
1309
1248
  },
1310
1249
  "script": [
1250
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1251
+ "export APP_PATH="api"",
1252
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1311
1253
  "cd api",
1312
1254
  "yarn npm audit --environment production",
1313
1255
  ],
1314
1256
  "stage": "test",
1315
1257
  "variables": {
1316
- "APP_PATH": "api",
1317
1258
  "KUBERNETES_CPU_REQUEST": "0.5",
1318
1259
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1319
1260
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -1347,6 +1288,9 @@ application:
1347
1288
  ],
1348
1289
  },
1349
1290
  "script": [
1291
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1292
+ "export APP_PATH="api"",
1293
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1350
1294
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1351
1295
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1352
1296
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -1363,7 +1307,6 @@ application:
1363
1307
  ],
1364
1308
  "stage": "test",
1365
1309
  "variables": {
1366
- "APP_PATH": "api",
1367
1310
  "KUBERNETES_CPU_REQUEST": "0.5",
1368
1311
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1369
1312
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
@@ -1387,6 +1330,8 @@ application:
1387
1330
  ],
1388
1331
  },
1389
1332
  "script": [
1333
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1334
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1390
1335
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
1391
1336
  ],
1392
1337
  "stage": "build",
@@ -1439,7 +1384,7 @@ application:
1439
1384
  ],
1440
1385
  "variables": {
1441
1386
  "FF_USE_FASTZIP": "true",
1442
- "GIT_DEPTH": 1,
1387
+ "GIT_DEPTH": "1",
1443
1388
  },
1444
1389
  "workflow": {
1445
1390
  "rules": [
@@ -1470,10 +1415,16 @@ application:
1470
1415
  "image": "path/to/docker/jobs-default:the-version",
1471
1416
  "jobs": {
1472
1417
  "api โ†ฉ๏ธ Rollback โš ๏ธ | prod ": {
1418
+ "allow_failure": true,
1419
+ "artifacts": {
1420
+ "reports": {
1421
+ "dotenv": "gitlab_environment.env",
1422
+ },
1423
+ },
1473
1424
  "environment": {
1474
1425
  "action": "access",
1475
1426
  "name": "prod/api",
1476
- "url": "https://api.prod.test-app.pan.panter.cloud",
1427
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1477
1428
  },
1478
1429
  "image": "path/to/docker/kubernetes:the-version",
1479
1430
  "interruptible": true,
@@ -1487,97 +1438,60 @@ application:
1487
1438
  },
1488
1439
  "rules": [
1489
1440
  {
1490
- "allow_failure": true,
1491
1441
  "when": "manual",
1492
1442
  },
1493
1443
  ],
1494
1444
  "script": [
1445
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1446
+ "export ENV_SHORT="prod"",
1447
+ "export APP_DIR="api"",
1448
+ "export ENV_TYPE="prod"",
1449
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1450
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1451
+ "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")"",
1452
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
1453
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
1454
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
1455
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
1456
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
1457
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
1458
+ "export KUBE_APP_NAME="api"",
1459
+ "export KUBE_APP_NAME_PREFIX=""",
1460
+ "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\\"]"",
1461
+ "export RELEASE_NAME="pan-test-app-prod-api"",
1462
+ "export HELM_EXPERIMENTAL_OCI="1"",
1463
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1464
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1465
+ "export HELM_ARGS=""",
1466
+ "export COMPONENT_NAME="api"",
1467
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1468
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1495
1469
  "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",
1496
1470
  "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
1497
1471
  "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"",
1498
1472
  "kubectl config use-context "kube-pan-test-app-prod-api"",
1499
1473
  "kubernetesRollback",
1474
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
1500
1475
  ],
1501
1476
  "stage": "rollback prod",
1502
1477
  "variables": {
1503
- "APP_DIR": "api",
1504
- "BUILD_ID": "some-id",
1505
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1506
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1507
- "BUILD_INFO_ID": "some-id",
1508
- "COMPONENT_NAME": "api",
1509
- "ENV_SHORT": "prod",
1510
- "ENV_TYPE": "prod",
1511
1478
  "GIT_STRATEGY": "none",
1512
- "HELM_ARGS": "",
1513
- "HELM_EXPERIMENTAL_OCI": "1",
1514
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1515
- "HOST": "api.prod.test-app.pan.panter.cloud",
1516
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
1517
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
1518
1479
  "KUBERNETES_CPU_REQUEST": "0.5",
1519
1480
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
1520
1481
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
1521
- "KUBE_APP_NAME": "api",
1522
- "KUBE_APP_NAME_PREFIX": "",
1523
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1524
- "KUBE_NAMESPACE": "pan-test-app-prod",
1525
- "KUBE_VALUES": "env:
1526
- secret: {}
1527
- public:
1528
- ENV_SHORT: 'prod'
1529
- APP_DIR: 'api'
1530
- ENV_TYPE: 'prod'
1531
- BUILD_INFO_ID: 'some-id'
1532
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1533
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1534
- HOST: 'api.prod.test-app.pan.panter.cloud'
1535
- ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
1536
- HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
1537
- ROOT_URL_INTERNAL: 'https://api.prod.test-app.pan.panter.cloud'
1538
- KUBE_NAMESPACE: 'pan-test-app-prod'
1539
- KUBE_APP_NAME: 'api'
1540
- KUBE_APP_NAME_PREFIX: ''
1541
- HOST_INTERNAL: 'api.prod.test-app.pan.panter.cloud'
1542
- _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"]'
1543
- application:
1544
- host: 'api.prod.test-app.pan.panter.cloud'
1545
- command: 'node main.js'
1546
- livenessProbe:
1547
- httpGet:
1548
- path: '__health'
1549
- readinessProbe:
1550
- httpGet:
1551
- path: '__health'
1552
- startupProbe:
1553
- httpGet:
1554
- path: '__health'
1555
- autoscale:
1556
- minReplicas: 2
1557
- maxReplicas: 5
1558
- metrics:
1559
- - type: 'Resource'
1560
- resource:
1561
- name: 'cpu'
1562
- target:
1563
- type: 'Utilization'
1564
- averageUtilization: 0.5
1565
- resources:
1566
- limits:
1567
- cpu: '1'
1568
- memory: '2048Mi'
1569
- ",
1570
- "RELEASE_NAME": "pan-test-app-prod-api",
1571
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
1572
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
1573
- "_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"]",
1574
1482
  },
1575
1483
  },
1576
1484
  "api โ†ฉ๏ธ Rollback โš ๏ธ | stage ": {
1485
+ "allow_failure": true,
1486
+ "artifacts": {
1487
+ "reports": {
1488
+ "dotenv": "gitlab_environment.env",
1489
+ },
1490
+ },
1577
1491
  "environment": {
1578
1492
  "action": "access",
1579
1493
  "name": "stage/api",
1580
- "url": "https://api.stage.test-app.pan.panter.cloud",
1494
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1581
1495
  },
1582
1496
  "image": "path/to/docker/kubernetes:the-version",
1583
1497
  "interruptible": true,
@@ -1591,90 +1505,47 @@ application:
1591
1505
  },
1592
1506
  "rules": [
1593
1507
  {
1594
- "allow_failure": true,
1595
1508
  "when": "manual",
1596
1509
  },
1597
1510
  ],
1598
1511
  "script": [
1512
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1513
+ "export ENV_SHORT="stage"",
1514
+ "export APP_DIR="api"",
1515
+ "export ENV_TYPE="stage"",
1516
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1517
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1518
+ "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")"",
1519
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
1520
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
1521
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
1522
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
1523
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
1524
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
1525
+ "export KUBE_APP_NAME="api"",
1526
+ "export KUBE_APP_NAME_PREFIX=""",
1527
+ "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\\"]"",
1528
+ "export RELEASE_NAME="pan-test-app-stage-api"",
1529
+ "export HELM_EXPERIMENTAL_OCI="1"",
1530
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1531
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1532
+ "export HELM_ARGS=""",
1533
+ "export COMPONENT_NAME="api"",
1534
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1535
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1599
1536
  "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",
1600
1537
  "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
1601
1538
  "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"",
1602
1539
  "kubectl config use-context "kube-pan-test-app-stage-api"",
1603
1540
  "kubernetesRollback",
1541
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
1604
1542
  ],
1605
1543
  "stage": "rollback stage",
1606
1544
  "variables": {
1607
- "APP_DIR": "api",
1608
- "BUILD_ID": "some-id",
1609
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1610
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1611
- "BUILD_INFO_ID": "some-id",
1612
- "COMPONENT_NAME": "api",
1613
- "ENV_SHORT": "stage",
1614
- "ENV_TYPE": "stage",
1615
1545
  "GIT_STRATEGY": "none",
1616
- "HELM_ARGS": "",
1617
- "HELM_EXPERIMENTAL_OCI": "1",
1618
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
1619
- "HOST": "api.stage.test-app.pan.panter.cloud",
1620
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
1621
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
1622
1546
  "KUBERNETES_CPU_REQUEST": "0.5",
1623
1547
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
1624
1548
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
1625
- "KUBE_APP_NAME": "api",
1626
- "KUBE_APP_NAME_PREFIX": "",
1627
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
1628
- "KUBE_NAMESPACE": "pan-test-app-stage",
1629
- "KUBE_VALUES": "env:
1630
- secret: {}
1631
- public:
1632
- ENV_SHORT: 'stage'
1633
- APP_DIR: 'api'
1634
- ENV_TYPE: 'stage'
1635
- BUILD_INFO_ID: 'some-id'
1636
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
1637
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
1638
- HOST: 'api.stage.test-app.pan.panter.cloud'
1639
- ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
1640
- HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
1641
- ROOT_URL_INTERNAL: 'https://api.stage.test-app.pan.panter.cloud'
1642
- KUBE_NAMESPACE: 'pan-test-app-stage'
1643
- KUBE_APP_NAME: 'api'
1644
- KUBE_APP_NAME_PREFIX: ''
1645
- HOST_INTERNAL: 'api.stage.test-app.pan.panter.cloud'
1646
- _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"]'
1647
- application:
1648
- host: 'api.stage.test-app.pan.panter.cloud'
1649
- command: 'node main.js'
1650
- livenessProbe:
1651
- httpGet:
1652
- path: '__health'
1653
- readinessProbe:
1654
- httpGet:
1655
- path: '__health'
1656
- startupProbe:
1657
- httpGet:
1658
- path: '__health'
1659
- autoscale:
1660
- minReplicas: 2
1661
- maxReplicas: 5
1662
- metrics:
1663
- - type: 'Resource'
1664
- resource:
1665
- name: 'cpu'
1666
- target:
1667
- type: 'Utilization'
1668
- averageUtilization: 0.5
1669
- resources:
1670
- limits:
1671
- cpu: '1'
1672
- memory: '2048Mi'
1673
- ",
1674
- "RELEASE_NAME": "pan-test-app-stage-api",
1675
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
1676
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
1677
- "_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"]",
1678
1549
  },
1679
1550
  },
1680
1551
  "api ๐Ÿ”จ app | prod ": {
@@ -1724,7 +1595,24 @@ application:
1724
1595
  ],
1725
1596
  },
1726
1597
  "script": [
1727
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1598
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1599
+ "export ENV_SHORT="prod"",
1600
+ "export APP_DIR="api"",
1601
+ "export ENV_TYPE="prod"",
1602
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1603
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1604
+ "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")"",
1605
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
1606
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
1607
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
1608
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
1609
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
1610
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
1611
+ "export KUBE_APP_NAME="api"",
1612
+ "export KUBE_APP_NAME_PREFIX=""",
1613
+ "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\\"]"",
1614
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1615
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
1728
1616
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1729
1617
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1730
1618
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -1741,24 +1629,9 @@ application:
1741
1629
  ],
1742
1630
  "stage": "build",
1743
1631
  "variables": {
1744
- "APP_DIR": "api",
1745
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1746
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1747
- "BUILD_INFO_ID": "some-id",
1748
- "ENV_SHORT": "prod",
1749
- "ENV_TYPE": "prod",
1750
- "HOST": "api.prod.test-app.pan.panter.cloud",
1751
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
1752
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
1753
1632
  "KUBERNETES_CPU_REQUEST": "0.5",
1754
1633
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1755
1634
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
1756
- "KUBE_APP_NAME": "api",
1757
- "KUBE_APP_NAME_PREFIX": "",
1758
- "KUBE_NAMESPACE": "pan-test-app-prod",
1759
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
1760
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
1761
- "_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"]",
1762
1635
  },
1763
1636
  },
1764
1637
  "api ๐Ÿ”จ app | stage ": {
@@ -1808,7 +1681,24 @@ application:
1808
1681
  ],
1809
1682
  },
1810
1683
  "script": [
1811
- "echo '{"id":"some-id","time":"01-01-2023 12:13:14"}' > api/__build_info.json",
1684
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1685
+ "export ENV_SHORT="stage"",
1686
+ "export APP_DIR="api"",
1687
+ "export ENV_TYPE="stage"",
1688
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1689
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1690
+ "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")"",
1691
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
1692
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
1693
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
1694
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
1695
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
1696
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
1697
+ "export KUBE_APP_NAME="api"",
1698
+ "export KUBE_APP_NAME_PREFIX=""",
1699
+ "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\\"]"",
1700
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1701
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
1812
1702
  "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1813
1703
  "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1814
1704
  "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
@@ -1825,24 +1715,9 @@ application:
1825
1715
  ],
1826
1716
  "stage": "build",
1827
1717
  "variables": {
1828
- "APP_DIR": "api",
1829
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
1830
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
1831
- "BUILD_INFO_ID": "some-id",
1832
- "ENV_SHORT": "stage",
1833
- "ENV_TYPE": "stage",
1834
- "HOST": "api.stage.test-app.pan.panter.cloud",
1835
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
1836
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
1837
1718
  "KUBERNETES_CPU_REQUEST": "0.5",
1838
1719
  "KUBERNETES_MEMORY_LIMIT": "4Gi",
1839
1720
  "KUBERNETES_MEMORY_REQUEST": "2Gi",
1840
- "KUBE_APP_NAME": "api",
1841
- "KUBE_APP_NAME_PREFIX": "",
1842
- "KUBE_NAMESPACE": "pan-test-app-stage",
1843
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
1844
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
1845
- "_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"]",
1846
1721
  },
1847
1722
  },
1848
1723
  "api ๐Ÿ”จ docker | prod ": {
@@ -1868,6 +1743,22 @@ application:
1868
1743
  ],
1869
1744
  },
1870
1745
  "script": [
1746
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1747
+ "export APP_DIR="api"",
1748
+ "export DOCKER_DIR="."",
1749
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1750
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1751
+ "export DOCKER_IMAGE_NAME="prod/api"",
1752
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1753
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1754
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1755
+ RUN yarn plugin import workspace-tools
1756
+ RUN yarn workspaces focus --production && yarn rebuild"",
1757
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1758
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1759
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1760
+ COPY --chown=node:node .yarn /app/.yarn"",
1761
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1871
1762
  "ensureNodeDockerfile",
1872
1763
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1873
1764
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -1891,25 +1782,9 @@ application:
1891
1782
  ],
1892
1783
  "stage": "build",
1893
1784
  "variables": {
1894
- "APP_DIR": "api",
1895
- "DOCKERFILE_ADDITIONS": undefined,
1896
- "DOCKERFILE_ADDITIONS_END": undefined,
1897
1785
  "DOCKER_BUILDKIT": "1",
1898
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1899
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1900
- RUN yarn plugin import workspace-tools
1901
- RUN yarn workspaces focus --production && yarn rebuild",
1902
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1903
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1904
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1905
- COPY --chown=node:node .yarn /app/.yarn",
1906
- "DOCKER_DIR": ".",
1907
1786
  "DOCKER_DRIVER": "overlay2",
1908
1787
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
1909
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1910
- "DOCKER_IMAGE_NAME": "prod/api",
1911
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1912
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1913
1788
  "DOCKER_TLS_CERTDIR": "",
1914
1789
  "KUBERNETES_CPU_REQUEST": "0.5",
1915
1790
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -1939,6 +1814,22 @@ COPY --chown=node:node .yarn /app/.yarn",
1939
1814
  ],
1940
1815
  },
1941
1816
  "script": [
1817
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1818
+ "export APP_DIR="api"",
1819
+ "export DOCKER_DIR="."",
1820
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1821
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1822
+ "export DOCKER_IMAGE_NAME="stage/api"",
1823
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1824
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1825
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1826
+ RUN yarn plugin import workspace-tools
1827
+ RUN yarn workspaces focus --production && yarn rebuild"",
1828
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1829
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1830
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1831
+ COPY --chown=node:node .yarn /app/.yarn"",
1832
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1942
1833
  "ensureNodeDockerfile",
1943
1834
  "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1944
1835
  "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
@@ -1962,25 +1853,9 @@ COPY --chown=node:node .yarn /app/.yarn",
1962
1853
  ],
1963
1854
  "stage": "build",
1964
1855
  "variables": {
1965
- "APP_DIR": "api",
1966
- "DOCKERFILE_ADDITIONS": undefined,
1967
- "DOCKERFILE_ADDITIONS_END": undefined,
1968
1856
  "DOCKER_BUILDKIT": "1",
1969
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
1970
- "DOCKER_COPY_AND_INSTALL_APP": "COPY --chown=node:node $APP_DIR .
1971
- RUN yarn plugin import workspace-tools
1972
- RUN yarn workspaces focus --production && yarn rebuild",
1973
- "DOCKER_COPY_WORKSPACE_FILES": "COPY --chown=node:node api/package.json /app/api/package.json
1974
- COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1975
- COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1976
- COPY --chown=node:node .yarn /app/.yarn",
1977
- "DOCKER_DIR": ".",
1978
1857
  "DOCKER_DRIVER": "overlay2",
1979
1858
  "DOCKER_HOST": "tcp://0.0.0.0:2375",
1980
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
1981
- "DOCKER_IMAGE_NAME": "stage/api",
1982
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
1983
- "DOCKER_REGISTRY": "$CI_REGISTRY",
1984
1859
  "DOCKER_TLS_CERTDIR": "",
1985
1860
  "KUBERNETES_CPU_REQUEST": "0.5",
1986
1861
  "KUBERNETES_MEMORY_LIMIT": "2Gi",
@@ -1989,11 +1864,16 @@ COPY --chown=node:node .yarn /app/.yarn",
1989
1864
  },
1990
1865
  "api ๐Ÿš€ Deploy | prod ": {
1991
1866
  "allow_failure": true,
1867
+ "artifacts": {
1868
+ "reports": {
1869
+ "dotenv": "gitlab_environment.env",
1870
+ },
1871
+ },
1992
1872
  "environment": {
1993
1873
  "auto_stop_in": undefined,
1994
1874
  "name": "prod/api",
1995
1875
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | prod ",
1996
- "url": "https://api.prod.test-app.pan.panter.cloud",
1876
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1997
1877
  },
1998
1878
  "image": "path/to/docker/kubernetes:the-version",
1999
1879
  "interruptible": true,
@@ -2024,102 +1904,139 @@ COPY --chown=node:node .yarn /app/.yarn",
2024
1904
  },
2025
1905
  ],
2026
1906
  "script": [
1907
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1908
+ "export ENV_SHORT="prod"",
1909
+ "export APP_DIR="api"",
1910
+ "export ENV_TYPE="prod"",
1911
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1912
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1913
+ "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")"",
1914
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
1915
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
1916
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
1917
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
1918
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
1919
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
1920
+ "export KUBE_APP_NAME="api"",
1921
+ "export KUBE_APP_NAME_PREFIX=""",
1922
+ "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\\"]"",
1923
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
1924
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
1925
+ "export DOCKER_IMAGE_NAME="prod/api"",
1926
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
1927
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1928
+ "export RELEASE_NAME="pan-test-app-prod-api"",
1929
+ "export HELM_EXPERIMENTAL_OCI="1"",
1930
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1931
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1932
+ "export HELM_ARGS=""",
1933
+ "export COMPONENT_NAME="api"",
1934
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1935
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2027
1936
  "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",
2028
1937
  "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
2029
1938
  "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"",
2030
1939
  "kubectl config use-context "kube-pan-test-app-prod-api"",
2031
- "kubernetesCreateSecret",
2032
- "kubernetesDeploy",
2033
- "echo Uploading SBOM to Dependency Track",
2034
- "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" "__sbom.json" vex.json || true",
2035
- "echo deployment successful ๐Ÿ˜ป",
2036
- ],
2037
- "stage": "deploy prod",
2038
- "variables": {
2039
- "APP_DIR": "api",
2040
- "BUILD_ID": "some-id",
2041
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2042
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2043
- "BUILD_INFO_ID": "some-id",
2044
- "COMPONENT_NAME": "api",
2045
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
2046
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
2047
- "DOCKER_IMAGE_NAME": "prod/api",
2048
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2049
- "DOCKER_REGISTRY": "$CI_REGISTRY",
2050
- "ENV_SHORT": "prod",
2051
- "ENV_TYPE": "prod",
2052
- "HELM_ARGS": "",
2053
- "HELM_EXPERIMENTAL_OCI": "1",
2054
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2055
- "HOST": "api.prod.test-app.pan.panter.cloud",
2056
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
2057
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
2058
- "KUBERNETES_CPU_REQUEST": "0.5",
2059
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2060
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2061
- "KUBE_APP_NAME": "api",
2062
- "KUBE_APP_NAME_PREFIX": "",
2063
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2064
- "KUBE_NAMESPACE": "pan-test-app-prod",
2065
- "KUBE_VALUES": "env:
1940
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
1941
+ "cat > __all_values.yml <<EOF
1942
+ env:
2066
1943
  secret: {}
2067
1944
  public:
2068
- ENV_SHORT: 'prod'
2069
- APP_DIR: 'api'
2070
- ENV_TYPE: 'prod'
2071
- BUILD_INFO_ID: 'some-id'
2072
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2073
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2074
- HOST: 'api.prod.test-app.pan.panter.cloud'
2075
- ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
2076
- HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
2077
- ROOT_URL_INTERNAL: 'https://api.prod.test-app.pan.panter.cloud'
2078
- KUBE_NAMESPACE: 'pan-test-app-prod'
2079
- KUBE_APP_NAME: 'api'
2080
- KUBE_APP_NAME_PREFIX: ''
2081
- HOST_INTERNAL: 'api.prod.test-app.pan.panter.cloud'
2082
- _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"]'
1945
+ ENV_SHORT: |-
1946
+ prod
1947
+ APP_DIR: |-
1948
+ api
1949
+ ENV_TYPE: |-
1950
+ prod
1951
+ BUILD_INFO_BUILD_ID: |-
1952
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1953
+ BUILD_INFO_BUILD_TIME: |-
1954
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1955
+ BUILD_INFO_CURRENT_VERSION: |-
1956
+ $(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/^/ /')
1957
+ HOST: |-
1958
+ api.prod.test-app.pan.panter.cloud
1959
+ ROOT_URL: |-
1960
+ https://api.prod.test-app.pan.panter.cloud
1961
+ HOST_INTERNAL: |-
1962
+ api.prod.test-app.pan.panter.cloud
1963
+ HOST_CANONICAL: |-
1964
+ api.prod.test-app.pan.panter.cloud
1965
+ ROOT_URL_INTERNAL: |-
1966
+ https://api.prod.test-app.pan.panter.cloud
1967
+ KUBE_NAMESPACE: |-
1968
+ pan-test-app-prod
1969
+ KUBE_APP_NAME: |-
1970
+ api
1971
+ KUBE_APP_NAME_PREFIX: ""
1972
+ _ALL_ENV_VAR_KEYS: |-
1973
+ ["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"]
2083
1974
  application:
2084
- host: 'api.prod.test-app.pan.panter.cloud'
2085
- command: 'node main.js'
1975
+ host: |-
1976
+ api.prod.test-app.pan.panter.cloud
1977
+ command: |-
1978
+ node main.js
2086
1979
  livenessProbe:
2087
1980
  httpGet:
2088
- path: '__health'
1981
+ path: |-
1982
+ __health
2089
1983
  readinessProbe:
2090
1984
  httpGet:
2091
- path: '__health'
1985
+ path: |-
1986
+ __health
2092
1987
  startupProbe:
2093
1988
  httpGet:
2094
- path: '__health'
1989
+ path: |-
1990
+ __health
2095
1991
  autoscale:
2096
1992
  minReplicas: 2
2097
1993
  maxReplicas: 5
2098
1994
  metrics:
2099
- - type: 'Resource'
1995
+ - type: |-
1996
+ Resource
2100
1997
  resource:
2101
- name: 'cpu'
1998
+ name: |-
1999
+ cpu
2102
2000
  target:
2103
- type: 'Utilization'
2001
+ type: |-
2002
+ Utilization
2104
2003
  averageUtilization: 0.5
2105
2004
  resources:
2106
2005
  limits:
2107
- cpu: '1'
2108
- memory: '2048Mi'
2006
+ cpu: |-
2007
+ 1
2008
+ memory: |-
2009
+ 2048Mi
2010
+
2011
+ EOF
2109
2012
  ",
2110
- "RELEASE_NAME": "pan-test-app-prod-api",
2111
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
2112
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
2113
- "_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"]",
2013
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
2014
+ "kubernetesCreateSecret",
2015
+ "kubernetesDeploy",
2016
+ "echo Uploading SBOM to Dependency Track",
2017
+ "/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",
2018
+ "echo deployment successful ๐Ÿ˜ป",
2019
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
2020
+ ],
2021
+ "stage": "deploy prod",
2022
+ "variables": {
2023
+ "KUBERNETES_CPU_REQUEST": "0.5",
2024
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2025
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2114
2026
  },
2115
2027
  },
2116
2028
  "api ๐Ÿš€ Deploy | stage ": {
2117
2029
  "allow_failure": false,
2030
+ "artifacts": {
2031
+ "reports": {
2032
+ "dotenv": "gitlab_environment.env",
2033
+ },
2034
+ },
2118
2035
  "environment": {
2119
2036
  "auto_stop_in": undefined,
2120
2037
  "name": "stage/api",
2121
2038
  "on_stop": "api ๐Ÿ›‘ Stop โš ๏ธ | stage ",
2122
- "url": "https://api.stage.test-app.pan.panter.cloud",
2039
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2123
2040
  },
2124
2041
  "image": "path/to/docker/kubernetes:the-version",
2125
2042
  "interruptible": true,
@@ -2150,100 +2067,138 @@ application:
2150
2067
  },
2151
2068
  ],
2152
2069
  "script": [
2070
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2071
+ "export ENV_SHORT="stage"",
2072
+ "export APP_DIR="api"",
2073
+ "export ENV_TYPE="stage"",
2074
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2075
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2076
+ "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")"",
2077
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
2078
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
2079
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
2080
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
2081
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
2082
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
2083
+ "export KUBE_APP_NAME="api"",
2084
+ "export KUBE_APP_NAME_PREFIX=""",
2085
+ "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\\"]"",
2086
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
2087
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
2088
+ "export DOCKER_IMAGE_NAME="stage/api"",
2089
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2090
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2091
+ "export RELEASE_NAME="pan-test-app-stage-api"",
2092
+ "export HELM_EXPERIMENTAL_OCI="1"",
2093
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2094
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2095
+ "export HELM_ARGS=""",
2096
+ "export COMPONENT_NAME="api"",
2097
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2098
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2153
2099
  "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",
2154
2100
  "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
2155
2101
  "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"",
2156
2102
  "kubectl config use-context "kube-pan-test-app-stage-api"",
2157
- "kubernetesCreateSecret",
2158
- "kubernetesDeploy",
2159
- "echo Uploading SBOM to Dependency Track",
2160
- "/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",
2161
- "echo deployment successful ๐Ÿ˜ป",
2162
- ],
2163
- "stage": "deploy stage",
2164
- "variables": {
2165
- "APP_DIR": "api",
2166
- "BUILD_ID": "some-id",
2167
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2168
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2169
- "BUILD_INFO_ID": "some-id",
2170
- "COMPONENT_NAME": "api",
2171
- "DOCKER_CACHE_IMAGE": "$CI_REGISTRY_IMAGE/caches/api",
2172
- "DOCKER_IMAGE": "$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME",
2173
- "DOCKER_IMAGE_NAME": "stage/api",
2174
- "DOCKER_IMAGE_TAG": "$CI_COMMIT_SHA",
2175
- "DOCKER_REGISTRY": "$CI_REGISTRY",
2176
- "ENV_SHORT": "stage",
2177
- "ENV_TYPE": "stage",
2178
- "HELM_ARGS": "",
2179
- "HELM_EXPERIMENTAL_OCI": "1",
2180
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2181
- "HOST": "api.stage.test-app.pan.panter.cloud",
2182
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
2183
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
2184
- "KUBERNETES_CPU_REQUEST": "0.5",
2185
- "KUBERNETES_MEMORY_LIMIT": "400Mi",
2186
- "KUBERNETES_MEMORY_REQUEST": "200Mi",
2187
- "KUBE_APP_NAME": "api",
2188
- "KUBE_APP_NAME_PREFIX": "",
2189
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2190
- "KUBE_NAMESPACE": "pan-test-app-stage",
2191
- "KUBE_VALUES": "env:
2103
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
2104
+ "cat > __all_values.yml <<EOF
2105
+ env:
2192
2106
  secret: {}
2193
2107
  public:
2194
- ENV_SHORT: 'stage'
2195
- APP_DIR: 'api'
2196
- ENV_TYPE: 'stage'
2197
- BUILD_INFO_ID: 'some-id'
2198
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2199
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2200
- HOST: 'api.stage.test-app.pan.panter.cloud'
2201
- ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
2202
- HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
2203
- ROOT_URL_INTERNAL: 'https://api.stage.test-app.pan.panter.cloud'
2204
- KUBE_NAMESPACE: 'pan-test-app-stage'
2205
- KUBE_APP_NAME: 'api'
2206
- KUBE_APP_NAME_PREFIX: ''
2207
- HOST_INTERNAL: 'api.stage.test-app.pan.panter.cloud'
2208
- _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"]'
2108
+ ENV_SHORT: |-
2109
+ stage
2110
+ APP_DIR: |-
2111
+ api
2112
+ ENV_TYPE: |-
2113
+ stage
2114
+ BUILD_INFO_BUILD_ID: |-
2115
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2116
+ BUILD_INFO_BUILD_TIME: |-
2117
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2118
+ BUILD_INFO_CURRENT_VERSION: |-
2119
+ $(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/^/ /')
2120
+ HOST: |-
2121
+ api.stage.test-app.pan.panter.cloud
2122
+ ROOT_URL: |-
2123
+ https://api.stage.test-app.pan.panter.cloud
2124
+ HOST_INTERNAL: |-
2125
+ api.stage.test-app.pan.panter.cloud
2126
+ HOST_CANONICAL: |-
2127
+ api.stage.test-app.pan.panter.cloud
2128
+ ROOT_URL_INTERNAL: |-
2129
+ https://api.stage.test-app.pan.panter.cloud
2130
+ KUBE_NAMESPACE: |-
2131
+ pan-test-app-stage
2132
+ KUBE_APP_NAME: |-
2133
+ api
2134
+ KUBE_APP_NAME_PREFIX: ""
2135
+ _ALL_ENV_VAR_KEYS: |-
2136
+ ["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"]
2209
2137
  application:
2210
- host: 'api.stage.test-app.pan.panter.cloud'
2211
- command: 'node main.js'
2138
+ host: |-
2139
+ api.stage.test-app.pan.panter.cloud
2140
+ command: |-
2141
+ node main.js
2212
2142
  livenessProbe:
2213
2143
  httpGet:
2214
- path: '__health'
2144
+ path: |-
2145
+ __health
2215
2146
  readinessProbe:
2216
2147
  httpGet:
2217
- path: '__health'
2148
+ path: |-
2149
+ __health
2218
2150
  startupProbe:
2219
2151
  httpGet:
2220
- path: '__health'
2152
+ path: |-
2153
+ __health
2221
2154
  autoscale:
2222
2155
  minReplicas: 2
2223
2156
  maxReplicas: 5
2224
2157
  metrics:
2225
- - type: 'Resource'
2158
+ - type: |-
2159
+ Resource
2226
2160
  resource:
2227
- name: 'cpu'
2161
+ name: |-
2162
+ cpu
2228
2163
  target:
2229
- type: 'Utilization'
2164
+ type: |-
2165
+ Utilization
2230
2166
  averageUtilization: 0.5
2231
2167
  resources:
2232
2168
  limits:
2233
- cpu: '1'
2234
- memory: '2048Mi'
2169
+ cpu: |-
2170
+ 1
2171
+ memory: |-
2172
+ 2048Mi
2173
+
2174
+ EOF
2235
2175
  ",
2236
- "RELEASE_NAME": "pan-test-app-stage-api",
2237
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
2238
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
2239
- "_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"]",
2176
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
2177
+ "kubernetesCreateSecret",
2178
+ "kubernetesDeploy",
2179
+ "echo Uploading SBOM to Dependency Track",
2180
+ "/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",
2181
+ "echo deployment successful ๐Ÿ˜ป",
2182
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
2183
+ ],
2184
+ "stage": "deploy stage",
2185
+ "variables": {
2186
+ "KUBERNETES_CPU_REQUEST": "0.5",
2187
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2188
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2240
2189
  },
2241
2190
  },
2242
2191
  "api ๐Ÿ›‘ Stop โš ๏ธ | prod ": {
2192
+ "allow_failure": true,
2193
+ "artifacts": {
2194
+ "reports": {
2195
+ "dotenv": "gitlab_environment.env",
2196
+ },
2197
+ },
2243
2198
  "environment": {
2244
2199
  "action": "stop",
2245
2200
  "name": "prod/api",
2246
- "url": "https://api.prod.test-app.pan.panter.cloud",
2201
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2247
2202
  },
2248
2203
  "image": "path/to/docker/kubernetes:the-version",
2249
2204
  "interruptible": true,
@@ -2257,16 +2212,38 @@ application:
2257
2212
  },
2258
2213
  "rules": [
2259
2214
  {
2260
- "allow_failure": true,
2261
2215
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2262
2216
  "when": "on_success",
2263
2217
  },
2264
2218
  {
2265
- "allow_failure": true,
2266
2219
  "when": "manual",
2267
2220
  },
2268
2221
  ],
2269
2222
  "script": [
2223
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2224
+ "export ENV_SHORT="prod"",
2225
+ "export APP_DIR="api"",
2226
+ "export ENV_TYPE="prod"",
2227
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2228
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2229
+ "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")"",
2230
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
2231
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
2232
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
2233
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
2234
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
2235
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
2236
+ "export KUBE_APP_NAME="api"",
2237
+ "export KUBE_APP_NAME_PREFIX=""",
2238
+ "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\\"]"",
2239
+ "export RELEASE_NAME="pan-test-app-prod-api"",
2240
+ "export HELM_EXPERIMENTAL_OCI="1"",
2241
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2242
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2243
+ "export HELM_ARGS=""",
2244
+ "export COMPONENT_NAME="api"",
2245
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2246
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2270
2247
  "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",
2271
2248
  "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
2272
2249
  "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"",
@@ -2274,87 +2251,27 @@ application:
2274
2251
  "kubernetesDelete",
2275
2252
  "echo Disabling component in Dependency Track",
2276
2253
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" || true",
2254
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
2277
2255
  ],
2278
2256
  "stage": "stop prod",
2279
2257
  "variables": {
2280
- "APP_DIR": "api",
2281
- "BUILD_ID": "some-id",
2282
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2283
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2284
- "BUILD_INFO_ID": "some-id",
2285
- "COMPONENT_NAME": "api",
2286
- "ENV_SHORT": "prod",
2287
- "ENV_TYPE": "prod",
2288
2258
  "GIT_STRATEGY": "none",
2289
- "HELM_ARGS": "",
2290
- "HELM_EXPERIMENTAL_OCI": "1",
2291
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2292
- "HOST": "api.prod.test-app.pan.panter.cloud",
2293
- "HOST_CANONICAL": "api.prod.test-app.pan.panter.cloud",
2294
- "HOST_INTERNAL": "api.prod.test-app.pan.panter.cloud",
2295
2259
  "KUBERNETES_CPU_REQUEST": "0.5",
2296
2260
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
2297
2261
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
2298
- "KUBE_APP_NAME": "api",
2299
- "KUBE_APP_NAME_PREFIX": "",
2300
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2301
- "KUBE_NAMESPACE": "pan-test-app-prod",
2302
- "KUBE_VALUES": "env:
2303
- secret: {}
2304
- public:
2305
- ENV_SHORT: 'prod'
2306
- APP_DIR: 'api'
2307
- ENV_TYPE: 'prod'
2308
- BUILD_INFO_ID: 'some-id'
2309
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2310
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2311
- HOST: 'api.prod.test-app.pan.panter.cloud'
2312
- ROOT_URL: 'https://api.prod.test-app.pan.panter.cloud'
2313
- HOST_CANONICAL: 'api.prod.test-app.pan.panter.cloud'
2314
- ROOT_URL_INTERNAL: 'https://api.prod.test-app.pan.panter.cloud'
2315
- KUBE_NAMESPACE: 'pan-test-app-prod'
2316
- KUBE_APP_NAME: 'api'
2317
- KUBE_APP_NAME_PREFIX: ''
2318
- HOST_INTERNAL: 'api.prod.test-app.pan.panter.cloud'
2319
- _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"]'
2320
- application:
2321
- host: 'api.prod.test-app.pan.panter.cloud'
2322
- command: 'node main.js'
2323
- livenessProbe:
2324
- httpGet:
2325
- path: '__health'
2326
- readinessProbe:
2327
- httpGet:
2328
- path: '__health'
2329
- startupProbe:
2330
- httpGet:
2331
- path: '__health'
2332
- autoscale:
2333
- minReplicas: 2
2334
- maxReplicas: 5
2335
- metrics:
2336
- - type: 'Resource'
2337
- resource:
2338
- name: 'cpu'
2339
- target:
2340
- type: 'Utilization'
2341
- averageUtilization: 0.5
2342
- resources:
2343
- limits:
2344
- cpu: '1'
2345
- memory: '2048Mi'
2346
- ",
2347
- "RELEASE_NAME": "pan-test-app-prod-api",
2348
- "ROOT_URL": "https://api.prod.test-app.pan.panter.cloud",
2349
- "ROOT_URL_INTERNAL": "https://api.prod.test-app.pan.panter.cloud",
2350
- "_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"]",
2351
2262
  },
2352
2263
  },
2353
2264
  "api ๐Ÿ›‘ Stop โš ๏ธ | stage ": {
2265
+ "allow_failure": true,
2266
+ "artifacts": {
2267
+ "reports": {
2268
+ "dotenv": "gitlab_environment.env",
2269
+ },
2270
+ },
2354
2271
  "environment": {
2355
2272
  "action": "stop",
2356
2273
  "name": "stage/api",
2357
- "url": "https://api.stage.test-app.pan.panter.cloud",
2274
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2358
2275
  },
2359
2276
  "image": "path/to/docker/kubernetes:the-version",
2360
2277
  "interruptible": true,
@@ -2368,16 +2285,38 @@ application:
2368
2285
  },
2369
2286
  "rules": [
2370
2287
  {
2371
- "allow_failure": true,
2372
2288
  "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2373
2289
  "when": "on_success",
2374
2290
  },
2375
2291
  {
2376
- "allow_failure": true,
2377
2292
  "when": "manual",
2378
2293
  },
2379
2294
  ],
2380
2295
  "script": [
2296
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2297
+ "export ENV_SHORT="stage"",
2298
+ "export APP_DIR="api"",
2299
+ "export ENV_TYPE="stage"",
2300
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2301
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2302
+ "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")"",
2303
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
2304
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
2305
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
2306
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
2307
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
2308
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
2309
+ "export KUBE_APP_NAME="api"",
2310
+ "export KUBE_APP_NAME_PREFIX=""",
2311
+ "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\\"]"",
2312
+ "export RELEASE_NAME="pan-test-app-stage-api"",
2313
+ "export HELM_EXPERIMENTAL_OCI="1"",
2314
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2315
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2316
+ "export HELM_ARGS=""",
2317
+ "export COMPONENT_NAME="api"",
2318
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2319
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2381
2320
  "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",
2382
2321
  "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
2383
2322
  "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"",
@@ -2385,80 +2324,14 @@ application:
2385
2324
  "kubernetesDelete",
2386
2325
  "echo Disabling component in Dependency Track",
2387
2326
  "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" || true",
2327
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
2388
2328
  ],
2389
2329
  "stage": "stop stage",
2390
2330
  "variables": {
2391
- "APP_DIR": "api",
2392
- "BUILD_ID": "some-id",
2393
- "BUILD_INFO_BUILD_TIME": "01-01-2023 12:13:14",
2394
- "BUILD_INFO_CURRENT_VERSION": "3.2.1",
2395
- "BUILD_INFO_ID": "some-id",
2396
- "COMPONENT_NAME": "api",
2397
- "ENV_SHORT": "stage",
2398
- "ENV_TYPE": "stage",
2399
2331
  "GIT_STRATEGY": "none",
2400
- "HELM_ARGS": "",
2401
- "HELM_EXPERIMENTAL_OCI": "1",
2402
- "HELM_GITLAB_CHART_NAME": "/helm-charts/the-panter-chart",
2403
- "HOST": "api.stage.test-app.pan.panter.cloud",
2404
- "HOST_CANONICAL": "api.stage.test-app.pan.panter.cloud",
2405
- "HOST_INTERNAL": "api.stage.test-app.pan.panter.cloud",
2406
2332
  "KUBERNETES_CPU_REQUEST": "0.5",
2407
2333
  "KUBERNETES_MEMORY_LIMIT": "400Mi",
2408
2334
  "KUBERNETES_MEMORY_REQUEST": "200Mi",
2409
- "KUBE_APP_NAME": "api",
2410
- "KUBE_APP_NAME_PREFIX": "",
2411
- "KUBE_DOCKER_IMAGE_PULL_SECRET": "gitlab-registry-api",
2412
- "KUBE_NAMESPACE": "pan-test-app-stage",
2413
- "KUBE_VALUES": "env:
2414
- secret: {}
2415
- public:
2416
- ENV_SHORT: 'stage'
2417
- APP_DIR: 'api'
2418
- ENV_TYPE: 'stage'
2419
- BUILD_INFO_ID: 'some-id'
2420
- BUILD_INFO_BUILD_TIME: '01-01-2023 12:13:14'
2421
- BUILD_INFO_CURRENT_VERSION: '3.2.1'
2422
- HOST: 'api.stage.test-app.pan.panter.cloud'
2423
- ROOT_URL: 'https://api.stage.test-app.pan.panter.cloud'
2424
- HOST_CANONICAL: 'api.stage.test-app.pan.panter.cloud'
2425
- ROOT_URL_INTERNAL: 'https://api.stage.test-app.pan.panter.cloud'
2426
- KUBE_NAMESPACE: 'pan-test-app-stage'
2427
- KUBE_APP_NAME: 'api'
2428
- KUBE_APP_NAME_PREFIX: ''
2429
- HOST_INTERNAL: 'api.stage.test-app.pan.panter.cloud'
2430
- _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"]'
2431
- application:
2432
- host: 'api.stage.test-app.pan.panter.cloud'
2433
- command: 'node main.js'
2434
- livenessProbe:
2435
- httpGet:
2436
- path: '__health'
2437
- readinessProbe:
2438
- httpGet:
2439
- path: '__health'
2440
- startupProbe:
2441
- httpGet:
2442
- path: '__health'
2443
- autoscale:
2444
- minReplicas: 2
2445
- maxReplicas: 5
2446
- metrics:
2447
- - type: 'Resource'
2448
- resource:
2449
- name: 'cpu'
2450
- target:
2451
- type: 'Utilization'
2452
- averageUtilization: 0.5
2453
- resources:
2454
- limits:
2455
- cpu: '1'
2456
- memory: '2048Mi'
2457
- ",
2458
- "RELEASE_NAME": "pan-test-app-stage-api",
2459
- "ROOT_URL": "https://api.stage.test-app.pan.panter.cloud",
2460
- "ROOT_URL_INTERNAL": "https://api.stage.test-app.pan.panter.cloud",
2461
- "_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"]",
2462
2335
  },
2463
2336
  },
2464
2337
  "api ๐Ÿงพ sbom | prod ": {
@@ -2479,6 +2352,8 @@ application:
2479
2352
  ],
2480
2353
  },
2481
2354
  "script": [
2355
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2356
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2482
2357
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
2483
2358
  ],
2484
2359
  "stage": "build",
@@ -2502,6 +2377,8 @@ application:
2502
2377
  ],
2503
2378
  },
2504
2379
  "script": [
2380
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2381
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2505
2382
  "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
2506
2383
  ],
2507
2384
  "stage": "build",
@@ -2554,7 +2431,7 @@ application:
2554
2431
  ],
2555
2432
  "variables": {
2556
2433
  "FF_USE_FASTZIP": "true",
2557
- "GIT_DEPTH": 1,
2434
+ "GIT_DEPTH": "1",
2558
2435
  },
2559
2436
  "workflow": {
2560
2437
  "rules": [