@catladder/pipeline 0.0.0-refactore-catenv-command-validates-argument-78d05852 โ†’ 0.0.0-reference-database-url-1befbbee

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 (639) hide show
  1. package/README.md +15 -1
  2. package/dist/bash/BashExpression.d.ts +36 -0
  3. package/dist/bash/BashExpression.js +114 -0
  4. package/dist/bash/bashEscape.d.ts +37 -0
  5. package/dist/bash/bashEscape.js +119 -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 +69 -0
  10. package/dist/bash/getInjectVarsScript.d.ts +2 -0
  11. package/dist/bash/getInjectVarsScript.js +47 -0
  12. package/dist/bash/index.d.ts +2 -0
  13. package/dist/bash/index.js +26 -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 +3 -1
  17. package/dist/build/base/constants.js +4 -2
  18. package/dist/build/base/createAppBuildJob.d.ts +5 -3
  19. package/dist/build/base/createAppBuildJob.js +18 -15
  20. package/dist/build/base/createArtifactsConfig.d.ts +1 -1
  21. package/dist/build/base/createArtifactsConfig.js +3 -1
  22. package/dist/build/base/createBuildJobDefinition.d.ts +6 -0
  23. package/dist/build/base/createBuildJobDefinition.js +58 -0
  24. package/dist/build/base/index.d.ts +6 -4
  25. package/dist/build/base/index.js +17 -6
  26. package/dist/build/base/writeBuildInfo.d.ts +2 -2
  27. package/dist/build/base/writeBuildInfo.js +4 -3
  28. package/dist/build/base/writeDotEnv.d.ts +3 -2
  29. package/dist/build/base/writeDotEnv.js +30 -6
  30. package/dist/build/cache/createJobCache.d.ts +7 -0
  31. package/dist/build/cache/createJobCache.js +115 -0
  32. package/dist/build/cache/getAllCacheConfigsFromConfig.d.ts +3 -0
  33. package/dist/build/cache/getAllCacheConfigsFromConfig.js +64 -0
  34. package/dist/build/cache/transformLegacyJobCache.d.ts +3 -0
  35. package/dist/build/cache/transformLegacyJobCache.js +29 -0
  36. package/dist/build/custom/__tests__/testJob.test.js +15 -16
  37. package/dist/build/custom/buildJob.d.ts +2 -2
  38. package/dist/build/custom/buildJob.js +8 -66
  39. package/dist/build/custom/index.d.ts +2 -2
  40. package/dist/build/custom/index.js +3 -1
  41. package/dist/build/custom/testJob.d.ts +4 -4
  42. package/dist/build/custom/testJob.js +25 -20
  43. package/dist/build/docker.d.ts +37 -46
  44. package/dist/build/docker.js +65 -34
  45. package/dist/build/index.d.ts +14 -7
  46. package/dist/build/index.js +44 -17
  47. package/dist/build/node/buildJob.d.ts +8 -2
  48. package/dist/build/node/buildJob.js +39 -52
  49. package/dist/build/node/cache.d.ts +4 -5
  50. package/dist/build/node/cache.js +18 -24
  51. package/dist/build/node/constants.js +5 -3
  52. package/dist/build/node/index.d.ts +4 -4
  53. package/dist/build/node/index.js +3 -1
  54. package/dist/build/node/meteor.d.ts +2 -2
  55. package/dist/build/node/meteor.js +10 -12
  56. package/dist/build/node/testJob.d.ts +3 -2
  57. package/dist/build/node/testJob.js +29 -19
  58. package/dist/build/node/yarn.d.ts +4 -3
  59. package/dist/build/node/yarn.js +11 -12
  60. package/dist/build/rails/build.d.ts +2 -2
  61. package/dist/build/rails/build.js +13 -6
  62. package/dist/build/rails/index.d.ts +2 -2
  63. package/dist/build/rails/index.js +3 -1
  64. package/dist/build/rails/test.d.ts +2 -2
  65. package/dist/build/rails/test.js +30 -11
  66. package/dist/build/sbom.d.ts +2 -2
  67. package/dist/build/sbom.js +13 -7
  68. package/dist/build/types.d.ts +160 -47
  69. package/dist/build/types.js +10 -2
  70. package/dist/catladder-gitlab.js +129 -49
  71. package/dist/config/__tests__/configruedEnvs.test.js +3 -1
  72. package/dist/config/__tests__/getAllEnvs.test.js +79 -0
  73. package/dist/config/__tests__/getAllEnvsInAllComponents.test.d.ts +1 -0
  74. package/dist/config/__tests__/getAllEnvsInAllComponents.test.js +73 -0
  75. package/dist/config/configruedEnvs.js +3 -1
  76. package/dist/config/index.js +13 -7
  77. package/dist/config/readConfig.d.ts +2 -2
  78. package/dist/config/readConfig.js +191 -40
  79. package/dist/constants.js +5 -3
  80. package/dist/context/createAllComponentsContext.d.ts +12 -0
  81. package/dist/{pipeline/commitInfo/getCommitInfo.js โ†’ context/createAllComponentsContext.js} +35 -19
  82. package/dist/context/createComponentContext.d.ts +11 -0
  83. package/dist/context/createComponentContext.js +262 -0
  84. package/dist/context/createWorkspaceContext.d.ts +16 -0
  85. package/dist/context/createWorkspaceContext.js +173 -0
  86. package/dist/context/getBuildInfoVariables.d.ts +6 -0
  87. package/dist/context/getBuildInfoVariables.js +55 -0
  88. package/dist/context/getEnvConfig.js +21 -4
  89. package/dist/context/getEnvType.js +3 -1
  90. package/dist/context/getEnvironment.d.ts +3 -3
  91. package/dist/context/getEnvironment.js +11 -12
  92. package/dist/context/getEnvironmentContext.d.ts +7 -3
  93. package/dist/context/getEnvironmentContext.js +21 -11
  94. package/dist/context/getEnvironmentVariables.d.ts +22 -5
  95. package/dist/context/getEnvironmentVariables.js +79 -53
  96. package/dist/context/getLabels.d.ts +2 -2
  97. package/dist/context/getLabels.js +9 -7
  98. package/dist/context/getReviewSlug.d.ts +4 -0
  99. package/dist/context/getReviewSlug.js +21 -0
  100. package/dist/context/index.d.ts +2 -4
  101. package/dist/context/index.js +15 -162
  102. package/dist/context/transformJobOnlyVars.d.ts +5 -2
  103. package/dist/context/transformJobOnlyVars.js +4 -2
  104. package/dist/context/utils/envVars.d.ts +1 -1
  105. package/dist/context/utils/envVars.js +5 -2
  106. package/dist/defaults/index.js +3 -1
  107. package/dist/deploy/base/deploy.d.ts +3 -3
  108. package/dist/deploy/base/deploy.js +37 -21
  109. package/dist/deploy/base/index.d.ts +3 -5
  110. package/dist/deploy/base/index.js +3 -1
  111. package/dist/deploy/base/rollback.d.ts +3 -3
  112. package/dist/deploy/base/rollback.js +13 -9
  113. package/dist/deploy/base/stop.d.ts +3 -3
  114. package/dist/deploy/base/stop.js +16 -11
  115. package/dist/deploy/base/types.d.ts +1 -1
  116. package/dist/deploy/base/types.js +3 -1
  117. package/dist/deploy/base/variables.js +4 -2
  118. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +8 -11
  119. package/dist/deploy/cloudRun/artifactsRegistry.js +15 -14
  120. package/dist/deploy/cloudRun/cleanup.d.ts +2 -2
  121. package/dist/deploy/cloudRun/cleanup.js +3 -1
  122. package/dist/deploy/cloudRun/cloudRunRevisions.d.ts +2 -2
  123. package/dist/deploy/cloudRun/cloudRunRevisions.js +7 -6
  124. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.d.ts +8 -6
  125. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +57 -106
  126. package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +3 -3
  127. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +79 -15
  128. package/dist/deploy/cloudRun/createJobs/common.d.ts +7 -7
  129. package/dist/deploy/cloudRun/createJobs/common.js +6 -3
  130. package/dist/deploy/cloudRun/createJobs/constants.d.ts +1 -0
  131. package/dist/deploy/cloudRun/createJobs/constants.js +7 -0
  132. package/dist/deploy/cloudRun/createJobs/execute/onDeploy.d.ts +3 -0
  133. package/dist/deploy/cloudRun/createJobs/execute/onDeploy.js +115 -0
  134. package/dist/deploy/cloudRun/createJobs/execute/schedules.d.ts +3 -0
  135. package/dist/deploy/cloudRun/createJobs/execute/schedules.js +173 -0
  136. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.d.ts +2 -2
  137. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +13 -5
  138. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.d.ts +2 -2
  139. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +7 -3
  140. package/dist/deploy/cloudRun/createJobs/healthCheck.d.ts +5 -0
  141. package/dist/deploy/cloudRun/createJobs/healthCheck.js +82 -0
  142. package/dist/deploy/cloudRun/createJobs/index.d.ts +2 -2
  143. package/dist/deploy/cloudRun/createJobs/index.js +26 -12
  144. package/dist/deploy/cloudRun/createJobs/volumes.d.ts +3 -0
  145. package/dist/deploy/cloudRun/createJobs/volumes.js +58 -0
  146. package/dist/deploy/cloudRun/index.d.ts +2 -2
  147. package/dist/deploy/cloudRun/index.js +25 -13
  148. package/dist/deploy/cloudRun/utils/cloudRunExecutionUrl.d.ts +10 -0
  149. package/dist/deploy/cloudRun/utils/cloudRunExecutionUrl.js +16 -0
  150. package/dist/deploy/cloudRun/utils/createArgsString.d.ts +2 -2
  151. package/dist/deploy/cloudRun/utils/createArgsString.js +3 -1
  152. package/dist/deploy/cloudRun/utils/database.d.ts +25 -4
  153. package/dist/deploy/cloudRun/utils/database.js +49 -15
  154. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.d.ts +2 -2
  155. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +3 -1
  156. package/dist/deploy/cloudRun/utils/getJobOrServiceArgs.d.ts +2 -0
  157. package/dist/deploy/cloudRun/utils/getJobOrServiceArgs.js +12 -0
  158. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +2 -2
  159. package/dist/deploy/cloudRun/utils/getServiceName.js +3 -1
  160. package/dist/deploy/cloudRun/utils/jobName.d.ts +6 -1
  161. package/dist/deploy/cloudRun/utils/jobName.js +18 -4
  162. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +3 -1
  163. package/dist/deploy/cloudSql/utils.d.ts +2 -1
  164. package/dist/deploy/cloudSql/utils.js +7 -2
  165. package/dist/deploy/custom/deployJob.d.ts +2 -2
  166. package/dist/deploy/custom/deployJob.js +10 -9
  167. package/dist/deploy/custom/index.d.ts +2 -2
  168. package/dist/deploy/custom/index.js +3 -1
  169. package/dist/deploy/dockerTag/deployJob.d.ts +2 -2
  170. package/dist/deploy/dockerTag/deployJob.js +6 -6
  171. package/dist/deploy/dockerTag/index.d.ts +2 -2
  172. package/dist/deploy/dockerTag/index.js +3 -1
  173. package/dist/deploy/index.d.ts +10 -9
  174. package/dist/deploy/index.js +13 -7
  175. package/dist/deploy/kubernetes/additionalSecretKeys.d.ts +3 -1
  176. package/dist/deploy/kubernetes/additionalSecretKeys.js +3 -1
  177. package/dist/deploy/kubernetes/cloudSql/index.d.ts +6 -5
  178. package/dist/deploy/kubernetes/cloudSql/index.js +14 -21
  179. package/dist/deploy/kubernetes/deployJob.d.ts +2 -2
  180. package/dist/deploy/kubernetes/deployJob.js +23 -22
  181. package/dist/deploy/kubernetes/index.d.ts +2 -2
  182. package/dist/deploy/kubernetes/index.js +52 -15
  183. package/dist/deploy/kubernetes/kubeEnv.d.ts +5 -4
  184. package/dist/deploy/kubernetes/kubeEnv.js +9 -5
  185. package/dist/deploy/kubernetes/kubeValues.d.ts +5 -6
  186. package/dist/deploy/kubernetes/kubeValues.js +17 -19
  187. package/dist/deploy/kubernetes/mongodb.d.ts +2 -2
  188. package/dist/deploy/kubernetes/mongodb.js +14 -12
  189. package/dist/deploy/sbom.d.ts +4 -4
  190. package/dist/deploy/sbom.js +8 -4
  191. package/dist/deploy/types/base.d.ts +5 -5
  192. package/dist/deploy/types/base.js +3 -1
  193. package/dist/deploy/types/custom.d.ts +3 -7
  194. package/dist/deploy/types/custom.js +3 -1
  195. package/dist/deploy/types/dockerTag.d.ts +1 -1
  196. package/dist/deploy/types/dockerTag.js +3 -1
  197. package/dist/deploy/types/googleCloudRun.d.ts +291 -16
  198. package/dist/deploy/types/googleCloudRun.js +28 -1
  199. package/dist/deploy/types/index.d.ts +8 -7
  200. package/dist/deploy/types/index.js +21 -10
  201. package/dist/deploy/types/kubernetes.d.ts +21 -54
  202. package/dist/deploy/types/kubernetes.js +3 -1
  203. package/dist/deploy/utils.d.ts +2 -2
  204. package/dist/deploy/utils.js +5 -2
  205. package/dist/globalScriptFunctions/index.d.ts +14 -0
  206. package/dist/globalScriptFunctions/index.js +37 -0
  207. package/dist/index.d.ts +5 -2
  208. package/dist/index.js +18 -9
  209. package/dist/packageInfos.d.ts +4 -0
  210. package/dist/packageInfos.js +20 -0
  211. package/dist/pipeline/__tests__/getPipelineStages.test.d.ts +1 -0
  212. package/dist/pipeline/__tests__/getPipelineStages.test.js +73 -0
  213. package/dist/pipeline/createAllJobs.d.ts +16 -6
  214. package/dist/pipeline/createAllJobs.js +99 -27
  215. package/dist/pipeline/createJobsForComponent.d.ts +2 -2
  216. package/dist/pipeline/createJobsForComponent.js +9 -149
  217. package/dist/pipeline/createJobsForWorkspace.d.ts +3 -0
  218. package/dist/pipeline/createJobsForWorkspace.js +12 -0
  219. package/dist/pipeline/createMainPipeline.d.ts +3 -0
  220. package/dist/pipeline/createMainPipeline.js +283 -0
  221. package/dist/pipeline/generatePipelineFiles.d.ts +7 -0
  222. package/dist/pipeline/generatePipelineFiles.js +305 -0
  223. package/dist/pipeline/getPipelineStages.d.ts +7 -0
  224. package/dist/pipeline/getPipelineStages.js +56 -0
  225. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +11 -14
  226. package/dist/pipeline/gitlab/createGitlabJobs.js +264 -74
  227. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +9 -0
  228. package/dist/pipeline/gitlab/createGitlabPipeline.js +77 -0
  229. package/dist/pipeline/gitlab/gitlabReleaseJobs.d.ts +33 -0
  230. package/dist/pipeline/gitlab/gitlabReleaseJobs.js +25 -0
  231. package/dist/pipeline/gitlab/sortGitLabJobDefProps.d.ts +7 -0
  232. package/dist/pipeline/gitlab/sortGitLabJobDefProps.js +27 -0
  233. package/dist/pipeline/index.d.ts +3 -2
  234. package/dist/pipeline/index.js +16 -9
  235. package/dist/pipeline/packageManager.d.ts +4 -2
  236. package/dist/pipeline/packageManager.js +56 -19
  237. package/dist/pipeline/yarn/yarnUtils.d.ts +2 -2
  238. package/dist/pipeline/yarn/yarnUtils.js +18 -15
  239. package/dist/rules/index.d.ts +10 -3
  240. package/dist/rules/index.js +35 -17
  241. package/dist/runner/index.d.ts +1 -1
  242. package/dist/runner/index.js +3 -1
  243. package/dist/tsconfig.tsbuildinfo +1 -1
  244. package/dist/types/config.d.ts +54 -36
  245. package/dist/types/config.js +5 -2
  246. package/dist/types/context.d.ts +123 -38
  247. package/dist/types/context.js +12 -1
  248. package/dist/types/environmentContext.d.ts +15 -12
  249. package/dist/types/environmentContext.js +3 -1
  250. package/dist/types/gitlab-ci-yml.d.ts +30 -30
  251. package/dist/types/gitlab-ci-yml.js +3 -2
  252. package/dist/types/gitlab-types.d.ts +8 -8
  253. package/dist/types/gitlab-types.js +3 -1
  254. package/dist/types/index.d.ts +3 -1
  255. package/dist/types/index.js +16 -8
  256. package/dist/types/jobDefinition.d.ts +11 -0
  257. package/dist/types/jobDefinition.js +5 -0
  258. package/dist/types/jobs.d.ts +30 -15
  259. package/dist/types/jobs.js +3 -1
  260. package/dist/types/pipeline.d.ts +3 -3
  261. package/dist/types/pipeline.js +3 -1
  262. package/dist/types/utils.d.ts +1 -1
  263. package/dist/types/utils.js +3 -1
  264. package/dist/utils/gitlab.js +7 -2
  265. package/dist/utils/index.d.ts +2 -1
  266. package/dist/utils/index.js +10 -3
  267. package/dist/utils/jsonParse.d.ts +1 -0
  268. package/dist/utils/jsonParse.js +14 -0
  269. package/dist/utils/removeUndefined.d.ts +1 -0
  270. package/dist/utils/removeUndefined.js +36 -0
  271. package/dist/utils/writeFiles.d.ts +11 -0
  272. package/dist/{pipeline/commitInfo/getBuildId.js โ†’ utils/writeFiles.js} +39 -22
  273. package/dist/variables/VariableValue.d.ts +3 -0
  274. package/dist/variables/VariableValue.js +5 -0
  275. package/dist/variables/VariableValueContainingReferences.d.ts +24 -0
  276. package/dist/variables/VariableValueContainingReferences.js +97 -0
  277. package/dist/variables/__tests__/resolveAllReferences.test.d.ts +1 -0
  278. package/dist/variables/__tests__/resolveAllReferences.test.js +218 -0
  279. package/dist/variables/__tests__/resolveAllReferencesOnce.test.d.ts +1 -0
  280. package/dist/variables/__tests__/resolveAllReferencesOnce.test.js +171 -0
  281. package/dist/variables/__tests__/resolveReferencesOnce.test.d.ts +1 -0
  282. package/dist/variables/__tests__/resolveReferencesOnce.test.js +199 -0
  283. package/dist/variables/__tests__/variableValue.test.d.ts +1 -0
  284. package/dist/variables/__tests__/variableValue.test.js +36 -0
  285. package/dist/variables/resolveAllReferences.d.ts +3 -0
  286. package/dist/{pipeline/createChildPipeline.js โ†’ variables/resolveAllReferences.js} +44 -48
  287. package/dist/variables/resolveAllReferencesOnce.d.ts +5 -0
  288. package/dist/variables/resolveAllReferencesOnce.js +191 -0
  289. package/dist/variables/resolveReferencesOnce.d.ts +8 -0
  290. package/dist/variables/resolveReferencesOnce.js +22 -0
  291. package/examples/.test-gen-ignore +1 -0
  292. package/examples/__snapshots__/cloud-run-health-check-defaults.test.ts.snap +1394 -0
  293. package/examples/__snapshots__/cloud-run-health-check-only-startup.test.ts.snap +1394 -0
  294. package/examples/__snapshots__/cloud-run-health-check.test.ts.snap +1394 -0
  295. package/examples/__snapshots__/cloud-run-http2.test.ts.snap +1394 -0
  296. package/examples/__snapshots__/cloud-run-llama.test.ts.snap +624 -0
  297. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1394 -0
  298. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1394 -0
  299. package/examples/__snapshots__/cloud-run-nextjs.test.ts.snap +1410 -0
  300. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1394 -0
  301. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1502 -0
  302. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1394 -0
  303. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1412 -0
  304. package/examples/__snapshots__/cloud-run-service-custom-vpc-connector.test.ts.snap +1462 -0
  305. package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +1462 -0
  306. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1394 -0
  307. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1394 -0
  308. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1466 -0
  309. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1284 -0
  310. package/examples/__snapshots__/cloud-run-with-gpu.test.ts.snap +1394 -0
  311. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1394 -0
  312. package/examples/__snapshots__/cloud-run-with-sql-legacy-jobs.test.ts.snap +1709 -0
  313. package/examples/__snapshots__/cloud-run-with-sql-multiple-dbs.test.ts.snap +4515 -0
  314. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2950 -0
  315. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +1772 -0
  316. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1402 -0
  317. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1261 -0
  318. package/examples/__snapshots__/custom-build-job.test.ts.snap +1156 -0
  319. package/examples/__snapshots__/custom-deploy.test.ts.snap +1059 -0
  320. package/examples/__snapshots__/custom-envs.test.ts.snap +786 -0
  321. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1152 -0
  322. package/examples/__snapshots__/custom-verify-job.test.ts.snap +1606 -0
  323. package/examples/__snapshots__/git-submodule.test.ts.snap +1395 -0
  324. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1713 -0
  325. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1733 -0
  326. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3265 -0
  327. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1837 -0
  328. package/examples/__snapshots__/local-dot-env.test.ts.snap +1318 -0
  329. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1790 -0
  330. package/examples/__snapshots__/multiline-var.test.ts.snap +5585 -0
  331. package/examples/__snapshots__/native-app.test.ts.snap +2210 -0
  332. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1394 -0
  333. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1402 -0
  334. package/examples/__snapshots__/override-secrets.test.ts.snap +1419 -0
  335. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +1464 -0
  336. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1444 -0
  337. package/examples/__snapshots__/referencing-other-vars.test.ts.snap +4645 -0
  338. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1424 -0
  339. package/examples/__snapshots__/workspace-api-www-turbo-cache.test.ts.snap +2298 -0
  340. package/examples/__snapshots__/workspace-api-www.test.ts.snap +2290 -0
  341. package/examples/__utils__/helpers.ts +9 -12
  342. package/examples/cloud-run-health-check-defaults.test.ts +11 -0
  343. package/examples/cloud-run-health-check-defaults.ts +28 -0
  344. package/examples/cloud-run-health-check-only-startup.test.ts +11 -0
  345. package/examples/cloud-run-health-check-only-startup.ts +38 -0
  346. package/examples/cloud-run-health-check.test.ts +11 -0
  347. package/examples/cloud-run-health-check.ts +45 -0
  348. package/examples/cloud-run-http2.test.ts +11 -0
  349. package/examples/cloud-run-http2.ts +29 -0
  350. package/examples/cloud-run-llama.test.ts +11 -0
  351. package/examples/cloud-run-llama.ts +40 -0
  352. package/examples/cloud-run-memory-limit.test.ts +11 -0
  353. package/examples/cloud-run-memory-limit.ts +12 -7
  354. package/examples/cloud-run-meteor-with-worker.test.ts +11 -0
  355. package/examples/cloud-run-meteor-with-worker.ts +13 -7
  356. package/examples/cloud-run-nextjs.test.ts +11 -0
  357. package/examples/cloud-run-nextjs.ts +28 -0
  358. package/examples/cloud-run-no-cpu-throttling.test.ts +11 -0
  359. package/examples/cloud-run-no-cpu-throttling.ts +8 -6
  360. package/examples/cloud-run-no-service.test.ts +11 -0
  361. package/examples/cloud-run-no-service.ts +39 -0
  362. package/examples/cloud-run-non-public.test.ts +11 -0
  363. package/examples/cloud-run-non-public.ts +7 -6
  364. package/examples/cloud-run-post-stop-job.test.ts +11 -0
  365. package/examples/cloud-run-post-stop-job.ts +15 -6
  366. package/examples/cloud-run-service-custom-vpc-connector.test.ts +11 -0
  367. package/examples/cloud-run-service-custom-vpc-connector.ts +37 -0
  368. package/examples/cloud-run-service-custom-vpc.test.ts +11 -0
  369. package/examples/cloud-run-service-custom-vpc.ts +39 -0
  370. package/examples/cloud-run-service-gen2.test.ts +11 -0
  371. package/examples/cloud-run-service-gen2.ts +8 -6
  372. package/examples/cloud-run-service-increase-timout.test.ts +11 -0
  373. package/examples/cloud-run-service-increase-timout.ts +29 -0
  374. package/examples/cloud-run-service-with-volumes.test.ts +11 -0
  375. package/examples/cloud-run-service-with-volumes.ts +64 -0
  376. package/examples/cloud-run-storybook.test.ts +11 -0
  377. package/examples/cloud-run-storybook.ts +33 -0
  378. package/examples/cloud-run-with-gpu.test.ts +11 -0
  379. package/examples/cloud-run-with-gpu.ts +30 -0
  380. package/examples/cloud-run-with-ngnix.test.ts +11 -0
  381. package/examples/cloud-run-with-ngnix.ts +29 -0
  382. package/examples/cloud-run-with-sql-legacy-jobs.test.ts +11 -0
  383. package/examples/cloud-run-with-sql-legacy-jobs.ts +49 -0
  384. package/examples/cloud-run-with-sql-multiple-dbs.test.ts +11 -0
  385. package/examples/cloud-run-with-sql-multiple-dbs.ts +87 -0
  386. package/examples/cloud-run-with-sql-reuse-db.test.ts +11 -0
  387. package/examples/cloud-run-with-sql-reuse-db.ts +7 -6
  388. package/examples/cloud-run-with-sql.test.ts +11 -0
  389. package/examples/cloud-run-with-sql.ts +45 -24
  390. package/examples/cloud-run-with-worker.test.ts +11 -0
  391. package/examples/cloud-run-with-worker.ts +8 -6
  392. package/examples/custom-build-job-with-tests.test.ts +11 -0
  393. package/examples/custom-build-job-with-tests.ts +7 -6
  394. package/examples/custom-build-job.test.ts +11 -0
  395. package/examples/custom-build-job.ts +7 -6
  396. package/examples/custom-deploy.test.ts +11 -0
  397. package/examples/custom-deploy.ts +22 -14
  398. package/examples/custom-envs.test.ts +11 -0
  399. package/examples/custom-envs.ts +7 -6
  400. package/examples/custom-sbom-java.test.ts +11 -0
  401. package/examples/custom-sbom-java.ts +12 -8
  402. package/examples/custom-verify-job.test.ts +11 -0
  403. package/examples/custom-verify-job.ts +65 -0
  404. package/examples/git-submodule.test.ts +11 -0
  405. package/examples/git-submodule.ts +30 -0
  406. package/examples/kubernetes-application-customization.test.ts +11 -0
  407. package/examples/kubernetes-application-customization.ts +9 -6
  408. package/examples/kubernetes-with-cloud-sql.test.ts +11 -0
  409. package/examples/kubernetes-with-cloud-sql.ts +9 -6
  410. package/examples/kubernetes-with-jobs.test.ts +11 -0
  411. package/examples/kubernetes-with-jobs.ts +9 -6
  412. package/examples/kubernetes-with-mongodb.test.ts +11 -0
  413. package/examples/kubernetes-with-mongodb.ts +9 -6
  414. package/examples/local-dot-env.test.ts +11 -0
  415. package/examples/local-dot-env.ts +27 -0
  416. package/examples/meteor-kubernetes.test.ts +11 -0
  417. package/examples/meteor-kubernetes.ts +6 -7
  418. package/examples/multiline-var.test.ts +11 -0
  419. package/examples/multiline-var.ts +107 -0
  420. package/examples/native-app.test.ts +11 -0
  421. package/examples/native-app.ts +24 -19
  422. package/examples/node-build-with-custom-image.test.ts +11 -0
  423. package/examples/node-build-with-custom-image.ts +7 -6
  424. package/examples/node-build-with-docker-additions.test.ts +11 -0
  425. package/examples/node-build-with-docker-additions.ts +7 -6
  426. package/examples/override-secrets.test.ts +11 -0
  427. package/examples/override-secrets.ts +44 -0
  428. package/examples/rails-k8s-with-worker-dockerfile.test.ts +33 -0
  429. package/examples/rails-k8s-with-worker.test.ts +11 -0
  430. package/examples/rails-k8s-with-worker.ts +13 -13
  431. package/examples/referencing-other-vars.test.ts +11 -0
  432. package/examples/referencing-other-vars.ts +83 -0
  433. package/examples/wait-for-other-deploy.test.ts +11 -0
  434. package/examples/wait-for-other-deploy.ts +6 -5
  435. package/examples/workspace-api-www-turbo-cache.test.ts +11 -0
  436. package/examples/workspace-api-www-turbo-cache.ts +52 -0
  437. package/examples/workspace-api-www.test.ts +11 -0
  438. package/examples/workspace-api-www.ts +46 -0
  439. package/package.json +23 -26
  440. package/scripts/generate-examples-test.ts +84 -0
  441. package/scripts/generate-gitlab-ci-types.ts +2 -2
  442. package/scripts/tsconfig.json +7 -0
  443. package/src/bash/BashExpression.ts +78 -0
  444. package/src/bash/bashEscape.ts +164 -0
  445. package/src/bash/bashExpressionPerPipelineType.ts +16 -0
  446. package/src/bash/bashYaml.ts +80 -0
  447. package/src/bash/getInjectVarsScript.ts +21 -0
  448. package/src/bash/index.ts +2 -0
  449. package/src/build/artifacts/createBuildJobArtifact.ts +63 -0
  450. package/src/build/base/__tests__/createArtifactsConfig.test.ts +3 -3
  451. package/src/build/base/constants.ts +1 -1
  452. package/src/build/base/createAppBuildJob.ts +40 -24
  453. package/src/build/base/createArtifactsConfig.ts +2 -2
  454. package/src/build/base/createBuildJobDefinition.ts +37 -0
  455. package/src/build/base/index.ts +40 -8
  456. package/src/build/base/writeBuildInfo.ts +3 -3
  457. package/src/build/base/writeDotEnv.ts +25 -6
  458. package/src/build/cache/createJobCache.ts +83 -0
  459. package/src/build/cache/getAllCacheConfigsFromConfig.ts +29 -0
  460. package/src/build/cache/transformLegacyJobCache.ts +14 -0
  461. package/src/build/custom/__tests__/testJob.test.ts +10 -13
  462. package/src/build/custom/buildJob.ts +11 -37
  463. package/src/build/custom/index.ts +4 -2
  464. package/src/build/custom/testJob.ts +24 -21
  465. package/src/build/docker.ts +110 -49
  466. package/src/build/index.ts +45 -11
  467. package/src/build/node/buildJob.ts +68 -69
  468. package/src/build/node/cache.ts +28 -34
  469. package/src/build/node/constants.ts +2 -2
  470. package/src/build/node/index.ts +13 -4
  471. package/src/build/node/meteor.ts +19 -24
  472. package/src/build/node/testJob.ts +44 -25
  473. package/src/build/node/yarn.ts +22 -15
  474. package/src/build/rails/build.ts +15 -9
  475. package/src/build/rails/index.ts +4 -2
  476. package/src/build/rails/test.ts +41 -12
  477. package/src/build/sbom.ts +21 -11
  478. package/src/build/types.ts +198 -47
  479. package/src/catladder-gitlab.ts +7 -56
  480. package/src/config/__tests__/__snapshots__/getAllEnvs.test.ts.snap +31 -0
  481. package/src/config/__tests__/__snapshots__/getAllEnvsInAllComponents.test.ts.snap +15 -0
  482. package/src/config/__tests__/getAllEnvs.test.ts +71 -0
  483. package/src/config/__tests__/getAllEnvsInAllComponents.test.ts +63 -0
  484. package/src/config/configruedEnvs.ts +6 -6
  485. package/src/config/readConfig.ts +15 -22
  486. package/src/constants.ts +5 -2
  487. package/src/context/createAllComponentsContext.ts +31 -0
  488. package/src/context/createComponentContext.ts +148 -0
  489. package/src/context/createWorkspaceContext.ts +56 -0
  490. package/src/context/getBuildInfoVariables.ts +36 -0
  491. package/src/context/getEnvConfig.ts +25 -5
  492. package/src/context/getEnvType.ts +1 -1
  493. package/src/context/getEnvironment.ts +8 -24
  494. package/src/context/getEnvironmentContext.ts +25 -29
  495. package/src/context/getEnvironmentVariables.ts +101 -83
  496. package/src/context/getLabels.ts +8 -5
  497. package/src/context/getReviewSlug.ts +27 -0
  498. package/src/context/index.ts +1 -65
  499. package/src/context/transformJobOnlyVars.ts +6 -3
  500. package/src/context/utils/envVars.ts +5 -4
  501. package/src/deploy/base/deploy.ts +63 -47
  502. package/src/deploy/base/index.ts +11 -6
  503. package/src/deploy/base/rollback.ts +11 -16
  504. package/src/deploy/base/stop.ts +11 -15
  505. package/src/deploy/base/variables.ts +1 -1
  506. package/src/deploy/cloudRun/artifactsRegistry.ts +32 -28
  507. package/src/deploy/cloudRun/cleanup.ts +5 -5
  508. package/src/deploy/cloudRun/cloudRunRevisions.ts +9 -11
  509. package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +71 -153
  510. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +65 -26
  511. package/src/deploy/cloudRun/createJobs/common.ts +7 -7
  512. package/src/deploy/cloudRun/createJobs/constants.ts +1 -0
  513. package/src/deploy/cloudRun/createJobs/execute/onDeploy.ts +102 -0
  514. package/src/deploy/cloudRun/createJobs/execute/schedules.ts +186 -0
  515. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +27 -16
  516. package/src/deploy/cloudRun/createJobs/getCloudRunStopScripts.ts +9 -11
  517. package/src/deploy/cloudRun/createJobs/healthCheck.ts +64 -0
  518. package/src/deploy/cloudRun/createJobs/index.ts +20 -14
  519. package/src/deploy/cloudRun/createJobs/volumes.ts +23 -0
  520. package/src/deploy/cloudRun/index.ts +94 -60
  521. package/src/deploy/cloudRun/utils/cloudRunExecutionUrl.ts +20 -0
  522. package/src/deploy/cloudRun/utils/createArgsString.ts +6 -2
  523. package/src/deploy/cloudRun/utils/database.ts +116 -9
  524. package/src/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.ts +5 -3
  525. package/src/deploy/cloudRun/utils/getJobOrServiceArgs.ts +18 -0
  526. package/src/deploy/cloudRun/utils/getServiceName.ts +2 -2
  527. package/src/deploy/cloudRun/utils/jobName.ts +22 -2
  528. package/src/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.ts +1 -1
  529. package/src/deploy/cloudSql/utils.ts +13 -10
  530. package/src/deploy/custom/deployJob.ts +15 -10
  531. package/src/deploy/custom/index.ts +2 -2
  532. package/src/deploy/dockerTag/deployJob.ts +6 -7
  533. package/src/deploy/dockerTag/index.ts +8 -7
  534. package/src/deploy/index.ts +15 -12
  535. package/src/deploy/kubernetes/additionalSecretKeys.ts +3 -1
  536. package/src/deploy/kubernetes/cloudSql/index.ts +16 -25
  537. package/src/deploy/kubernetes/deployJob.ts +30 -21
  538. package/src/deploy/kubernetes/index.ts +43 -35
  539. package/src/deploy/kubernetes/kubeEnv.ts +12 -10
  540. package/src/deploy/kubernetes/kubeValues.ts +25 -20
  541. package/src/deploy/kubernetes/mongodb.ts +15 -15
  542. package/src/deploy/sbom.ts +20 -10
  543. package/src/deploy/types/base.ts +3 -3
  544. package/src/deploy/types/custom.ts +3 -7
  545. package/src/deploy/types/googleCloudRun.ts +359 -2
  546. package/src/deploy/types/index.ts +9 -2
  547. package/src/deploy/types/kubernetes.ts +1 -36
  548. package/src/deploy/utils.ts +5 -5
  549. package/src/globalScriptFunctions/index.ts +30 -0
  550. package/src/index.ts +4 -1
  551. package/src/packageInfos.ts +14 -0
  552. package/src/pipeline/__tests__/__snapshots__/getPipelineStages.test.ts.snap +69 -0
  553. package/src/pipeline/__tests__/getPipelineStages.test.ts +63 -0
  554. package/src/pipeline/createAllJobs.ts +67 -33
  555. package/src/pipeline/createJobsForComponent.ts +17 -37
  556. package/src/pipeline/createJobsForWorkspace.ts +12 -0
  557. package/src/pipeline/createMainPipeline.ts +118 -0
  558. package/src/pipeline/generatePipelineFiles.ts +100 -0
  559. package/src/pipeline/getPipelineStages.ts +23 -0
  560. package/src/pipeline/gitlab/createGitlabJobs.ts +398 -108
  561. package/src/pipeline/gitlab/createGitlabPipeline.ts +35 -0
  562. package/src/pipeline/gitlab/gitlabReleaseJobs.ts +23 -0
  563. package/src/pipeline/gitlab/sortGitLabJobDefProps.ts +59 -0
  564. package/src/pipeline/index.ts +2 -1
  565. package/src/pipeline/packageManager.ts +42 -18
  566. package/src/pipeline/yarn/yarnUtils.ts +15 -12
  567. package/src/rules/index.ts +41 -18
  568. package/src/runner/index.ts +0 -1
  569. package/src/types/config.ts +62 -23
  570. package/src/types/context.ts +167 -36
  571. package/src/types/environmentContext.ts +18 -13
  572. package/src/types/gitlab-ci-yml.ts +0 -1
  573. package/src/types/gitlab-types.ts +10 -7
  574. package/src/types/index.ts +2 -0
  575. package/src/types/jobDefinition.ts +34 -0
  576. package/src/types/jobs.ts +31 -15
  577. package/src/types/utils.ts +4 -4
  578. package/src/utils/gitlab.ts +20 -3
  579. package/src/utils/index.ts +6 -3
  580. package/src/utils/jsonParse.ts +7 -0
  581. package/src/utils/removeUndefined.ts +4 -0
  582. package/src/utils/writeFiles.ts +52 -0
  583. package/src/variables/VariableValue.ts +6 -0
  584. package/src/variables/VariableValueContainingReferences.ts +89 -0
  585. package/src/variables/__tests__/resolveAllReferences.test.ts +110 -0
  586. package/src/variables/__tests__/resolveAllReferencesOnce.test.ts +64 -0
  587. package/src/variables/__tests__/resolveReferencesOnce.test.ts +117 -0
  588. package/src/variables/__tests__/variableValue.test.ts +73 -0
  589. package/src/variables/resolveAllReferences.ts +46 -0
  590. package/src/variables/resolveAllReferencesOnce.ts +44 -0
  591. package/src/variables/resolveReferencesOnce.ts +29 -0
  592. package/bin/catladder-gitlab-dev.js +0 -3
  593. package/bin/catladder-gitlab.js +0 -3
  594. package/dist/bundles/catladder-gitlab/index.js +0 -34559
  595. package/dist/context/__tests__/resolveReferences.test.js +0 -336
  596. package/dist/context/resolveReferences.d.ts +0 -4
  597. package/dist/context/resolveReferences.js +0 -254
  598. package/dist/deploy/cloudRun/createJobs/variables.d.ts +0 -5
  599. package/dist/deploy/cloudRun/createJobs/variables.js +0 -19
  600. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +0 -84
  601. package/dist/deploy/kubernetes/processSecretsAsFiles.js +0 -31
  602. package/dist/pipeline/commitInfo/getBuildId.d.ts +0 -6
  603. package/dist/pipeline/commitInfo/getCommitInfo.d.ts +0 -2
  604. package/dist/pipeline/createChildPipeline.d.ts +0 -3
  605. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +0 -1839
  606. package/examples/__snapshots__/cloud-run-meteor-with-worker.ts.snap +0 -1807
  607. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +0 -1839
  608. package/examples/__snapshots__/cloud-run-non-public.ts.snap +0 -1839
  609. package/examples/__snapshots__/cloud-run-post-stop-job.ts.snap +0 -1849
  610. package/examples/__snapshots__/cloud-run-service-gen2.ts.snap +0 -1839
  611. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +0 -3647
  612. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +0 -3658
  613. package/examples/__snapshots__/cloud-run-with-worker.ts.snap +0 -1847
  614. package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +0 -1663
  615. package/examples/__snapshots__/custom-build-job.ts.snap +0 -1375
  616. package/examples/__snapshots__/custom-deploy.ts.snap +0 -1625
  617. package/examples/__snapshots__/custom-envs.ts.snap +0 -1127
  618. package/examples/__snapshots__/custom-sbom-java.ts.snap +0 -1383
  619. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +0 -2573
  620. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +0 -2533
  621. package/examples/__snapshots__/kubernetes-with-cloud-sql.ts.snap +0 -2545
  622. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +0 -4660
  623. package/examples/__snapshots__/kubernetes-with-mongodb.ts.snap +0 -2737
  624. package/examples/__snapshots__/meteor-kubernetes.ts.snap +0 -2658
  625. package/examples/__snapshots__/native-app.ts.snap +0 -3007
  626. package/examples/__snapshots__/node-build-with-custom-image.ts.snap +0 -1839
  627. package/examples/__snapshots__/node-build-with-docker-additions.ts.snap +0 -1839
  628. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +0 -4291
  629. package/examples/__snapshots__/wait-for-other-deploy.ts.snap +0 -2049
  630. package/examples/kubernetes-with-cloud-sql-legacy.ts +0 -33
  631. package/scripts/bundle +0 -2
  632. package/src/context/__tests__/resolveReferences.test.ts +0 -143
  633. package/src/context/resolveReferences.ts +0 -70
  634. package/src/deploy/cloudRun/createJobs/variables.ts +0 -21
  635. package/src/deploy/kubernetes/processSecretsAsFiles.ts +0 -34
  636. package/src/pipeline/commitInfo/getBuildId.ts +0 -17
  637. package/src/pipeline/commitInfo/getCommitInfo.ts +0 -15
  638. package/src/pipeline/createChildPipeline.ts +0 -46
  639. /package/dist/{context/__tests__/resolveReferences.test.d.ts โ†’ config/__tests__/getAllEnvs.test.d.ts} +0 -0
