@catladder/pipeline 0.0.0-more-collapse-deeb54d7 → 0.0.0-multiple-gitlab-includes-1a40efc0

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