@catladder/pipeline 0.0.0-node16-ddfae617 → 0.0.0-perf-cli-reduce-bundle-size-with-tsconfig-optimization-3556aaa4

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 (543) hide show
  1. package/README.md +17 -0
  2. package/bin/catladder-gitlab-dev.js +3 -0
  3. package/bin/catladder-gitlab.js +1 -1
  4. package/dist/bash/BashExpression.d.ts +40 -0
  5. package/dist/bash/BashExpression.js +124 -0
  6. package/dist/bash/bashExpressionPerPipelineType.d.ts +6 -0
  7. package/dist/bash/bashExpressionPerPipelineType.js +11 -0
  8. package/dist/bash/bashYaml.d.ts +10 -0
  9. package/dist/bash/bashYaml.js +46 -0
  10. package/dist/bash/getInjectVarsScript.d.ts +2 -0
  11. package/dist/bash/getInjectVarsScript.js +45 -0
  12. package/dist/bash/replaceAsync.d.ts +2 -0
  13. package/dist/bash/replaceAsync.js +171 -0
  14. package/dist/build/artifacts/createBuildJobArtifact.d.ts +3 -0
  15. package/dist/build/artifacts/createBuildJobArtifact.js +97 -0
  16. package/dist/build/base/__tests__/createArtifactsConfig.test.js +42 -0
  17. package/dist/build/base/constants.d.ts +0 -1
  18. package/dist/build/base/constants.js +4 -3
  19. package/dist/build/base/createAppBuildJob.d.ts +9 -0
  20. package/dist/build/base/createAppBuildJob.js +87 -0
  21. package/dist/build/base/createArtifactsConfig.d.ts +4 -0
  22. package/dist/build/base/createArtifactsConfig.js +65 -0
  23. package/dist/build/base/index.d.ts +12 -0
  24. package/dist/build/base/index.js +68 -0
  25. package/dist/build/base/writeBuildInfo.d.ts +2 -0
  26. package/dist/build/base/writeBuildInfo.js +10 -0
  27. package/dist/build/base/writeDotEnv.d.ts +8 -0
  28. package/dist/build/base/writeDotEnv.js +66 -0
  29. package/dist/build/custom/__tests__/testJob.test.js +36 -0
  30. package/dist/build/custom/buildJob.d.ts +3 -0
  31. package/dist/build/custom/buildJob.js +67 -0
  32. package/dist/build/custom/index.d.ts +3 -0
  33. package/dist/build/custom/index.js +43 -0
  34. package/dist/build/custom/testJob.d.ts +7 -0
  35. package/dist/build/custom/testJob.js +100 -0
  36. package/dist/build/docker.d.ts +61 -22
  37. package/dist/build/docker.js +110 -73
  38. package/dist/build/index.d.ts +16 -8
  39. package/dist/build/index.js +61 -19
  40. package/dist/build/node/buildJob.d.ts +8 -3
  41. package/dist/build/node/buildJob.js +48 -68
  42. package/dist/build/node/cache.d.ts +4 -3
  43. package/dist/build/node/cache.js +45 -32
  44. package/dist/build/node/constants.d.ts +0 -1
  45. package/dist/build/node/constants.js +5 -4
  46. package/dist/build/node/index.d.ts +5 -5
  47. package/dist/build/node/index.js +6 -17
  48. package/dist/build/node/meteor.d.ts +3 -3
  49. package/dist/build/node/meteor.js +26 -37
  50. package/dist/build/node/testJob.d.ts +4 -3
  51. package/dist/build/node/testJob.js +35 -36
  52. package/dist/build/node/yarn.d.ts +6 -6
  53. package/dist/build/node/yarn.js +40 -25
  54. package/dist/build/rails/build.d.ts +3 -0
  55. package/dist/build/rails/build.js +90 -0
  56. package/dist/build/rails/index.d.ts +3 -0
  57. package/dist/build/rails/index.js +43 -0
  58. package/dist/build/rails/test.d.ts +3 -0
  59. package/dist/build/rails/test.js +103 -0
  60. package/dist/build/sbom.d.ts +5 -0
  61. package/dist/build/sbom.js +32 -0
  62. package/dist/build/types.d.ts +251 -33
  63. package/dist/build/types.js +10 -6
  64. package/dist/bundles/catladder-gitlab/index.js +41626 -0
  65. package/dist/catladder-gitlab.js +130 -68
  66. package/dist/config/{configruedEnvs.test.js → __tests__/configruedEnvs.test.js} +13 -13
  67. package/dist/config/__tests__/getAllEnvs.test.js +79 -0
  68. package/dist/config/__tests__/getAllEnvsInAllComponents.test.d.ts +1 -0
  69. package/dist/config/__tests__/getAllEnvsInAllComponents.test.js +73 -0
  70. package/dist/config/configruedEnvs.d.ts +1 -1
  71. package/dist/config/configruedEnvs.js +10 -23
  72. package/dist/config/index.js +13 -11
  73. package/dist/config/readConfig.d.ts +3 -3
  74. package/dist/config/readConfig.js +193 -52
  75. package/dist/constants.js +5 -3
  76. package/dist/context/__tests__/resolveReferences.test.d.ts +1 -0
  77. package/dist/context/__tests__/resolveReferences.test.js +368 -0
  78. package/dist/context/createAllComponentsContext.d.ts +12 -0
  79. package/dist/context/createAllComponentsContext.js +159 -0
  80. package/dist/context/createComponentContext.d.ts +11 -0
  81. package/dist/context/createComponentContext.js +256 -0
  82. package/dist/context/createWorkspaceContext.d.ts +16 -0
  83. package/dist/context/createWorkspaceContext.js +173 -0
  84. package/dist/context/getBuildInfoVariables.d.ts +6 -0
  85. package/dist/context/getBuildInfoVariables.js +55 -0
  86. package/dist/context/getEnvConfig.d.ts +2 -0
  87. package/dist/context/getEnvConfig.js +20 -0
  88. package/dist/context/getEnvType.d.ts +4 -0
  89. package/dist/context/getEnvType.js +15 -0
  90. package/dist/context/getEnvironment.d.ts +3 -0
  91. package/dist/{pipeline/createChildPipeline.test.js → context/getEnvironment.js} +50 -86
  92. package/dist/context/getEnvironmentContext.d.ts +8 -0
  93. package/dist/context/getEnvironmentContext.js +43 -0
  94. package/dist/context/getEnvironmentVariables.d.ts +27 -0
  95. package/dist/context/getEnvironmentVariables.js +285 -0
  96. package/dist/context/getLabels.d.ts +9 -0
  97. package/dist/context/getLabels.js +41 -0
  98. package/dist/context/getReviewSlug.d.ts +4 -0
  99. package/dist/context/getReviewSlug.js +22 -0
  100. package/dist/context/index.d.ts +3 -6
  101. package/dist/context/index.js +22 -219
  102. package/dist/context/resolveReferences.d.ts +3 -3
  103. package/dist/context/resolveReferences.js +248 -55
  104. package/dist/context/transformJobOnlyVars.d.ts +13 -0
  105. package/dist/{build/tests/storybook.test.js → context/transformJobOnlyVars.js} +54 -106
  106. package/dist/context/utils/envVars.d.ts +8 -0
  107. package/dist/context/utils/envVars.js +55 -0
  108. package/dist/defaults/index.d.ts +1 -1
  109. package/dist/defaults/index.js +3 -1
  110. package/dist/deploy/base/deploy.d.ts +5 -0
  111. package/dist/deploy/base/deploy.js +121 -0
  112. package/dist/deploy/base/index.d.ts +10 -0
  113. package/dist/deploy/base/index.js +44 -0
  114. package/dist/deploy/base/rollback.d.ts +5 -0
  115. package/dist/deploy/base/rollback.js +41 -0
  116. package/dist/deploy/base/stop.d.ts +5 -0
  117. package/dist/deploy/base/stop.js +46 -0
  118. package/dist/deploy/base/types.d.ts +2 -0
  119. package/dist/deploy/base/types.js +5 -0
  120. package/dist/deploy/base/variables.d.ts +5 -0
  121. package/dist/deploy/base/variables.js +11 -0
  122. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +19 -0
  123. package/dist/deploy/cloudRun/artifactsRegistry.js +125 -0
  124. package/dist/deploy/cloudRun/cleanup.d.ts +2 -0
  125. package/dist/deploy/cloudRun/cleanup.js +53 -0
  126. package/dist/deploy/cloudRun/cloudRunRevisions.d.ts +2 -0
  127. package/dist/deploy/cloudRun/cloudRunRevisions.js +62 -0
  128. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.d.ts +7 -0
  129. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +187 -0
  130. package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +4 -0
  131. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +93 -0
  132. package/dist/deploy/cloudRun/createJobs/common.d.ts +18 -0
  133. package/dist/deploy/cloudRun/createJobs/common.js +93 -0
  134. package/dist/deploy/cloudRun/createJobs/constants.d.ts +1 -0
  135. package/dist/deploy/cloudRun/createJobs/constants.js +7 -0
  136. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.d.ts +2 -0
  137. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +62 -0
  138. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.d.ts +2 -0
  139. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +54 -0
  140. package/dist/deploy/cloudRun/createJobs/index.d.ts +3 -0
  141. package/dist/deploy/cloudRun/createJobs/index.js +58 -0
  142. package/dist/deploy/cloudRun/createJobs/volumes.d.ts +3 -0
  143. package/dist/deploy/cloudRun/createJobs/volumes.js +58 -0
  144. package/dist/deploy/cloudRun/index.d.ts +4 -0
  145. package/dist/deploy/cloudRun/index.js +128 -0
  146. package/dist/deploy/cloudRun/utils/createArgsString.d.ts +13 -0
  147. package/dist/deploy/cloudRun/utils/createArgsString.js +63 -0
  148. package/dist/deploy/cloudRun/utils/database.d.ts +6 -0
  149. package/dist/deploy/cloudRun/utils/database.js +77 -0
  150. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.d.ts +2 -0
  151. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +12 -0
  152. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +2 -0
  153. package/dist/deploy/cloudRun/utils/getServiceName.js +10 -0
  154. package/dist/deploy/cloudRun/utils/jobName.d.ts +2 -0
  155. package/dist/deploy/cloudRun/utils/jobName.js +10 -0
  156. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.d.ts +9 -0
  157. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +18 -0
  158. package/dist/deploy/cloudSql/utils.d.ts +4 -0
  159. package/dist/deploy/cloudSql/utils.js +14 -0
  160. package/dist/deploy/custom/deployJob.d.ts +3 -3
  161. package/dist/deploy/custom/deployJob.js +28 -25
  162. package/dist/deploy/custom/index.d.ts +2 -1
  163. package/dist/deploy/custom/index.js +16 -19
  164. package/dist/deploy/dockerTag/deployJob.d.ts +3 -0
  165. package/dist/deploy/dockerTag/deployJob.js +65 -0
  166. package/dist/deploy/dockerTag/index.d.ts +2 -0
  167. package/dist/deploy/dockerTag/index.js +19 -0
  168. package/dist/deploy/index.d.ts +15 -9
  169. package/dist/deploy/index.js +20 -27
  170. package/dist/deploy/kubernetes/additionalSecretKeys.d.ts +8 -0
  171. package/dist/deploy/kubernetes/additionalSecretKeys.js +30 -0
  172. package/dist/deploy/kubernetes/cloudSql/index.d.ts +14 -0
  173. package/dist/deploy/kubernetes/cloudSql/index.js +55 -0
  174. package/dist/deploy/kubernetes/deployJob.d.ts +3 -3
  175. package/dist/deploy/kubernetes/deployJob.js +43 -124
  176. package/dist/deploy/kubernetes/index.d.ts +3 -1
  177. package/dist/deploy/kubernetes/index.js +86 -11
  178. package/dist/deploy/kubernetes/kubeEnv.d.ts +10 -0
  179. package/dist/deploy/kubernetes/kubeEnv.js +76 -0
  180. package/dist/deploy/kubernetes/kubeValues.d.ts +90 -0
  181. package/dist/deploy/kubernetes/kubeValues.js +123 -0
  182. package/dist/deploy/kubernetes/mongodb.d.ts +19 -6
  183. package/dist/deploy/kubernetes/mongodb.js +100 -11
  184. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +27 -29
  185. package/dist/deploy/kubernetes/processSecretsAsFiles.js +5 -11
  186. package/dist/deploy/sbom.d.ts +4 -0
  187. package/dist/deploy/sbom.js +20 -0
  188. package/dist/deploy/types/base.d.ts +36 -0
  189. package/dist/deploy/types/base.js +5 -0
  190. package/dist/deploy/types/custom.d.ts +33 -0
  191. package/dist/deploy/types/custom.js +5 -0
  192. package/dist/deploy/types/dockerTag.d.ts +12 -0
  193. package/dist/deploy/types/dockerTag.js +5 -0
  194. package/dist/deploy/types/googleCloudRun.d.ts +208 -0
  195. package/dist/deploy/types/googleCloudRun.js +5 -0
  196. package/dist/deploy/types/index.d.ts +22 -0
  197. package/dist/deploy/types/index.js +37 -0
  198. package/dist/deploy/types/kubernetes.d.ts +355 -0
  199. package/dist/deploy/types/kubernetes.js +5 -0
  200. package/dist/deploy/utils.d.ts +3 -3
  201. package/dist/deploy/utils.js +8 -12
  202. package/dist/index.d.ts +3 -2
  203. package/dist/index.js +16 -19
  204. package/dist/packageInfos.d.ts +4 -0
  205. package/dist/packageInfos.js +20 -0
  206. package/dist/pipeline/__tests__/getPipelineStages.test.d.ts +1 -0
  207. package/dist/pipeline/__tests__/getPipelineStages.test.js +73 -0
  208. package/dist/pipeline/createAllJobs.d.ts +18 -0
  209. package/dist/pipeline/createAllJobs.js +236 -0
  210. package/dist/pipeline/createChildPipeline.d.ts +3 -3
  211. package/dist/pipeline/createChildPipeline.js +45 -157
  212. package/dist/pipeline/createJobsForComponent.d.ts +3 -0
  213. package/dist/{build/base/createBuildJob.js → pipeline/createJobsForComponent.js} +32 -51
  214. package/dist/pipeline/createJobsForWorkspace.d.ts +3 -0
  215. package/dist/pipeline/createJobsForWorkspace.js +12 -0
  216. package/dist/pipeline/createMainPipeline.d.ts +3 -0
  217. package/dist/pipeline/createMainPipeline.js +269 -0
  218. package/dist/pipeline/generatePipelineFiles.d.ts +40 -0
  219. package/dist/pipeline/generatePipelineFiles.js +240 -0
  220. package/dist/pipeline/getPipelineStages.d.ts +7 -0
  221. package/dist/pipeline/getPipelineStages.js +56 -0
  222. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +11 -0
  223. package/dist/pipeline/gitlab/createGitlabJobs.js +461 -0
  224. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +8 -0
  225. package/dist/pipeline/gitlab/createGitlabPipeline.js +41 -0
  226. package/dist/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.d.ts +1 -0
  227. package/dist/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.js +29 -0
  228. package/dist/pipeline/gitlab/gitlabReleaseJobs.d.ts +35 -0
  229. package/dist/pipeline/gitlab/gitlabReleaseJobs.js +27 -0
  230. package/dist/pipeline/gitlab/sortGitLabJobDefProps.d.ts +7 -0
  231. package/dist/pipeline/gitlab/sortGitLabJobDefProps.js +27 -0
  232. package/dist/pipeline/index.d.ts +3 -1
  233. package/dist/pipeline/index.js +16 -12
  234. package/dist/pipeline/packageManager.d.ts +3 -2
  235. package/dist/pipeline/packageManager.js +69 -196
  236. package/dist/pipeline/yarn/yarnUtils.d.ts +5 -0
  237. package/dist/pipeline/yarn/yarnUtils.js +241 -0
  238. package/dist/rules/index.d.ts +10 -2
  239. package/dist/rules/index.js +36 -16
  240. package/dist/runner/index.d.ts +2 -3
  241. package/dist/runner/index.js +3 -4
  242. package/dist/tsconfig.tsbuildinfo +1 -1
  243. package/dist/types/config.d.ts +56 -32
  244. package/dist/types/config.js +11 -18
  245. package/dist/types/context.d.ts +143 -27
  246. package/dist/types/context.js +12 -1
  247. package/dist/types/environmentContext.d.ts +31 -0
  248. package/dist/types/environmentContext.js +5 -0
  249. package/dist/types/gitlab-ci-yml.d.ts +769 -0
  250. package/dist/types/gitlab-ci-yml.js +10 -0
  251. package/dist/types/gitlab-types.d.ts +12 -60
  252. package/dist/types/gitlab-types.js +3 -1
  253. package/dist/types/index.js +13 -13
  254. package/dist/types/jobs.d.ts +55 -21
  255. package/dist/types/jobs.js +4 -2
  256. package/dist/types/pipeline.d.ts +5 -4
  257. package/dist/types/pipeline.js +3 -1
  258. package/dist/types/utils.d.ts +1 -0
  259. package/dist/types/utils.js +5 -0
  260. package/dist/utils/gitlab.d.ts +6 -0
  261. package/dist/utils/gitlab.js +56 -0
  262. package/dist/utils/index.d.ts +1 -1
  263. package/dist/utils/index.js +8 -16
  264. package/dist/utils/jsonParse.d.ts +1 -0
  265. package/dist/utils/jsonParse.js +14 -0
  266. package/dist/utils/removeUndefined.d.ts +1 -0
  267. package/dist/utils/removeUndefined.js +36 -0
  268. package/dist/utils/writeFiles.d.ts +11 -0
  269. package/dist/utils/writeFiles.js +180 -0
  270. package/examples/.test-gen-ignore +1 -0
  271. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +3300 -0
  272. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +3260 -0
  273. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +3300 -0
  274. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +3404 -0
  275. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +3300 -0
  276. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +3322 -0
  277. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +3300 -0
  278. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +3300 -0
  279. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +3388 -0
  280. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +2900 -0
  281. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +3300 -0
  282. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +6760 -0
  283. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +6030 -0
  284. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +3316 -0
  285. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +2983 -0
  286. package/examples/__snapshots__/custom-build-job.test.ts.snap +2572 -0
  287. package/examples/__snapshots__/custom-deploy.test.ts.snap +2824 -0
  288. package/examples/__snapshots__/custom-envs.test.ts.snap +1884 -0
  289. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +2588 -0
  290. package/examples/__snapshots__/git-submodule.test.ts.snap +3304 -0
  291. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +4228 -0
  292. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +4252 -0
  293. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +4268 -0
  294. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +7910 -0
  295. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +4476 -0
  296. package/examples/__snapshots__/local-dot-env.test.ts.snap +3300 -0
  297. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +4342 -0
  298. package/examples/__snapshots__/multiline-var.test.ts.snap +7864 -0
  299. package/examples/__snapshots__/native-app.test.ts.snap +5316 -0
  300. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +3300 -0
  301. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +3316 -0
  302. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +2011 -0
  303. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +3465 -0
  304. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +3380 -0
  305. package/examples/__utils__/helpers.ts +27 -0
  306. package/examples/cloud-run-memory-limit.test.ts +18 -0
  307. package/examples/cloud-run-memory-limit.ts +33 -0
  308. package/examples/cloud-run-meteor-with-worker.test.ts +18 -0
  309. package/examples/cloud-run-meteor-with-worker.ts +37 -0
  310. package/examples/cloud-run-no-cpu-throttling.test.ts +18 -0
  311. package/examples/cloud-run-no-cpu-throttling.ts +35 -0
  312. package/examples/cloud-run-no-service.test.ts +18 -0
  313. package/examples/cloud-run-no-service.ts +33 -0
  314. package/examples/cloud-run-non-public.test.ts +18 -0
  315. package/examples/cloud-run-non-public.ts +28 -0
  316. package/examples/cloud-run-post-stop-job.test.ts +18 -0
  317. package/examples/cloud-run-post-stop-job.ts +42 -0
  318. package/examples/cloud-run-service-gen2.test.ts +18 -0
  319. package/examples/cloud-run-service-gen2.ts +29 -0
  320. package/examples/cloud-run-service-increase-timout.test.ts +18 -0
  321. package/examples/cloud-run-service-increase-timout.ts +29 -0
  322. package/examples/cloud-run-service-with-volumes.test.ts +18 -0
  323. package/examples/cloud-run-service-with-volumes.ts +56 -0
  324. package/examples/cloud-run-storybook.test.ts +18 -0
  325. package/examples/cloud-run-storybook.ts +33 -0
  326. package/examples/cloud-run-with-ngnix.test.ts +18 -0
  327. package/examples/cloud-run-with-ngnix.ts +29 -0
  328. package/examples/cloud-run-with-sql-reuse-db.test.ts +18 -0
  329. package/examples/cloud-run-with-sql-reuse-db.ts +55 -0
  330. package/examples/cloud-run-with-sql.test.ts +18 -0
  331. package/examples/cloud-run-with-sql.ts +71 -0
  332. package/examples/cloud-run-with-worker.test.ts +18 -0
  333. package/examples/cloud-run-with-worker.ts +37 -0
  334. package/examples/custom-build-job-with-tests.test.ts +18 -0
  335. package/examples/custom-build-job-with-tests.ts +56 -0
  336. package/examples/custom-build-job.test.ts +18 -0
  337. package/examples/custom-build-job.ts +29 -0
  338. package/examples/custom-deploy.test.ts +18 -0
  339. package/examples/custom-deploy.ts +36 -0
  340. package/examples/custom-envs.test.ts +18 -0
  341. package/examples/custom-envs.ts +32 -0
  342. package/examples/custom-sbom-java.test.ts +18 -0
  343. package/examples/custom-sbom-java.ts +38 -0
  344. package/examples/git-submodule.test.ts +18 -0
  345. package/examples/git-submodule.ts +30 -0
  346. package/examples/kubernetes-application-customization.test.ts +18 -0
  347. package/examples/kubernetes-application-customization.ts +59 -0
  348. package/examples/kubernetes-with-cloud-sql-legacy.test.ts +18 -0
  349. package/examples/kubernetes-with-cloud-sql-legacy.ts +35 -0
  350. package/examples/kubernetes-with-cloud-sql.test.ts +18 -0
  351. package/examples/kubernetes-with-cloud-sql.ts +37 -0
  352. package/examples/kubernetes-with-jobs.test.ts +18 -0
  353. package/examples/kubernetes-with-jobs.ts +70 -0
  354. package/examples/kubernetes-with-mongodb.test.ts +18 -0
  355. package/examples/kubernetes-with-mongodb.ts +51 -0
  356. package/examples/local-dot-env.test.ts +18 -0
  357. package/examples/local-dot-env.ts +27 -0
  358. package/examples/meteor-kubernetes.test.ts +18 -0
  359. package/examples/meteor-kubernetes.ts +64 -0
  360. package/examples/multiline-var.test.ts +18 -0
  361. package/examples/multiline-var.ts +65 -0
  362. package/examples/native-app.test.ts +18 -0
  363. package/examples/native-app.ts +83 -0
  364. package/examples/node-build-with-custom-image.test.ts +18 -0
  365. package/examples/node-build-with-custom-image.ts +26 -0
  366. package/examples/node-build-with-docker-additions.test.ts +18 -0
  367. package/examples/node-build-with-docker-additions.ts +29 -0
  368. package/examples/rails-k8s-with-worker-dockerfile.test.ts +9 -0
  369. package/examples/rails-k8s-with-worker.test.ts +18 -0
  370. package/examples/rails-k8s-with-worker.ts +95 -0
  371. package/examples/wait-for-other-deploy.test.ts +18 -0
  372. package/examples/wait-for-other-deploy.ts +37 -0
  373. package/package.json +76 -17
  374. package/scripts/bundle +2 -0
  375. package/scripts/generate-examples-test.ts +93 -0
  376. package/scripts/generate-gitlab-ci-types.ts +51 -0
  377. package/scripts/tsconfig.json +7 -0
  378. package/src/bash/BashExpression.ts +81 -0
  379. package/src/bash/bashExpressionPerPipelineType.ts +16 -0
  380. package/src/bash/bashYaml.ts +46 -0
  381. package/src/bash/getInjectVarsScript.ts +12 -0
  382. package/src/bash/replaceAsync.ts +50 -0
  383. package/src/build/artifacts/createBuildJobArtifact.ts +61 -0
  384. package/src/build/base/__tests__/__snapshots__/createArtifactsConfig.test.ts.snap +49 -0
  385. package/src/build/base/__tests__/createArtifactsConfig.test.ts +41 -0
  386. package/src/build/base/constants.ts +2 -2
  387. package/src/build/base/createAppBuildJob.ts +70 -0
  388. package/src/build/base/createArtifactsConfig.ts +34 -0
  389. package/src/build/base/index.ts +62 -0
  390. package/src/build/base/writeBuildInfo.ts +7 -0
  391. package/src/build/base/writeDotEnv.ts +40 -0
  392. package/src/build/custom/__tests__/testJob.test.ts +29 -0
  393. package/src/build/custom/buildJob.ts +41 -0
  394. package/src/build/custom/index.ts +8 -0
  395. package/src/build/custom/testJob.ts +93 -0
  396. package/src/build/docker.ts +173 -63
  397. package/src/build/index.ts +59 -8
  398. package/src/build/node/buildJob.ts +84 -64
  399. package/src/build/node/cache.ts +59 -24
  400. package/src/build/node/constants.ts +2 -3
  401. package/src/build/node/index.ts +9 -5
  402. package/src/build/node/meteor.ts +41 -44
  403. package/src/build/node/testJob.ts +57 -16
  404. package/src/build/node/yarn.ts +81 -25
  405. package/src/build/rails/build.ts +69 -0
  406. package/src/build/rails/index.ts +8 -0
  407. package/src/build/rails/test.ts +103 -0
  408. package/src/build/sbom.ts +48 -0
  409. package/src/build/types.ts +301 -27
  410. package/src/catladder-gitlab.ts +12 -52
  411. package/src/config/__tests__/__snapshots__/getAllEnvs.test.ts.snap +31 -0
  412. package/src/config/__tests__/__snapshots__/getAllEnvsInAllComponents.test.ts.snap +15 -0
  413. package/src/config/{configruedEnvs.test.ts → __tests__/configruedEnvs.test.ts} +3 -3
  414. package/src/config/__tests__/getAllEnvs.test.ts +71 -0
  415. package/src/config/__tests__/getAllEnvsInAllComponents.test.ts +63 -0
  416. package/src/config/configruedEnvs.ts +8 -13
  417. package/src/config/readConfig.ts +17 -23
  418. package/src/constants.ts +5 -2
  419. package/src/context/{resolveReferences.test.ts → __tests__/resolveReferences.test.ts} +34 -44
  420. package/src/context/createAllComponentsContext.ts +31 -0
  421. package/src/context/createComponentContext.ts +135 -0
  422. package/src/context/createWorkspaceContext.ts +56 -0
  423. package/src/context/getBuildInfoVariables.ts +36 -0
  424. package/src/context/getEnvConfig.ts +21 -0
  425. package/src/context/getEnvType.ts +17 -0
  426. package/src/context/getEnvironment.ts +26 -0
  427. package/src/context/getEnvironmentContext.ts +53 -0
  428. package/src/context/getEnvironmentVariables.ts +210 -0
  429. package/src/context/getLabels.ts +21 -0
  430. package/src/context/getReviewSlug.ts +27 -0
  431. package/src/context/index.ts +3 -232
  432. package/src/context/resolveReferences.ts +67 -40
  433. package/src/context/transformJobOnlyVars.ts +45 -0
  434. package/src/context/utils/envVars.ts +27 -0
  435. package/src/defaults/index.ts +1 -1
  436. package/src/deploy/base/deploy.ts +136 -0
  437. package/src/deploy/base/index.ts +22 -0
  438. package/src/deploy/base/rollback.ts +38 -0
  439. package/src/deploy/base/stop.ts +43 -0
  440. package/src/deploy/base/types.ts +3 -0
  441. package/src/deploy/base/variables.ts +5 -0
  442. package/src/deploy/cloudRun/artifactsRegistry.ts +126 -0
  443. package/src/deploy/cloudRun/cleanup.ts +30 -0
  444. package/src/deploy/cloudRun/cloudRunRevisions.ts +65 -0
  445. package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +198 -0
  446. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +86 -0
  447. package/src/deploy/cloudRun/createJobs/common.ts +59 -0
  448. package/src/deploy/cloudRun/createJobs/constants.ts +1 -0
  449. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +79 -0
  450. package/src/deploy/cloudRun/createJobs/getCloudRunStopScripts.ts +34 -0
  451. package/src/deploy/cloudRun/createJobs/index.ts +51 -0
  452. package/src/deploy/cloudRun/createJobs/volumes.ts +23 -0
  453. package/src/deploy/cloudRun/index.ts +127 -0
  454. package/src/deploy/cloudRun/utils/createArgsString.ts +34 -0
  455. package/src/deploy/cloudRun/utils/database.ts +77 -0
  456. package/src/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.ts +12 -0
  457. package/src/deploy/cloudRun/utils/getServiceName.ts +3 -0
  458. package/src/deploy/cloudRun/utils/jobName.ts +7 -0
  459. package/src/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.ts +12 -0
  460. package/src/deploy/cloudSql/utils.ts +26 -0
  461. package/src/deploy/custom/deployJob.ts +41 -16
  462. package/src/deploy/custom/index.ts +9 -1
  463. package/src/deploy/dockerTag/deployJob.ts +29 -0
  464. package/src/deploy/dockerTag/index.ts +10 -0
  465. package/src/deploy/index.ts +32 -17
  466. package/src/deploy/kubernetes/additionalSecretKeys.ts +25 -0
  467. package/src/deploy/kubernetes/cloudSql/index.ts +76 -0
  468. package/src/deploy/kubernetes/deployJob.ts +61 -115
  469. package/src/deploy/kubernetes/index.ts +50 -1
  470. package/src/deploy/kubernetes/kubeEnv.ts +50 -0
  471. package/src/deploy/kubernetes/kubeValues.ts +100 -0
  472. package/src/deploy/kubernetes/mongodb.ts +106 -8
  473. package/src/deploy/kubernetes/processSecretsAsFiles.ts +6 -5
  474. package/src/deploy/sbom.ts +32 -0
  475. package/src/deploy/types/base.ts +43 -0
  476. package/src/deploy/types/custom.ts +36 -0
  477. package/src/deploy/types/dockerTag.ts +14 -0
  478. package/src/deploy/types/googleCloudRun.ts +282 -0
  479. package/src/deploy/types/index.ts +28 -0
  480. package/src/deploy/types/kubernetes.ts +390 -0
  481. package/src/deploy/utils.ts +10 -6
  482. package/src/index.ts +2 -1
  483. package/src/packageInfos.ts +14 -0
  484. package/src/pipeline/__tests__/__snapshots__/getPipelineStages.test.ts.snap +69 -0
  485. package/src/pipeline/__tests__/getPipelineStages.test.ts +63 -0
  486. package/src/pipeline/createAllJobs.ts +72 -0
  487. package/src/pipeline/createChildPipeline.ts +24 -43
  488. package/src/pipeline/createJobsForComponent.ts +35 -0
  489. package/src/pipeline/createJobsForWorkspace.ts +12 -0
  490. package/src/pipeline/createMainPipeline.ts +111 -0
  491. package/src/pipeline/generatePipelineFiles.ts +76 -0
  492. package/src/pipeline/getPipelineStages.ts +23 -0
  493. package/src/pipeline/gitlab/createGitlabJobs.ts +445 -0
  494. package/src/pipeline/gitlab/createGitlabPipeline.ts +28 -0
  495. package/src/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.ts +46 -0
  496. package/src/pipeline/gitlab/gitlabReleaseJobs.ts +25 -0
  497. package/src/pipeline/gitlab/sortGitLabJobDefProps.ts +59 -0
  498. package/src/pipeline/index.ts +3 -1
  499. package/src/pipeline/packageManager.ts +47 -64
  500. package/src/pipeline/yarn/yarnUtils.ts +66 -0
  501. package/src/rules/index.ts +46 -13
  502. package/src/runner/index.ts +2 -1
  503. package/src/types/config.ts +72 -16
  504. package/src/types/context.ts +194 -25
  505. package/src/types/environmentContext.ts +38 -0
  506. package/src/types/gitlab-ci-yml.ts +891 -0
  507. package/src/types/gitlab-types.ts +52 -57
  508. package/src/types/jobs.ts +66 -11
  509. package/src/types/pipeline.ts +5 -1
  510. package/src/types/utils.ts +7 -0
  511. package/src/utils/gitlab.ts +33 -0
  512. package/src/utils/index.ts +3 -3
  513. package/src/utils/jsonParse.ts +7 -0
  514. package/src/utils/removeUndefined.ts +4 -0
  515. package/src/utils/writeFiles.ts +53 -0
  516. package/tsconfig.json +4 -2
  517. package/dist/build/base/createBuildJob.d.ts +0 -7
  518. package/dist/build/base/getBuildInfo.d.ts +0 -2
  519. package/dist/build/base/getBuildInfo.js +0 -12
  520. package/dist/context/resolveReferences.test.js +0 -141
  521. package/dist/deploy/base.d.ts +0 -8
  522. package/dist/deploy/base.js +0 -107
  523. package/dist/deploy/kubernetes/cloudsql.d.ts +0 -6
  524. package/dist/deploy/kubernetes/cloudsql.js +0 -16
  525. package/dist/deploy/types.d.ts +0 -196
  526. package/dist/deploy/types.js +0 -16
  527. package/dist/pipeline/createJobs.d.ts +0 -3
  528. package/dist/pipeline/createJobs.js +0 -383
  529. package/dist/pipeline/gitlab/makeGitlabJob.d.ts +0 -8
  530. package/dist/pipeline/gitlab/makeGitlabJob.js +0 -45
  531. package/src/build/base/createBuildJob.ts +0 -43
  532. package/src/build/base/getBuildInfo.ts +0 -7
  533. package/src/build/tests/storybook.test.ts +0 -54
  534. package/src/deploy/base.ts +0 -120
  535. package/src/deploy/kubernetes/cloudsql.ts +0 -12
  536. package/src/deploy/types.ts +0 -189
  537. package/src/pipeline/createChildPipeline.test.ts +0 -49
  538. package/src/pipeline/createJobs.ts +0 -195
  539. package/src/pipeline/gitlab/makeGitlabJob.ts +0 -16
  540. /package/dist/build/{tests/storybook.test.d.ts → base/__tests__/createArtifactsConfig.test.d.ts} +0 -0
  541. /package/dist/{config/configruedEnvs.test.d.ts → build/custom/__tests__/testJob.test.d.ts} +0 -0
  542. /package/dist/{context/resolveReferences.test.d.ts → config/__tests__/configruedEnvs.test.d.ts} +0 -0
  543. /package/dist/{pipeline/createChildPipeline.test.d.ts → config/__tests__/getAllEnvs.test.d.ts} +0 -0
