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

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