@@ -0,0 +1,1837 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for kubernetes-with-mongodb 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
+ before_script:
49
+ - |-
50
+ function escapeForDotEnv () {
51
+ input="\${1:-$(cat)}"
52
+ input="\${input//$'\\n'/\\\\n}"
53
+ if [[ "$input" == *\\\\n* ]]; then
54
+ if [[ "$input" == *\\"* && "$input" == *\\'* && "$input" == *\\\`* ]]; then
55
+ printf "\\"%s\\"\\n" "$input"
56
+ elif [[ "$input" == *\\"* && "$input" == *\\'* ]]; then
57
+ printf "\`%s\`\\n" "$input"
58
+ elif [[ "$input" == *\\"* ]]; then
59
+ printf "'%s'\\n" "$input"
60
+ else
61
+ printf "\\"%s\\"\\n" "$input"
62
+ fi
63
+ else
64
+ printf "%s\\n" "$input"
65
+ fi
66
+ }
67
+ - |-
68
+ function collapseable_section_start () {
69
+ local section_title="\${1}"
70
+ local section_description="\${2:-$section_title}"
71
+ echo -e "section_start:\`date +%s\`:\${section_title}[collapsed=true]\\r\\e[0K\${section_description}"
72
+ }
73
+ - |-
74
+ function collapseable_section_end () {
75
+ local section_title="\${1}"
76
+ echo -e "section_end:\`date +%s\`:\${section_title}\\r\\e[0K"
77
+ }
78
+ api ๐Ÿ›ก audit:
79
+ stage: test
80
+ image: path/to/docker/jobs-default:the-version
81
+ variables:
82
+ KUBERNETES_CPU_REQUEST: '0.45'
83
+ KUBERNETES_MEMORY_REQUEST: 1Gi
84
+ KUBERNETES_MEMORY_LIMIT: 4Gi
85
+ script:
86
+ - collapseable_section_start "injectvars" "Injecting variables"
87
+ - export APP_PATH="api"
88
+ - collapseable_section_end "injectvars"
89
+ - cd api
90
+ - yarn npm audit --environment production
91
+ rules:
92
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
93
+ - if: $CI_MERGE_REQUEST_ID
94
+ needs: []
95
+ retry: &a1
96
+ max: 2
97
+ when:
98
+ - runner_system_failure
99
+ - stuck_or_timeout_failure
100
+ interruptible: true
101
+ allow_failure: true
102
+ api ๐Ÿ‘ฎ lint:
103
+ stage: test
104
+ image: path/to/docker/jobs-default:the-version
105
+ variables:
106
+ KUBERNETES_CPU_REQUEST: '0.45'
107
+ KUBERNETES_MEMORY_REQUEST: 1Gi
108
+ KUBERNETES_MEMORY_LIMIT: 4Gi
109
+ script:
110
+ - collapseable_section_start "injectvars" "Injecting variables"
111
+ - export APP_PATH="api"
112
+ - collapseable_section_end "injectvars"
113
+ - collapseable_section_start "nodeinstall" "Ensure node version"
114
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
115
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
116
+ - collapseable_section_end "nodeinstall"
117
+ - cd api
118
+ - collapseable_section_start "nodeinstall" "Ensure node version"
119
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
120
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
121
+ - collapseable_section_end "nodeinstall"
122
+ - collapseable_section_start "yarninstall" "Yarn install"
123
+ - yarn install --immutable
124
+ - collapseable_section_end "yarninstall"
125
+ - yarn lint
126
+ cache:
127
+ - key: api-yarn
128
+ policy: pull-push
129
+ paths:
130
+ - api/.yarn
131
+ - key: api-node-modules
132
+ policy: pull-push
133
+ paths:
134
+ - api/node_modules
135
+ rules:
136
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
137
+ - if: $CI_MERGE_REQUEST_ID
138
+ needs: []
139
+ retry: *a1
140
+ interruptible: true
141
+ api ๐Ÿงช test:
142
+ stage: test
143
+ image: path/to/docker/jobs-testing-chrome:the-version
144
+ variables:
145
+ KUBERNETES_CPU_REQUEST: '0.45'
146
+ KUBERNETES_MEMORY_REQUEST: 1Gi
147
+ KUBERNETES_MEMORY_LIMIT: 4Gi
148
+ script:
149
+ - collapseable_section_start "injectvars" "Injecting variables"
150
+ - export APP_PATH="api"
151
+ - collapseable_section_end "injectvars"
152
+ - collapseable_section_start "nodeinstall" "Ensure node version"
153
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
154
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
155
+ - collapseable_section_end "nodeinstall"
156
+ - cd api
157
+ - collapseable_section_start "nodeinstall" "Ensure node version"
158
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
159
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
160
+ - collapseable_section_end "nodeinstall"
161
+ - collapseable_section_start "yarninstall" "Yarn install"
162
+ - yarn install --immutable
163
+ - collapseable_section_end "yarninstall"
164
+ - yarn test
165
+ cache:
166
+ - key: api-yarn
167
+ policy: pull-push
168
+ paths:
169
+ - api/.yarn
170
+ - key: api-node-modules
171
+ policy: pull-push
172
+ paths:
173
+ - api/node_modules
174
+ rules:
175
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
176
+ - if: $CI_MERGE_REQUEST_ID
177
+ needs: []
178
+ retry: *a1
179
+ interruptible: true
180
+ 'api ๐Ÿ”จ app | dev ':
181
+ stage: build
182
+ image: path/to/docker/jobs-default:the-version
183
+ variables:
184
+ KUBERNETES_CPU_REQUEST: '0.45'
185
+ KUBERNETES_MEMORY_REQUEST: 1Gi
186
+ KUBERNETES_MEMORY_LIMIT: 4Gi
187
+ script:
188
+ - collapseable_section_start "injectvars" "Injecting variables"
189
+ - export ENV_SHORT="dev"
190
+ - export APP_DIR="api"
191
+ - export ENV_TYPE="dev"
192
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
193
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
194
+ - 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")"
195
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
196
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
197
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
198
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
199
+ - export KUBE_NAMESPACE="pan-test-app-dev"
200
+ - export KUBE_APP_NAME="api"
201
+ - export KUBE_APP_NAME_PREFIX=""
202
+ - export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"
203
+ - export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"
204
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
205
+ - collapseable_section_end "injectvars"
206
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
207
+ - collapseable_section_start "nodeinstall" "Ensure node version"
208
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
209
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
210
+ - collapseable_section_end "nodeinstall"
211
+ - cd api
212
+ - collapseable_section_start "nodeinstall" "Ensure node version"
213
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
214
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
215
+ - collapseable_section_end "nodeinstall"
216
+ - collapseable_section_start "yarninstall" "Yarn install"
217
+ - yarn install --immutable
218
+ - collapseable_section_end "yarninstall"
219
+ - yarn build
220
+ cache:
221
+ - key: api-yarn
222
+ policy: pull-push
223
+ paths:
224
+ - api/.yarn
225
+ - key: api-node-modules
226
+ policy: pull-push
227
+ paths:
228
+ - api/node_modules
229
+ artifacts:
230
+ paths:
231
+ - api/__build_info.json
232
+ - api/.next
233
+ - api/dist
234
+ expire_in: 1 day
235
+ when: always
236
+ reports: {}
237
+ rules:
238
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
239
+ needs: []
240
+ retry: *a1
241
+ interruptible: true
242
+ 'api ๐Ÿ”จ docker | dev ':
243
+ stage: build
244
+ image: path/to/docker/docker-build:the-version
245
+ services:
246
+ - name: docker:24.0.6-dind
247
+ command:
248
+ - --tls=false
249
+ - --registry-mirror=https://mirror.gcr.io
250
+ variables:
251
+ DOCKER_HOST: tcp://docker:2375
252
+ DOCKER_TLS_CERTDIR: ''
253
+ DOCKER_DRIVER: overlay2
254
+ DOCKER_BUILDKIT: '1'
255
+ KUBERNETES_CPU_REQUEST: '0.45'
256
+ KUBERNETES_MEMORY_REQUEST: 1Gi
257
+ KUBERNETES_MEMORY_LIMIT: 2Gi
258
+ script:
259
+ - collapseable_section_start "injectvars" "Injecting variables"
260
+ - export APP_DIR="api"
261
+ - export DOCKER_BUILD_CONTEXT="."
262
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
263
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
264
+ - export DOCKER_IMAGE_NAME="dev/api"
265
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
266
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
267
+ - |-
268
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
269
+ RUN yarn plugin import workspace-tools
270
+ RUN yarn workspaces focus --production && yarn rebuild"
271
+ - |-
272
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
273
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
274
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
275
+ COPY --chown=node:node .yarn /app/.yarn"
276
+ - collapseable_section_end "injectvars"
277
+ - ensureNodeDockerfile
278
+ - collapseable_section_start "docker-login" "Docker Login"
279
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
280
+ - collapseable_section_end "docker-login"
281
+ - collapseable_section_start "docker-build" "Docker build"
282
+ - 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
283
+ - collapseable_section_end "docker-build"
284
+ - collapseable_section_start "docker-push" "Docker push and tag"
285
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
286
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
287
+ - docker push $DOCKER_CACHE_IMAGE
288
+ - collapseable_section_end "docker-push"
289
+ cache:
290
+ - key: api-yarn
291
+ policy: pull
292
+ paths:
293
+ - api/.yarn
294
+ rules:
295
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
296
+ needs:
297
+ - 'api ๐Ÿ”จ app | dev '
298
+ retry: *a1
299
+ interruptible: true
300
+ 'api ๐Ÿงพ sbom | dev ':
301
+ stage: build
302
+ image:
303
+ name: aquasec/trivy:0.58.2
304
+ entrypoint:
305
+ - ''
306
+ variables: {}
307
+ script:
308
+ - collapseable_section_start "injectvars" "Injecting variables"
309
+ - collapseable_section_end "injectvars"
310
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
311
+ artifacts:
312
+ paths:
313
+ - __sbom.json
314
+ rules:
315
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
316
+ needs: []
317
+ retry: *a1
318
+ interruptible: true
319
+ allow_failure: true
320
+ 'api ๐Ÿš€ Deploy | dev ':
321
+ stage: deploy dev
322
+ image: path/to/docker/kubernetes:the-version
323
+ variables:
324
+ KUBERNETES_CPU_REQUEST: '0.22'
325
+ KUBERNETES_MEMORY_REQUEST: 200Mi
326
+ KUBERNETES_MEMORY_LIMIT: 400Mi
327
+ script:
328
+ - collapseable_section_start "injectvars" "Injecting variables"
329
+ - export ENV_SHORT="dev"
330
+ - export APP_DIR="api"
331
+ - export ENV_TYPE="dev"
332
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
333
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
334
+ - 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")"
335
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
336
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
337
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
338
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
339
+ - export KUBE_NAMESPACE="pan-test-app-dev"
340
+ - export KUBE_APP_NAME="api"
341
+ - export KUBE_APP_NAME_PREFIX=""
342
+ - export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"
343
+ - export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"
344
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
345
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
346
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
347
+ - export DOCKER_IMAGE_NAME="dev/api"
348
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
349
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
350
+ - export RELEASE_NAME="pan-test-app-dev-api"
351
+ - export HELM_EXPERIMENTAL_OCI="1"
352
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
353
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
354
+ - export HELM_ARGS=""
355
+ - export COMPONENT_NAME="api"
356
+ - collapseable_section_end "injectvars"
357
+ - 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
358
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
359
+ - 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"
360
+ - kubectl config use-context "kube-pan-test-app-dev-api"
361
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
362
+ - |
363
+ cat > __all_values.yml <<EOF
364
+ env:
365
+ secret:
366
+ MONGODB_ROOT_PASSWORD: |-
367
+ $(printf %s "$CL_dev_api_MONGODB_ROOT_PASSWORD" | sed '1!s/^/ /')
368
+ MONGODB_REPLICASET_KEY: |-
369
+ $(printf %s "$CL_dev_api_MONGODB_REPLICASET_KEY" | sed '1!s/^/ /')
370
+ MONGO_URL: |-
371
+ 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
372
+ MONGO_OPLOG_URL: |-
373
+ 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
374
+ public:
375
+ ENV_SHORT: |-
376
+ dev
377
+ APP_DIR: |-
378
+ api
379
+ ENV_TYPE: |-
380
+ dev
381
+ BUILD_INFO_BUILD_ID: |-
382
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
383
+ BUILD_INFO_BUILD_TIME: |-
384
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
385
+ BUILD_INFO_CURRENT_VERSION: |-
386
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
387
+ HOSTNAME: |-
388
+ api.dev.test-app.pan.panter.cloud
389
+ ROOT_URL: |-
390
+ https://api.dev.test-app.pan.panter.cloud
391
+ HOSTNAME_INTERNAL: |-
392
+ api.dev.test-app.pan.panter.cloud
393
+ ROOT_URL_INTERNAL: |-
394
+ https://api.dev.test-app.pan.panter.cloud
395
+ KUBE_NAMESPACE: |-
396
+ pan-test-app-dev
397
+ KUBE_APP_NAME: |-
398
+ api
399
+ KUBE_APP_NAME_PREFIX: ""
400
+ _ALL_ENV_VAR_KEYS: |-
401
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
402
+ application:
403
+ host: |-
404
+ api.dev.test-app.pan.panter.cloud
405
+ command: |-
406
+ node main.js
407
+ livenessProbe:
408
+ httpGet:
409
+ path: |-
410
+ __health
411
+ readinessProbe:
412
+ httpGet:
413
+ path: |-
414
+ __health
415
+ startupProbe:
416
+ httpGet:
417
+ path: |-
418
+ __health
419
+ mongodb:
420
+ enabled: true
421
+ auth:
422
+ enabled: true
423
+ rootPassword: |-
424
+ $CL_dev_api_MONGODB_ROOT_PASSWORD
425
+ replicaSetKey: |-
426
+ $CL_dev_api_MONGODB_REPLICASET_KEY
427
+ persistence:
428
+ storageClass: |-
429
+ premium-rwo
430
+ backup:
431
+ enabled: false
432
+ hostToBackup: |-
433
+ api-mongodb-0.api-mongodb-headless.pan-test-app-dev.svc.cluster.local:27017
434
+ pvcToBackup: |-
435
+ datadir-api-mongodb-0
436
+ image: |-
437
+ mrelite/kubectlmongoshell:v1.0
438
+ schedule: |-
439
+ 0 4 * * *
440
+ volumeSnapshotClass: |-
441
+ snapshotclass
442
+ architecture: |-
443
+ replicaset
444
+ tolerations:
445
+ - key: |-
446
+ mongodb
447
+ operator: |-
448
+ Equal
449
+ value: |-
450
+ true
451
+ effect: |-
452
+ NoSchedule
453
+
454
+ EOF
455
+ - collapseable_section_end "writeallvalues"
456
+ - kubernetesCreateSecret
457
+ - kubernetesDeploy
458
+ - echo 'Uploading SBOM to Dependency Track'
459
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
460
+ - echo deployment successful ๐Ÿ˜ป
461
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
462
+ environment:
463
+ name: dev/api
464
+ url: $CL_GITLAB_ENVIRONMENT_URL
465
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | dev '
466
+ auto_stop_in: 4 weeks
467
+ artifacts:
468
+ reports:
469
+ dotenv: gitlab_environment.env
470
+ rules:
471
+ - when: on_success
472
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
473
+ needs:
474
+ - job: api ๐Ÿ‘ฎ lint
475
+ artifacts: false
476
+ - job: 'api ๐Ÿ”จ app | dev '
477
+ artifacts: false
478
+ - job: 'api ๐Ÿ”จ docker | dev '
479
+ artifacts: false
480
+ - job: api ๐Ÿงช test
481
+ artifacts: false
482
+ - job: 'api ๐Ÿงพ sbom | dev '
483
+ artifacts: true
484
+ - job: api ๐Ÿ›ก audit
485
+ artifacts: false
486
+ retry: *a1
487
+ interruptible: true
488
+ allow_failure: false
489
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | dev ':
490
+ stage: stop dev
491
+ image: path/to/docker/kubernetes:the-version
492
+ variables:
493
+ KUBERNETES_CPU_REQUEST: '0.22'
494
+ KUBERNETES_MEMORY_REQUEST: 200Mi
495
+ KUBERNETES_MEMORY_LIMIT: 400Mi
496
+ GIT_STRATEGY: none
497
+ script:
498
+ - collapseable_section_start "injectvars" "Injecting variables"
499
+ - export ENV_SHORT="dev"
500
+ - export APP_DIR="api"
501
+ - export ENV_TYPE="dev"
502
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
503
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
504
+ - 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")"
505
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
506
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
507
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
508
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
509
+ - export KUBE_NAMESPACE="pan-test-app-dev"
510
+ - export KUBE_APP_NAME="api"
511
+ - export KUBE_APP_NAME_PREFIX=""
512
+ - export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"
513
+ - export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"
514
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
515
+ - export RELEASE_NAME="pan-test-app-dev-api"
516
+ - export HELM_EXPERIMENTAL_OCI="1"
517
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
518
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
519
+ - export HELM_ARGS=""
520
+ - export COMPONENT_NAME="api"
521
+ - collapseable_section_end "injectvars"
522
+ - 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
523
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
524
+ - 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"
525
+ - kubectl config use-context "kube-pan-test-app-dev-api"
526
+ - kubernetesDelete
527
+ - echo 'Disabling component in Dependency Track'
528
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
529
+ environment:
530
+ name: dev/api
531
+ action: stop
532
+ rules:
533
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
534
+ when: on_success
535
+ - when: manual
536
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
537
+ needs: []
538
+ retry: *a1
539
+ interruptible: true
540
+ allow_failure: true
541
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | dev ':
542
+ stage: rollback dev
543
+ image: path/to/docker/kubernetes:the-version
544
+ variables:
545
+ KUBERNETES_CPU_REQUEST: '0.22'
546
+ KUBERNETES_MEMORY_REQUEST: 200Mi
547
+ KUBERNETES_MEMORY_LIMIT: 400Mi
548
+ GIT_STRATEGY: none
549
+ script:
550
+ - collapseable_section_start "injectvars" "Injecting variables"
551
+ - export ENV_SHORT="dev"
552
+ - export APP_DIR="api"
553
+ - export ENV_TYPE="dev"
554
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
555
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
556
+ - 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")"
557
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
558
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
559
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
560
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
561
+ - export KUBE_NAMESPACE="pan-test-app-dev"
562
+ - export KUBE_APP_NAME="api"
563
+ - export KUBE_APP_NAME_PREFIX=""
564
+ - export MONGODB_ROOT_PASSWORD="$CL_dev_api_MONGODB_ROOT_PASSWORD"
565
+ - export MONGODB_REPLICASET_KEY="$CL_dev_api_MONGODB_REPLICASET_KEY"
566
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
567
+ - export RELEASE_NAME="pan-test-app-dev-api"
568
+ - export HELM_EXPERIMENTAL_OCI="1"
569
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
570
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
571
+ - export HELM_ARGS=""
572
+ - export COMPONENT_NAME="api"
573
+ - collapseable_section_end "injectvars"
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
+ environment:
580
+ name: dev/api
581
+ action: access
582
+ rules:
583
+ - when: manual
584
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
585
+ needs: []
586
+ retry: *a1
587
+ interruptible: true
588
+ allow_failure: true
589
+ 'api ๐Ÿ”จ app | review ':
590
+ stage: build
591
+ image: path/to/docker/jobs-default:the-version
592
+ variables:
593
+ KUBERNETES_CPU_REQUEST: '0.45'
594
+ KUBERNETES_MEMORY_REQUEST: 1Gi
595
+ KUBERNETES_MEMORY_LIMIT: 4Gi
596
+ script:
597
+ - collapseable_section_start "injectvars" "Injecting variables"
598
+ - export ENV_SHORT="review"
599
+ - export APP_DIR="api"
600
+ - export ENV_TYPE="review"
601
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
602
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
603
+ - 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")"
604
+ - export HOSTNAME="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"
605
+ - 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"
606
+ - export HOSTNAME_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"
607
+ - 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"
608
+ - export KUBE_NAMESPACE="pan-test-app-review"
609
+ - 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"
610
+ - 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"; })-"
611
+ - export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"
612
+ - export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"
613
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
614
+ - collapseable_section_end "injectvars"
615
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
616
+ - collapseable_section_start "nodeinstall" "Ensure node version"
617
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
618
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
619
+ - collapseable_section_end "nodeinstall"
620
+ - cd api
621
+ - collapseable_section_start "nodeinstall" "Ensure node version"
622
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
623
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
624
+ - collapseable_section_end "nodeinstall"
625
+ - collapseable_section_start "yarninstall" "Yarn install"
626
+ - yarn install --immutable
627
+ - collapseable_section_end "yarninstall"
628
+ - yarn build
629
+ cache:
630
+ - key: api-yarn
631
+ policy: pull-push
632
+ paths:
633
+ - api/.yarn
634
+ - key: api-node-modules
635
+ policy: pull-push
636
+ paths:
637
+ - api/node_modules
638
+ artifacts:
639
+ paths:
640
+ - api/__build_info.json
641
+ - api/.next
642
+ - api/dist
643
+ expire_in: 1 day
644
+ when: always
645
+ reports: {}
646
+ rules:
647
+ - if: $CI_MERGE_REQUEST_ID
648
+ needs: []
649
+ retry: *a1
650
+ interruptible: true
651
+ 'api ๐Ÿ”จ docker | review ':
652
+ stage: build
653
+ image: path/to/docker/docker-build:the-version
654
+ services:
655
+ - name: docker:24.0.6-dind
656
+ command:
657
+ - --tls=false
658
+ - --registry-mirror=https://mirror.gcr.io
659
+ variables:
660
+ DOCKER_HOST: tcp://docker:2375
661
+ DOCKER_TLS_CERTDIR: ''
662
+ DOCKER_DRIVER: overlay2
663
+ DOCKER_BUILDKIT: '1'
664
+ KUBERNETES_CPU_REQUEST: '0.45'
665
+ KUBERNETES_MEMORY_REQUEST: 1Gi
666
+ KUBERNETES_MEMORY_LIMIT: 2Gi
667
+ script:
668
+ - collapseable_section_start "injectvars" "Injecting variables"
669
+ - export APP_DIR="api"
670
+ - export DOCKER_BUILD_CONTEXT="."
671
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
672
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
673
+ - export DOCKER_IMAGE_NAME="review/api"
674
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
675
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
676
+ - |-
677
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
678
+ RUN yarn plugin import workspace-tools
679
+ RUN yarn workspaces focus --production && yarn rebuild"
680
+ - |-
681
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
682
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
683
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
684
+ COPY --chown=node:node .yarn /app/.yarn"
685
+ - collapseable_section_end "injectvars"
686
+ - ensureNodeDockerfile
687
+ - collapseable_section_start "docker-login" "Docker Login"
688
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
689
+ - collapseable_section_end "docker-login"
690
+ - collapseable_section_start "docker-build" "Docker build"
691
+ - 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
692
+ - collapseable_section_end "docker-build"
693
+ - collapseable_section_start "docker-push" "Docker push and tag"
694
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
695
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
696
+ - docker push $DOCKER_CACHE_IMAGE
697
+ - collapseable_section_end "docker-push"
698
+ cache:
699
+ - key: api-yarn
700
+ policy: pull
701
+ paths:
702
+ - api/.yarn
703
+ rules:
704
+ - if: $CI_MERGE_REQUEST_ID
705
+ needs:
706
+ - 'api ๐Ÿ”จ app | review '
707
+ retry: *a1
708
+ interruptible: true
709
+ 'api ๐Ÿงพ sbom | review ':
710
+ stage: build
711
+ image:
712
+ name: aquasec/trivy:0.58.2
713
+ entrypoint:
714
+ - ''
715
+ variables: {}
716
+ script:
717
+ - collapseable_section_start "injectvars" "Injecting variables"
718
+ - collapseable_section_end "injectvars"
719
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
720
+ artifacts:
721
+ paths:
722
+ - __sbom.json
723
+ rules:
724
+ - if: $CI_MERGE_REQUEST_ID
725
+ needs: []
726
+ retry: *a1
727
+ interruptible: true
728
+ allow_failure: true
729
+ 'api ๐Ÿš€ Deploy | review ':
730
+ stage: deploy review
731
+ image: path/to/docker/kubernetes:the-version
732
+ variables:
733
+ KUBERNETES_CPU_REQUEST: '0.22'
734
+ KUBERNETES_MEMORY_REQUEST: 200Mi
735
+ KUBERNETES_MEMORY_LIMIT: 400Mi
736
+ script:
737
+ - collapseable_section_start "injectvars" "Injecting variables"
738
+ - export ENV_SHORT="review"
739
+ - export APP_DIR="api"
740
+ - export ENV_TYPE="review"
741
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
742
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
743
+ - 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")"
744
+ - export HOSTNAME="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"
745
+ - 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"
746
+ - export HOSTNAME_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"
747
+ - 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"
748
+ - export KUBE_NAMESPACE="pan-test-app-review"
749
+ - 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"
750
+ - 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"; })-"
751
+ - export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"
752
+ - export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"
753
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
754
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
755
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
756
+ - export DOCKER_IMAGE_NAME="review/api"
757
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
758
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
759
+ - 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"
760
+ - export HELM_EXPERIMENTAL_OCI="1"
761
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
762
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
763
+ - export HELM_ARGS=""
764
+ - export COMPONENT_NAME="api"
765
+ - collapseable_section_end "injectvars"
766
+ - 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
767
+ - 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"
768
+ - 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"
769
+ - 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"
770
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
771
+ - |
772
+ cat > __all_values.yml <<EOF
773
+ env:
774
+ secret:
775
+ MONGODB_ROOT_PASSWORD: |-
776
+ $(printf %s "$CL_review_api_MONGODB_ROOT_PASSWORD" | sed '1!s/^/ /')
777
+ MONGODB_REPLICASET_KEY: |-
778
+ $(printf %s "$CL_review_api_MONGODB_REPLICASET_KEY" | sed '1!s/^/ /')
779
+ MONGO_URL: |-
780
+ 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
781
+ MONGO_OPLOG_URL: |-
782
+ 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
783
+ public:
784
+ ENV_SHORT: |-
785
+ review
786
+ APP_DIR: |-
787
+ api
788
+ ENV_TYPE: |-
789
+ review
790
+ BUILD_INFO_BUILD_ID: |-
791
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
792
+ BUILD_INFO_BUILD_TIME: |-
793
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
794
+ BUILD_INFO_CURRENT_VERSION: |-
795
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
796
+ HOSTNAME: |-
797
+ $(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 '1!s/^/ /')
798
+ ROOT_URL: |-
799
+ $(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 '1!s/^/ /')
800
+ HOSTNAME_INTERNAL: |-
801
+ $(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 '1!s/^/ /')
802
+ ROOT_URL_INTERNAL: |-
803
+ $(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 '1!s/^/ /')
804
+ KUBE_NAMESPACE: |-
805
+ pan-test-app-review
806
+ KUBE_APP_NAME: |-
807
+ $(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 '1!s/^/ /')
808
+ KUBE_APP_NAME_PREFIX: |-
809
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | sed '1!s/^/ /')
810
+ _ALL_ENV_VAR_KEYS: |-
811
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
812
+ application:
813
+ host: |-
814
+ $(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 '1!s/^/ /')
815
+ command: |-
816
+ node main.js
817
+ livenessProbe:
818
+ httpGet:
819
+ path: |-
820
+ __health
821
+ readinessProbe:
822
+ httpGet:
823
+ path: |-
824
+ __health
825
+ startupProbe:
826
+ httpGet:
827
+ path: |-
828
+ __health
829
+ mongodb:
830
+ enabled: true
831
+ auth:
832
+ enabled: true
833
+ rootPassword: |-
834
+ $CL_review_api_MONGODB_ROOT_PASSWORD
835
+ replicaSetKey: |-
836
+ $CL_review_api_MONGODB_REPLICASET_KEY
837
+ persistence:
838
+ storageClass: |-
839
+ premium-rwo
840
+ backup:
841
+ enabled: false
842
+ hostToBackup: |-
843
+ $([ -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
844
+ pvcToBackup: |-
845
+ 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
846
+ image: |-
847
+ mrelite/kubectlmongoshell:v1.0
848
+ schedule: |-
849
+ 0 4 * * *
850
+ volumeSnapshotClass: |-
851
+ snapshotclass
852
+ architecture: |-
853
+ replicaset
854
+ tolerations:
855
+ - key: |-
856
+ mongodb
857
+ operator: |-
858
+ Equal
859
+ value: |-
860
+ true
861
+ effect: |-
862
+ NoSchedule
863
+
864
+ EOF
865
+ - collapseable_section_end "writeallvalues"
866
+ - kubernetesCreateSecret
867
+ - kubernetesDeploy
868
+ - echo 'Uploading SBOM to Dependency Track'
869
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
870
+ - echo deployment successful ๐Ÿ˜ป
871
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
872
+ environment:
873
+ name: review/$CI_COMMIT_REF_NAME/api
874
+ url: $CL_GITLAB_ENVIRONMENT_URL
875
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | review '
876
+ auto_stop_in: 1 week
877
+ artifacts:
878
+ reports:
879
+ dotenv: gitlab_environment.env
880
+ rules:
881
+ - when: on_success
882
+ if: $CI_MERGE_REQUEST_ID
883
+ needs:
884
+ - job: api ๐Ÿ‘ฎ lint
885
+ artifacts: false
886
+ - job: 'api ๐Ÿ”จ app | review '
887
+ artifacts: false
888
+ - job: 'api ๐Ÿ”จ docker | review '
889
+ artifacts: false
890
+ - job: api ๐Ÿงช test
891
+ artifacts: false
892
+ - job: 'api ๐Ÿงพ sbom | review '
893
+ artifacts: true
894
+ - job: api ๐Ÿ›ก audit
895
+ artifacts: false
896
+ retry: *a1
897
+ interruptible: true
898
+ allow_failure: false
899
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | review ':
900
+ stage: stop review
901
+ image: path/to/docker/kubernetes:the-version
902
+ variables:
903
+ KUBERNETES_CPU_REQUEST: '0.22'
904
+ KUBERNETES_MEMORY_REQUEST: 200Mi
905
+ KUBERNETES_MEMORY_LIMIT: 400Mi
906
+ GIT_STRATEGY: none
907
+ script:
908
+ - collapseable_section_start "injectvars" "Injecting variables"
909
+ - export ENV_SHORT="review"
910
+ - export APP_DIR="api"
911
+ - export ENV_TYPE="review"
912
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
913
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
914
+ - 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")"
915
+ - export HOSTNAME="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"
916
+ - 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"
917
+ - export HOSTNAME_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"
918
+ - 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"
919
+ - export KUBE_NAMESPACE="pan-test-app-review"
920
+ - 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"
921
+ - 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"; })-"
922
+ - export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"
923
+ - export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"
924
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
925
+ - 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"
926
+ - export HELM_EXPERIMENTAL_OCI="1"
927
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
928
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
929
+ - export HELM_ARGS=""
930
+ - export COMPONENT_NAME="api"
931
+ - collapseable_section_end "injectvars"
932
+ - 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
933
+ - 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"
934
+ - 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"
935
+ - 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"
936
+ - kubernetesDelete
937
+ - echo 'Disabling component in Dependency Track'
938
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
939
+ environment:
940
+ name: review/$CI_COMMIT_REF_NAME/api
941
+ action: stop
942
+ rules:
943
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
944
+ when: on_success
945
+ - when: manual
946
+ if: $CI_MERGE_REQUEST_ID
947
+ needs: []
948
+ retry: *a1
949
+ interruptible: true
950
+ allow_failure: true
951
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | review ':
952
+ stage: rollback review
953
+ image: path/to/docker/kubernetes:the-version
954
+ variables:
955
+ KUBERNETES_CPU_REQUEST: '0.22'
956
+ KUBERNETES_MEMORY_REQUEST: 200Mi
957
+ KUBERNETES_MEMORY_LIMIT: 400Mi
958
+ GIT_STRATEGY: none
959
+ script:
960
+ - collapseable_section_start "injectvars" "Injecting variables"
961
+ - export ENV_SHORT="review"
962
+ - export APP_DIR="api"
963
+ - export ENV_TYPE="review"
964
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
965
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
966
+ - 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")"
967
+ - export HOSTNAME="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"
968
+ - 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"
969
+ - export HOSTNAME_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"
970
+ - 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"
971
+ - export KUBE_NAMESPACE="pan-test-app-review"
972
+ - 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"
973
+ - 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"; })-"
974
+ - export MONGODB_ROOT_PASSWORD="$CL_review_api_MONGODB_ROOT_PASSWORD"
975
+ - export MONGODB_REPLICASET_KEY="$CL_review_api_MONGODB_REPLICASET_KEY"
976
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
977
+ - 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"
978
+ - export HELM_EXPERIMENTAL_OCI="1"
979
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
980
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
981
+ - export HELM_ARGS=""
982
+ - export COMPONENT_NAME="api"
983
+ - collapseable_section_end "injectvars"
984
+ - 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
985
+ - 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"
986
+ - 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"
987
+ - 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"
988
+ - kubernetesRollback
989
+ environment:
990
+ name: review/$CI_COMMIT_REF_NAME/api
991
+ action: access
992
+ rules:
993
+ - when: manual
994
+ if: $CI_MERGE_REQUEST_ID
995
+ needs: []
996
+ retry: *a1
997
+ interruptible: true
998
+ allow_failure: true
999
+ 'api ๐Ÿ”จ app | stage ':
1000
+ stage: build
1001
+ image: path/to/docker/jobs-default:the-version
1002
+ variables:
1003
+ KUBERNETES_CPU_REQUEST: '0.45'
1004
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1005
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1006
+ script:
1007
+ - collapseable_section_start "injectvars" "Injecting variables"
1008
+ - export ENV_SHORT="stage"
1009
+ - export APP_DIR="api"
1010
+ - export ENV_TYPE="stage"
1011
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1012
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1013
+ - 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")"
1014
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
1015
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1016
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
1017
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1018
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1019
+ - export KUBE_APP_NAME="api"
1020
+ - export KUBE_APP_NAME_PREFIX=""
1021
+ - export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"
1022
+ - export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"
1023
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1024
+ - collapseable_section_end "injectvars"
1025
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1026
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1027
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1028
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1029
+ - collapseable_section_end "nodeinstall"
1030
+ - cd api
1031
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1032
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1033
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1034
+ - collapseable_section_end "nodeinstall"
1035
+ - collapseable_section_start "yarninstall" "Yarn install"
1036
+ - yarn install --immutable
1037
+ - collapseable_section_end "yarninstall"
1038
+ - yarn build
1039
+ cache:
1040
+ - key: api-yarn
1041
+ policy: pull-push
1042
+ paths:
1043
+ - api/.yarn
1044
+ - key: api-node-modules
1045
+ policy: pull-push
1046
+ paths:
1047
+ - api/node_modules
1048
+ artifacts:
1049
+ paths:
1050
+ - api/__build_info.json
1051
+ - api/.next
1052
+ - api/dist
1053
+ expire_in: 1 day
1054
+ when: always
1055
+ reports: {}
1056
+ rules:
1057
+ - if: $CI_COMMIT_TAG
1058
+ needs: []
1059
+ retry: *a1
1060
+ interruptible: true
1061
+ 'api ๐Ÿ”จ docker | stage ':
1062
+ stage: build
1063
+ image: path/to/docker/docker-build:the-version
1064
+ services:
1065
+ - name: docker:24.0.6-dind
1066
+ command:
1067
+ - --tls=false
1068
+ - --registry-mirror=https://mirror.gcr.io
1069
+ variables:
1070
+ DOCKER_HOST: tcp://docker:2375
1071
+ DOCKER_TLS_CERTDIR: ''
1072
+ DOCKER_DRIVER: overlay2
1073
+ DOCKER_BUILDKIT: '1'
1074
+ KUBERNETES_CPU_REQUEST: '0.45'
1075
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1076
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1077
+ script:
1078
+ - collapseable_section_start "injectvars" "Injecting variables"
1079
+ - export APP_DIR="api"
1080
+ - export DOCKER_BUILD_CONTEXT="."
1081
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1082
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1083
+ - export DOCKER_IMAGE_NAME="stage/api"
1084
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1085
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1086
+ - |-
1087
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1088
+ RUN yarn plugin import workspace-tools
1089
+ RUN yarn workspaces focus --production && yarn rebuild"
1090
+ - |-
1091
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1092
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1093
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1094
+ COPY --chown=node:node .yarn /app/.yarn"
1095
+ - collapseable_section_end "injectvars"
1096
+ - ensureNodeDockerfile
1097
+ - collapseable_section_start "docker-login" "Docker Login"
1098
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1099
+ - collapseable_section_end "docker-login"
1100
+ - collapseable_section_start "docker-build" "Docker build"
1101
+ - 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
1102
+ - collapseable_section_end "docker-build"
1103
+ - collapseable_section_start "docker-push" "Docker push and tag"
1104
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1105
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1106
+ - docker push $DOCKER_CACHE_IMAGE
1107
+ - collapseable_section_end "docker-push"
1108
+ cache:
1109
+ - key: api-yarn
1110
+ policy: pull
1111
+ paths:
1112
+ - api/.yarn
1113
+ rules:
1114
+ - if: $CI_COMMIT_TAG
1115
+ needs:
1116
+ - 'api ๐Ÿ”จ app | stage '
1117
+ retry: *a1
1118
+ interruptible: true
1119
+ 'api ๐Ÿงพ sbom | stage ':
1120
+ stage: build
1121
+ image:
1122
+ name: aquasec/trivy:0.58.2
1123
+ entrypoint:
1124
+ - ''
1125
+ variables: {}
1126
+ script:
1127
+ - collapseable_section_start "injectvars" "Injecting variables"
1128
+ - collapseable_section_end "injectvars"
1129
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1130
+ artifacts:
1131
+ paths:
1132
+ - __sbom.json
1133
+ rules:
1134
+ - if: $CI_COMMIT_TAG
1135
+ needs: []
1136
+ retry: *a1
1137
+ interruptible: true
1138
+ allow_failure: true
1139
+ 'api ๐Ÿš€ Deploy | stage ':
1140
+ stage: deploy stage
1141
+ image: path/to/docker/kubernetes:the-version
1142
+ variables:
1143
+ KUBERNETES_CPU_REQUEST: '0.22'
1144
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1145
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1146
+ script:
1147
+ - collapseable_section_start "injectvars" "Injecting variables"
1148
+ - export ENV_SHORT="stage"
1149
+ - export APP_DIR="api"
1150
+ - export ENV_TYPE="stage"
1151
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1152
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1153
+ - 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")"
1154
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
1155
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1156
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
1157
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1158
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1159
+ - export KUBE_APP_NAME="api"
1160
+ - export KUBE_APP_NAME_PREFIX=""
1161
+ - export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"
1162
+ - export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"
1163
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1164
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1165
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1166
+ - export DOCKER_IMAGE_NAME="stage/api"
1167
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1168
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1169
+ - export RELEASE_NAME="pan-test-app-stage-api"
1170
+ - export HELM_EXPERIMENTAL_OCI="1"
1171
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1172
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1173
+ - export HELM_ARGS=""
1174
+ - export COMPONENT_NAME="api"
1175
+ - collapseable_section_end "injectvars"
1176
+ - 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
1177
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1178
+ - 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"
1179
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1180
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
1181
+ - |
1182
+ cat > __all_values.yml <<EOF
1183
+ env:
1184
+ secret:
1185
+ MONGODB_ROOT_PASSWORD: |-
1186
+ $(printf %s "$CL_stage_api_MONGODB_ROOT_PASSWORD" | sed '1!s/^/ /')
1187
+ MONGODB_REPLICASET_KEY: |-
1188
+ $(printf %s "$CL_stage_api_MONGODB_REPLICASET_KEY" | sed '1!s/^/ /')
1189
+ MONGO_URL: |-
1190
+ 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
1191
+ MONGO_OPLOG_URL: |-
1192
+ 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
1193
+ public:
1194
+ ENV_SHORT: |-
1195
+ stage
1196
+ APP_DIR: |-
1197
+ api
1198
+ ENV_TYPE: |-
1199
+ stage
1200
+ BUILD_INFO_BUILD_ID: |-
1201
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1202
+ BUILD_INFO_BUILD_TIME: |-
1203
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1204
+ BUILD_INFO_CURRENT_VERSION: |-
1205
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
1206
+ HOSTNAME: |-
1207
+ api.stage.test-app.pan.panter.cloud
1208
+ ROOT_URL: |-
1209
+ https://api.stage.test-app.pan.panter.cloud
1210
+ HOSTNAME_INTERNAL: |-
1211
+ api.stage.test-app.pan.panter.cloud
1212
+ ROOT_URL_INTERNAL: |-
1213
+ https://api.stage.test-app.pan.panter.cloud
1214
+ KUBE_NAMESPACE: |-
1215
+ pan-test-app-stage
1216
+ KUBE_APP_NAME: |-
1217
+ api
1218
+ KUBE_APP_NAME_PREFIX: ""
1219
+ _ALL_ENV_VAR_KEYS: |-
1220
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
1221
+ application:
1222
+ host: |-
1223
+ api.stage.test-app.pan.panter.cloud
1224
+ command: |-
1225
+ node main.js
1226
+ livenessProbe:
1227
+ httpGet:
1228
+ path: |-
1229
+ __health
1230
+ readinessProbe:
1231
+ httpGet:
1232
+ path: |-
1233
+ __health
1234
+ startupProbe:
1235
+ httpGet:
1236
+ path: |-
1237
+ __health
1238
+ mongodb:
1239
+ enabled: true
1240
+ auth:
1241
+ enabled: true
1242
+ rootPassword: |-
1243
+ $CL_stage_api_MONGODB_ROOT_PASSWORD
1244
+ replicaSetKey: |-
1245
+ $CL_stage_api_MONGODB_REPLICASET_KEY
1246
+ persistence:
1247
+ storageClass: |-
1248
+ premium-rwo
1249
+ backup:
1250
+ enabled: true
1251
+ hostToBackup: |-
1252
+ api-mongodb-0.api-mongodb-headless.pan-test-app-stage.svc.cluster.local:27017
1253
+ pvcToBackup: |-
1254
+ datadir-api-mongodb-0
1255
+ image: |-
1256
+ mrelite/kubectlmongoshell:v1.0
1257
+ schedule: |-
1258
+ 0 4 * * *
1259
+ volumeSnapshotClass: |-
1260
+ snapshotclass
1261
+ architecture: |-
1262
+ replicaset
1263
+ tolerations:
1264
+ - key: |-
1265
+ mongodb
1266
+ operator: |-
1267
+ Equal
1268
+ value: |-
1269
+ true
1270
+ effect: |-
1271
+ NoSchedule
1272
+
1273
+ EOF
1274
+ - collapseable_section_end "writeallvalues"
1275
+ - kubernetesCreateSecret
1276
+ - kubernetesDeploy
1277
+ - echo 'Uploading SBOM to Dependency Track'
1278
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
1279
+ - echo deployment successful ๐Ÿ˜ป
1280
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1281
+ environment:
1282
+ name: stage/api
1283
+ url: $CL_GITLAB_ENVIRONMENT_URL
1284
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | stage '
1285
+ artifacts:
1286
+ reports:
1287
+ dotenv: gitlab_environment.env
1288
+ rules:
1289
+ - when: on_success
1290
+ if: $CI_COMMIT_TAG
1291
+ needs:
1292
+ - job: 'api ๐Ÿ”จ app | stage '
1293
+ artifacts: false
1294
+ - job: 'api ๐Ÿ”จ docker | stage '
1295
+ artifacts: false
1296
+ - job: 'api ๐Ÿงพ sbom | stage '
1297
+ artifacts: true
1298
+ retry: *a1
1299
+ interruptible: true
1300
+ allow_failure: false
1301
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | stage ':
1302
+ stage: stop stage
1303
+ image: path/to/docker/kubernetes:the-version
1304
+ variables:
1305
+ KUBERNETES_CPU_REQUEST: '0.22'
1306
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1307
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1308
+ GIT_STRATEGY: none
1309
+ script:
1310
+ - collapseable_section_start "injectvars" "Injecting variables"
1311
+ - export ENV_SHORT="stage"
1312
+ - export APP_DIR="api"
1313
+ - export ENV_TYPE="stage"
1314
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1315
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1316
+ - 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")"
1317
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
1318
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1319
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
1320
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1321
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1322
+ - export KUBE_APP_NAME="api"
1323
+ - export KUBE_APP_NAME_PREFIX=""
1324
+ - export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"
1325
+ - export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"
1326
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1327
+ - export RELEASE_NAME="pan-test-app-stage-api"
1328
+ - export HELM_EXPERIMENTAL_OCI="1"
1329
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1330
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1331
+ - export HELM_ARGS=""
1332
+ - export COMPONENT_NAME="api"
1333
+ - collapseable_section_end "injectvars"
1334
+ - 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
1335
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1336
+ - 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"
1337
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1338
+ - kubernetesDelete
1339
+ - echo 'Disabling component in Dependency Track'
1340
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
1341
+ environment:
1342
+ name: stage/api
1343
+ action: stop
1344
+ rules:
1345
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1346
+ when: on_success
1347
+ - when: manual
1348
+ if: $CI_COMMIT_TAG
1349
+ needs: []
1350
+ retry: *a1
1351
+ interruptible: true
1352
+ allow_failure: true
1353
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | stage ':
1354
+ stage: rollback stage
1355
+ image: path/to/docker/kubernetes:the-version
1356
+ variables:
1357
+ KUBERNETES_CPU_REQUEST: '0.22'
1358
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1359
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1360
+ GIT_STRATEGY: none
1361
+ script:
1362
+ - collapseable_section_start "injectvars" "Injecting variables"
1363
+ - export ENV_SHORT="stage"
1364
+ - export APP_DIR="api"
1365
+ - export ENV_TYPE="stage"
1366
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1367
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1368
+ - 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")"
1369
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
1370
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1371
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
1372
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1373
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1374
+ - export KUBE_APP_NAME="api"
1375
+ - export KUBE_APP_NAME_PREFIX=""
1376
+ - export MONGODB_ROOT_PASSWORD="$CL_stage_api_MONGODB_ROOT_PASSWORD"
1377
+ - export MONGODB_REPLICASET_KEY="$CL_stage_api_MONGODB_REPLICASET_KEY"
1378
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1379
+ - export RELEASE_NAME="pan-test-app-stage-api"
1380
+ - export HELM_EXPERIMENTAL_OCI="1"
1381
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1382
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1383
+ - export HELM_ARGS=""
1384
+ - export COMPONENT_NAME="api"
1385
+ - collapseable_section_end "injectvars"
1386
+ - 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
1387
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1388
+ - 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"
1389
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1390
+ - kubernetesRollback
1391
+ environment:
1392
+ name: stage/api
1393
+ action: access
1394
+ rules:
1395
+ - when: manual
1396
+ if: $CI_COMMIT_TAG
1397
+ needs: []
1398
+ retry: *a1
1399
+ interruptible: true
1400
+ allow_failure: true
1401
+ 'api ๐Ÿ”จ app | prod ':
1402
+ stage: build
1403
+ image: path/to/docker/jobs-default:the-version
1404
+ variables:
1405
+ KUBERNETES_CPU_REQUEST: '0.45'
1406
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1407
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1408
+ script:
1409
+ - collapseable_section_start "injectvars" "Injecting variables"
1410
+ - export ENV_SHORT="prod"
1411
+ - export APP_DIR="api"
1412
+ - export ENV_TYPE="prod"
1413
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1414
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1415
+ - 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")"
1416
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1417
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1418
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1419
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1420
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1421
+ - export KUBE_APP_NAME="api"
1422
+ - export KUBE_APP_NAME_PREFIX=""
1423
+ - export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"
1424
+ - export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"
1425
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1426
+ - collapseable_section_end "injectvars"
1427
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1428
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1429
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1430
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1431
+ - collapseable_section_end "nodeinstall"
1432
+ - cd api
1433
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1434
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1435
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1436
+ - collapseable_section_end "nodeinstall"
1437
+ - collapseable_section_start "yarninstall" "Yarn install"
1438
+ - yarn install --immutable
1439
+ - collapseable_section_end "yarninstall"
1440
+ - yarn build
1441
+ cache:
1442
+ - key: api-yarn
1443
+ policy: pull-push
1444
+ paths:
1445
+ - api/.yarn
1446
+ - key: api-node-modules
1447
+ policy: pull-push
1448
+ paths:
1449
+ - api/node_modules
1450
+ artifacts:
1451
+ paths:
1452
+ - api/__build_info.json
1453
+ - api/.next
1454
+ - api/dist
1455
+ expire_in: 1 day
1456
+ when: always
1457
+ reports: {}
1458
+ rules:
1459
+ - if: $CI_COMMIT_TAG
1460
+ needs: []
1461
+ retry: *a1
1462
+ interruptible: true
1463
+ 'api ๐Ÿ”จ docker | prod ':
1464
+ stage: build
1465
+ image: path/to/docker/docker-build:the-version
1466
+ services:
1467
+ - name: docker:24.0.6-dind
1468
+ command:
1469
+ - --tls=false
1470
+ - --registry-mirror=https://mirror.gcr.io
1471
+ variables:
1472
+ DOCKER_HOST: tcp://docker:2375
1473
+ DOCKER_TLS_CERTDIR: ''
1474
+ DOCKER_DRIVER: overlay2
1475
+ DOCKER_BUILDKIT: '1'
1476
+ KUBERNETES_CPU_REQUEST: '0.45'
1477
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1478
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1479
+ script:
1480
+ - collapseable_section_start "injectvars" "Injecting variables"
1481
+ - export APP_DIR="api"
1482
+ - export DOCKER_BUILD_CONTEXT="."
1483
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1484
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1485
+ - export DOCKER_IMAGE_NAME="prod/api"
1486
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1487
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1488
+ - |-
1489
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1490
+ RUN yarn plugin import workspace-tools
1491
+ RUN yarn workspaces focus --production && yarn rebuild"
1492
+ - |-
1493
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1494
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1495
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1496
+ COPY --chown=node:node .yarn /app/.yarn"
1497
+ - collapseable_section_end "injectvars"
1498
+ - ensureNodeDockerfile
1499
+ - collapseable_section_start "docker-login" "Docker Login"
1500
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1501
+ - collapseable_section_end "docker-login"
1502
+ - collapseable_section_start "docker-build" "Docker build"
1503
+ - 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
1504
+ - collapseable_section_end "docker-build"
1505
+ - collapseable_section_start "docker-push" "Docker push and tag"
1506
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1507
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1508
+ - docker push $DOCKER_CACHE_IMAGE
1509
+ - collapseable_section_end "docker-push"
1510
+ cache:
1511
+ - key: api-yarn
1512
+ policy: pull
1513
+ paths:
1514
+ - api/.yarn
1515
+ rules:
1516
+ - if: $CI_COMMIT_TAG
1517
+ needs:
1518
+ - 'api ๐Ÿ”จ app | prod '
1519
+ retry: *a1
1520
+ interruptible: true
1521
+ 'api ๐Ÿงพ sbom | prod ':
1522
+ stage: build
1523
+ image:
1524
+ name: aquasec/trivy:0.58.2
1525
+ entrypoint:
1526
+ - ''
1527
+ variables: {}
1528
+ script:
1529
+ - collapseable_section_start "injectvars" "Injecting variables"
1530
+ - collapseable_section_end "injectvars"
1531
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1532
+ artifacts:
1533
+ paths:
1534
+ - __sbom.json
1535
+ rules:
1536
+ - if: $CI_COMMIT_TAG
1537
+ needs: []
1538
+ retry: *a1
1539
+ interruptible: true
1540
+ allow_failure: true
1541
+ 'api ๐Ÿš€ Deploy | prod ':
1542
+ stage: deploy prod
1543
+ image: path/to/docker/kubernetes:the-version
1544
+ variables:
1545
+ KUBERNETES_CPU_REQUEST: '0.22'
1546
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1547
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1548
+ script:
1549
+ - collapseable_section_start "injectvars" "Injecting variables"
1550
+ - export ENV_SHORT="prod"
1551
+ - export APP_DIR="api"
1552
+ - export ENV_TYPE="prod"
1553
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1554
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1555
+ - 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")"
1556
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1557
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1558
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1559
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1560
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1561
+ - export KUBE_APP_NAME="api"
1562
+ - export KUBE_APP_NAME_PREFIX=""
1563
+ - export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"
1564
+ - export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"
1565
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1566
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1567
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1568
+ - export DOCKER_IMAGE_NAME="prod/api"
1569
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1570
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1571
+ - export RELEASE_NAME="pan-test-app-prod-api"
1572
+ - export HELM_EXPERIMENTAL_OCI="1"
1573
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1574
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1575
+ - export HELM_ARGS=""
1576
+ - export COMPONENT_NAME="api"
1577
+ - collapseable_section_end "injectvars"
1578
+ - 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
1579
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1580
+ - 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"
1581
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1582
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
1583
+ - |
1584
+ cat > __all_values.yml <<EOF
1585
+ env:
1586
+ secret:
1587
+ MONGODB_ROOT_PASSWORD: |-
1588
+ $(printf %s "$CL_prod_api_MONGODB_ROOT_PASSWORD" | sed '1!s/^/ /')
1589
+ MONGODB_REPLICASET_KEY: |-
1590
+ $(printf %s "$CL_prod_api_MONGODB_REPLICASET_KEY" | sed '1!s/^/ /')
1591
+ MONGO_URL: |-
1592
+ 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
1593
+ MONGO_OPLOG_URL: |-
1594
+ 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
1595
+ public:
1596
+ ENV_SHORT: |-
1597
+ prod
1598
+ APP_DIR: |-
1599
+ api
1600
+ ENV_TYPE: |-
1601
+ prod
1602
+ BUILD_INFO_BUILD_ID: |-
1603
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1604
+ BUILD_INFO_BUILD_TIME: |-
1605
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1606
+ BUILD_INFO_CURRENT_VERSION: |-
1607
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
1608
+ HOSTNAME: |-
1609
+ api.prod.test-app.pan.panter.cloud
1610
+ ROOT_URL: |-
1611
+ https://api.prod.test-app.pan.panter.cloud
1612
+ HOSTNAME_INTERNAL: |-
1613
+ api.prod.test-app.pan.panter.cloud
1614
+ ROOT_URL_INTERNAL: |-
1615
+ https://api.prod.test-app.pan.panter.cloud
1616
+ KUBE_NAMESPACE: |-
1617
+ pan-test-app-prod
1618
+ KUBE_APP_NAME: |-
1619
+ api
1620
+ KUBE_APP_NAME_PREFIX: ""
1621
+ _ALL_ENV_VAR_KEYS: |-
1622
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOSTNAME","ROOT_URL","HOSTNAME_INTERNAL","ROOT_URL_INTERNAL","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX","MONGODB_ROOT_PASSWORD","MONGODB_REPLICASET_KEY"]
1623
+ application:
1624
+ host: |-
1625
+ api.prod.test-app.pan.panter.cloud
1626
+ command: |-
1627
+ node main.js
1628
+ livenessProbe:
1629
+ httpGet:
1630
+ path: |-
1631
+ __health
1632
+ readinessProbe:
1633
+ httpGet:
1634
+ path: |-
1635
+ __health
1636
+ startupProbe:
1637
+ httpGet:
1638
+ path: |-
1639
+ __health
1640
+ mongodb:
1641
+ enabled: true
1642
+ auth:
1643
+ enabled: true
1644
+ rootPassword: |-
1645
+ $CL_prod_api_MONGODB_ROOT_PASSWORD
1646
+ replicaSetKey: |-
1647
+ $CL_prod_api_MONGODB_REPLICASET_KEY
1648
+ persistence:
1649
+ storageClass: |-
1650
+ premium-rwo
1651
+ backup:
1652
+ enabled: true
1653
+ hostToBackup: |-
1654
+ api-mongodb-0.api-mongodb-headless.pan-test-app-prod.svc.cluster.local:27017
1655
+ pvcToBackup: |-
1656
+ datadir-api-mongodb-0
1657
+ image: |-
1658
+ mrelite/kubectlmongoshell:v1.0
1659
+ schedule: |-
1660
+ 0 4 * * *
1661
+ volumeSnapshotClass: |-
1662
+ snapshotclass
1663
+ architecture: |-
1664
+ replicaset
1665
+ tolerations:
1666
+ - key: |-
1667
+ mongodb
1668
+ operator: |-
1669
+ Equal
1670
+ value: |-
1671
+ true
1672
+ effect: |-
1673
+ NoSchedule
1674
+
1675
+ EOF
1676
+ - collapseable_section_end "writeallvalues"
1677
+ - kubernetesCreateSecret
1678
+ - kubernetesDeploy
1679
+ - echo 'Uploading SBOM to Dependency Track'
1680
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
1681
+ - echo deployment successful ๐Ÿ˜ป
1682
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1683
+ environment:
1684
+ name: prod/api
1685
+ url: $CL_GITLAB_ENVIRONMENT_URL
1686
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | prod '
1687
+ artifacts:
1688
+ reports:
1689
+ dotenv: gitlab_environment.env
1690
+ rules:
1691
+ - when: manual
1692
+ if: $CI_COMMIT_TAG
1693
+ needs:
1694
+ - job: 'api ๐Ÿ”จ app | prod '
1695
+ artifacts: false
1696
+ - job: 'api ๐Ÿ”จ docker | prod '
1697
+ artifacts: false
1698
+ - job: 'api ๐Ÿงพ sbom | prod '
1699
+ artifacts: true
1700
+ retry: *a1
1701
+ interruptible: true
1702
+ allow_failure: true
1703
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1704
+ stage: stop prod
1705
+ image: path/to/docker/kubernetes:the-version
1706
+ variables:
1707
+ KUBERNETES_CPU_REQUEST: '0.22'
1708
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1709
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1710
+ GIT_STRATEGY: none
1711
+ script:
1712
+ - collapseable_section_start "injectvars" "Injecting variables"
1713
+ - export ENV_SHORT="prod"
1714
+ - export APP_DIR="api"
1715
+ - export ENV_TYPE="prod"
1716
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1717
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1718
+ - 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")"
1719
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1720
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1721
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1722
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1723
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1724
+ - export KUBE_APP_NAME="api"
1725
+ - export KUBE_APP_NAME_PREFIX=""
1726
+ - export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"
1727
+ - export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"
1728
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1729
+ - export RELEASE_NAME="pan-test-app-prod-api"
1730
+ - export HELM_EXPERIMENTAL_OCI="1"
1731
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1732
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1733
+ - export HELM_ARGS=""
1734
+ - export COMPONENT_NAME="api"
1735
+ - collapseable_section_end "injectvars"
1736
+ - 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
1737
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1738
+ - 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"
1739
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1740
+ - kubernetesDelete
1741
+ - echo 'Disabling component in Dependency Track'
1742
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
1743
+ environment:
1744
+ name: prod/api
1745
+ action: stop
1746
+ rules:
1747
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1748
+ when: on_success
1749
+ - when: manual
1750
+ if: $CI_COMMIT_TAG
1751
+ needs: []
1752
+ retry: *a1
1753
+ interruptible: true
1754
+ allow_failure: true
1755
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | prod ':
1756
+ stage: rollback prod
1757
+ image: path/to/docker/kubernetes:the-version
1758
+ variables:
1759
+ KUBERNETES_CPU_REQUEST: '0.22'
1760
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1761
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1762
+ GIT_STRATEGY: none
1763
+ script:
1764
+ - collapseable_section_start "injectvars" "Injecting variables"
1765
+ - export ENV_SHORT="prod"
1766
+ - export APP_DIR="api"
1767
+ - export ENV_TYPE="prod"
1768
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1769
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1770
+ - 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")"
1771
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1772
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1773
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1774
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1775
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1776
+ - export KUBE_APP_NAME="api"
1777
+ - export KUBE_APP_NAME_PREFIX=""
1778
+ - export MONGODB_ROOT_PASSWORD="$CL_prod_api_MONGODB_ROOT_PASSWORD"
1779
+ - export MONGODB_REPLICASET_KEY="$CL_prod_api_MONGODB_REPLICASET_KEY"
1780
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"MONGODB_ROOT_PASSWORD\\",\\"MONGODB_REPLICASET_KEY\\"]"
1781
+ - export RELEASE_NAME="pan-test-app-prod-api"
1782
+ - export HELM_EXPERIMENTAL_OCI="1"
1783
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1784
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1785
+ - export HELM_ARGS=""
1786
+ - export COMPONENT_NAME="api"
1787
+ - collapseable_section_end "injectvars"
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
+ - kubernetesRollback
1793
+ environment:
1794
+ name: prod/api
1795
+ action: access
1796
+ rules:
1797
+ - when: manual
1798
+ if: $CI_COMMIT_TAG
1799
+ needs: []
1800
+ retry: *a1
1801
+ interruptible: true
1802
+ allow_failure: true
1803
+ create release:
1804
+ stage: release
1805
+ image: path/to/docker/semantic-release:the-version
1806
+ script:
1807
+ - semanticRelease
1808
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1809
+ rules:
1810
+ - &a2
1811
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1812
+ when: never
1813
+ - &a3
1814
+ if: $CI_PIPELINE_SOURCE == "schedule"
1815
+ when: never
1816
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1817
+ when: on_success
1818
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1819
+ when: manual
1820
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1821
+ when: manual
1822
+ โš ๏ธ force create release:
1823
+ stage: release
1824
+ image: path/to/docker/semantic-release:the-version
1825
+ script:
1826
+ - semanticRelease
1827
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1828
+ rules:
1829
+ - *a2
1830
+ - *a3
1831
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1832
+ when: manual
1833
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1834
+ when: manual
1835
+ needs: []
1836
+ "
1837
+ `;