@@ -0,0 +1,4476 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for cloud-run-memory-limit local pipeline YAML 1`] = `
4
+ "image: path/to/docker/jobs-default:the-version
5
+ stages:
6
+ - setup
7
+ - setup dev
8
+ - setup review
9
+ - setup stage
10
+ - setup prod
11
+ - test
12
+ - test dev
13
+ - test review
14
+ - test stage
15
+ - test prod
16
+ - build
17
+ - build dev
18
+ - build review
19
+ - build stage
20
+ - build prod
21
+ - deploy
22
+ - deploy dev
23
+ - deploy review
24
+ - deploy stage
25
+ - deploy prod
26
+ - verify
27
+ - verify dev
28
+ - verify review
29
+ - verify stage
30
+ - verify prod
31
+ - rollback
32
+ - rollback dev
33
+ - rollback review
34
+ - rollback stage
35
+ - rollback prod
36
+ - stop
37
+ - stop dev
38
+ - stop review
39
+ - stop stage
40
+ - stop prod
41
+ - release
42
+ variables:
43
+ FF_USE_FASTZIP: 'true'
44
+ ARTIFACT_COMPRESSION_LEVEL: fast
45
+ CACHE_COMPRESSION_LEVEL: fast
46
+ TRANSFER_METER_FREQUENCY: 5s
47
+ GIT_DEPTH: '1'
48
+ api 🛡 audit:
49
+ stage: test
50
+ image: path/to/docker/jobs-default:the-version
51
+ variables:
52
+ KUBERNETES_CPU_REQUEST: '0.45'
53
+ KUBERNETES_MEMORY_REQUEST: 1Gi
54
+ KUBERNETES_MEMORY_LIMIT: 4Gi
55
+ script:
56
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
57
+ - export APP_PATH="api"
58
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
59
+ - cd api
60
+ - yarn npm audit --environment production
61
+ rules:
62
+ - when: never
63
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
64
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
65
+ - if: $CI_MERGE_REQUEST_ID
66
+ needs: []
67
+ retry: &a1
68
+ max: 2
69
+ when:
70
+ - runner_system_failure
71
+ - stuck_or_timeout_failure
72
+ interruptible: true
73
+ allow_failure: true
74
+ api 👮 lint:
75
+ stage: test
76
+ image: path/to/docker/jobs-default:the-version
77
+ variables:
78
+ KUBERNETES_CPU_REQUEST: '0.45'
79
+ KUBERNETES_MEMORY_REQUEST: 1Gi
80
+ KUBERNETES_MEMORY_LIMIT: 4Gi
81
+ script:
82
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
83
+ - export APP_PATH="api"
84
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
85
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
86
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
87
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
88
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
89
+ - cd api
90
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
91
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
92
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
93
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
94
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
95
+ - yarn install --immutable
96
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
97
+ - yarn lint
98
+ cache:
99
+ - key: api-yarn
100
+ policy: pull-push
101
+ paths:
102
+ - api/.yarn
103
+ - key: api-node-modules
104
+ policy: pull-push
105
+ paths:
106
+ - api/node_modules
107
+ rules:
108
+ - when: never
109
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
110
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
111
+ - if: $CI_MERGE_REQUEST_ID
112
+ needs: []
113
+ retry: *a1
114
+ interruptible: true
115
+ api 🧪 test:
116
+ stage: test
117
+ image: path/to/docker/jobs-testing-chrome:the-version
118
+ variables:
119
+ KUBERNETES_CPU_REQUEST: '0.45'
120
+ KUBERNETES_MEMORY_REQUEST: 1Gi
121
+ KUBERNETES_MEMORY_LIMIT: 4Gi
122
+ script:
123
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
124
+ - export APP_PATH="api"
125
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
126
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
127
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
128
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
129
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
130
+ - cd api
131
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
132
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
133
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
134
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
135
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
136
+ - yarn install --immutable
137
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
138
+ - yarn test
139
+ cache:
140
+ - key: api-yarn
141
+ policy: pull-push
142
+ paths:
143
+ - api/.yarn
144
+ - key: api-node-modules
145
+ policy: pull-push
146
+ paths:
147
+ - api/node_modules
148
+ rules:
149
+ - when: never
150
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
151
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
152
+ - if: $CI_MERGE_REQUEST_ID
153
+ needs: []
154
+ retry: *a1
155
+ interruptible: true
156
+ 'api 🔨 app | dev ':
157
+ stage: build
158
+ image: path/to/docker/jobs-default:the-version
159
+ variables:
160
+ KUBERNETES_CPU_REQUEST: '0.45'
161
+ KUBERNETES_MEMORY_REQUEST: 1Gi
162
+ KUBERNETES_MEMORY_LIMIT: 4Gi
163
+ script:
164
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
165
+ - export ENV_SHORT="dev"
166
+ - export APP_DIR="api"
167
+ - export ENV_TYPE="dev"
168
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
169
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
170
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
171
+ - export HOST="api.dev.test-app.pan.panter.cloud"
172
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
173
+ - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
174
+ - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
175
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
176
+ - export KUBE_NAMESPACE="pan-test-app-dev"
177
+ - export KUBE_APP_NAME="api"
178
+ - export KUBE_APP_NAME_PREFIX=""
179
+ - export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"
180
+ - export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"
181
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
182
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
183
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
184
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
185
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
186
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
187
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
188
+ - cd api
189
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
190
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
191
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
192
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
193
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
194
+ - yarn install --immutable
195
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
196
+ - yarn build
197
+ cache:
198
+ - key: api-yarn
199
+ policy: pull-push
200
+ paths:
201
+ - api/.yarn
202
+ - key: api-node-modules
203
+ policy: pull-push
204
+ paths:
205
+ - api/node_modules
206
+ - key: api-next-cache
207
+ policy: pull-push
208
+ paths:
209
+ - api/.next/cache
210
+ artifacts:
211
+ paths:
212
+ - api/__build_info.json
213
+ - api/.next
214
+ - api/dist
215
+ expire_in: 1 day
216
+ when: always
217
+ reports: {}
218
+ rules:
219
+ - when: never
220
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
221
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
222
+ needs: []
223
+ retry: *a1
224
+ interruptible: true
225
+ 'api 🔨 docker | dev ':
226
+ stage: build
227
+ image: path/to/docker/docker-build:the-version
228
+ services:
229
+ - name: docker:24.0.6-dind
230
+ command:
231
+ - --tls=false
232
+ variables:
233
+ DOCKER_HOST: tcp://0.0.0.0:2375
234
+ DOCKER_TLS_CERTDIR: ''
235
+ DOCKER_DRIVER: overlay2
236
+ DOCKER_BUILDKIT: '1'
237
+ KUBERNETES_CPU_REQUEST: '0.45'
238
+ KUBERNETES_MEMORY_REQUEST: 1Gi
239
+ KUBERNETES_MEMORY_LIMIT: 2Gi
240
+ script:
241
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
242
+ - export APP_DIR="api"
243
+ - export DOCKER_BUILD_CONTEXT="."
244
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
245
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
246
+ - export DOCKER_IMAGE_NAME="dev/api"
247
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
248
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
249
+ - |-
250
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
251
+ RUN yarn plugin import workspace-tools
252
+ RUN yarn workspaces focus --production && yarn rebuild"
253
+ - |-
254
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
255
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
256
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
257
+ COPY --chown=node:node .yarn /app/.yarn"
258
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
259
+ - ensureNodeDockerfile
260
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
261
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
262
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
263
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
264
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
265
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
266
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
267
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
268
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
269
+ - docker push $DOCKER_CACHE_IMAGE
270
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
271
+ cache:
272
+ - key: api-yarn
273
+ policy: pull
274
+ paths:
275
+ - api/.yarn
276
+ rules:
277
+ - when: never
278
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
279
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
280
+ needs:
281
+ - 'api 🔨 app | dev '
282
+ retry: *a1
283
+ interruptible: true
284
+ 'api 🧾 sbom | dev ':
285
+ stage: build
286
+ image: aquasec/trivy:0.38.3
287
+ variables: {}
288
+ script:
289
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
290
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
291
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
292
+ artifacts:
293
+ paths:
294
+ - __sbom.json
295
+ rules:
296
+ - when: never
297
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
298
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
299
+ needs: []
300
+ retry: *a1
301
+ interruptible: true
302
+ allow_failure: true
303
+ 'api 🚀 Deploy | dev ':
304
+ stage: deploy dev
305
+ image: path/to/docker/kubernetes:the-version
306
+ variables:
307
+ KUBERNETES_CPU_REQUEST: '0.22'
308
+ KUBERNETES_MEMORY_REQUEST: 200Mi
309
+ KUBERNETES_MEMORY_LIMIT: 400Mi
310
+ script:
311
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
312
+ - export ENV_SHORT="dev"
313
+ - export APP_DIR="api"
314
+ - export ENV_TYPE="dev"
315
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
316
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
317
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
318
+ - export HOST="api.dev.test-app.pan.panter.cloud"
319
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
320
+ - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
321
+ - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
322
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
323
+ - export KUBE_NAMESPACE="pan-test-app-dev"
324
+ - export KUBE_APP_NAME="api"
325
+ - export KUBE_APP_NAME_PREFIX=""
326
+ - export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"
327
+ - export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"
328
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
329
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
330
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
331
+ - export DOCKER_IMAGE_NAME="dev/api"
332
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
333
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
334
+ - export RELEASE_NAME="pan-test-app-dev-api"
335
+ - export HELM_EXPERIMENTAL_OCI="1"
336
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
337
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
338
+ - export HELM_ARGS=""
339
+ - export COMPONENT_NAME="api"
340
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
341
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
342
+ - 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
343
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
344
+ - 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"
345
+ - kubectl config use-context "kube-pan-test-app-dev-api"
346
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
347
+ - |
348
+ cat > __all_values.yml <<EOF
349
+ env:
350
+ secret:
351
+ MONGODB_ROOT_PASSWORD: |-
352
+ $(printf %s "$CL_dev_api_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
353
+ MONGODB_REPLICASET_KEY: |-
354
+ $(printf %s "$CL_dev_api_MONGODB_REPLICASET_KEY" | sed 's/^/ /')
355
+ MONGO_URL: |-
356
+ mongodb://root:$CL_dev_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017/app?replicaSet=rs0&authSource=admin
357
+ MONGO_OPLOG_URL: |-
358
+ mongodb://root:$CL_dev_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017/local?replicaSet=rs0&authSource=admin
359
+ public:
360
+ ENV_SHORT: |-
361
+ dev
362
+ APP_DIR: |-
363
+ api
364
+ ENV_TYPE: |-
365
+ dev
366
+ BUILD_INFO_BUILD_ID: |-
367
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
368
+ BUILD_INFO_BUILD_TIME: |-
369
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
370
+ BUILD_INFO_CURRENT_VERSION: |-
371
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
372
+ HOST: |-
373
+ api.dev.test-app.pan.panter.cloud
374
+ ROOT_URL: |-
375
+ https://api.dev.test-app.pan.panter.cloud
376
+ HOST_INTERNAL: |-
377
+ api.dev.test-app.pan.panter.cloud
378
+ HOST_CANONICAL: |-
379
+ api.dev.test-app.pan.panter.cloud
380
+ ROOT_URL_INTERNAL: |-
381
+ https://api.dev.test-app.pan.panter.cloud
382
+ KUBE_NAMESPACE: |-
383
+ pan-test-app-dev
384
+ KUBE_APP_NAME: |-
385
+ api
386
+ KUBE_APP_NAME_PREFIX: ""
387
+ _ALL_ENV_VAR_KEYS: |-
388
+ ["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","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
389
+ application:
390
+ host: |-
391
+ api.dev.test-app.pan.panter.cloud
392
+ command: |-
393
+ node main.js
394
+ livenessProbe:
395
+ httpGet:
396
+ path: |-
397
+ __health
398
+ readinessProbe:
399
+ httpGet:
400
+ path: |-
401
+ __health
402
+ startupProbe:
403
+ httpGet:
404
+ path: |-
405
+ __health
406
+ mongodb:
407
+ enabled: true
408
+ auth:
409
+ enabled: true
410
+ rootPassword: |-
411
+ $CL_dev_api_MONGODB_ROOT_PASSWORD
412
+ replicaSetKey: |-
413
+ $CL_dev_api_MONGODB_REPLICASET_KEY
414
+ persistence:
415
+ storageClass: |-
416
+ premium-rwo
417
+ backup:
418
+ enabled: false
419
+ hostToBackup: |-
420
+ api-mongodb-0.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017
421
+ pvcToBackup: |-
422
+ datadir-api-mongodb-0
423
+ image: |-
424
+ mrelite/kubectlmongoshell:v1.0
425
+ schedule: |-
426
+ 0 4 * * *
427
+ volumeSnapshotClass: |-
428
+ snapshotclass
429
+ architecture: |-
430
+ replicaset
431
+ tolerations:
432
+ - key: |-
433
+ mongodb
434
+ operator: |-
435
+ Equal
436
+ value: |-
437
+ true
438
+ effect: |-
439
+ NoSchedule
440
+
441
+ EOF
442
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
443
+ - kubernetesCreateSecret
444
+ - kubernetesDeploy
445
+ - echo 'Uploading SBOM to Dependency Track'
446
+ - /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
447
+ - echo deployment successful 😻
448
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
449
+ environment:
450
+ name: dev/api
451
+ url: $CL_GITLAB_ENVIRONMENT_URL
452
+ on_stop: 'api 🛑 Stop ⚠️ | dev '
453
+ auto_stop_in: 4 weeks
454
+ artifacts:
455
+ reports:
456
+ dotenv: gitlab_environment.env
457
+ rules:
458
+ - when: never
459
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
460
+ - when: on_success
461
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
462
+ needs:
463
+ - job: api 👮 lint
464
+ artifacts: false
465
+ - job: 'api 🔨 app | dev '
466
+ artifacts: false
467
+ - job: 'api 🔨 docker | dev '
468
+ artifacts: false
469
+ - job: api 🧪 test
470
+ artifacts: false
471
+ - job: 'api 🧾 sbom | dev '
472
+ artifacts: true
473
+ - job: api 🛡 audit
474
+ artifacts: false
475
+ retry: *a1
476
+ interruptible: true
477
+ allow_failure: false
478
+ 'api 🛑 Stop ⚠️ | dev ':
479
+ stage: stop dev
480
+ image: path/to/docker/kubernetes:the-version
481
+ variables:
482
+ KUBERNETES_CPU_REQUEST: '0.22'
483
+ KUBERNETES_MEMORY_REQUEST: 200Mi
484
+ KUBERNETES_MEMORY_LIMIT: 400Mi
485
+ GIT_STRATEGY: none
486
+ script:
487
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
488
+ - export ENV_SHORT="dev"
489
+ - export APP_DIR="api"
490
+ - export ENV_TYPE="dev"
491
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
492
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
493
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
494
+ - export HOST="api.dev.test-app.pan.panter.cloud"
495
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
496
+ - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
497
+ - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
498
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
499
+ - export KUBE_NAMESPACE="pan-test-app-dev"
500
+ - export KUBE_APP_NAME="api"
501
+ - export KUBE_APP_NAME_PREFIX=""
502
+ - export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"
503
+ - export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"
504
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
505
+ - export RELEASE_NAME="pan-test-app-dev-api"
506
+ - export HELM_EXPERIMENTAL_OCI="1"
507
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
508
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
509
+ - export HELM_ARGS=""
510
+ - export COMPONENT_NAME="api"
511
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
512
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
513
+ - 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
514
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
515
+ - 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"
516
+ - kubectl config use-context "kube-pan-test-app-dev-api"
517
+ - kubernetesDelete
518
+ - echo 'Disabling component in Dependency Track'
519
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" || true
520
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
521
+ environment:
522
+ name: dev/api
523
+ url: $CL_GITLAB_ENVIRONMENT_URL
524
+ action: stop
525
+ artifacts:
526
+ reports:
527
+ dotenv: gitlab_environment.env
528
+ rules:
529
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
530
+ when: on_success
531
+ - when: never
532
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
533
+ - when: manual
534
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
535
+ needs: []
536
+ retry: *a1
537
+ interruptible: true
538
+ allow_failure: true
539
+ 'api ↩️ Rollback ⚠️ | dev ':
540
+ stage: rollback dev
541
+ image: path/to/docker/kubernetes:the-version
542
+ variables:
543
+ KUBERNETES_CPU_REQUEST: '0.22'
544
+ KUBERNETES_MEMORY_REQUEST: 200Mi
545
+ KUBERNETES_MEMORY_LIMIT: 400Mi
546
+ GIT_STRATEGY: none
547
+ script:
548
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
549
+ - export ENV_SHORT="dev"
550
+ - export APP_DIR="api"
551
+ - export ENV_TYPE="dev"
552
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
553
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
554
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
555
+ - export HOST="api.dev.test-app.pan.panter.cloud"
556
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
557
+ - export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"
558
+ - export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"
559
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
560
+ - export KUBE_NAMESPACE="pan-test-app-dev"
561
+ - export KUBE_APP_NAME="api"
562
+ - export KUBE_APP_NAME_PREFIX=""
563
+ - export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"
564
+ - export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"
565
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
566
+ - export RELEASE_NAME="pan-test-app-dev-api"
567
+ - export HELM_EXPERIMENTAL_OCI="1"
568
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
569
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
570
+ - export HELM_ARGS=""
571
+ - export COMPONENT_NAME="api"
572
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
573
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
574
+ - 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
575
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
576
+ - 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"
577
+ - kubectl config use-context "kube-pan-test-app-dev-api"
578
+ - kubernetesRollback
579
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env
580
+ environment:
581
+ name: dev/api
582
+ url: $CL_GITLAB_ENVIRONMENT_URL
583
+ action: access
584
+ artifacts:
585
+ reports:
586
+ dotenv: gitlab_environment.env
587
+ rules:
588
+ - when: never
589
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
590
+ - when: manual
591
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
592
+ needs: []
593
+ retry: *a1
594
+ interruptible: true
595
+ allow_failure: true
596
+ 'api 🔨 app | review ':
597
+ stage: build
598
+ image: path/to/docker/jobs-default:the-version
599
+ variables:
600
+ KUBERNETES_CPU_REQUEST: '0.45'
601
+ KUBERNETES_MEMORY_REQUEST: 1Gi
602
+ KUBERNETES_MEMORY_LIMIT: 4Gi
603
+ script:
604
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
605
+ - export ENV_SHORT="review"
606
+ - export APP_DIR="api"
607
+ - export ENV_TYPE="review"
608
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
609
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
610
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
611
+ - 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"
612
+ - 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"
613
+ - 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"
614
+ - 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"
615
+ - 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"
616
+ - export KUBE_NAMESPACE="pan-test-app-review"
617
+ - 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"
618
+ - 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"; })-"
619
+ - export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"
620
+ - export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"
621
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
622
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
623
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
624
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
625
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
626
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
627
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
628
+ - cd api
629
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
630
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
631
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
632
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
633
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
634
+ - yarn install --immutable
635
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
636
+ - yarn build
637
+ cache:
638
+ - key: api-yarn
639
+ policy: pull-push
640
+ paths:
641
+ - api/.yarn
642
+ - key: api-node-modules
643
+ policy: pull-push
644
+ paths:
645
+ - api/node_modules
646
+ - key: api-next-cache
647
+ policy: pull-push
648
+ paths:
649
+ - api/.next/cache
650
+ artifacts:
651
+ paths:
652
+ - api/__build_info.json
653
+ - api/.next
654
+ - api/dist
655
+ expire_in: 1 day
656
+ when: always
657
+ reports: {}
658
+ rules:
659
+ - if: $CI_MERGE_REQUEST_ID
660
+ needs: []
661
+ retry: *a1
662
+ interruptible: true
663
+ 'api 🔨 docker | review ':
664
+ stage: build
665
+ image: path/to/docker/docker-build:the-version
666
+ services:
667
+ - name: docker:24.0.6-dind
668
+ command:
669
+ - --tls=false
670
+ variables:
671
+ DOCKER_HOST: tcp://0.0.0.0:2375
672
+ DOCKER_TLS_CERTDIR: ''
673
+ DOCKER_DRIVER: overlay2
674
+ DOCKER_BUILDKIT: '1'
675
+ KUBERNETES_CPU_REQUEST: '0.45'
676
+ KUBERNETES_MEMORY_REQUEST: 1Gi
677
+ KUBERNETES_MEMORY_LIMIT: 2Gi
678
+ script:
679
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
680
+ - export APP_DIR="api"
681
+ - export DOCKER_BUILD_CONTEXT="."
682
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
683
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
684
+ - export DOCKER_IMAGE_NAME="review/api"
685
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
686
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
687
+ - |-
688
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
689
+ RUN yarn plugin import workspace-tools
690
+ RUN yarn workspaces focus --production && yarn rebuild"
691
+ - |-
692
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
693
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
694
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
695
+ COPY --chown=node:node .yarn /app/.yarn"
696
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
697
+ - ensureNodeDockerfile
698
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
699
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
700
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
701
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
702
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
703
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
704
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
705
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
706
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
707
+ - docker push $DOCKER_CACHE_IMAGE
708
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
709
+ cache:
710
+ - key: api-yarn
711
+ policy: pull
712
+ paths:
713
+ - api/.yarn
714
+ rules:
715
+ - if: $CI_MERGE_REQUEST_ID
716
+ needs:
717
+ - 'api 🔨 app | review '
718
+ retry: *a1
719
+ interruptible: true
720
+ 'api 🧾 sbom | review ':
721
+ stage: build
722
+ image: aquasec/trivy:0.38.3
723
+ variables: {}
724
+ script:
725
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
726
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
727
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
728
+ artifacts:
729
+ paths:
730
+ - __sbom.json
731
+ rules:
732
+ - if: $CI_MERGE_REQUEST_ID
733
+ needs: []
734
+ retry: *a1
735
+ interruptible: true
736
+ allow_failure: true
737
+ 'api 🚀 Deploy | review ':
738
+ stage: deploy review
739
+ image: path/to/docker/kubernetes:the-version
740
+ variables:
741
+ KUBERNETES_CPU_REQUEST: '0.22'
742
+ KUBERNETES_MEMORY_REQUEST: 200Mi
743
+ KUBERNETES_MEMORY_LIMIT: 400Mi
744
+ script:
745
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
746
+ - export ENV_SHORT="review"
747
+ - export APP_DIR="api"
748
+ - export ENV_TYPE="review"
749
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
750
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
751
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
752
+ - export HOST="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
753
+ - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
754
+ - export HOST_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
755
+ - export HOST_CANONICAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
756
+ - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
757
+ - export KUBE_NAMESPACE="pan-test-app-review"
758
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
759
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
760
+ - export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"
761
+ - export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"
762
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
763
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
764
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
765
+ - export DOCKER_IMAGE_NAME="review/api"
766
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
767
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
768
+ - 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"
769
+ - export HELM_EXPERIMENTAL_OCI="1"
770
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
771
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
772
+ - export HELM_ARGS=""
773
+ - export COMPONENT_NAME="api"
774
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
775
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
776
+ - 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
777
+ - 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"
778
+ - 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"
779
+ - 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"
780
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
781
+ - |
782
+ cat > __all_values.yml <<EOF
783
+ env:
784
+ secret:
785
+ MONGODB_ROOT_PASSWORD: |-
786
+ $(printf %s "$CL_review_api_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
787
+ MONGODB_REPLICASET_KEY: |-
788
+ $(printf %s "$CL_review_api_MONGODB_REPLICASET_KEY" | sed 's/^/ /')
789
+ MONGO_URL: |-
790
+ mongodb://root:$CL_review_api_MONGODB_ROOT_PASSWORD@$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-0.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-headless.pan-test-app-review.svc.cluster.local:27017,$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-1.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-headless.pan-test-app-review.svc.cluster.local:27017/app?replicaSet=rs0&authSource=admin
791
+ MONGO_OPLOG_URL: |-
792
+ mongodb://root:$CL_review_api_MONGODB_ROOT_PASSWORD@$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-0.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-headless.pan-test-app-review.svc.cluster.local:27017,$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-1.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-headless.pan-test-app-review.svc.cluster.local:27017/local?replicaSet=rs0&authSource=admin
793
+ public:
794
+ ENV_SHORT: |-
795
+ review
796
+ APP_DIR: |-
797
+ api
798
+ ENV_TYPE: |-
799
+ review
800
+ BUILD_INFO_BUILD_ID: |-
801
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
802
+ BUILD_INFO_BUILD_TIME: |-
803
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
804
+ BUILD_INFO_CURRENT_VERSION: |-
805
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
806
+ HOST: |-
807
+ $(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/^/ /')
808
+ ROOT_URL: |-
809
+ $(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/^/ /')
810
+ HOST_INTERNAL: |-
811
+ $(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/^/ /')
812
+ HOST_CANONICAL: |-
813
+ $(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/^/ /')
814
+ ROOT_URL_INTERNAL: |-
815
+ $(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/^/ /')
816
+ KUBE_NAMESPACE: |-
817
+ pan-test-app-review
818
+ KUBE_APP_NAME: |-
819
+ $(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/^/ /')
820
+ KUBE_APP_NAME_PREFIX: |-
821
+ $(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/^/ /')
822
+ _ALL_ENV_VAR_KEYS: |-
823
+ ["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","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
824
+ application:
825
+ host: |-
826
+ $(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/^/ /')
827
+ command: |-
828
+ node main.js
829
+ livenessProbe:
830
+ httpGet:
831
+ path: |-
832
+ __health
833
+ readinessProbe:
834
+ httpGet:
835
+ path: |-
836
+ __health
837
+ startupProbe:
838
+ httpGet:
839
+ path: |-
840
+ __health
841
+ mongodb:
842
+ enabled: true
843
+ auth:
844
+ enabled: true
845
+ rootPassword: |-
846
+ $CL_review_api_MONGODB_ROOT_PASSWORD
847
+ replicaSetKey: |-
848
+ $CL_review_api_MONGODB_REPLICASET_KEY
849
+ persistence:
850
+ storageClass: |-
851
+ premium-rwo
852
+ backup:
853
+ enabled: false
854
+ hostToBackup: |-
855
+ $([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-0.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-headless.pan-test-app-review.svc.cluster.local:27017
856
+ pvcToBackup: |-
857
+ datadir-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-0
858
+ image: |-
859
+ mrelite/kubectlmongoshell:v1.0
860
+ schedule: |-
861
+ 0 4 * * *
862
+ volumeSnapshotClass: |-
863
+ snapshotclass
864
+ architecture: |-
865
+ replicaset
866
+ tolerations:
867
+ - key: |-
868
+ mongodb
869
+ operator: |-
870
+ Equal
871
+ value: |-
872
+ true
873
+ effect: |-
874
+ NoSchedule
875
+
876
+ EOF
877
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
878
+ - kubernetesCreateSecret
879
+ - kubernetesDeploy
880
+ - echo 'Uploading SBOM to Dependency Track'
881
+ - /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
882
+ - echo deployment successful 😻
883
+ - 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
884
+ environment:
885
+ name: review/$CI_COMMIT_REF_NAME/api
886
+ url: $CL_GITLAB_ENVIRONMENT_URL
887
+ on_stop: 'api 🛑 Stop ⚠️ | review '
888
+ auto_stop_in: 1 week
889
+ artifacts:
890
+ reports:
891
+ dotenv: gitlab_environment.env
892
+ rules:
893
+ - when: on_success
894
+ if: $CI_MERGE_REQUEST_ID
895
+ needs:
896
+ - job: api 👮 lint
897
+ artifacts: false
898
+ - job: 'api 🔨 app | review '
899
+ artifacts: false
900
+ - job: 'api 🔨 docker | review '
901
+ artifacts: false
902
+ - job: api 🧪 test
903
+ artifacts: false
904
+ - job: 'api 🧾 sbom | review '
905
+ artifacts: true
906
+ - job: api 🛡 audit
907
+ artifacts: false
908
+ retry: *a1
909
+ interruptible: true
910
+ allow_failure: false
911
+ 'api 🛑 Stop ⚠️ | review ':
912
+ stage: stop review
913
+ image: path/to/docker/kubernetes:the-version
914
+ variables:
915
+ KUBERNETES_CPU_REQUEST: '0.22'
916
+ KUBERNETES_MEMORY_REQUEST: 200Mi
917
+ KUBERNETES_MEMORY_LIMIT: 400Mi
918
+ GIT_STRATEGY: none
919
+ script:
920
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
921
+ - export ENV_SHORT="review"
922
+ - export APP_DIR="api"
923
+ - export ENV_TYPE="review"
924
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
925
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
926
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
927
+ - 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"
928
+ - 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"
929
+ - 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"
930
+ - 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"
931
+ - 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"
932
+ - export KUBE_NAMESPACE="pan-test-app-review"
933
+ - 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"
934
+ - 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"; })-"
935
+ - export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"
936
+ - export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"
937
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
938
+ - 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"
939
+ - export HELM_EXPERIMENTAL_OCI="1"
940
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
941
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
942
+ - export HELM_ARGS=""
943
+ - export COMPONENT_NAME="api"
944
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
945
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
946
+ - 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
947
+ - 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"
948
+ - 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"
949
+ - 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"
950
+ - kubernetesDelete
951
+ - echo 'Disabling component in Dependency Track'
952
+ - /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
953
+ - 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
954
+ environment:
955
+ name: review/$CI_COMMIT_REF_NAME/api
956
+ url: $CL_GITLAB_ENVIRONMENT_URL
957
+ action: stop
958
+ artifacts:
959
+ reports:
960
+ dotenv: gitlab_environment.env
961
+ rules:
962
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
963
+ when: on_success
964
+ - when: manual
965
+ if: $CI_MERGE_REQUEST_ID
966
+ needs: []
967
+ retry: *a1
968
+ interruptible: true
969
+ allow_failure: true
970
+ 'api ↩️ Rollback ⚠️ | review ':
971
+ stage: rollback review
972
+ image: path/to/docker/kubernetes:the-version
973
+ variables:
974
+ KUBERNETES_CPU_REQUEST: '0.22'
975
+ KUBERNETES_MEMORY_REQUEST: 200Mi
976
+ KUBERNETES_MEMORY_LIMIT: 400Mi
977
+ GIT_STRATEGY: none
978
+ script:
979
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
980
+ - export ENV_SHORT="review"
981
+ - export APP_DIR="api"
982
+ - export ENV_TYPE="review"
983
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
984
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
985
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
986
+ - 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"
987
+ - 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"
988
+ - 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"
989
+ - 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"
990
+ - 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"
991
+ - export KUBE_NAMESPACE="pan-test-app-review"
992
+ - 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"
993
+ - 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"; })-"
994
+ - export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"
995
+ - export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"
996
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
997
+ - 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"
998
+ - export HELM_EXPERIMENTAL_OCI="1"
999
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1000
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1001
+ - export HELM_ARGS=""
1002
+ - export COMPONENT_NAME="api"
1003
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1004
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1005
+ - 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
1006
+ - 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"
1007
+ - 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"
1008
+ - 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"
1009
+ - kubernetesRollback
1010
+ - 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
1011
+ environment:
1012
+ name: review/$CI_COMMIT_REF_NAME/api
1013
+ url: $CL_GITLAB_ENVIRONMENT_URL
1014
+ action: access
1015
+ artifacts:
1016
+ reports:
1017
+ dotenv: gitlab_environment.env
1018
+ rules:
1019
+ - when: manual
1020
+ if: $CI_MERGE_REQUEST_ID
1021
+ needs: []
1022
+ retry: *a1
1023
+ interruptible: true
1024
+ allow_failure: true
1025
+ 'api 🔨 app | stage ':
1026
+ stage: build
1027
+ image: path/to/docker/jobs-default:the-version
1028
+ variables:
1029
+ KUBERNETES_CPU_REQUEST: '0.45'
1030
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1031
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1032
+ script:
1033
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1034
+ - export ENV_SHORT="stage"
1035
+ - export APP_DIR="api"
1036
+ - export ENV_TYPE="stage"
1037
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1038
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1039
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1040
+ - export HOST="api.stage.test-app.pan.panter.cloud"
1041
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1042
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1043
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1044
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1045
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1046
+ - export KUBE_APP_NAME="api"
1047
+ - export KUBE_APP_NAME_PREFIX=""
1048
+ - export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"
1049
+ - export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"
1050
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1051
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1052
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1053
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1054
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1055
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1056
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1057
+ - cd api
1058
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1059
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1060
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1061
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1062
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1063
+ - yarn install --immutable
1064
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1065
+ - yarn build
1066
+ cache:
1067
+ - key: api-yarn
1068
+ policy: pull-push
1069
+ paths:
1070
+ - api/.yarn
1071
+ - key: api-node-modules
1072
+ policy: pull-push
1073
+ paths:
1074
+ - api/node_modules
1075
+ - key: api-next-cache
1076
+ policy: pull-push
1077
+ paths:
1078
+ - api/.next/cache
1079
+ artifacts:
1080
+ paths:
1081
+ - api/__build_info.json
1082
+ - api/.next
1083
+ - api/dist
1084
+ expire_in: 1 day
1085
+ when: always
1086
+ reports: {}
1087
+ rules:
1088
+ - if: $CI_COMMIT_TAG
1089
+ needs: []
1090
+ retry: *a1
1091
+ interruptible: true
1092
+ 'api 🔨 docker | stage ':
1093
+ stage: build
1094
+ image: path/to/docker/docker-build:the-version
1095
+ services:
1096
+ - name: docker:24.0.6-dind
1097
+ command:
1098
+ - --tls=false
1099
+ variables:
1100
+ DOCKER_HOST: tcp://0.0.0.0:2375
1101
+ DOCKER_TLS_CERTDIR: ''
1102
+ DOCKER_DRIVER: overlay2
1103
+ DOCKER_BUILDKIT: '1'
1104
+ KUBERNETES_CPU_REQUEST: '0.45'
1105
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1106
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1107
+ script:
1108
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1109
+ - export APP_DIR="api"
1110
+ - export DOCKER_BUILD_CONTEXT="."
1111
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1112
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1113
+ - export DOCKER_IMAGE_NAME="stage/api"
1114
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1115
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1116
+ - |-
1117
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1118
+ RUN yarn plugin import workspace-tools
1119
+ RUN yarn workspaces focus --production && yarn rebuild"
1120
+ - |-
1121
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1122
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1123
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1124
+ COPY --chown=node:node .yarn /app/.yarn"
1125
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1126
+ - ensureNodeDockerfile
1127
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1128
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1129
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1130
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1131
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1132
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1133
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1134
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1135
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1136
+ - docker push $DOCKER_CACHE_IMAGE
1137
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1138
+ cache:
1139
+ - key: api-yarn
1140
+ policy: pull
1141
+ paths:
1142
+ - api/.yarn
1143
+ rules:
1144
+ - if: $CI_COMMIT_TAG
1145
+ needs:
1146
+ - 'api 🔨 app | stage '
1147
+ retry: *a1
1148
+ interruptible: true
1149
+ 'api 🧾 sbom | stage ':
1150
+ stage: build
1151
+ image: aquasec/trivy:0.38.3
1152
+ variables: {}
1153
+ script:
1154
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1155
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1156
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1157
+ artifacts:
1158
+ paths:
1159
+ - __sbom.json
1160
+ rules:
1161
+ - if: $CI_COMMIT_TAG
1162
+ needs: []
1163
+ retry: *a1
1164
+ interruptible: true
1165
+ allow_failure: true
1166
+ 'api 🚀 Deploy | stage ':
1167
+ stage: deploy stage
1168
+ image: path/to/docker/kubernetes:the-version
1169
+ variables:
1170
+ KUBERNETES_CPU_REQUEST: '0.22'
1171
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1172
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1173
+ script:
1174
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1175
+ - export ENV_SHORT="stage"
1176
+ - export APP_DIR="api"
1177
+ - export ENV_TYPE="stage"
1178
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1179
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1180
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1181
+ - export HOST="api.stage.test-app.pan.panter.cloud"
1182
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1183
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1184
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1185
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1186
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1187
+ - export KUBE_APP_NAME="api"
1188
+ - export KUBE_APP_NAME_PREFIX=""
1189
+ - export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"
1190
+ - export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"
1191
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1192
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1193
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1194
+ - export DOCKER_IMAGE_NAME="stage/api"
1195
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1196
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1197
+ - export RELEASE_NAME="pan-test-app-stage-api"
1198
+ - export HELM_EXPERIMENTAL_OCI="1"
1199
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1200
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1201
+ - export HELM_ARGS=""
1202
+ - export COMPONENT_NAME="api"
1203
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1204
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1205
+ - 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
1206
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1207
+ - 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"
1208
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1209
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
1210
+ - |
1211
+ cat > __all_values.yml <<EOF
1212
+ env:
1213
+ secret:
1214
+ MONGODB_ROOT_PASSWORD: |-
1215
+ $(printf %s "$CL_stage_api_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
1216
+ MONGODB_REPLICASET_KEY: |-
1217
+ $(printf %s "$CL_stage_api_MONGODB_REPLICASET_KEY" | sed 's/^/ /')
1218
+ MONGO_URL: |-
1219
+ mongodb://root:$CL_stage_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017/app?replicaSet=rs0&authSource=admin
1220
+ MONGO_OPLOG_URL: |-
1221
+ mongodb://root:$CL_stage_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017/local?replicaSet=rs0&authSource=admin
1222
+ public:
1223
+ ENV_SHORT: |-
1224
+ stage
1225
+ APP_DIR: |-
1226
+ api
1227
+ ENV_TYPE: |-
1228
+ stage
1229
+ BUILD_INFO_BUILD_ID: |-
1230
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1231
+ BUILD_INFO_BUILD_TIME: |-
1232
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1233
+ BUILD_INFO_CURRENT_VERSION: |-
1234
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1235
+ HOST: |-
1236
+ api.stage.test-app.pan.panter.cloud
1237
+ ROOT_URL: |-
1238
+ https://api.stage.test-app.pan.panter.cloud
1239
+ HOST_INTERNAL: |-
1240
+ api.stage.test-app.pan.panter.cloud
1241
+ HOST_CANONICAL: |-
1242
+ api.stage.test-app.pan.panter.cloud
1243
+ ROOT_URL_INTERNAL: |-
1244
+ https://api.stage.test-app.pan.panter.cloud
1245
+ KUBE_NAMESPACE: |-
1246
+ pan-test-app-stage
1247
+ KUBE_APP_NAME: |-
1248
+ api
1249
+ KUBE_APP_NAME_PREFIX: ""
1250
+ _ALL_ENV_VAR_KEYS: |-
1251
+ ["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","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
1252
+ application:
1253
+ host: |-
1254
+ api.stage.test-app.pan.panter.cloud
1255
+ command: |-
1256
+ node main.js
1257
+ livenessProbe:
1258
+ httpGet:
1259
+ path: |-
1260
+ __health
1261
+ readinessProbe:
1262
+ httpGet:
1263
+ path: |-
1264
+ __health
1265
+ startupProbe:
1266
+ httpGet:
1267
+ path: |-
1268
+ __health
1269
+ mongodb:
1270
+ enabled: true
1271
+ auth:
1272
+ enabled: true
1273
+ rootPassword: |-
1274
+ $CL_stage_api_MONGODB_ROOT_PASSWORD
1275
+ replicaSetKey: |-
1276
+ $CL_stage_api_MONGODB_REPLICASET_KEY
1277
+ persistence:
1278
+ storageClass: |-
1279
+ premium-rwo
1280
+ backup:
1281
+ enabled: true
1282
+ hostToBackup: |-
1283
+ api-mongodb-0.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017
1284
+ pvcToBackup: |-
1285
+ datadir-api-mongodb-0
1286
+ image: |-
1287
+ mrelite/kubectlmongoshell:v1.0
1288
+ schedule: |-
1289
+ 0 4 * * *
1290
+ volumeSnapshotClass: |-
1291
+ snapshotclass
1292
+ architecture: |-
1293
+ replicaset
1294
+ tolerations:
1295
+ - key: |-
1296
+ mongodb
1297
+ operator: |-
1298
+ Equal
1299
+ value: |-
1300
+ true
1301
+ effect: |-
1302
+ NoSchedule
1303
+
1304
+ EOF
1305
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
1306
+ - kubernetesCreateSecret
1307
+ - kubernetesDeploy
1308
+ - echo 'Uploading SBOM to Dependency Track'
1309
+ - /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
1310
+ - echo deployment successful 😻
1311
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1312
+ environment:
1313
+ name: stage/api
1314
+ url: $CL_GITLAB_ENVIRONMENT_URL
1315
+ on_stop: 'api 🛑 Stop ⚠️ | stage '
1316
+ artifacts:
1317
+ reports:
1318
+ dotenv: gitlab_environment.env
1319
+ rules:
1320
+ - when: on_success
1321
+ if: $CI_COMMIT_TAG
1322
+ needs:
1323
+ - job: 'api 🔨 app | stage '
1324
+ artifacts: false
1325
+ - job: 'api 🔨 docker | stage '
1326
+ artifacts: false
1327
+ - job: 'api 🧾 sbom | stage '
1328
+ artifacts: true
1329
+ retry: *a1
1330
+ interruptible: true
1331
+ allow_failure: false
1332
+ 'api 🛑 Stop ⚠️ | stage ':
1333
+ stage: stop stage
1334
+ image: path/to/docker/kubernetes:the-version
1335
+ variables:
1336
+ KUBERNETES_CPU_REQUEST: '0.22'
1337
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1338
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1339
+ GIT_STRATEGY: none
1340
+ script:
1341
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1342
+ - export ENV_SHORT="stage"
1343
+ - export APP_DIR="api"
1344
+ - export ENV_TYPE="stage"
1345
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1346
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1347
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1348
+ - export HOST="api.stage.test-app.pan.panter.cloud"
1349
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1350
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1351
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1352
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1353
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1354
+ - export KUBE_APP_NAME="api"
1355
+ - export KUBE_APP_NAME_PREFIX=""
1356
+ - export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"
1357
+ - export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"
1358
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1359
+ - export RELEASE_NAME="pan-test-app-stage-api"
1360
+ - export HELM_EXPERIMENTAL_OCI="1"
1361
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1362
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1363
+ - export HELM_ARGS=""
1364
+ - export COMPONENT_NAME="api"
1365
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1366
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1367
+ - 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
1368
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1369
+ - 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"
1370
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1371
+ - kubernetesDelete
1372
+ - echo 'Disabling component in Dependency Track'
1373
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" || true
1374
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1375
+ environment:
1376
+ name: stage/api
1377
+ url: $CL_GITLAB_ENVIRONMENT_URL
1378
+ action: stop
1379
+ artifacts:
1380
+ reports:
1381
+ dotenv: gitlab_environment.env
1382
+ rules:
1383
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1384
+ when: on_success
1385
+ - when: manual
1386
+ if: $CI_COMMIT_TAG
1387
+ needs: []
1388
+ retry: *a1
1389
+ interruptible: true
1390
+ allow_failure: true
1391
+ 'api ↩️ Rollback ⚠️ | stage ':
1392
+ stage: rollback stage
1393
+ image: path/to/docker/kubernetes:the-version
1394
+ variables:
1395
+ KUBERNETES_CPU_REQUEST: '0.22'
1396
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1397
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1398
+ GIT_STRATEGY: none
1399
+ script:
1400
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1401
+ - export ENV_SHORT="stage"
1402
+ - export APP_DIR="api"
1403
+ - export ENV_TYPE="stage"
1404
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1405
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1406
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1407
+ - export HOST="api.stage.test-app.pan.panter.cloud"
1408
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1409
+ - export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"
1410
+ - export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"
1411
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1412
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1413
+ - export KUBE_APP_NAME="api"
1414
+ - export KUBE_APP_NAME_PREFIX=""
1415
+ - export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"
1416
+ - export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"
1417
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1418
+ - export RELEASE_NAME="pan-test-app-stage-api"
1419
+ - export HELM_EXPERIMENTAL_OCI="1"
1420
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1421
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1422
+ - export HELM_ARGS=""
1423
+ - export COMPONENT_NAME="api"
1424
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1425
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1426
+ - 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
1427
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1428
+ - 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"
1429
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1430
+ - kubernetesRollback
1431
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env
1432
+ environment:
1433
+ name: stage/api
1434
+ url: $CL_GITLAB_ENVIRONMENT_URL
1435
+ action: access
1436
+ artifacts:
1437
+ reports:
1438
+ dotenv: gitlab_environment.env
1439
+ rules:
1440
+ - when: manual
1441
+ if: $CI_COMMIT_TAG
1442
+ needs: []
1443
+ retry: *a1
1444
+ interruptible: true
1445
+ allow_failure: true
1446
+ 'api 🔨 app | prod ':
1447
+ stage: build
1448
+ image: path/to/docker/jobs-default:the-version
1449
+ variables:
1450
+ KUBERNETES_CPU_REQUEST: '0.45'
1451
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1452
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1453
+ script:
1454
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1455
+ - export ENV_SHORT="prod"
1456
+ - export APP_DIR="api"
1457
+ - export ENV_TYPE="prod"
1458
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1459
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1460
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1461
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1462
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1463
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1464
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1465
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1466
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1467
+ - export KUBE_APP_NAME="api"
1468
+ - export KUBE_APP_NAME_PREFIX=""
1469
+ - export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"
1470
+ - export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"
1471
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1472
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1473
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1474
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1475
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1476
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1477
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1478
+ - cd api
1479
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
1480
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1481
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1482
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
1483
+ - echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"
1484
+ - yarn install --immutable
1485
+ - echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"
1486
+ - yarn build
1487
+ cache:
1488
+ - key: api-yarn
1489
+ policy: pull-push
1490
+ paths:
1491
+ - api/.yarn
1492
+ - key: api-node-modules
1493
+ policy: pull-push
1494
+ paths:
1495
+ - api/node_modules
1496
+ - key: api-next-cache
1497
+ policy: pull-push
1498
+ paths:
1499
+ - api/.next/cache
1500
+ artifacts:
1501
+ paths:
1502
+ - api/__build_info.json
1503
+ - api/.next
1504
+ - api/dist
1505
+ expire_in: 1 day
1506
+ when: always
1507
+ reports: {}
1508
+ rules:
1509
+ - if: $CI_COMMIT_TAG
1510
+ needs: []
1511
+ retry: *a1
1512
+ interruptible: true
1513
+ 'api 🔨 docker | prod ':
1514
+ stage: build
1515
+ image: path/to/docker/docker-build:the-version
1516
+ services:
1517
+ - name: docker:24.0.6-dind
1518
+ command:
1519
+ - --tls=false
1520
+ variables:
1521
+ DOCKER_HOST: tcp://0.0.0.0:2375
1522
+ DOCKER_TLS_CERTDIR: ''
1523
+ DOCKER_DRIVER: overlay2
1524
+ DOCKER_BUILDKIT: '1'
1525
+ KUBERNETES_CPU_REQUEST: '0.45'
1526
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1527
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1528
+ script:
1529
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1530
+ - export APP_DIR="api"
1531
+ - export DOCKER_BUILD_CONTEXT="."
1532
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1533
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1534
+ - export DOCKER_IMAGE_NAME="prod/api"
1535
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1536
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1537
+ - |-
1538
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1539
+ RUN yarn plugin import workspace-tools
1540
+ RUN yarn workspaces focus --production && yarn rebuild"
1541
+ - |-
1542
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1543
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1544
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1545
+ COPY --chown=node:node .yarn /app/.yarn"
1546
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1547
+ - ensureNodeDockerfile
1548
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
1549
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1550
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
1551
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
1552
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
1553
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
1554
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
1555
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1556
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1557
+ - docker push $DOCKER_CACHE_IMAGE
1558
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
1559
+ cache:
1560
+ - key: api-yarn
1561
+ policy: pull
1562
+ paths:
1563
+ - api/.yarn
1564
+ rules:
1565
+ - if: $CI_COMMIT_TAG
1566
+ needs:
1567
+ - 'api 🔨 app | prod '
1568
+ retry: *a1
1569
+ interruptible: true
1570
+ 'api 🧾 sbom | prod ':
1571
+ stage: build
1572
+ image: aquasec/trivy:0.38.3
1573
+ variables: {}
1574
+ script:
1575
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1576
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1577
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1578
+ artifacts:
1579
+ paths:
1580
+ - __sbom.json
1581
+ rules:
1582
+ - if: $CI_COMMIT_TAG
1583
+ needs: []
1584
+ retry: *a1
1585
+ interruptible: true
1586
+ allow_failure: true
1587
+ 'api 🚀 Deploy | prod ':
1588
+ stage: deploy prod
1589
+ image: path/to/docker/kubernetes:the-version
1590
+ variables:
1591
+ KUBERNETES_CPU_REQUEST: '0.22'
1592
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1593
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1594
+ script:
1595
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1596
+ - export ENV_SHORT="prod"
1597
+ - export APP_DIR="api"
1598
+ - export ENV_TYPE="prod"
1599
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1600
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1601
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1602
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1603
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1604
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1605
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1606
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1607
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1608
+ - export KUBE_APP_NAME="api"
1609
+ - export KUBE_APP_NAME_PREFIX=""
1610
+ - export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"
1611
+ - export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"
1612
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1613
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1614
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1615
+ - export DOCKER_IMAGE_NAME="prod/api"
1616
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1617
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1618
+ - export RELEASE_NAME="pan-test-app-prod-api"
1619
+ - export HELM_EXPERIMENTAL_OCI="1"
1620
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1621
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1622
+ - export HELM_ARGS=""
1623
+ - export COMPONENT_NAME="api"
1624
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1625
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1626
+ - 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
1627
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1628
+ - 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"
1629
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1630
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"
1631
+ - |
1632
+ cat > __all_values.yml <<EOF
1633
+ env:
1634
+ secret:
1635
+ MONGODB_ROOT_PASSWORD: |-
1636
+ $(printf %s "$CL_prod_api_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
1637
+ MONGODB_REPLICASET_KEY: |-
1638
+ $(printf %s "$CL_prod_api_MONGODB_REPLICASET_KEY" | sed 's/^/ /')
1639
+ MONGO_URL: |-
1640
+ mongodb://root:$CL_prod_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017/app?replicaSet=rs0&authSource=admin
1641
+ MONGO_OPLOG_URL: |-
1642
+ mongodb://root:$CL_prod_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017/local?replicaSet=rs0&authSource=admin
1643
+ public:
1644
+ ENV_SHORT: |-
1645
+ prod
1646
+ APP_DIR: |-
1647
+ api
1648
+ ENV_TYPE: |-
1649
+ prod
1650
+ BUILD_INFO_BUILD_ID: |-
1651
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1652
+ BUILD_INFO_BUILD_TIME: |-
1653
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1654
+ BUILD_INFO_CURRENT_VERSION: |-
1655
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
1656
+ HOST: |-
1657
+ api.prod.test-app.pan.panter.cloud
1658
+ ROOT_URL: |-
1659
+ https://api.prod.test-app.pan.panter.cloud
1660
+ HOST_INTERNAL: |-
1661
+ api.prod.test-app.pan.panter.cloud
1662
+ HOST_CANONICAL: |-
1663
+ api.prod.test-app.pan.panter.cloud
1664
+ ROOT_URL_INTERNAL: |-
1665
+ https://api.prod.test-app.pan.panter.cloud
1666
+ KUBE_NAMESPACE: |-
1667
+ pan-test-app-prod
1668
+ KUBE_APP_NAME: |-
1669
+ api
1670
+ KUBE_APP_NAME_PREFIX: ""
1671
+ _ALL_ENV_VAR_KEYS: |-
1672
+ ["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","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
1673
+ application:
1674
+ host: |-
1675
+ api.prod.test-app.pan.panter.cloud
1676
+ command: |-
1677
+ node main.js
1678
+ livenessProbe:
1679
+ httpGet:
1680
+ path: |-
1681
+ __health
1682
+ readinessProbe:
1683
+ httpGet:
1684
+ path: |-
1685
+ __health
1686
+ startupProbe:
1687
+ httpGet:
1688
+ path: |-
1689
+ __health
1690
+ mongodb:
1691
+ enabled: true
1692
+ auth:
1693
+ enabled: true
1694
+ rootPassword: |-
1695
+ $CL_prod_api_MONGODB_ROOT_PASSWORD
1696
+ replicaSetKey: |-
1697
+ $CL_prod_api_MONGODB_REPLICASET_KEY
1698
+ persistence:
1699
+ storageClass: |-
1700
+ premium-rwo
1701
+ backup:
1702
+ enabled: true
1703
+ hostToBackup: |-
1704
+ api-mongodb-0.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017
1705
+ pvcToBackup: |-
1706
+ datadir-api-mongodb-0
1707
+ image: |-
1708
+ mrelite/kubectlmongoshell:v1.0
1709
+ schedule: |-
1710
+ 0 4 * * *
1711
+ volumeSnapshotClass: |-
1712
+ snapshotclass
1713
+ architecture: |-
1714
+ replicaset
1715
+ tolerations:
1716
+ - key: |-
1717
+ mongodb
1718
+ operator: |-
1719
+ Equal
1720
+ value: |-
1721
+ true
1722
+ effect: |-
1723
+ NoSchedule
1724
+
1725
+ EOF
1726
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"
1727
+ - kubernetesCreateSecret
1728
+ - kubernetesDeploy
1729
+ - echo 'Uploading SBOM to Dependency Track'
1730
+ - /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
1731
+ - echo deployment successful 😻
1732
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1733
+ environment:
1734
+ name: prod/api
1735
+ url: $CL_GITLAB_ENVIRONMENT_URL
1736
+ on_stop: 'api 🛑 Stop ⚠️ | prod '
1737
+ artifacts:
1738
+ reports:
1739
+ dotenv: gitlab_environment.env
1740
+ rules:
1741
+ - when: manual
1742
+ if: $CI_COMMIT_TAG
1743
+ needs:
1744
+ - job: 'api 🔨 app | prod '
1745
+ artifacts: false
1746
+ - job: 'api 🔨 docker | prod '
1747
+ artifacts: false
1748
+ - job: 'api 🧾 sbom | prod '
1749
+ artifacts: true
1750
+ retry: *a1
1751
+ interruptible: true
1752
+ allow_failure: true
1753
+ 'api 🛑 Stop ⚠️ | prod ':
1754
+ stage: stop prod
1755
+ image: path/to/docker/kubernetes:the-version
1756
+ variables:
1757
+ KUBERNETES_CPU_REQUEST: '0.22'
1758
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1759
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1760
+ GIT_STRATEGY: none
1761
+ script:
1762
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1763
+ - export ENV_SHORT="prod"
1764
+ - export APP_DIR="api"
1765
+ - export ENV_TYPE="prod"
1766
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1767
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1768
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1769
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1770
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1771
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1772
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1773
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1774
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1775
+ - export KUBE_APP_NAME="api"
1776
+ - export KUBE_APP_NAME_PREFIX=""
1777
+ - export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"
1778
+ - export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"
1779
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1780
+ - export RELEASE_NAME="pan-test-app-prod-api"
1781
+ - export HELM_EXPERIMENTAL_OCI="1"
1782
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1783
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1784
+ - export HELM_ARGS=""
1785
+ - export COMPONENT_NAME="api"
1786
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1787
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1788
+ - 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
1789
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1790
+ - 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"
1791
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1792
+ - kubernetesDelete
1793
+ - echo 'Disabling component in Dependency Track'
1794
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" || true
1795
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1796
+ environment:
1797
+ name: prod/api
1798
+ url: $CL_GITLAB_ENVIRONMENT_URL
1799
+ action: stop
1800
+ artifacts:
1801
+ reports:
1802
+ dotenv: gitlab_environment.env
1803
+ rules:
1804
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1805
+ when: on_success
1806
+ - when: manual
1807
+ if: $CI_COMMIT_TAG
1808
+ needs: []
1809
+ retry: *a1
1810
+ interruptible: true
1811
+ allow_failure: true
1812
+ 'api ↩️ Rollback ⚠️ | prod ':
1813
+ stage: rollback prod
1814
+ image: path/to/docker/kubernetes:the-version
1815
+ variables:
1816
+ KUBERNETES_CPU_REQUEST: '0.22'
1817
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1818
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1819
+ GIT_STRATEGY: none
1820
+ script:
1821
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1822
+ - export ENV_SHORT="prod"
1823
+ - export APP_DIR="api"
1824
+ - export ENV_TYPE="prod"
1825
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1826
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1827
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1828
+ - export HOST="api.prod.test-app.pan.panter.cloud"
1829
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1830
+ - export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"
1831
+ - export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"
1832
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1833
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1834
+ - export KUBE_APP_NAME="api"
1835
+ - export KUBE_APP_NAME_PREFIX=""
1836
+ - export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"
1837
+ - export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"
1838
+ - 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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1839
+ - export RELEASE_NAME="pan-test-app-prod-api"
1840
+ - export HELM_EXPERIMENTAL_OCI="1"
1841
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1842
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1843
+ - export HELM_ARGS=""
1844
+ - export COMPONENT_NAME="api"
1845
+ - export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1846
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1847
+ - 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
1848
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1849
+ - 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"
1850
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1851
+ - kubernetesRollback
1852
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env
1853
+ environment:
1854
+ name: prod/api
1855
+ url: $CL_GITLAB_ENVIRONMENT_URL
1856
+ action: access
1857
+ artifacts:
1858
+ reports:
1859
+ dotenv: gitlab_environment.env
1860
+ rules:
1861
+ - when: manual
1862
+ if: $CI_COMMIT_TAG
1863
+ needs: []
1864
+ retry: *a1
1865
+ interruptible: true
1866
+ allow_failure: true
1867
+ create release:
1868
+ stage: release
1869
+ image: path/to/docker/semantic-release:the-version
1870
+ script:
1871
+ - semanticRelease
1872
+ after_script:
1873
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1874
+ rules:
1875
+ - &a2
1876
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1877
+ when: never
1878
+ - &a3
1879
+ if: $CI_PIPELINE_SOURCE == "schedule"
1880
+ when: never
1881
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1882
+ when: on_success
1883
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1884
+ when: manual
1885
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1886
+ when: manual
1887
+ ⚠️ force create release:
1888
+ stage: release
1889
+ image: path/to/docker/semantic-release:the-version
1890
+ script:
1891
+ - semanticRelease
1892
+ after_script:
1893
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1894
+ rules:
1895
+ - *a2
1896
+ - *a3
1897
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1898
+ when: manual
1899
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1900
+ when: manual
1901
+ needs: []
1902
+ "
1903
+ `;
1904
+
1905
+ exports[`matches snapshot for kubernetes-with-mongodb 1`] = `
1906
+ {
1907
+ "mainBranch": {
1908
+ "image": "path/to/docker/jobs-default:the-version",
1909
+ "jobs": {
1910
+ "api ↩️ Rollback ⚠️ | dev ": {
1911
+ "allow_failure": true,
1912
+ "artifacts": {
1913
+ "reports": {
1914
+ "dotenv": "gitlab_environment.env",
1915
+ },
1916
+ },
1917
+ "environment": {
1918
+ "action": "access",
1919
+ "name": "dev/api",
1920
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1921
+ },
1922
+ "image": "path/to/docker/kubernetes:the-version",
1923
+ "interruptible": true,
1924
+ "needs": [],
1925
+ "retry": {
1926
+ "max": 2,
1927
+ "when": [
1928
+ "runner_system_failure",
1929
+ "stuck_or_timeout_failure",
1930
+ ],
1931
+ },
1932
+ "rules": [
1933
+ {
1934
+ "when": "manual",
1935
+ },
1936
+ ],
1937
+ "script": [
1938
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1939
+ "export ENV_SHORT="dev"",
1940
+ "export APP_DIR="api"",
1941
+ "export ENV_TYPE="dev"",
1942
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1943
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1944
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
1945
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
1946
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
1947
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
1948
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
1949
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
1950
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
1951
+ "export KUBE_APP_NAME="api"",
1952
+ "export KUBE_APP_NAME_PREFIX=""",
1953
+ "export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"",
1954
+ "export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"",
1955
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
1956
+ "export RELEASE_NAME="pan-test-app-dev-api"",
1957
+ "export HELM_EXPERIMENTAL_OCI="1"",
1958
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
1959
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
1960
+ "export HELM_ARGS=""",
1961
+ "export COMPONENT_NAME="api"",
1962
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1963
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1964
+ "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",
1965
+ "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
1966
+ "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"",
1967
+ "kubectl config use-context "kube-pan-test-app-dev-api"",
1968
+ "kubernetesRollback",
1969
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
1970
+ ],
1971
+ "stage": "rollback dev",
1972
+ "variables": {
1973
+ "GIT_STRATEGY": "none",
1974
+ "KUBERNETES_CPU_REQUEST": "0.22",
1975
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1976
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1977
+ },
1978
+ },
1979
+ "api 👮 lint": {
1980
+ "cache": [
1981
+ {
1982
+ "key": "api-yarn",
1983
+ "paths": [
1984
+ "api/.yarn",
1985
+ ],
1986
+ "policy": "pull-push",
1987
+ },
1988
+ {
1989
+ "key": "api-node-modules",
1990
+ "paths": [
1991
+ "api/node_modules",
1992
+ ],
1993
+ "policy": "pull-push",
1994
+ },
1995
+ ],
1996
+ "image": "path/to/docker/jobs-default:the-version",
1997
+ "interruptible": true,
1998
+ "needs": [],
1999
+ "retry": {
2000
+ "max": 2,
2001
+ "when": [
2002
+ "runner_system_failure",
2003
+ "stuck_or_timeout_failure",
2004
+ ],
2005
+ },
2006
+ "script": [
2007
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2008
+ "export APP_PATH="api"",
2009
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2010
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2011
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2012
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2013
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2014
+ "cd api",
2015
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2016
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2017
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2018
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2019
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2020
+ "yarn install --immutable",
2021
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2022
+ "yarn lint",
2023
+ ],
2024
+ "stage": "test",
2025
+ "variables": {
2026
+ "KUBERNETES_CPU_REQUEST": "0.45",
2027
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2028
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2029
+ },
2030
+ },
2031
+ "api 🔨 app | dev ": {
2032
+ "artifacts": {
2033
+ "expire_in": "1 day",
2034
+ "paths": [
2035
+ "api/__build_info.json",
2036
+ "api/.next",
2037
+ "api/dist",
2038
+ ],
2039
+ "reports": {
2040
+ "junit": undefined,
2041
+ },
2042
+ "when": "always",
2043
+ },
2044
+ "cache": [
2045
+ {
2046
+ "key": "api-yarn",
2047
+ "paths": [
2048
+ "api/.yarn",
2049
+ ],
2050
+ "policy": "pull-push",
2051
+ },
2052
+ {
2053
+ "key": "api-node-modules",
2054
+ "paths": [
2055
+ "api/node_modules",
2056
+ ],
2057
+ "policy": "pull-push",
2058
+ },
2059
+ {
2060
+ "key": "api-next-cache",
2061
+ "paths": [
2062
+ "api/.next/cache",
2063
+ ],
2064
+ "policy": "pull-push",
2065
+ },
2066
+ ],
2067
+ "image": "path/to/docker/jobs-default:the-version",
2068
+ "interruptible": true,
2069
+ "needs": [],
2070
+ "retry": {
2071
+ "max": 2,
2072
+ "when": [
2073
+ "runner_system_failure",
2074
+ "stuck_or_timeout_failure",
2075
+ ],
2076
+ },
2077
+ "script": [
2078
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2079
+ "export ENV_SHORT="dev"",
2080
+ "export APP_DIR="api"",
2081
+ "export ENV_TYPE="dev"",
2082
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2083
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2084
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
2085
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
2086
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
2087
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
2088
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
2089
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
2090
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
2091
+ "export KUBE_APP_NAME="api"",
2092
+ "export KUBE_APP_NAME_PREFIX=""",
2093
+ "export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"",
2094
+ "export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"",
2095
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
2096
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2097
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
2098
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2099
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2100
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2101
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2102
+ "cd api",
2103
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2104
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2105
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2106
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2107
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2108
+ "yarn install --immutable",
2109
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2110
+ "yarn build",
2111
+ ],
2112
+ "stage": "build",
2113
+ "variables": {
2114
+ "KUBERNETES_CPU_REQUEST": "0.45",
2115
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2116
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2117
+ },
2118
+ },
2119
+ "api 🔨 docker | dev ": {
2120
+ "cache": [
2121
+ {
2122
+ "key": "api-yarn",
2123
+ "paths": [
2124
+ "api/.yarn",
2125
+ ],
2126
+ "policy": "pull",
2127
+ },
2128
+ ],
2129
+ "image": "path/to/docker/docker-build:the-version",
2130
+ "interruptible": true,
2131
+ "needs": [
2132
+ "api 🔨 app | dev ",
2133
+ ],
2134
+ "retry": {
2135
+ "max": 2,
2136
+ "when": [
2137
+ "runner_system_failure",
2138
+ "stuck_or_timeout_failure",
2139
+ ],
2140
+ },
2141
+ "script": [
2142
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2143
+ "export APP_DIR="api"",
2144
+ "export DOCKER_BUILD_CONTEXT="."",
2145
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
2146
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
2147
+ "export DOCKER_IMAGE_NAME="dev/api"",
2148
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2149
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2150
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2151
+ RUN yarn plugin import workspace-tools
2152
+ RUN yarn workspaces focus --production && yarn rebuild"",
2153
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
2154
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2155
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2156
+ COPY --chown=node:node .yarn /app/.yarn"",
2157
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2158
+ "ensureNodeDockerfile",
2159
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
2160
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2161
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
2162
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
2163
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1",
2164
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
2165
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
2166
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2167
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2168
+ "docker push $DOCKER_CACHE_IMAGE",
2169
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
2170
+ ],
2171
+ "services": [
2172
+ {
2173
+ "command": [
2174
+ "--tls=false",
2175
+ ],
2176
+ "name": "docker:24.0.6-dind",
2177
+ },
2178
+ ],
2179
+ "stage": "build",
2180
+ "variables": {
2181
+ "DOCKER_BUILDKIT": "1",
2182
+ "DOCKER_DRIVER": "overlay2",
2183
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2184
+ "DOCKER_TLS_CERTDIR": "",
2185
+ "KUBERNETES_CPU_REQUEST": "0.45",
2186
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2187
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2188
+ },
2189
+ },
2190
+ "api 🚀 Deploy | dev ": {
2191
+ "allow_failure": false,
2192
+ "artifacts": {
2193
+ "reports": {
2194
+ "dotenv": "gitlab_environment.env",
2195
+ },
2196
+ },
2197
+ "environment": {
2198
+ "auto_stop_in": "4 weeks",
2199
+ "name": "dev/api",
2200
+ "on_stop": "api 🛑 Stop ⚠️ | dev ",
2201
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2202
+ },
2203
+ "image": "path/to/docker/kubernetes:the-version",
2204
+ "interruptible": true,
2205
+ "needs": [
2206
+ {
2207
+ "artifacts": false,
2208
+ "job": "api 👮 lint",
2209
+ },
2210
+ {
2211
+ "artifacts": false,
2212
+ "job": "api 🔨 app | dev ",
2213
+ },
2214
+ {
2215
+ "artifacts": false,
2216
+ "job": "api 🔨 docker | dev ",
2217
+ },
2218
+ {
2219
+ "artifacts": false,
2220
+ "job": "api 🧪 test",
2221
+ },
2222
+ {
2223
+ "artifacts": true,
2224
+ "job": "api 🧾 sbom | dev ",
2225
+ },
2226
+ {
2227
+ "artifacts": false,
2228
+ "job": "api 🛡 audit",
2229
+ },
2230
+ ],
2231
+ "retry": {
2232
+ "max": 2,
2233
+ "when": [
2234
+ "runner_system_failure",
2235
+ "stuck_or_timeout_failure",
2236
+ ],
2237
+ },
2238
+ "rules": [
2239
+ {
2240
+ "when": "on_success",
2241
+ },
2242
+ ],
2243
+ "script": [
2244
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2245
+ "export ENV_SHORT="dev"",
2246
+ "export APP_DIR="api"",
2247
+ "export ENV_TYPE="dev"",
2248
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2249
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2250
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
2251
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
2252
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
2253
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
2254
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
2255
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
2256
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
2257
+ "export KUBE_APP_NAME="api"",
2258
+ "export KUBE_APP_NAME_PREFIX=""",
2259
+ "export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"",
2260
+ "export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"",
2261
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
2262
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
2263
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
2264
+ "export DOCKER_IMAGE_NAME="dev/api"",
2265
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2266
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2267
+ "export RELEASE_NAME="pan-test-app-dev-api"",
2268
+ "export HELM_EXPERIMENTAL_OCI="1"",
2269
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2270
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2271
+ "export HELM_ARGS=""",
2272
+ "export COMPONENT_NAME="api"",
2273
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2274
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2275
+ "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",
2276
+ "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
2277
+ "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"",
2278
+ "kubectl config use-context "kube-pan-test-app-dev-api"",
2279
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
2280
+ "cat > __all_values.yml <<EOF
2281
+ env:
2282
+ secret:
2283
+ MONGODB_ROOT_PASSWORD: |-
2284
+ $(printf %s "$CL_dev_api_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
2285
+ MONGODB_REPLICASET_KEY: |-
2286
+ $(printf %s "$CL_dev_api_MONGODB_REPLICASET_KEY" | sed 's/^/ /')
2287
+ MONGO_URL: |-
2288
+ mongodb://root:$CL_dev_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017/app?replicaSet=rs0&authSource=admin
2289
+ MONGO_OPLOG_URL: |-
2290
+ mongodb://root:$CL_dev_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017/local?replicaSet=rs0&authSource=admin
2291
+ public:
2292
+ ENV_SHORT: |-
2293
+ dev
2294
+ APP_DIR: |-
2295
+ api
2296
+ ENV_TYPE: |-
2297
+ dev
2298
+ BUILD_INFO_BUILD_ID: |-
2299
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2300
+ BUILD_INFO_BUILD_TIME: |-
2301
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2302
+ BUILD_INFO_CURRENT_VERSION: |-
2303
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
2304
+ HOST: |-
2305
+ api.dev.test-app.pan.panter.cloud
2306
+ ROOT_URL: |-
2307
+ https://api.dev.test-app.pan.panter.cloud
2308
+ HOST_INTERNAL: |-
2309
+ api.dev.test-app.pan.panter.cloud
2310
+ HOST_CANONICAL: |-
2311
+ api.dev.test-app.pan.panter.cloud
2312
+ ROOT_URL_INTERNAL: |-
2313
+ https://api.dev.test-app.pan.panter.cloud
2314
+ KUBE_NAMESPACE: |-
2315
+ pan-test-app-dev
2316
+ KUBE_APP_NAME: |-
2317
+ api
2318
+ KUBE_APP_NAME_PREFIX: ""
2319
+ _ALL_ENV_VAR_KEYS: |-
2320
+ ["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","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
2321
+ application:
2322
+ host: |-
2323
+ api.dev.test-app.pan.panter.cloud
2324
+ command: |-
2325
+ node main.js
2326
+ livenessProbe:
2327
+ httpGet:
2328
+ path: |-
2329
+ __health
2330
+ readinessProbe:
2331
+ httpGet:
2332
+ path: |-
2333
+ __health
2334
+ startupProbe:
2335
+ httpGet:
2336
+ path: |-
2337
+ __health
2338
+ mongodb:
2339
+ enabled: true
2340
+ auth:
2341
+ enabled: true
2342
+ rootPassword: |-
2343
+ $CL_dev_api_MONGODB_ROOT_PASSWORD
2344
+ replicaSetKey: |-
2345
+ $CL_dev_api_MONGODB_REPLICASET_KEY
2346
+ persistence:
2347
+ storageClass: |-
2348
+ premium-rwo
2349
+ backup:
2350
+ enabled: false
2351
+ hostToBackup: |-
2352
+ api-mongodb-0.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017
2353
+ pvcToBackup: |-
2354
+ datadir-api-mongodb-0
2355
+ image: |-
2356
+ mrelite/kubectlmongoshell:v1.0
2357
+ schedule: |-
2358
+ 0 4 * * *
2359
+ volumeSnapshotClass: |-
2360
+ snapshotclass
2361
+ architecture: |-
2362
+ replicaset
2363
+ tolerations:
2364
+ - key: |-
2365
+ mongodb
2366
+ operator: |-
2367
+ Equal
2368
+ value: |-
2369
+ true
2370
+ effect: |-
2371
+ NoSchedule
2372
+
2373
+ EOF
2374
+ ",
2375
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
2376
+ "kubernetesCreateSecret",
2377
+ "kubernetesDeploy",
2378
+ "echo 'Uploading SBOM to Dependency Track'",
2379
+ "/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",
2380
+ "echo deployment successful 😻",
2381
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
2382
+ ],
2383
+ "stage": "deploy dev",
2384
+ "variables": {
2385
+ "KUBERNETES_CPU_REQUEST": "0.22",
2386
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2387
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2388
+ },
2389
+ },
2390
+ "api 🛑 Stop ⚠️ | dev ": {
2391
+ "allow_failure": true,
2392
+ "artifacts": {
2393
+ "reports": {
2394
+ "dotenv": "gitlab_environment.env",
2395
+ },
2396
+ },
2397
+ "environment": {
2398
+ "action": "stop",
2399
+ "name": "dev/api",
2400
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2401
+ },
2402
+ "image": "path/to/docker/kubernetes:the-version",
2403
+ "interruptible": true,
2404
+ "needs": [],
2405
+ "retry": {
2406
+ "max": 2,
2407
+ "when": [
2408
+ "runner_system_failure",
2409
+ "stuck_or_timeout_failure",
2410
+ ],
2411
+ },
2412
+ "rules": [
2413
+ {
2414
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2415
+ "when": "on_success",
2416
+ },
2417
+ {
2418
+ "when": "manual",
2419
+ },
2420
+ ],
2421
+ "script": [
2422
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2423
+ "export ENV_SHORT="dev"",
2424
+ "export APP_DIR="api"",
2425
+ "export ENV_TYPE="dev"",
2426
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2427
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2428
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
2429
+ "export HOST="api.dev.test-app.pan.panter.cloud"",
2430
+ "export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"",
2431
+ "export HOST_INTERNAL="api.dev.test-app.pan.panter.cloud"",
2432
+ "export HOST_CANONICAL="api.dev.test-app.pan.panter.cloud"",
2433
+ "export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"",
2434
+ "export KUBE_NAMESPACE="pan-test-app-dev"",
2435
+ "export KUBE_APP_NAME="api"",
2436
+ "export KUBE_APP_NAME_PREFIX=""",
2437
+ "export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"",
2438
+ "export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"",
2439
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
2440
+ "export RELEASE_NAME="pan-test-app-dev-api"",
2441
+ "export HELM_EXPERIMENTAL_OCI="1"",
2442
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2443
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2444
+ "export HELM_ARGS=""",
2445
+ "export COMPONENT_NAME="api"",
2446
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2447
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2448
+ "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",
2449
+ "kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"",
2450
+ "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"",
2451
+ "kubectl config use-context "kube-pan-test-app-dev-api"",
2452
+ "kubernetesDelete",
2453
+ "echo 'Disabling component in Dependency Track'",
2454
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.dev.test-app.pan.panter.cloud" || true",
2455
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.dev.test-app.pan.panter.cloud" >> gitlab_environment.env",
2456
+ ],
2457
+ "stage": "stop dev",
2458
+ "variables": {
2459
+ "GIT_STRATEGY": "none",
2460
+ "KUBERNETES_CPU_REQUEST": "0.22",
2461
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2462
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2463
+ },
2464
+ },
2465
+ "api 🛡 audit": {
2466
+ "allow_failure": true,
2467
+ "image": "path/to/docker/jobs-default:the-version",
2468
+ "interruptible": true,
2469
+ "needs": [],
2470
+ "retry": {
2471
+ "max": 2,
2472
+ "when": [
2473
+ "runner_system_failure",
2474
+ "stuck_or_timeout_failure",
2475
+ ],
2476
+ },
2477
+ "script": [
2478
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2479
+ "export APP_PATH="api"",
2480
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2481
+ "cd api",
2482
+ "yarn npm audit --environment production",
2483
+ ],
2484
+ "stage": "test",
2485
+ "variables": {
2486
+ "KUBERNETES_CPU_REQUEST": "0.45",
2487
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2488
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2489
+ },
2490
+ },
2491
+ "api 🧪 test": {
2492
+ "cache": [
2493
+ {
2494
+ "key": "api-yarn",
2495
+ "paths": [
2496
+ "api/.yarn",
2497
+ ],
2498
+ "policy": "pull-push",
2499
+ },
2500
+ {
2501
+ "key": "api-node-modules",
2502
+ "paths": [
2503
+ "api/node_modules",
2504
+ ],
2505
+ "policy": "pull-push",
2506
+ },
2507
+ ],
2508
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
2509
+ "interruptible": true,
2510
+ "needs": [],
2511
+ "retry": {
2512
+ "max": 2,
2513
+ "when": [
2514
+ "runner_system_failure",
2515
+ "stuck_or_timeout_failure",
2516
+ ],
2517
+ },
2518
+ "script": [
2519
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2520
+ "export APP_PATH="api"",
2521
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2522
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2523
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2524
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2525
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2526
+ "cd api",
2527
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2528
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2529
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2530
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2531
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2532
+ "yarn install --immutable",
2533
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2534
+ "yarn test",
2535
+ ],
2536
+ "stage": "test",
2537
+ "variables": {
2538
+ "KUBERNETES_CPU_REQUEST": "0.45",
2539
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2540
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2541
+ },
2542
+ },
2543
+ "api 🧾 sbom | dev ": {
2544
+ "allow_failure": true,
2545
+ "artifacts": {
2546
+ "paths": [
2547
+ "__sbom.json",
2548
+ ],
2549
+ },
2550
+ "image": "aquasec/trivy:0.38.3",
2551
+ "interruptible": true,
2552
+ "needs": [],
2553
+ "retry": {
2554
+ "max": 2,
2555
+ "when": [
2556
+ "runner_system_failure",
2557
+ "stuck_or_timeout_failure",
2558
+ ],
2559
+ },
2560
+ "script": [
2561
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2562
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2563
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
2564
+ ],
2565
+ "stage": "build",
2566
+ "variables": {},
2567
+ },
2568
+ },
2569
+ "stages": [
2570
+ "setup",
2571
+ "setup dev",
2572
+ "setup review",
2573
+ "setup stage",
2574
+ "setup prod",
2575
+ "test",
2576
+ "test dev",
2577
+ "test review",
2578
+ "test stage",
2579
+ "test prod",
2580
+ "build",
2581
+ "build dev",
2582
+ "build review",
2583
+ "build stage",
2584
+ "build prod",
2585
+ "deploy",
2586
+ "deploy dev",
2587
+ "deploy review",
2588
+ "deploy stage",
2589
+ "deploy prod",
2590
+ "verify",
2591
+ "verify dev",
2592
+ "verify review",
2593
+ "verify stage",
2594
+ "verify prod",
2595
+ "rollback",
2596
+ "rollback dev",
2597
+ "rollback review",
2598
+ "rollback stage",
2599
+ "rollback prod",
2600
+ "stop",
2601
+ "stop dev",
2602
+ "stop review",
2603
+ "stop stage",
2604
+ "stop prod",
2605
+ ],
2606
+ "variables": {
2607
+ "ARTIFACT_COMPRESSION_LEVEL": "fast",
2608
+ "CACHE_COMPRESSION_LEVEL": "fast",
2609
+ "FF_USE_FASTZIP": "true",
2610
+ "GIT_DEPTH": "1",
2611
+ "TRANSFER_METER_FREQUENCY": "5s",
2612
+ },
2613
+ "workflow": {
2614
+ "rules": [
2615
+ {
2616
+ "if": "$CI_COMMIT_TAG",
2617
+ },
2618
+ {
2619
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
2620
+ "when": "never",
2621
+ },
2622
+ {
2623
+ "if": "$CI_PIPELINE_SOURCE == "schedule"",
2624
+ "when": "never",
2625
+ },
2626
+ {
2627
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
2628
+ },
2629
+ {
2630
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
2631
+ },
2632
+ {
2633
+ "if": "$CI_MERGE_REQUEST_ID",
2634
+ },
2635
+ ],
2636
+ },
2637
+ },
2638
+ "mr": {
2639
+ "image": "path/to/docker/jobs-default:the-version",
2640
+ "jobs": {
2641
+ "api ↩️ Rollback ⚠️ | review ": {
2642
+ "allow_failure": true,
2643
+ "artifacts": {
2644
+ "reports": {
2645
+ "dotenv": "gitlab_environment.env",
2646
+ },
2647
+ },
2648
+ "environment": {
2649
+ "action": "access",
2650
+ "name": "review/$CI_COMMIT_REF_NAME/api",
2651
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2652
+ },
2653
+ "image": "path/to/docker/kubernetes:the-version",
2654
+ "interruptible": true,
2655
+ "needs": [],
2656
+ "retry": {
2657
+ "max": 2,
2658
+ "when": [
2659
+ "runner_system_failure",
2660
+ "stuck_or_timeout_failure",
2661
+ ],
2662
+ },
2663
+ "rules": [
2664
+ {
2665
+ "when": "manual",
2666
+ },
2667
+ ],
2668
+ "script": [
2669
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2670
+ "export ENV_SHORT="review"",
2671
+ "export APP_DIR="api"",
2672
+ "export ENV_TYPE="review"",
2673
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2674
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2675
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
2676
+ "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"",
2677
+ "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"",
2678
+ "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"",
2679
+ "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"",
2680
+ "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"",
2681
+ "export KUBE_NAMESPACE="pan-test-app-review"",
2682
+ "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"",
2683
+ "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"; })-"",
2684
+ "export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"",
2685
+ "export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"",
2686
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
2687
+ "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"",
2688
+ "export HELM_EXPERIMENTAL_OCI="1"",
2689
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
2690
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
2691
+ "export HELM_ARGS=""",
2692
+ "export COMPONENT_NAME="api"",
2693
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2694
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2695
+ "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",
2696
+ "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"",
2697
+ "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"",
2698
+ "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"",
2699
+ "kubernetesRollback",
2700
+ "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",
2701
+ ],
2702
+ "stage": "rollback review",
2703
+ "variables": {
2704
+ "GIT_STRATEGY": "none",
2705
+ "KUBERNETES_CPU_REQUEST": "0.22",
2706
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2707
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2708
+ },
2709
+ },
2710
+ "api 👮 lint": {
2711
+ "cache": [
2712
+ {
2713
+ "key": "api-yarn",
2714
+ "paths": [
2715
+ "api/.yarn",
2716
+ ],
2717
+ "policy": "pull-push",
2718
+ },
2719
+ {
2720
+ "key": "api-node-modules",
2721
+ "paths": [
2722
+ "api/node_modules",
2723
+ ],
2724
+ "policy": "pull-push",
2725
+ },
2726
+ ],
2727
+ "image": "path/to/docker/jobs-default:the-version",
2728
+ "interruptible": true,
2729
+ "needs": [],
2730
+ "retry": {
2731
+ "max": 2,
2732
+ "when": [
2733
+ "runner_system_failure",
2734
+ "stuck_or_timeout_failure",
2735
+ ],
2736
+ },
2737
+ "script": [
2738
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2739
+ "export APP_PATH="api"",
2740
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2741
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2742
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2743
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2744
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2745
+ "cd api",
2746
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2747
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2748
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2749
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2750
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2751
+ "yarn install --immutable",
2752
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2753
+ "yarn lint",
2754
+ ],
2755
+ "stage": "test",
2756
+ "variables": {
2757
+ "KUBERNETES_CPU_REQUEST": "0.45",
2758
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2759
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2760
+ },
2761
+ },
2762
+ "api 🔨 app | review ": {
2763
+ "artifacts": {
2764
+ "expire_in": "1 day",
2765
+ "paths": [
2766
+ "api/__build_info.json",
2767
+ "api/.next",
2768
+ "api/dist",
2769
+ ],
2770
+ "reports": {
2771
+ "junit": undefined,
2772
+ },
2773
+ "when": "always",
2774
+ },
2775
+ "cache": [
2776
+ {
2777
+ "key": "api-yarn",
2778
+ "paths": [
2779
+ "api/.yarn",
2780
+ ],
2781
+ "policy": "pull-push",
2782
+ },
2783
+ {
2784
+ "key": "api-node-modules",
2785
+ "paths": [
2786
+ "api/node_modules",
2787
+ ],
2788
+ "policy": "pull-push",
2789
+ },
2790
+ {
2791
+ "key": "api-next-cache",
2792
+ "paths": [
2793
+ "api/.next/cache",
2794
+ ],
2795
+ "policy": "pull-push",
2796
+ },
2797
+ ],
2798
+ "image": "path/to/docker/jobs-default:the-version",
2799
+ "interruptible": true,
2800
+ "needs": [],
2801
+ "retry": {
2802
+ "max": 2,
2803
+ "when": [
2804
+ "runner_system_failure",
2805
+ "stuck_or_timeout_failure",
2806
+ ],
2807
+ },
2808
+ "script": [
2809
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2810
+ "export ENV_SHORT="review"",
2811
+ "export APP_DIR="api"",
2812
+ "export ENV_TYPE="review"",
2813
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2814
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2815
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
2816
+ "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"",
2817
+ "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"",
2818
+ "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"",
2819
+ "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"",
2820
+ "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"",
2821
+ "export KUBE_NAMESPACE="pan-test-app-review"",
2822
+ "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"",
2823
+ "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"; })-"",
2824
+ "export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"",
2825
+ "export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"",
2826
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
2827
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2828
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
2829
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2830
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2831
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2832
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2833
+ "cd api",
2834
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
2835
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
2836
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
2837
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
2838
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
2839
+ "yarn install --immutable",
2840
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
2841
+ "yarn build",
2842
+ ],
2843
+ "stage": "build",
2844
+ "variables": {
2845
+ "KUBERNETES_CPU_REQUEST": "0.45",
2846
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
2847
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2848
+ },
2849
+ },
2850
+ "api 🔨 docker | review ": {
2851
+ "cache": [
2852
+ {
2853
+ "key": "api-yarn",
2854
+ "paths": [
2855
+ "api/.yarn",
2856
+ ],
2857
+ "policy": "pull",
2858
+ },
2859
+ ],
2860
+ "image": "path/to/docker/docker-build:the-version",
2861
+ "interruptible": true,
2862
+ "needs": [
2863
+ "api 🔨 app | review ",
2864
+ ],
2865
+ "retry": {
2866
+ "max": 2,
2867
+ "when": [
2868
+ "runner_system_failure",
2869
+ "stuck_or_timeout_failure",
2870
+ ],
2871
+ },
2872
+ "script": [
2873
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2874
+ "export APP_DIR="api"",
2875
+ "export DOCKER_BUILD_CONTEXT="."",
2876
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
2877
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
2878
+ "export DOCKER_IMAGE_NAME="review/api"",
2879
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2880
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2881
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2882
+ RUN yarn plugin import workspace-tools
2883
+ RUN yarn workspaces focus --production && yarn rebuild"",
2884
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
2885
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
2886
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2887
+ COPY --chown=node:node .yarn /app/.yarn"",
2888
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2889
+ "ensureNodeDockerfile",
2890
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
2891
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
2892
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
2893
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
2894
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1",
2895
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
2896
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
2897
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2898
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2899
+ "docker push $DOCKER_CACHE_IMAGE",
2900
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
2901
+ ],
2902
+ "services": [
2903
+ {
2904
+ "command": [
2905
+ "--tls=false",
2906
+ ],
2907
+ "name": "docker:24.0.6-dind",
2908
+ },
2909
+ ],
2910
+ "stage": "build",
2911
+ "variables": {
2912
+ "DOCKER_BUILDKIT": "1",
2913
+ "DOCKER_DRIVER": "overlay2",
2914
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2915
+ "DOCKER_TLS_CERTDIR": "",
2916
+ "KUBERNETES_CPU_REQUEST": "0.45",
2917
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2918
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2919
+ },
2920
+ },
2921
+ "api 🚀 Deploy | review ": {
2922
+ "allow_failure": false,
2923
+ "artifacts": {
2924
+ "reports": {
2925
+ "dotenv": "gitlab_environment.env",
2926
+ },
2927
+ },
2928
+ "environment": {
2929
+ "auto_stop_in": "1 week",
2930
+ "name": "review/$CI_COMMIT_REF_NAME/api",
2931
+ "on_stop": "api 🛑 Stop ⚠️ | review ",
2932
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2933
+ },
2934
+ "image": "path/to/docker/kubernetes:the-version",
2935
+ "interruptible": true,
2936
+ "needs": [
2937
+ {
2938
+ "artifacts": false,
2939
+ "job": "api 👮 lint",
2940
+ },
2941
+ {
2942
+ "artifacts": false,
2943
+ "job": "api 🔨 app | review ",
2944
+ },
2945
+ {
2946
+ "artifacts": false,
2947
+ "job": "api 🔨 docker | review ",
2948
+ },
2949
+ {
2950
+ "artifacts": false,
2951
+ "job": "api 🧪 test",
2952
+ },
2953
+ {
2954
+ "artifacts": true,
2955
+ "job": "api 🧾 sbom | review ",
2956
+ },
2957
+ {
2958
+ "artifacts": false,
2959
+ "job": "api 🛡 audit",
2960
+ },
2961
+ ],
2962
+ "retry": {
2963
+ "max": 2,
2964
+ "when": [
2965
+ "runner_system_failure",
2966
+ "stuck_or_timeout_failure",
2967
+ ],
2968
+ },
2969
+ "rules": [
2970
+ {
2971
+ "when": "on_success",
2972
+ },
2973
+ ],
2974
+ "script": [
2975
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2976
+ "export ENV_SHORT="review"",
2977
+ "export APP_DIR="api"",
2978
+ "export ENV_TYPE="review"",
2979
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2980
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2981
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
2982
+ "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"",
2983
+ "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"",
2984
+ "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"",
2985
+ "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"",
2986
+ "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"",
2987
+ "export KUBE_NAMESPACE="pan-test-app-review"",
2988
+ "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"",
2989
+ "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"; })-"",
2990
+ "export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"",
2991
+ "export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"",
2992
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
2993
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
2994
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
2995
+ "export DOCKER_IMAGE_NAME="review/api"",
2996
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
2997
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2998
+ "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"",
2999
+ "export HELM_EXPERIMENTAL_OCI="1"",
3000
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
3001
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
3002
+ "export HELM_ARGS=""",
3003
+ "export COMPONENT_NAME="api"",
3004
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3005
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3006
+ "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",
3007
+ "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"",
3008
+ "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"",
3009
+ "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"",
3010
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
3011
+ "cat > __all_values.yml <<EOF
3012
+ env:
3013
+ secret:
3014
+ MONGODB_ROOT_PASSWORD: |-
3015
+ $(printf %s "$CL_review_api_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
3016
+ MONGODB_REPLICASET_KEY: |-
3017
+ $(printf %s "$CL_review_api_MONGODB_REPLICASET_KEY" | sed 's/^/ /')
3018
+ MONGO_URL: |-
3019
+ mongodb://root:$CL_review_api_MONGODB_ROOT_PASSWORD@$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-0.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-headless.pan-test-app-review.svc.cluster.local:27017,$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-1.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-headless.pan-test-app-review.svc.cluster.local:27017/app?replicaSet=rs0&authSource=admin
3020
+ MONGO_OPLOG_URL: |-
3021
+ mongodb://root:$CL_review_api_MONGODB_ROOT_PASSWORD@$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-0.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-headless.pan-test-app-review.svc.cluster.local:27017,$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-1.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-headless.pan-test-app-review.svc.cluster.local:27017/local?replicaSet=rs0&authSource=admin
3022
+ public:
3023
+ ENV_SHORT: |-
3024
+ review
3025
+ APP_DIR: |-
3026
+ api
3027
+ ENV_TYPE: |-
3028
+ review
3029
+ BUILD_INFO_BUILD_ID: |-
3030
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3031
+ BUILD_INFO_BUILD_TIME: |-
3032
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3033
+ BUILD_INFO_CURRENT_VERSION: |-
3034
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
3035
+ HOST: |-
3036
+ $(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/^/ /')
3037
+ ROOT_URL: |-
3038
+ $(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/^/ /')
3039
+ HOST_INTERNAL: |-
3040
+ $(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/^/ /')
3041
+ HOST_CANONICAL: |-
3042
+ $(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/^/ /')
3043
+ ROOT_URL_INTERNAL: |-
3044
+ $(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/^/ /')
3045
+ KUBE_NAMESPACE: |-
3046
+ pan-test-app-review
3047
+ KUBE_APP_NAME: |-
3048
+ $(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/^/ /')
3049
+ KUBE_APP_NAME_PREFIX: |-
3050
+ $(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/^/ /')
3051
+ _ALL_ENV_VAR_KEYS: |-
3052
+ ["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","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
3053
+ application:
3054
+ host: |-
3055
+ $(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/^/ /')
3056
+ command: |-
3057
+ node main.js
3058
+ livenessProbe:
3059
+ httpGet:
3060
+ path: |-
3061
+ __health
3062
+ readinessProbe:
3063
+ httpGet:
3064
+ path: |-
3065
+ __health
3066
+ startupProbe:
3067
+ httpGet:
3068
+ path: |-
3069
+ __health
3070
+ mongodb:
3071
+ enabled: true
3072
+ auth:
3073
+ enabled: true
3074
+ rootPassword: |-
3075
+ $CL_review_api_MONGODB_ROOT_PASSWORD
3076
+ replicaSetKey: |-
3077
+ $CL_review_api_MONGODB_REPLICASET_KEY
3078
+ persistence:
3079
+ storageClass: |-
3080
+ premium-rwo
3081
+ backup:
3082
+ enabled: false
3083
+ hostToBackup: |-
3084
+ $([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-0.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-headless.pan-test-app-review.svc.cluster.local:27017
3085
+ pvcToBackup: |-
3086
+ datadir-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api-mongodb-0
3087
+ image: |-
3088
+ mrelite/kubectlmongoshell:v1.0
3089
+ schedule: |-
3090
+ 0 4 * * *
3091
+ volumeSnapshotClass: |-
3092
+ snapshotclass
3093
+ architecture: |-
3094
+ replicaset
3095
+ tolerations:
3096
+ - key: |-
3097
+ mongodb
3098
+ operator: |-
3099
+ Equal
3100
+ value: |-
3101
+ true
3102
+ effect: |-
3103
+ NoSchedule
3104
+
3105
+ EOF
3106
+ ",
3107
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
3108
+ "kubernetesCreateSecret",
3109
+ "kubernetesDeploy",
3110
+ "echo 'Uploading SBOM to Dependency Track'",
3111
+ "/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",
3112
+ "echo deployment successful 😻",
3113
+ "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",
3114
+ ],
3115
+ "stage": "deploy review",
3116
+ "variables": {
3117
+ "KUBERNETES_CPU_REQUEST": "0.22",
3118
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
3119
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3120
+ },
3121
+ },
3122
+ "api 🛑 Stop ⚠️ | review ": {
3123
+ "allow_failure": true,
3124
+ "artifacts": {
3125
+ "reports": {
3126
+ "dotenv": "gitlab_environment.env",
3127
+ },
3128
+ },
3129
+ "environment": {
3130
+ "action": "stop",
3131
+ "name": "review/$CI_COMMIT_REF_NAME/api",
3132
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
3133
+ },
3134
+ "image": "path/to/docker/kubernetes:the-version",
3135
+ "interruptible": true,
3136
+ "needs": [],
3137
+ "retry": {
3138
+ "max": 2,
3139
+ "when": [
3140
+ "runner_system_failure",
3141
+ "stuck_or_timeout_failure",
3142
+ ],
3143
+ },
3144
+ "rules": [
3145
+ {
3146
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
3147
+ "when": "on_success",
3148
+ },
3149
+ {
3150
+ "when": "manual",
3151
+ },
3152
+ ],
3153
+ "script": [
3154
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3155
+ "export ENV_SHORT="review"",
3156
+ "export APP_DIR="api"",
3157
+ "export ENV_TYPE="review"",
3158
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3159
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3160
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
3161
+ "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"",
3162
+ "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"",
3163
+ "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"",
3164
+ "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"",
3165
+ "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"",
3166
+ "export KUBE_NAMESPACE="pan-test-app-review"",
3167
+ "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"",
3168
+ "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"; })-"",
3169
+ "export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"",
3170
+ "export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"",
3171
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
3172
+ "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"",
3173
+ "export HELM_EXPERIMENTAL_OCI="1"",
3174
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
3175
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
3176
+ "export HELM_ARGS=""",
3177
+ "export COMPONENT_NAME="api"",
3178
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3179
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3180
+ "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",
3181
+ "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"",
3182
+ "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"",
3183
+ "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"",
3184
+ "kubernetesDelete",
3185
+ "echo 'Disabling component in Dependency Track'",
3186
+ "/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",
3187
+ "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",
3188
+ ],
3189
+ "stage": "stop review",
3190
+ "variables": {
3191
+ "GIT_STRATEGY": "none",
3192
+ "KUBERNETES_CPU_REQUEST": "0.22",
3193
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
3194
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3195
+ },
3196
+ },
3197
+ "api 🛡 audit": {
3198
+ "allow_failure": true,
3199
+ "image": "path/to/docker/jobs-default:the-version",
3200
+ "interruptible": true,
3201
+ "needs": [],
3202
+ "retry": {
3203
+ "max": 2,
3204
+ "when": [
3205
+ "runner_system_failure",
3206
+ "stuck_or_timeout_failure",
3207
+ ],
3208
+ },
3209
+ "script": [
3210
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3211
+ "export APP_PATH="api"",
3212
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3213
+ "cd api",
3214
+ "yarn npm audit --environment production",
3215
+ ],
3216
+ "stage": "test",
3217
+ "variables": {
3218
+ "KUBERNETES_CPU_REQUEST": "0.45",
3219
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
3220
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
3221
+ },
3222
+ },
3223
+ "api 🧪 test": {
3224
+ "cache": [
3225
+ {
3226
+ "key": "api-yarn",
3227
+ "paths": [
3228
+ "api/.yarn",
3229
+ ],
3230
+ "policy": "pull-push",
3231
+ },
3232
+ {
3233
+ "key": "api-node-modules",
3234
+ "paths": [
3235
+ "api/node_modules",
3236
+ ],
3237
+ "policy": "pull-push",
3238
+ },
3239
+ ],
3240
+ "image": "path/to/docker/jobs-testing-chrome:the-version",
3241
+ "interruptible": true,
3242
+ "needs": [],
3243
+ "retry": {
3244
+ "max": 2,
3245
+ "when": [
3246
+ "runner_system_failure",
3247
+ "stuck_or_timeout_failure",
3248
+ ],
3249
+ },
3250
+ "script": [
3251
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3252
+ "export APP_PATH="api"",
3253
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3254
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3255
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3256
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3257
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3258
+ "cd api",
3259
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3260
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3261
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3262
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3263
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3264
+ "yarn install --immutable",
3265
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3266
+ "yarn test",
3267
+ ],
3268
+ "stage": "test",
3269
+ "variables": {
3270
+ "KUBERNETES_CPU_REQUEST": "0.45",
3271
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
3272
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
3273
+ },
3274
+ },
3275
+ "api 🧾 sbom | review ": {
3276
+ "allow_failure": true,
3277
+ "artifacts": {
3278
+ "paths": [
3279
+ "__sbom.json",
3280
+ ],
3281
+ },
3282
+ "image": "aquasec/trivy:0.38.3",
3283
+ "interruptible": true,
3284
+ "needs": [],
3285
+ "retry": {
3286
+ "max": 2,
3287
+ "when": [
3288
+ "runner_system_failure",
3289
+ "stuck_or_timeout_failure",
3290
+ ],
3291
+ },
3292
+ "script": [
3293
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3294
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3295
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
3296
+ ],
3297
+ "stage": "build",
3298
+ "variables": {},
3299
+ },
3300
+ },
3301
+ "stages": [
3302
+ "setup",
3303
+ "setup dev",
3304
+ "setup review",
3305
+ "setup stage",
3306
+ "setup prod",
3307
+ "test",
3308
+ "test dev",
3309
+ "test review",
3310
+ "test stage",
3311
+ "test prod",
3312
+ "build",
3313
+ "build dev",
3314
+ "build review",
3315
+ "build stage",
3316
+ "build prod",
3317
+ "deploy",
3318
+ "deploy dev",
3319
+ "deploy review",
3320
+ "deploy stage",
3321
+ "deploy prod",
3322
+ "verify",
3323
+ "verify dev",
3324
+ "verify review",
3325
+ "verify stage",
3326
+ "verify prod",
3327
+ "rollback",
3328
+ "rollback dev",
3329
+ "rollback review",
3330
+ "rollback stage",
3331
+ "rollback prod",
3332
+ "stop",
3333
+ "stop dev",
3334
+ "stop review",
3335
+ "stop stage",
3336
+ "stop prod",
3337
+ ],
3338
+ "variables": {
3339
+ "ARTIFACT_COMPRESSION_LEVEL": "fast",
3340
+ "CACHE_COMPRESSION_LEVEL": "fast",
3341
+ "FF_USE_FASTZIP": "true",
3342
+ "GIT_DEPTH": "1",
3343
+ "TRANSFER_METER_FREQUENCY": "5s",
3344
+ },
3345
+ "workflow": {
3346
+ "rules": [
3347
+ {
3348
+ "if": "$CI_COMMIT_TAG",
3349
+ },
3350
+ {
3351
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
3352
+ "when": "never",
3353
+ },
3354
+ {
3355
+ "if": "$CI_PIPELINE_SOURCE == "schedule"",
3356
+ "when": "never",
3357
+ },
3358
+ {
3359
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
3360
+ },
3361
+ {
3362
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
3363
+ },
3364
+ {
3365
+ "if": "$CI_MERGE_REQUEST_ID",
3366
+ },
3367
+ ],
3368
+ },
3369
+ },
3370
+ "taggedRelease": {
3371
+ "image": "path/to/docker/jobs-default:the-version",
3372
+ "jobs": {
3373
+ "api ↩️ Rollback ⚠️ | prod ": {
3374
+ "allow_failure": true,
3375
+ "artifacts": {
3376
+ "reports": {
3377
+ "dotenv": "gitlab_environment.env",
3378
+ },
3379
+ },
3380
+ "environment": {
3381
+ "action": "access",
3382
+ "name": "prod/api",
3383
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
3384
+ },
3385
+ "image": "path/to/docker/kubernetes:the-version",
3386
+ "interruptible": true,
3387
+ "needs": [],
3388
+ "retry": {
3389
+ "max": 2,
3390
+ "when": [
3391
+ "runner_system_failure",
3392
+ "stuck_or_timeout_failure",
3393
+ ],
3394
+ },
3395
+ "rules": [
3396
+ {
3397
+ "when": "manual",
3398
+ },
3399
+ ],
3400
+ "script": [
3401
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3402
+ "export ENV_SHORT="prod"",
3403
+ "export APP_DIR="api"",
3404
+ "export ENV_TYPE="prod"",
3405
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3406
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3407
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
3408
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
3409
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
3410
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
3411
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
3412
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
3413
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
3414
+ "export KUBE_APP_NAME="api"",
3415
+ "export KUBE_APP_NAME_PREFIX=""",
3416
+ "export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"",
3417
+ "export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"",
3418
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
3419
+ "export RELEASE_NAME="pan-test-app-prod-api"",
3420
+ "export HELM_EXPERIMENTAL_OCI="1"",
3421
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
3422
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
3423
+ "export HELM_ARGS=""",
3424
+ "export COMPONENT_NAME="api"",
3425
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3426
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3427
+ "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",
3428
+ "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
3429
+ "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"",
3430
+ "kubectl config use-context "kube-pan-test-app-prod-api"",
3431
+ "kubernetesRollback",
3432
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
3433
+ ],
3434
+ "stage": "rollback prod",
3435
+ "variables": {
3436
+ "GIT_STRATEGY": "none",
3437
+ "KUBERNETES_CPU_REQUEST": "0.22",
3438
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
3439
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3440
+ },
3441
+ },
3442
+ "api ↩️ Rollback ⚠️ | stage ": {
3443
+ "allow_failure": true,
3444
+ "artifacts": {
3445
+ "reports": {
3446
+ "dotenv": "gitlab_environment.env",
3447
+ },
3448
+ },
3449
+ "environment": {
3450
+ "action": "access",
3451
+ "name": "stage/api",
3452
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
3453
+ },
3454
+ "image": "path/to/docker/kubernetes:the-version",
3455
+ "interruptible": true,
3456
+ "needs": [],
3457
+ "retry": {
3458
+ "max": 2,
3459
+ "when": [
3460
+ "runner_system_failure",
3461
+ "stuck_or_timeout_failure",
3462
+ ],
3463
+ },
3464
+ "rules": [
3465
+ {
3466
+ "when": "manual",
3467
+ },
3468
+ ],
3469
+ "script": [
3470
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3471
+ "export ENV_SHORT="stage"",
3472
+ "export APP_DIR="api"",
3473
+ "export ENV_TYPE="stage"",
3474
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3475
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3476
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
3477
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
3478
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
3479
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
3480
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
3481
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
3482
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
3483
+ "export KUBE_APP_NAME="api"",
3484
+ "export KUBE_APP_NAME_PREFIX=""",
3485
+ "export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"",
3486
+ "export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"",
3487
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
3488
+ "export RELEASE_NAME="pan-test-app-stage-api"",
3489
+ "export HELM_EXPERIMENTAL_OCI="1"",
3490
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
3491
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
3492
+ "export HELM_ARGS=""",
3493
+ "export COMPONENT_NAME="api"",
3494
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3495
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3496
+ "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",
3497
+ "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
3498
+ "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"",
3499
+ "kubectl config use-context "kube-pan-test-app-stage-api"",
3500
+ "kubernetesRollback",
3501
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
3502
+ ],
3503
+ "stage": "rollback stage",
3504
+ "variables": {
3505
+ "GIT_STRATEGY": "none",
3506
+ "KUBERNETES_CPU_REQUEST": "0.22",
3507
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
3508
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
3509
+ },
3510
+ },
3511
+ "api 🔨 app | prod ": {
3512
+ "artifacts": {
3513
+ "expire_in": "1 day",
3514
+ "paths": [
3515
+ "api/__build_info.json",
3516
+ "api/.next",
3517
+ "api/dist",
3518
+ ],
3519
+ "reports": {
3520
+ "junit": undefined,
3521
+ },
3522
+ "when": "always",
3523
+ },
3524
+ "cache": [
3525
+ {
3526
+ "key": "api-yarn",
3527
+ "paths": [
3528
+ "api/.yarn",
3529
+ ],
3530
+ "policy": "pull-push",
3531
+ },
3532
+ {
3533
+ "key": "api-node-modules",
3534
+ "paths": [
3535
+ "api/node_modules",
3536
+ ],
3537
+ "policy": "pull-push",
3538
+ },
3539
+ {
3540
+ "key": "api-next-cache",
3541
+ "paths": [
3542
+ "api/.next/cache",
3543
+ ],
3544
+ "policy": "pull-push",
3545
+ },
3546
+ ],
3547
+ "image": "path/to/docker/jobs-default:the-version",
3548
+ "interruptible": true,
3549
+ "needs": [],
3550
+ "retry": {
3551
+ "max": 2,
3552
+ "when": [
3553
+ "runner_system_failure",
3554
+ "stuck_or_timeout_failure",
3555
+ ],
3556
+ },
3557
+ "script": [
3558
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3559
+ "export ENV_SHORT="prod"",
3560
+ "export APP_DIR="api"",
3561
+ "export ENV_TYPE="prod"",
3562
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3563
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3564
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
3565
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
3566
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
3567
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
3568
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
3569
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
3570
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
3571
+ "export KUBE_APP_NAME="api"",
3572
+ "export KUBE_APP_NAME_PREFIX=""",
3573
+ "export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"",
3574
+ "export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"",
3575
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
3576
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3577
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
3578
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3579
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3580
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3581
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3582
+ "cd api",
3583
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3584
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3585
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3586
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3587
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3588
+ "yarn install --immutable",
3589
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3590
+ "yarn build",
3591
+ ],
3592
+ "stage": "build",
3593
+ "variables": {
3594
+ "KUBERNETES_CPU_REQUEST": "0.45",
3595
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
3596
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
3597
+ },
3598
+ },
3599
+ "api 🔨 app | stage ": {
3600
+ "artifacts": {
3601
+ "expire_in": "1 day",
3602
+ "paths": [
3603
+ "api/__build_info.json",
3604
+ "api/.next",
3605
+ "api/dist",
3606
+ ],
3607
+ "reports": {
3608
+ "junit": undefined,
3609
+ },
3610
+ "when": "always",
3611
+ },
3612
+ "cache": [
3613
+ {
3614
+ "key": "api-yarn",
3615
+ "paths": [
3616
+ "api/.yarn",
3617
+ ],
3618
+ "policy": "pull-push",
3619
+ },
3620
+ {
3621
+ "key": "api-node-modules",
3622
+ "paths": [
3623
+ "api/node_modules",
3624
+ ],
3625
+ "policy": "pull-push",
3626
+ },
3627
+ {
3628
+ "key": "api-next-cache",
3629
+ "paths": [
3630
+ "api/.next/cache",
3631
+ ],
3632
+ "policy": "pull-push",
3633
+ },
3634
+ ],
3635
+ "image": "path/to/docker/jobs-default:the-version",
3636
+ "interruptible": true,
3637
+ "needs": [],
3638
+ "retry": {
3639
+ "max": 2,
3640
+ "when": [
3641
+ "runner_system_failure",
3642
+ "stuck_or_timeout_failure",
3643
+ ],
3644
+ },
3645
+ "script": [
3646
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3647
+ "export ENV_SHORT="stage"",
3648
+ "export APP_DIR="api"",
3649
+ "export ENV_TYPE="stage"",
3650
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3651
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3652
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
3653
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
3654
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
3655
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
3656
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
3657
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
3658
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
3659
+ "export KUBE_APP_NAME="api"",
3660
+ "export KUBE_APP_NAME_PREFIX=""",
3661
+ "export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"",
3662
+ "export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"",
3663
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
3664
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3665
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json",
3666
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3667
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3668
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3669
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3670
+ "cd api",
3671
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
3672
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
3673
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
3674
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
3675
+ "echo -e "\\e[0Ksection_start:$(date +%s):yarninstall[collapsed=true]\\r\\e[0KYarn install"",
3676
+ "yarn install --immutable",
3677
+ "echo -e "\\e[0Ksection_end:$(date +%s):yarninstall\\r\\e[0K"",
3678
+ "yarn build",
3679
+ ],
3680
+ "stage": "build",
3681
+ "variables": {
3682
+ "KUBERNETES_CPU_REQUEST": "0.45",
3683
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
3684
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
3685
+ },
3686
+ },
3687
+ "api 🔨 docker | prod ": {
3688
+ "cache": [
3689
+ {
3690
+ "key": "api-yarn",
3691
+ "paths": [
3692
+ "api/.yarn",
3693
+ ],
3694
+ "policy": "pull",
3695
+ },
3696
+ ],
3697
+ "image": "path/to/docker/docker-build:the-version",
3698
+ "interruptible": true,
3699
+ "needs": [
3700
+ "api 🔨 app | prod ",
3701
+ ],
3702
+ "retry": {
3703
+ "max": 2,
3704
+ "when": [
3705
+ "runner_system_failure",
3706
+ "stuck_or_timeout_failure",
3707
+ ],
3708
+ },
3709
+ "script": [
3710
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3711
+ "export APP_DIR="api"",
3712
+ "export DOCKER_BUILD_CONTEXT="."",
3713
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
3714
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
3715
+ "export DOCKER_IMAGE_NAME="prod/api"",
3716
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
3717
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
3718
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
3719
+ RUN yarn plugin import workspace-tools
3720
+ RUN yarn workspaces focus --production && yarn rebuild"",
3721
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
3722
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
3723
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
3724
+ COPY --chown=node:node .yarn /app/.yarn"",
3725
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3726
+ "ensureNodeDockerfile",
3727
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
3728
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
3729
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
3730
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
3731
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1",
3732
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
3733
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
3734
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
3735
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
3736
+ "docker push $DOCKER_CACHE_IMAGE",
3737
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
3738
+ ],
3739
+ "services": [
3740
+ {
3741
+ "command": [
3742
+ "--tls=false",
3743
+ ],
3744
+ "name": "docker:24.0.6-dind",
3745
+ },
3746
+ ],
3747
+ "stage": "build",
3748
+ "variables": {
3749
+ "DOCKER_BUILDKIT": "1",
3750
+ "DOCKER_DRIVER": "overlay2",
3751
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
3752
+ "DOCKER_TLS_CERTDIR": "",
3753
+ "KUBERNETES_CPU_REQUEST": "0.45",
3754
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
3755
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
3756
+ },
3757
+ },
3758
+ "api 🔨 docker | stage ": {
3759
+ "cache": [
3760
+ {
3761
+ "key": "api-yarn",
3762
+ "paths": [
3763
+ "api/.yarn",
3764
+ ],
3765
+ "policy": "pull",
3766
+ },
3767
+ ],
3768
+ "image": "path/to/docker/docker-build:the-version",
3769
+ "interruptible": true,
3770
+ "needs": [
3771
+ "api 🔨 app | stage ",
3772
+ ],
3773
+ "retry": {
3774
+ "max": 2,
3775
+ "when": [
3776
+ "runner_system_failure",
3777
+ "stuck_or_timeout_failure",
3778
+ ],
3779
+ },
3780
+ "script": [
3781
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3782
+ "export APP_DIR="api"",
3783
+ "export DOCKER_BUILD_CONTEXT="."",
3784
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
3785
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
3786
+ "export DOCKER_IMAGE_NAME="stage/api"",
3787
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
3788
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
3789
+ "export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
3790
+ RUN yarn plugin import workspace-tools
3791
+ RUN yarn workspaces focus --production && yarn rebuild"",
3792
+ "export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
3793
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
3794
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
3795
+ COPY --chown=node:node .yarn /app/.yarn"",
3796
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3797
+ "ensureNodeDockerfile",
3798
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
3799
+ "docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY",
3800
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
3801
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
3802
+ "docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1",
3803
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
3804
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
3805
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
3806
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
3807
+ "docker push $DOCKER_CACHE_IMAGE",
3808
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
3809
+ ],
3810
+ "services": [
3811
+ {
3812
+ "command": [
3813
+ "--tls=false",
3814
+ ],
3815
+ "name": "docker:24.0.6-dind",
3816
+ },
3817
+ ],
3818
+ "stage": "build",
3819
+ "variables": {
3820
+ "DOCKER_BUILDKIT": "1",
3821
+ "DOCKER_DRIVER": "overlay2",
3822
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
3823
+ "DOCKER_TLS_CERTDIR": "",
3824
+ "KUBERNETES_CPU_REQUEST": "0.45",
3825
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
3826
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
3827
+ },
3828
+ },
3829
+ "api 🚀 Deploy | prod ": {
3830
+ "allow_failure": true,
3831
+ "artifacts": {
3832
+ "reports": {
3833
+ "dotenv": "gitlab_environment.env",
3834
+ },
3835
+ },
3836
+ "environment": {
3837
+ "auto_stop_in": undefined,
3838
+ "name": "prod/api",
3839
+ "on_stop": "api 🛑 Stop ⚠️ | prod ",
3840
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
3841
+ },
3842
+ "image": "path/to/docker/kubernetes:the-version",
3843
+ "interruptible": true,
3844
+ "needs": [
3845
+ {
3846
+ "artifacts": false,
3847
+ "job": "api 🔨 app | prod ",
3848
+ },
3849
+ {
3850
+ "artifacts": false,
3851
+ "job": "api 🔨 docker | prod ",
3852
+ },
3853
+ {
3854
+ "artifacts": true,
3855
+ "job": "api 🧾 sbom | prod ",
3856
+ },
3857
+ ],
3858
+ "retry": {
3859
+ "max": 2,
3860
+ "when": [
3861
+ "runner_system_failure",
3862
+ "stuck_or_timeout_failure",
3863
+ ],
3864
+ },
3865
+ "rules": [
3866
+ {
3867
+ "when": "manual",
3868
+ },
3869
+ ],
3870
+ "script": [
3871
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
3872
+ "export ENV_SHORT="prod"",
3873
+ "export APP_DIR="api"",
3874
+ "export ENV_TYPE="prod"",
3875
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3876
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
3877
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
3878
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
3879
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
3880
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
3881
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
3882
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
3883
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
3884
+ "export KUBE_APP_NAME="api"",
3885
+ "export KUBE_APP_NAME_PREFIX=""",
3886
+ "export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"",
3887
+ "export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"",
3888
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
3889
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
3890
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
3891
+ "export DOCKER_IMAGE_NAME="prod/api"",
3892
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
3893
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
3894
+ "export RELEASE_NAME="pan-test-app-prod-api"",
3895
+ "export HELM_EXPERIMENTAL_OCI="1"",
3896
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
3897
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
3898
+ "export HELM_ARGS=""",
3899
+ "export COMPONENT_NAME="api"",
3900
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
3901
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
3902
+ "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",
3903
+ "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
3904
+ "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"",
3905
+ "kubectl config use-context "kube-pan-test-app-prod-api"",
3906
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
3907
+ "cat > __all_values.yml <<EOF
3908
+ env:
3909
+ secret:
3910
+ MONGODB_ROOT_PASSWORD: |-
3911
+ $(printf %s "$CL_prod_api_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
3912
+ MONGODB_REPLICASET_KEY: |-
3913
+ $(printf %s "$CL_prod_api_MONGODB_REPLICASET_KEY" | sed 's/^/ /')
3914
+ MONGO_URL: |-
3915
+ mongodb://root:$CL_prod_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017/app?replicaSet=rs0&authSource=admin
3916
+ MONGO_OPLOG_URL: |-
3917
+ mongodb://root:$CL_prod_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017/local?replicaSet=rs0&authSource=admin
3918
+ public:
3919
+ ENV_SHORT: |-
3920
+ prod
3921
+ APP_DIR: |-
3922
+ api
3923
+ ENV_TYPE: |-
3924
+ prod
3925
+ BUILD_INFO_BUILD_ID: |-
3926
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
3927
+ BUILD_INFO_BUILD_TIME: |-
3928
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
3929
+ BUILD_INFO_CURRENT_VERSION: |-
3930
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
3931
+ HOST: |-
3932
+ api.prod.test-app.pan.panter.cloud
3933
+ ROOT_URL: |-
3934
+ https://api.prod.test-app.pan.panter.cloud
3935
+ HOST_INTERNAL: |-
3936
+ api.prod.test-app.pan.panter.cloud
3937
+ HOST_CANONICAL: |-
3938
+ api.prod.test-app.pan.panter.cloud
3939
+ ROOT_URL_INTERNAL: |-
3940
+ https://api.prod.test-app.pan.panter.cloud
3941
+ KUBE_NAMESPACE: |-
3942
+ pan-test-app-prod
3943
+ KUBE_APP_NAME: |-
3944
+ api
3945
+ KUBE_APP_NAME_PREFIX: ""
3946
+ _ALL_ENV_VAR_KEYS: |-
3947
+ ["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","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
3948
+ application:
3949
+ host: |-
3950
+ api.prod.test-app.pan.panter.cloud
3951
+ command: |-
3952
+ node main.js
3953
+ livenessProbe:
3954
+ httpGet:
3955
+ path: |-
3956
+ __health
3957
+ readinessProbe:
3958
+ httpGet:
3959
+ path: |-
3960
+ __health
3961
+ startupProbe:
3962
+ httpGet:
3963
+ path: |-
3964
+ __health
3965
+ mongodb:
3966
+ enabled: true
3967
+ auth:
3968
+ enabled: true
3969
+ rootPassword: |-
3970
+ $CL_prod_api_MONGODB_ROOT_PASSWORD
3971
+ replicaSetKey: |-
3972
+ $CL_prod_api_MONGODB_REPLICASET_KEY
3973
+ persistence:
3974
+ storageClass: |-
3975
+ premium-rwo
3976
+ backup:
3977
+ enabled: true
3978
+ hostToBackup: |-
3979
+ api-mongodb-0.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017
3980
+ pvcToBackup: |-
3981
+ datadir-api-mongodb-0
3982
+ image: |-
3983
+ mrelite/kubectlmongoshell:v1.0
3984
+ schedule: |-
3985
+ 0 4 * * *
3986
+ volumeSnapshotClass: |-
3987
+ snapshotclass
3988
+ architecture: |-
3989
+ replicaset
3990
+ tolerations:
3991
+ - key: |-
3992
+ mongodb
3993
+ operator: |-
3994
+ Equal
3995
+ value: |-
3996
+ true
3997
+ effect: |-
3998
+ NoSchedule
3999
+
4000
+ EOF
4001
+ ",
4002
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
4003
+ "kubernetesCreateSecret",
4004
+ "kubernetesDeploy",
4005
+ "echo 'Uploading SBOM to Dependency Track'",
4006
+ "/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",
4007
+ "echo deployment successful 😻",
4008
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
4009
+ ],
4010
+ "stage": "deploy prod",
4011
+ "variables": {
4012
+ "KUBERNETES_CPU_REQUEST": "0.22",
4013
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
4014
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
4015
+ },
4016
+ },
4017
+ "api 🚀 Deploy | stage ": {
4018
+ "allow_failure": false,
4019
+ "artifacts": {
4020
+ "reports": {
4021
+ "dotenv": "gitlab_environment.env",
4022
+ },
4023
+ },
4024
+ "environment": {
4025
+ "auto_stop_in": undefined,
4026
+ "name": "stage/api",
4027
+ "on_stop": "api 🛑 Stop ⚠️ | stage ",
4028
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
4029
+ },
4030
+ "image": "path/to/docker/kubernetes:the-version",
4031
+ "interruptible": true,
4032
+ "needs": [
4033
+ {
4034
+ "artifacts": false,
4035
+ "job": "api 🔨 app | stage ",
4036
+ },
4037
+ {
4038
+ "artifacts": false,
4039
+ "job": "api 🔨 docker | stage ",
4040
+ },
4041
+ {
4042
+ "artifacts": true,
4043
+ "job": "api 🧾 sbom | stage ",
4044
+ },
4045
+ ],
4046
+ "retry": {
4047
+ "max": 2,
4048
+ "when": [
4049
+ "runner_system_failure",
4050
+ "stuck_or_timeout_failure",
4051
+ ],
4052
+ },
4053
+ "rules": [
4054
+ {
4055
+ "when": "on_success",
4056
+ },
4057
+ ],
4058
+ "script": [
4059
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4060
+ "export ENV_SHORT="stage"",
4061
+ "export APP_DIR="api"",
4062
+ "export ENV_TYPE="stage"",
4063
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4064
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4065
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
4066
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
4067
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
4068
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
4069
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
4070
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
4071
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
4072
+ "export KUBE_APP_NAME="api"",
4073
+ "export KUBE_APP_NAME_PREFIX=""",
4074
+ "export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"",
4075
+ "export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"",
4076
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
4077
+ "export DOCKER_REGISTRY="$CI_REGISTRY"",
4078
+ "export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"",
4079
+ "export DOCKER_IMAGE_NAME="stage/api"",
4080
+ "export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"",
4081
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
4082
+ "export RELEASE_NAME="pan-test-app-stage-api"",
4083
+ "export HELM_EXPERIMENTAL_OCI="1"",
4084
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
4085
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
4086
+ "export HELM_ARGS=""",
4087
+ "export COMPONENT_NAME="api"",
4088
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4089
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4090
+ "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",
4091
+ "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
4092
+ "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"",
4093
+ "kubectl config use-context "kube-pan-test-app-stage-api"",
4094
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeallvalues[collapsed=true]\\r\\e[0KWrite __all_values.yml for helm deployment"",
4095
+ "cat > __all_values.yml <<EOF
4096
+ env:
4097
+ secret:
4098
+ MONGODB_ROOT_PASSWORD: |-
4099
+ $(printf %s "$CL_stage_api_MONGODB_ROOT_PASSWORD" | sed 's/^/ /')
4100
+ MONGODB_REPLICASET_KEY: |-
4101
+ $(printf %s "$CL_stage_api_MONGODB_REPLICASET_KEY" | sed 's/^/ /')
4102
+ MONGO_URL: |-
4103
+ mongodb://root:$CL_stage_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017/app?replicaSet=rs0&authSource=admin
4104
+ MONGO_OPLOG_URL: |-
4105
+ mongodb://root:$CL_stage_api_MONGODB_ROOT_PASSWORD@api-mongodb-0.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017,api-mongodb-1.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017/local?replicaSet=rs0&authSource=admin
4106
+ public:
4107
+ ENV_SHORT: |-
4108
+ stage
4109
+ APP_DIR: |-
4110
+ api
4111
+ ENV_TYPE: |-
4112
+ stage
4113
+ BUILD_INFO_BUILD_ID: |-
4114
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
4115
+ BUILD_INFO_BUILD_TIME: |-
4116
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
4117
+ BUILD_INFO_CURRENT_VERSION: |-
4118
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed 's/^/ /')
4119
+ HOST: |-
4120
+ api.stage.test-app.pan.panter.cloud
4121
+ ROOT_URL: |-
4122
+ https://api.stage.test-app.pan.panter.cloud
4123
+ HOST_INTERNAL: |-
4124
+ api.stage.test-app.pan.panter.cloud
4125
+ HOST_CANONICAL: |-
4126
+ api.stage.test-app.pan.panter.cloud
4127
+ ROOT_URL_INTERNAL: |-
4128
+ https://api.stage.test-app.pan.panter.cloud
4129
+ KUBE_NAMESPACE: |-
4130
+ pan-test-app-stage
4131
+ KUBE_APP_NAME: |-
4132
+ api
4133
+ KUBE_APP_NAME_PREFIX: ""
4134
+ _ALL_ENV_VAR_KEYS: |-
4135
+ ["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","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
4136
+ application:
4137
+ host: |-
4138
+ api.stage.test-app.pan.panter.cloud
4139
+ command: |-
4140
+ node main.js
4141
+ livenessProbe:
4142
+ httpGet:
4143
+ path: |-
4144
+ __health
4145
+ readinessProbe:
4146
+ httpGet:
4147
+ path: |-
4148
+ __health
4149
+ startupProbe:
4150
+ httpGet:
4151
+ path: |-
4152
+ __health
4153
+ mongodb:
4154
+ enabled: true
4155
+ auth:
4156
+ enabled: true
4157
+ rootPassword: |-
4158
+ $CL_stage_api_MONGODB_ROOT_PASSWORD
4159
+ replicaSetKey: |-
4160
+ $CL_stage_api_MONGODB_REPLICASET_KEY
4161
+ persistence:
4162
+ storageClass: |-
4163
+ premium-rwo
4164
+ backup:
4165
+ enabled: true
4166
+ hostToBackup: |-
4167
+ api-mongodb-0.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017
4168
+ pvcToBackup: |-
4169
+ datadir-api-mongodb-0
4170
+ image: |-
4171
+ mrelite/kubectlmongoshell:v1.0
4172
+ schedule: |-
4173
+ 0 4 * * *
4174
+ volumeSnapshotClass: |-
4175
+ snapshotclass
4176
+ architecture: |-
4177
+ replicaset
4178
+ tolerations:
4179
+ - key: |-
4180
+ mongodb
4181
+ operator: |-
4182
+ Equal
4183
+ value: |-
4184
+ true
4185
+ effect: |-
4186
+ NoSchedule
4187
+
4188
+ EOF
4189
+ ",
4190
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeallvalues\\r\\e[0K"",
4191
+ "kubernetesCreateSecret",
4192
+ "kubernetesDeploy",
4193
+ "echo 'Uploading SBOM to Dependency Track'",
4194
+ "/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",
4195
+ "echo deployment successful 😻",
4196
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
4197
+ ],
4198
+ "stage": "deploy stage",
4199
+ "variables": {
4200
+ "KUBERNETES_CPU_REQUEST": "0.22",
4201
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
4202
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
4203
+ },
4204
+ },
4205
+ "api 🛑 Stop ⚠️ | prod ": {
4206
+ "allow_failure": true,
4207
+ "artifacts": {
4208
+ "reports": {
4209
+ "dotenv": "gitlab_environment.env",
4210
+ },
4211
+ },
4212
+ "environment": {
4213
+ "action": "stop",
4214
+ "name": "prod/api",
4215
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
4216
+ },
4217
+ "image": "path/to/docker/kubernetes:the-version",
4218
+ "interruptible": true,
4219
+ "needs": [],
4220
+ "retry": {
4221
+ "max": 2,
4222
+ "when": [
4223
+ "runner_system_failure",
4224
+ "stuck_or_timeout_failure",
4225
+ ],
4226
+ },
4227
+ "rules": [
4228
+ {
4229
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
4230
+ "when": "on_success",
4231
+ },
4232
+ {
4233
+ "when": "manual",
4234
+ },
4235
+ ],
4236
+ "script": [
4237
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4238
+ "export ENV_SHORT="prod"",
4239
+ "export APP_DIR="api"",
4240
+ "export ENV_TYPE="prod"",
4241
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4242
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4243
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
4244
+ "export HOST="api.prod.test-app.pan.panter.cloud"",
4245
+ "export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"",
4246
+ "export HOST_INTERNAL="api.prod.test-app.pan.panter.cloud"",
4247
+ "export HOST_CANONICAL="api.prod.test-app.pan.panter.cloud"",
4248
+ "export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"",
4249
+ "export KUBE_NAMESPACE="pan-test-app-prod"",
4250
+ "export KUBE_APP_NAME="api"",
4251
+ "export KUBE_APP_NAME_PREFIX=""",
4252
+ "export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"",
4253
+ "export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"",
4254
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
4255
+ "export RELEASE_NAME="pan-test-app-prod-api"",
4256
+ "export HELM_EXPERIMENTAL_OCI="1"",
4257
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
4258
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
4259
+ "export HELM_ARGS=""",
4260
+ "export COMPONENT_NAME="api"",
4261
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4262
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4263
+ "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",
4264
+ "kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"",
4265
+ "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"",
4266
+ "kubectl config use-context "kube-pan-test-app-prod-api"",
4267
+ "kubernetesDelete",
4268
+ "echo 'Disabling component in Dependency Track'",
4269
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.prod.test-app.pan.panter.cloud" || true",
4270
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.prod.test-app.pan.panter.cloud" >> gitlab_environment.env",
4271
+ ],
4272
+ "stage": "stop prod",
4273
+ "variables": {
4274
+ "GIT_STRATEGY": "none",
4275
+ "KUBERNETES_CPU_REQUEST": "0.22",
4276
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
4277
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
4278
+ },
4279
+ },
4280
+ "api 🛑 Stop ⚠️ | stage ": {
4281
+ "allow_failure": true,
4282
+ "artifacts": {
4283
+ "reports": {
4284
+ "dotenv": "gitlab_environment.env",
4285
+ },
4286
+ },
4287
+ "environment": {
4288
+ "action": "stop",
4289
+ "name": "stage/api",
4290
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
4291
+ },
4292
+ "image": "path/to/docker/kubernetes:the-version",
4293
+ "interruptible": true,
4294
+ "needs": [],
4295
+ "retry": {
4296
+ "max": 2,
4297
+ "when": [
4298
+ "runner_system_failure",
4299
+ "stuck_or_timeout_failure",
4300
+ ],
4301
+ },
4302
+ "rules": [
4303
+ {
4304
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
4305
+ "when": "on_success",
4306
+ },
4307
+ {
4308
+ "when": "manual",
4309
+ },
4310
+ ],
4311
+ "script": [
4312
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4313
+ "export ENV_SHORT="stage"",
4314
+ "export APP_DIR="api"",
4315
+ "export ENV_TYPE="stage"",
4316
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4317
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
4318
+ "export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"",
4319
+ "export HOST="api.stage.test-app.pan.panter.cloud"",
4320
+ "export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"",
4321
+ "export HOST_INTERNAL="api.stage.test-app.pan.panter.cloud"",
4322
+ "export HOST_CANONICAL="api.stage.test-app.pan.panter.cloud"",
4323
+ "export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"",
4324
+ "export KUBE_NAMESPACE="pan-test-app-stage"",
4325
+ "export KUBE_APP_NAME="api"",
4326
+ "export KUBE_APP_NAME_PREFIX=""",
4327
+ "export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"",
4328
+ "export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"",
4329
+ "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\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"",
4330
+ "export RELEASE_NAME="pan-test-app-stage-api"",
4331
+ "export HELM_EXPERIMENTAL_OCI="1"",
4332
+ "export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"",
4333
+ "export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"",
4334
+ "export HELM_ARGS=""",
4335
+ "export COMPONENT_NAME="api"",
4336
+ "export BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
4337
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4338
+ "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",
4339
+ "kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"",
4340
+ "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"",
4341
+ "kubectl config use-context "kube-pan-test-app-stage-api"",
4342
+ "kubernetesDelete",
4343
+ "echo 'Disabling component in Dependency Track'",
4344
+ "/dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "https://api.stage.test-app.pan.panter.cloud" || true",
4345
+ "echo "CL_GITLAB_ENVIRONMENT_URL=https://api.stage.test-app.pan.panter.cloud" >> gitlab_environment.env",
4346
+ ],
4347
+ "stage": "stop stage",
4348
+ "variables": {
4349
+ "GIT_STRATEGY": "none",
4350
+ "KUBERNETES_CPU_REQUEST": "0.22",
4351
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
4352
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
4353
+ },
4354
+ },
4355
+ "api 🧾 sbom | prod ": {
4356
+ "allow_failure": true,
4357
+ "artifacts": {
4358
+ "paths": [
4359
+ "__sbom.json",
4360
+ ],
4361
+ },
4362
+ "image": "aquasec/trivy:0.38.3",
4363
+ "interruptible": true,
4364
+ "needs": [],
4365
+ "retry": {
4366
+ "max": 2,
4367
+ "when": [
4368
+ "runner_system_failure",
4369
+ "stuck_or_timeout_failure",
4370
+ ],
4371
+ },
4372
+ "script": [
4373
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4374
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4375
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
4376
+ ],
4377
+ "stage": "build",
4378
+ "variables": {},
4379
+ },
4380
+ "api 🧾 sbom | stage ": {
4381
+ "allow_failure": true,
4382
+ "artifacts": {
4383
+ "paths": [
4384
+ "__sbom.json",
4385
+ ],
4386
+ },
4387
+ "image": "aquasec/trivy:0.38.3",
4388
+ "interruptible": true,
4389
+ "needs": [],
4390
+ "retry": {
4391
+ "max": 2,
4392
+ "when": [
4393
+ "runner_system_failure",
4394
+ "stuck_or_timeout_failure",
4395
+ ],
4396
+ },
4397
+ "script": [
4398
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
4399
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
4400
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" api",
4401
+ ],
4402
+ "stage": "build",
4403
+ "variables": {},
4404
+ },
4405
+ },
4406
+ "stages": [
4407
+ "setup",
4408
+ "setup dev",
4409
+ "setup review",
4410
+ "setup stage",
4411
+ "setup prod",
4412
+ "test",
4413
+ "test dev",
4414
+ "test review",
4415
+ "test stage",
4416
+ "test prod",
4417
+ "build",
4418
+ "build dev",
4419
+ "build review",
4420
+ "build stage",
4421
+ "build prod",
4422
+ "deploy",
4423
+ "deploy dev",
4424
+ "deploy review",
4425
+ "deploy stage",
4426
+ "deploy prod",
4427
+ "verify",
4428
+ "verify dev",
4429
+ "verify review",
4430
+ "verify stage",
4431
+ "verify prod",
4432
+ "rollback",
4433
+ "rollback dev",
4434
+ "rollback review",
4435
+ "rollback stage",
4436
+ "rollback prod",
4437
+ "stop",
4438
+ "stop dev",
4439
+ "stop review",
4440
+ "stop stage",
4441
+ "stop prod",
4442
+ ],
4443
+ "variables": {
4444
+ "ARTIFACT_COMPRESSION_LEVEL": "fast",
4445
+ "CACHE_COMPRESSION_LEVEL": "fast",
4446
+ "FF_USE_FASTZIP": "true",
4447
+ "GIT_DEPTH": "1",
4448
+ "TRANSFER_METER_FREQUENCY": "5s",
4449
+ },
4450
+ "workflow": {
4451
+ "rules": [
4452
+ {
4453
+ "if": "$CI_COMMIT_TAG",
4454
+ },
4455
+ {
4456
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
4457
+ "when": "never",
4458
+ },
4459
+ {
4460
+ "if": "$CI_PIPELINE_SOURCE == "schedule"",
4461
+ "when": "never",
4462
+ },
4463
+ {
4464
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
4465
+ },
4466
+ {
4467
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
4468
+ },
4469
+ {
4470
+ "if": "$CI_MERGE_REQUEST_ID",
4471
+ },
4472
+ ],
4473
+ },
4474
+ },
4475
+ }
4476
+ `;