@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,1733 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for kubernetes-with-cloud-sql 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 POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
203
+ - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
204
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
205
+ - collapseable_section_end "injectvars"
206
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
207
+ - collapseable_section_start "nodeinstall" "Ensure node version"
208
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
209
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
210
+ - collapseable_section_end "nodeinstall"
211
+ - cd api
212
+ - collapseable_section_start "nodeinstall" "Ensure node version"
213
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
214
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
215
+ - collapseable_section_end "nodeinstall"
216
+ - collapseable_section_start "yarninstall" "Yarn install"
217
+ - yarn install --immutable
218
+ - collapseable_section_end "yarninstall"
219
+ - yarn build
220
+ cache:
221
+ - key: api-yarn
222
+ policy: pull-push
223
+ paths:
224
+ - api/.yarn
225
+ - key: api-node-modules
226
+ policy: pull-push
227
+ paths:
228
+ - api/node_modules
229
+ artifacts:
230
+ paths:
231
+ - api/__build_info.json
232
+ - api/.next
233
+ - api/dist
234
+ expire_in: 1 day
235
+ when: always
236
+ reports: {}
237
+ rules:
238
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
239
+ needs: []
240
+ retry: *a1
241
+ interruptible: true
242
+ 'api ๐Ÿ”จ docker | dev ':
243
+ stage: build
244
+ image: path/to/docker/docker-build:the-version
245
+ services:
246
+ - name: docker:24.0.6-dind
247
+ command:
248
+ - --tls=false
249
+ - --registry-mirror=https://mirror.gcr.io
250
+ variables:
251
+ DOCKER_HOST: tcp://docker:2375
252
+ DOCKER_TLS_CERTDIR: ''
253
+ DOCKER_DRIVER: overlay2
254
+ DOCKER_BUILDKIT: '1'
255
+ KUBERNETES_CPU_REQUEST: '0.45'
256
+ KUBERNETES_MEMORY_REQUEST: 1Gi
257
+ KUBERNETES_MEMORY_LIMIT: 2Gi
258
+ script:
259
+ - collapseable_section_start "injectvars" "Injecting variables"
260
+ - export APP_DIR="api"
261
+ - export DOCKER_BUILD_CONTEXT="."
262
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
263
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
264
+ - export DOCKER_IMAGE_NAME="dev/api"
265
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
266
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
267
+ - |-
268
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
269
+ RUN yarn plugin import workspace-tools
270
+ RUN yarn workspaces focus --production && yarn rebuild"
271
+ - |-
272
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
273
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
274
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
275
+ COPY --chown=node:node .yarn /app/.yarn"
276
+ - collapseable_section_end "injectvars"
277
+ - ensureNodeDockerfile
278
+ - collapseable_section_start "docker-login" "Docker Login"
279
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
280
+ - collapseable_section_end "docker-login"
281
+ - collapseable_section_start "docker-build" "Docker build"
282
+ - docker build --network host --cache-from $DOCKER_CACHE_IMAGE --tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG -f $APP_DIR/Dockerfile $DOCKER_BUILD_CONTEXT --build-arg BUILDKIT_INLINE_CACHE=1
283
+ - collapseable_section_end "docker-build"
284
+ - collapseable_section_start "docker-push" "Docker push and tag"
285
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
286
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
287
+ - docker push $DOCKER_CACHE_IMAGE
288
+ - collapseable_section_end "docker-push"
289
+ cache:
290
+ - key: api-yarn
291
+ policy: pull
292
+ paths:
293
+ - api/.yarn
294
+ rules:
295
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
296
+ needs:
297
+ - 'api ๐Ÿ”จ app | dev '
298
+ retry: *a1
299
+ interruptible: true
300
+ 'api ๐Ÿงพ sbom | dev ':
301
+ stage: build
302
+ image:
303
+ name: aquasec/trivy:0.58.2
304
+ entrypoint:
305
+ - ''
306
+ variables: {}
307
+ script:
308
+ - collapseable_section_start "injectvars" "Injecting variables"
309
+ - collapseable_section_end "injectvars"
310
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
311
+ artifacts:
312
+ paths:
313
+ - __sbom.json
314
+ rules:
315
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
316
+ needs: []
317
+ retry: *a1
318
+ interruptible: true
319
+ allow_failure: true
320
+ 'api ๐Ÿš€ Deploy | dev ':
321
+ stage: deploy dev
322
+ image: path/to/docker/kubernetes:the-version
323
+ variables:
324
+ KUBERNETES_CPU_REQUEST: '0.22'
325
+ KUBERNETES_MEMORY_REQUEST: 200Mi
326
+ KUBERNETES_MEMORY_LIMIT: 400Mi
327
+ script:
328
+ - collapseable_section_start "injectvars" "Injecting variables"
329
+ - export ENV_SHORT="dev"
330
+ - export APP_DIR="api"
331
+ - export ENV_TYPE="dev"
332
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
333
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
334
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
335
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
336
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
337
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
338
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
339
+ - export KUBE_NAMESPACE="pan-test-app-dev"
340
+ - export KUBE_APP_NAME="api"
341
+ - export KUBE_APP_NAME_PREFIX=""
342
+ - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
343
+ - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
344
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
345
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
346
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
347
+ - export DOCKER_IMAGE_NAME="dev/api"
348
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
349
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
350
+ - export RELEASE_NAME="pan-test-app-dev-api"
351
+ - export HELM_EXPERIMENTAL_OCI="1"
352
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
353
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
354
+ - export HELM_ARGS=""
355
+ - export COMPONENT_NAME="api"
356
+ - collapseable_section_end "injectvars"
357
+ - kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
358
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
359
+ - kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"
360
+ - kubectl config use-context "kube-pan-test-app-dev-api"
361
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
362
+ - |
363
+ cat > __all_values.yml <<EOF
364
+ env:
365
+ secret:
366
+ POSTGRESQL_PASSWORD: |-
367
+ $(printf %s "$CL_dev_api_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
368
+ cloudsqlProxyCredentials: |-
369
+ $(printf %s "$CL_dev_api_cloudsqlProxyCredentials" | sed '1!s/^/ /')
370
+ public:
371
+ ENV_SHORT: |-
372
+ dev
373
+ APP_DIR: |-
374
+ api
375
+ ENV_TYPE: |-
376
+ dev
377
+ BUILD_INFO_BUILD_ID: |-
378
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
379
+ BUILD_INFO_BUILD_TIME: |-
380
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
381
+ BUILD_INFO_CURRENT_VERSION: |-
382
+ $(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/^/ /')
383
+ HOSTNAME: |-
384
+ api.dev.test-app.pan.panter.cloud
385
+ ROOT_URL: |-
386
+ https://api.dev.test-app.pan.panter.cloud
387
+ HOSTNAME_INTERNAL: |-
388
+ api.dev.test-app.pan.panter.cloud
389
+ ROOT_URL_INTERNAL: |-
390
+ https://api.dev.test-app.pan.panter.cloud
391
+ KUBE_NAMESPACE: |-
392
+ pan-test-app-dev
393
+ KUBE_APP_NAME: |-
394
+ api
395
+ KUBE_APP_NAME_PREFIX: ""
396
+ _ALL_ENV_VAR_KEYS: |-
397
+ ["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","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
398
+ application:
399
+ host: |-
400
+ api.dev.test-app.pan.panter.cloud
401
+ command: |-
402
+ yarn start
403
+ livenessProbe:
404
+ httpGet:
405
+ path: |-
406
+ __health
407
+ readinessProbe:
408
+ httpGet:
409
+ path: |-
410
+ __health
411
+ startupProbe:
412
+ httpGet:
413
+ path: |-
414
+ __health
415
+ cloudsql:
416
+ enabled: true
417
+ dbUser: |-
418
+ postgres
419
+ instanceConnectionName: |-
420
+ myproject:europe-west6:instance-name
421
+ proxyCredentials: |-
422
+ $CL_dev_api_cloudsqlProxyCredentials
423
+ fullDbName: |-
424
+ pan-test-app-dev-api
425
+ type: |-
426
+ unmanaged
427
+
428
+ EOF
429
+ - collapseable_section_end "writeallvalues"
430
+ - kubernetesCreateSecret
431
+ - kubernetesDeploy
432
+ - echo 'Uploading SBOM to Dependency Track'
433
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
434
+ - echo deployment successful ๐Ÿ˜ป
435
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
436
+ environment:
437
+ name: dev/api
438
+ url: $CL_GITLAB_ENVIRONMENT_URL
439
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | dev '
440
+ auto_stop_in: 4 weeks
441
+ artifacts:
442
+ reports:
443
+ dotenv: gitlab_environment.env
444
+ rules:
445
+ - when: on_success
446
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
447
+ needs:
448
+ - job: api ๐Ÿ‘ฎ lint
449
+ artifacts: false
450
+ - job: 'api ๐Ÿ”จ app | dev '
451
+ artifacts: false
452
+ - job: 'api ๐Ÿ”จ docker | dev '
453
+ artifacts: false
454
+ - job: api ๐Ÿงช test
455
+ artifacts: false
456
+ - job: 'api ๐Ÿงพ sbom | dev '
457
+ artifacts: true
458
+ - job: api ๐Ÿ›ก audit
459
+ artifacts: false
460
+ retry: *a1
461
+ interruptible: true
462
+ allow_failure: false
463
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | dev ':
464
+ stage: stop dev
465
+ image: path/to/docker/kubernetes:the-version
466
+ variables:
467
+ KUBERNETES_CPU_REQUEST: '0.22'
468
+ KUBERNETES_MEMORY_REQUEST: 200Mi
469
+ KUBERNETES_MEMORY_LIMIT: 400Mi
470
+ GIT_STRATEGY: none
471
+ script:
472
+ - collapseable_section_start "injectvars" "Injecting variables"
473
+ - export ENV_SHORT="dev"
474
+ - export APP_DIR="api"
475
+ - export ENV_TYPE="dev"
476
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
477
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
478
+ - 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")"
479
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
480
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
481
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
482
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
483
+ - export KUBE_NAMESPACE="pan-test-app-dev"
484
+ - export KUBE_APP_NAME="api"
485
+ - export KUBE_APP_NAME_PREFIX=""
486
+ - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
487
+ - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
488
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
489
+ - export RELEASE_NAME="pan-test-app-dev-api"
490
+ - export HELM_EXPERIMENTAL_OCI="1"
491
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
492
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
493
+ - export HELM_ARGS=""
494
+ - export COMPONENT_NAME="api"
495
+ - collapseable_section_end "injectvars"
496
+ - 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
497
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
498
+ - 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"
499
+ - kubectl config use-context "kube-pan-test-app-dev-api"
500
+ - kubernetesDelete
501
+ - echo 'Disabling component in Dependency Track'
502
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
503
+ environment:
504
+ name: dev/api
505
+ action: stop
506
+ rules:
507
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
508
+ when: on_success
509
+ - when: manual
510
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
511
+ needs: []
512
+ retry: *a1
513
+ interruptible: true
514
+ allow_failure: true
515
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | dev ':
516
+ stage: rollback dev
517
+ image: path/to/docker/kubernetes:the-version
518
+ variables:
519
+ KUBERNETES_CPU_REQUEST: '0.22'
520
+ KUBERNETES_MEMORY_REQUEST: 200Mi
521
+ KUBERNETES_MEMORY_LIMIT: 400Mi
522
+ GIT_STRATEGY: none
523
+ script:
524
+ - collapseable_section_start "injectvars" "Injecting variables"
525
+ - export ENV_SHORT="dev"
526
+ - export APP_DIR="api"
527
+ - export ENV_TYPE="dev"
528
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
529
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
530
+ - 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")"
531
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
532
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
533
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
534
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
535
+ - export KUBE_NAMESPACE="pan-test-app-dev"
536
+ - export KUBE_APP_NAME="api"
537
+ - export KUBE_APP_NAME_PREFIX=""
538
+ - export POSTGRESQL_PASSWORD="$CL_dev_api_POSTGRESQL_PASSWORD"
539
+ - export cloudsqlProxyCredentials="$CL_dev_api_cloudsqlProxyCredentials"
540
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
541
+ - export RELEASE_NAME="pan-test-app-dev-api"
542
+ - export HELM_EXPERIMENTAL_OCI="1"
543
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
544
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
545
+ - export HELM_ARGS=""
546
+ - export COMPONENT_NAME="api"
547
+ - collapseable_section_end "injectvars"
548
+ - 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
549
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
550
+ - 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"
551
+ - kubectl config use-context "kube-pan-test-app-dev-api"
552
+ - kubernetesRollback
553
+ environment:
554
+ name: dev/api
555
+ action: access
556
+ rules:
557
+ - when: manual
558
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
559
+ needs: []
560
+ retry: *a1
561
+ interruptible: true
562
+ allow_failure: true
563
+ 'api ๐Ÿ”จ app | review ':
564
+ stage: build
565
+ image: path/to/docker/jobs-default:the-version
566
+ variables:
567
+ KUBERNETES_CPU_REQUEST: '0.45'
568
+ KUBERNETES_MEMORY_REQUEST: 1Gi
569
+ KUBERNETES_MEMORY_LIMIT: 4Gi
570
+ script:
571
+ - collapseable_section_start "injectvars" "Injecting variables"
572
+ - export ENV_SHORT="review"
573
+ - export APP_DIR="api"
574
+ - export ENV_TYPE="review"
575
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
576
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
577
+ - 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")"
578
+ - 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"
579
+ - 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"
580
+ - 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"
581
+ - 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"
582
+ - export KUBE_NAMESPACE="pan-test-app-review"
583
+ - 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"
584
+ - 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"; })-"
585
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
586
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
587
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
588
+ - collapseable_section_end "injectvars"
589
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
590
+ - collapseable_section_start "nodeinstall" "Ensure node version"
591
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
592
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
593
+ - collapseable_section_end "nodeinstall"
594
+ - cd api
595
+ - collapseable_section_start "nodeinstall" "Ensure node version"
596
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
597
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
598
+ - collapseable_section_end "nodeinstall"
599
+ - collapseable_section_start "yarninstall" "Yarn install"
600
+ - yarn install --immutable
601
+ - collapseable_section_end "yarninstall"
602
+ - yarn build
603
+ cache:
604
+ - key: api-yarn
605
+ policy: pull-push
606
+ paths:
607
+ - api/.yarn
608
+ - key: api-node-modules
609
+ policy: pull-push
610
+ paths:
611
+ - api/node_modules
612
+ artifacts:
613
+ paths:
614
+ - api/__build_info.json
615
+ - api/.next
616
+ - api/dist
617
+ expire_in: 1 day
618
+ when: always
619
+ reports: {}
620
+ rules:
621
+ - if: $CI_MERGE_REQUEST_ID
622
+ needs: []
623
+ retry: *a1
624
+ interruptible: true
625
+ 'api ๐Ÿ”จ docker | review ':
626
+ stage: build
627
+ image: path/to/docker/docker-build:the-version
628
+ services:
629
+ - name: docker:24.0.6-dind
630
+ command:
631
+ - --tls=false
632
+ - --registry-mirror=https://mirror.gcr.io
633
+ variables:
634
+ DOCKER_HOST: tcp://docker:2375
635
+ DOCKER_TLS_CERTDIR: ''
636
+ DOCKER_DRIVER: overlay2
637
+ DOCKER_BUILDKIT: '1'
638
+ KUBERNETES_CPU_REQUEST: '0.45'
639
+ KUBERNETES_MEMORY_REQUEST: 1Gi
640
+ KUBERNETES_MEMORY_LIMIT: 2Gi
641
+ script:
642
+ - collapseable_section_start "injectvars" "Injecting variables"
643
+ - export APP_DIR="api"
644
+ - export DOCKER_BUILD_CONTEXT="."
645
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
646
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
647
+ - export DOCKER_IMAGE_NAME="review/api"
648
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
649
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
650
+ - |-
651
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
652
+ RUN yarn plugin import workspace-tools
653
+ RUN yarn workspaces focus --production && yarn rebuild"
654
+ - |-
655
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
656
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
657
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
658
+ COPY --chown=node:node .yarn /app/.yarn"
659
+ - collapseable_section_end "injectvars"
660
+ - ensureNodeDockerfile
661
+ - collapseable_section_start "docker-login" "Docker Login"
662
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
663
+ - collapseable_section_end "docker-login"
664
+ - collapseable_section_start "docker-build" "Docker build"
665
+ - 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
666
+ - collapseable_section_end "docker-build"
667
+ - collapseable_section_start "docker-push" "Docker push and tag"
668
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
669
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
670
+ - docker push $DOCKER_CACHE_IMAGE
671
+ - collapseable_section_end "docker-push"
672
+ cache:
673
+ - key: api-yarn
674
+ policy: pull
675
+ paths:
676
+ - api/.yarn
677
+ rules:
678
+ - if: $CI_MERGE_REQUEST_ID
679
+ needs:
680
+ - 'api ๐Ÿ”จ app | review '
681
+ retry: *a1
682
+ interruptible: true
683
+ 'api ๐Ÿงพ sbom | review ':
684
+ stage: build
685
+ image:
686
+ name: aquasec/trivy:0.58.2
687
+ entrypoint:
688
+ - ''
689
+ variables: {}
690
+ script:
691
+ - collapseable_section_start "injectvars" "Injecting variables"
692
+ - collapseable_section_end "injectvars"
693
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
694
+ artifacts:
695
+ paths:
696
+ - __sbom.json
697
+ rules:
698
+ - if: $CI_MERGE_REQUEST_ID
699
+ needs: []
700
+ retry: *a1
701
+ interruptible: true
702
+ allow_failure: true
703
+ 'api ๐Ÿš€ Deploy | review ':
704
+ stage: deploy review
705
+ image: path/to/docker/kubernetes:the-version
706
+ variables:
707
+ KUBERNETES_CPU_REQUEST: '0.22'
708
+ KUBERNETES_MEMORY_REQUEST: 200Mi
709
+ KUBERNETES_MEMORY_LIMIT: 400Mi
710
+ script:
711
+ - collapseable_section_start "injectvars" "Injecting variables"
712
+ - export ENV_SHORT="review"
713
+ - export APP_DIR="api"
714
+ - export ENV_TYPE="review"
715
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
716
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
717
+ - 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")"
718
+ - 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"
719
+ - 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"
720
+ - 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"
721
+ - 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"
722
+ - export KUBE_NAMESPACE="pan-test-app-review"
723
+ - 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"
724
+ - 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"; })-"
725
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
726
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
727
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
728
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
729
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
730
+ - export DOCKER_IMAGE_NAME="review/api"
731
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
732
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
733
+ - 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"
734
+ - export HELM_EXPERIMENTAL_OCI="1"
735
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
736
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
737
+ - export HELM_ARGS=""
738
+ - export COMPONENT_NAME="api"
739
+ - collapseable_section_end "injectvars"
740
+ - 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
741
+ - 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"
742
+ - 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"
743
+ - 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"
744
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
745
+ - |
746
+ cat > __all_values.yml <<EOF
747
+ env:
748
+ secret:
749
+ POSTGRESQL_PASSWORD: |-
750
+ $(printf %s "$CL_review_api_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
751
+ cloudsqlProxyCredentials: |-
752
+ $(printf %s "$CL_review_api_cloudsqlProxyCredentials" | sed '1!s/^/ /')
753
+ public:
754
+ ENV_SHORT: |-
755
+ review
756
+ APP_DIR: |-
757
+ api
758
+ ENV_TYPE: |-
759
+ review
760
+ BUILD_INFO_BUILD_ID: |-
761
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
762
+ BUILD_INFO_BUILD_TIME: |-
763
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
764
+ BUILD_INFO_CURRENT_VERSION: |-
765
+ $(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/^/ /')
766
+ HOSTNAME: |-
767
+ $(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/^/ /')
768
+ ROOT_URL: |-
769
+ $(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/^/ /')
770
+ HOSTNAME_INTERNAL: |-
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
+ ROOT_URL_INTERNAL: |-
773
+ $(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/^/ /')
774
+ KUBE_NAMESPACE: |-
775
+ pan-test-app-review
776
+ KUBE_APP_NAME: |-
777
+ $(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/^/ /')
778
+ KUBE_APP_NAME_PREFIX: |-
779
+ $(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/^/ /')
780
+ _ALL_ENV_VAR_KEYS: |-
781
+ ["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","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
782
+ application:
783
+ host: |-
784
+ $(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/^/ /')
785
+ command: |-
786
+ yarn start
787
+ livenessProbe:
788
+ httpGet:
789
+ path: |-
790
+ __health
791
+ readinessProbe:
792
+ httpGet:
793
+ path: |-
794
+ __health
795
+ startupProbe:
796
+ httpGet:
797
+ path: |-
798
+ __health
799
+ cloudsql:
800
+ enabled: true
801
+ dbUser: |-
802
+ postgres
803
+ instanceConnectionName: |-
804
+ myproject:europe-west6:instance-name
805
+ proxyCredentials: |-
806
+ $CL_review_api_cloudsqlProxyCredentials
807
+ fullDbName: |-
808
+ $(printf %s "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" | sed '1!s/^/ /')
809
+ type: |-
810
+ unmanaged
811
+
812
+ EOF
813
+ - collapseable_section_end "writeallvalues"
814
+ - kubernetesCreateSecret
815
+ - kubernetesDeploy
816
+ - echo 'Uploading SBOM to Dependency Track'
817
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
818
+ - echo deployment successful ๐Ÿ˜ป
819
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
820
+ environment:
821
+ name: review/$CI_COMMIT_REF_NAME/api
822
+ url: $CL_GITLAB_ENVIRONMENT_URL
823
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | review '
824
+ auto_stop_in: 1 week
825
+ artifacts:
826
+ reports:
827
+ dotenv: gitlab_environment.env
828
+ rules:
829
+ - when: on_success
830
+ if: $CI_MERGE_REQUEST_ID
831
+ needs:
832
+ - job: api ๐Ÿ‘ฎ lint
833
+ artifacts: false
834
+ - job: 'api ๐Ÿ”จ app | review '
835
+ artifacts: false
836
+ - job: 'api ๐Ÿ”จ docker | review '
837
+ artifacts: false
838
+ - job: api ๐Ÿงช test
839
+ artifacts: false
840
+ - job: 'api ๐Ÿงพ sbom | review '
841
+ artifacts: true
842
+ - job: api ๐Ÿ›ก audit
843
+ artifacts: false
844
+ retry: *a1
845
+ interruptible: true
846
+ allow_failure: false
847
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | review ':
848
+ stage: stop review
849
+ image: path/to/docker/kubernetes:the-version
850
+ variables:
851
+ KUBERNETES_CPU_REQUEST: '0.22'
852
+ KUBERNETES_MEMORY_REQUEST: 200Mi
853
+ KUBERNETES_MEMORY_LIMIT: 400Mi
854
+ GIT_STRATEGY: none
855
+ script:
856
+ - collapseable_section_start "injectvars" "Injecting variables"
857
+ - export ENV_SHORT="review"
858
+ - export APP_DIR="api"
859
+ - export ENV_TYPE="review"
860
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
861
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
862
+ - 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")"
863
+ - 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"
864
+ - 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"
865
+ - 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"
866
+ - 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"
867
+ - export KUBE_NAMESPACE="pan-test-app-review"
868
+ - 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"
869
+ - 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"; })-"
870
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
871
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
872
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
873
+ - 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"
874
+ - export HELM_EXPERIMENTAL_OCI="1"
875
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
876
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
877
+ - export HELM_ARGS=""
878
+ - export COMPONENT_NAME="api"
879
+ - collapseable_section_end "injectvars"
880
+ - 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
881
+ - 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"
882
+ - 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"
883
+ - 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"
884
+ - kubernetesDelete
885
+ - echo 'Disabling component in Dependency Track'
886
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
887
+ environment:
888
+ name: review/$CI_COMMIT_REF_NAME/api
889
+ action: stop
890
+ rules:
891
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
892
+ when: on_success
893
+ - when: manual
894
+ if: $CI_MERGE_REQUEST_ID
895
+ needs: []
896
+ retry: *a1
897
+ interruptible: true
898
+ allow_failure: true
899
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | review ':
900
+ stage: rollback review
901
+ image: path/to/docker/kubernetes:the-version
902
+ variables:
903
+ KUBERNETES_CPU_REQUEST: '0.22'
904
+ KUBERNETES_MEMORY_REQUEST: 200Mi
905
+ KUBERNETES_MEMORY_LIMIT: 400Mi
906
+ GIT_STRATEGY: none
907
+ script:
908
+ - collapseable_section_start "injectvars" "Injecting variables"
909
+ - export ENV_SHORT="review"
910
+ - export APP_DIR="api"
911
+ - export ENV_TYPE="review"
912
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
913
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
914
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
915
+ - export HOSTNAME="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
916
+ - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
917
+ - export HOSTNAME_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
918
+ - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
919
+ - export KUBE_NAMESPACE="pan-test-app-review"
920
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
921
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
922
+ - export POSTGRESQL_PASSWORD="$CL_review_api_POSTGRESQL_PASSWORD"
923
+ - export cloudsqlProxyCredentials="$CL_review_api_cloudsqlProxyCredentials"
924
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
925
+ - export RELEASE_NAME="pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
926
+ - export HELM_EXPERIMENTAL_OCI="1"
927
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
928
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
929
+ - export HELM_ARGS=""
930
+ - export COMPONENT_NAME="api"
931
+ - collapseable_section_end "injectvars"
932
+ - kubectl config set-cluster "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
933
+ - kubectl config set-credentials "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --token="$CL_review_api_KUBE_TOKEN"
934
+ - kubectl config set-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --cluster="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --user="kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" --namespace="pan-test-app-review"
935
+ - kubectl config use-context "kube-pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
936
+ - kubernetesRollback
937
+ environment:
938
+ name: review/$CI_COMMIT_REF_NAME/api
939
+ action: access
940
+ rules:
941
+ - when: manual
942
+ if: $CI_MERGE_REQUEST_ID
943
+ needs: []
944
+ retry: *a1
945
+ interruptible: true
946
+ allow_failure: true
947
+ 'api ๐Ÿ”จ app | stage ':
948
+ stage: build
949
+ image: path/to/docker/jobs-default:the-version
950
+ variables:
951
+ KUBERNETES_CPU_REQUEST: '0.45'
952
+ KUBERNETES_MEMORY_REQUEST: 1Gi
953
+ KUBERNETES_MEMORY_LIMIT: 4Gi
954
+ script:
955
+ - collapseable_section_start "injectvars" "Injecting variables"
956
+ - export ENV_SHORT="stage"
957
+ - export APP_DIR="api"
958
+ - export ENV_TYPE="stage"
959
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
960
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
961
+ - 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")"
962
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
963
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
964
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
965
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
966
+ - export KUBE_NAMESPACE="pan-test-app-stage"
967
+ - export KUBE_APP_NAME="api"
968
+ - export KUBE_APP_NAME_PREFIX=""
969
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
970
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
971
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
972
+ - collapseable_section_end "injectvars"
973
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
974
+ - collapseable_section_start "nodeinstall" "Ensure node version"
975
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
976
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
977
+ - collapseable_section_end "nodeinstall"
978
+ - cd api
979
+ - collapseable_section_start "nodeinstall" "Ensure node version"
980
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
981
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
982
+ - collapseable_section_end "nodeinstall"
983
+ - collapseable_section_start "yarninstall" "Yarn install"
984
+ - yarn install --immutable
985
+ - collapseable_section_end "yarninstall"
986
+ - yarn build
987
+ cache:
988
+ - key: api-yarn
989
+ policy: pull-push
990
+ paths:
991
+ - api/.yarn
992
+ - key: api-node-modules
993
+ policy: pull-push
994
+ paths:
995
+ - api/node_modules
996
+ artifacts:
997
+ paths:
998
+ - api/__build_info.json
999
+ - api/.next
1000
+ - api/dist
1001
+ expire_in: 1 day
1002
+ when: always
1003
+ reports: {}
1004
+ rules:
1005
+ - if: $CI_COMMIT_TAG
1006
+ needs: []
1007
+ retry: *a1
1008
+ interruptible: true
1009
+ 'api ๐Ÿ”จ docker | stage ':
1010
+ stage: build
1011
+ image: path/to/docker/docker-build:the-version
1012
+ services:
1013
+ - name: docker:24.0.6-dind
1014
+ command:
1015
+ - --tls=false
1016
+ - --registry-mirror=https://mirror.gcr.io
1017
+ variables:
1018
+ DOCKER_HOST: tcp://docker:2375
1019
+ DOCKER_TLS_CERTDIR: ''
1020
+ DOCKER_DRIVER: overlay2
1021
+ DOCKER_BUILDKIT: '1'
1022
+ KUBERNETES_CPU_REQUEST: '0.45'
1023
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1024
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1025
+ script:
1026
+ - collapseable_section_start "injectvars" "Injecting variables"
1027
+ - export APP_DIR="api"
1028
+ - export DOCKER_BUILD_CONTEXT="."
1029
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1030
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1031
+ - export DOCKER_IMAGE_NAME="stage/api"
1032
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1033
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1034
+ - |-
1035
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1036
+ RUN yarn plugin import workspace-tools
1037
+ RUN yarn workspaces focus --production && yarn rebuild"
1038
+ - |-
1039
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1040
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1041
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1042
+ COPY --chown=node:node .yarn /app/.yarn"
1043
+ - collapseable_section_end "injectvars"
1044
+ - ensureNodeDockerfile
1045
+ - collapseable_section_start "docker-login" "Docker Login"
1046
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1047
+ - collapseable_section_end "docker-login"
1048
+ - collapseable_section_start "docker-build" "Docker build"
1049
+ - 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
1050
+ - collapseable_section_end "docker-build"
1051
+ - collapseable_section_start "docker-push" "Docker push and tag"
1052
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1053
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1054
+ - docker push $DOCKER_CACHE_IMAGE
1055
+ - collapseable_section_end "docker-push"
1056
+ cache:
1057
+ - key: api-yarn
1058
+ policy: pull
1059
+ paths:
1060
+ - api/.yarn
1061
+ rules:
1062
+ - if: $CI_COMMIT_TAG
1063
+ needs:
1064
+ - 'api ๐Ÿ”จ app | stage '
1065
+ retry: *a1
1066
+ interruptible: true
1067
+ 'api ๐Ÿงพ sbom | stage ':
1068
+ stage: build
1069
+ image:
1070
+ name: aquasec/trivy:0.58.2
1071
+ entrypoint:
1072
+ - ''
1073
+ variables: {}
1074
+ script:
1075
+ - collapseable_section_start "injectvars" "Injecting variables"
1076
+ - collapseable_section_end "injectvars"
1077
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1078
+ artifacts:
1079
+ paths:
1080
+ - __sbom.json
1081
+ rules:
1082
+ - if: $CI_COMMIT_TAG
1083
+ needs: []
1084
+ retry: *a1
1085
+ interruptible: true
1086
+ allow_failure: true
1087
+ 'api ๐Ÿš€ Deploy | stage ':
1088
+ stage: deploy stage
1089
+ image: path/to/docker/kubernetes:the-version
1090
+ variables:
1091
+ KUBERNETES_CPU_REQUEST: '0.22'
1092
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1093
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1094
+ script:
1095
+ - collapseable_section_start "injectvars" "Injecting variables"
1096
+ - export ENV_SHORT="stage"
1097
+ - export APP_DIR="api"
1098
+ - export ENV_TYPE="stage"
1099
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1100
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1101
+ - 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")"
1102
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
1103
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1104
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
1105
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1106
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1107
+ - export KUBE_APP_NAME="api"
1108
+ - export KUBE_APP_NAME_PREFIX=""
1109
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1110
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1111
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1112
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1113
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1114
+ - export DOCKER_IMAGE_NAME="stage/api"
1115
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1116
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1117
+ - export RELEASE_NAME="pan-test-app-stage-api"
1118
+ - export HELM_EXPERIMENTAL_OCI="1"
1119
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1120
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1121
+ - export HELM_ARGS=""
1122
+ - export COMPONENT_NAME="api"
1123
+ - collapseable_section_end "injectvars"
1124
+ - 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
1125
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1126
+ - 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"
1127
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1128
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
1129
+ - |
1130
+ cat > __all_values.yml <<EOF
1131
+ env:
1132
+ secret:
1133
+ POSTGRESQL_PASSWORD: |-
1134
+ $(printf %s "$CL_stage_api_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
1135
+ cloudsqlProxyCredentials: |-
1136
+ $(printf %s "$CL_stage_api_cloudsqlProxyCredentials" | sed '1!s/^/ /')
1137
+ public:
1138
+ ENV_SHORT: |-
1139
+ stage
1140
+ APP_DIR: |-
1141
+ api
1142
+ ENV_TYPE: |-
1143
+ stage
1144
+ BUILD_INFO_BUILD_ID: |-
1145
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1146
+ BUILD_INFO_BUILD_TIME: |-
1147
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1148
+ BUILD_INFO_CURRENT_VERSION: |-
1149
+ $(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/^/ /')
1150
+ HOSTNAME: |-
1151
+ api.stage.test-app.pan.panter.cloud
1152
+ ROOT_URL: |-
1153
+ https://api.stage.test-app.pan.panter.cloud
1154
+ HOSTNAME_INTERNAL: |-
1155
+ api.stage.test-app.pan.panter.cloud
1156
+ ROOT_URL_INTERNAL: |-
1157
+ https://api.stage.test-app.pan.panter.cloud
1158
+ KUBE_NAMESPACE: |-
1159
+ pan-test-app-stage
1160
+ KUBE_APP_NAME: |-
1161
+ api
1162
+ KUBE_APP_NAME_PREFIX: ""
1163
+ _ALL_ENV_VAR_KEYS: |-
1164
+ ["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","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
1165
+ application:
1166
+ host: |-
1167
+ api.stage.test-app.pan.panter.cloud
1168
+ command: |-
1169
+ yarn start
1170
+ livenessProbe:
1171
+ httpGet:
1172
+ path: |-
1173
+ __health
1174
+ readinessProbe:
1175
+ httpGet:
1176
+ path: |-
1177
+ __health
1178
+ startupProbe:
1179
+ httpGet:
1180
+ path: |-
1181
+ __health
1182
+ cloudsql:
1183
+ enabled: true
1184
+ dbUser: |-
1185
+ postgres
1186
+ instanceConnectionName: |-
1187
+ myproject:europe-west6:instance-name
1188
+ proxyCredentials: |-
1189
+ $CL_stage_api_cloudsqlProxyCredentials
1190
+ fullDbName: |-
1191
+ pan-test-app-stage-api
1192
+ type: |-
1193
+ unmanaged
1194
+
1195
+ EOF
1196
+ - collapseable_section_end "writeallvalues"
1197
+ - kubernetesCreateSecret
1198
+ - kubernetesDeploy
1199
+ - echo 'Uploading SBOM to Dependency Track'
1200
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
1201
+ - echo deployment successful ๐Ÿ˜ป
1202
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1203
+ environment:
1204
+ name: stage/api
1205
+ url: $CL_GITLAB_ENVIRONMENT_URL
1206
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | stage '
1207
+ artifacts:
1208
+ reports:
1209
+ dotenv: gitlab_environment.env
1210
+ rules:
1211
+ - when: on_success
1212
+ if: $CI_COMMIT_TAG
1213
+ needs:
1214
+ - job: 'api ๐Ÿ”จ app | stage '
1215
+ artifacts: false
1216
+ - job: 'api ๐Ÿ”จ docker | stage '
1217
+ artifacts: false
1218
+ - job: 'api ๐Ÿงพ sbom | stage '
1219
+ artifacts: true
1220
+ retry: *a1
1221
+ interruptible: true
1222
+ allow_failure: false
1223
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | stage ':
1224
+ stage: stop stage
1225
+ image: path/to/docker/kubernetes:the-version
1226
+ variables:
1227
+ KUBERNETES_CPU_REQUEST: '0.22'
1228
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1229
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1230
+ GIT_STRATEGY: none
1231
+ script:
1232
+ - collapseable_section_start "injectvars" "Injecting variables"
1233
+ - export ENV_SHORT="stage"
1234
+ - export APP_DIR="api"
1235
+ - export ENV_TYPE="stage"
1236
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1237
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1238
+ - 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")"
1239
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
1240
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1241
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
1242
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1243
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1244
+ - export KUBE_APP_NAME="api"
1245
+ - export KUBE_APP_NAME_PREFIX=""
1246
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1247
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1248
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1249
+ - export RELEASE_NAME="pan-test-app-stage-api"
1250
+ - export HELM_EXPERIMENTAL_OCI="1"
1251
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1252
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1253
+ - export HELM_ARGS=""
1254
+ - export COMPONENT_NAME="api"
1255
+ - collapseable_section_end "injectvars"
1256
+ - 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
1257
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1258
+ - 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"
1259
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1260
+ - kubernetesDelete
1261
+ - echo 'Disabling component in Dependency Track'
1262
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
1263
+ environment:
1264
+ name: stage/api
1265
+ action: stop
1266
+ rules:
1267
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1268
+ when: on_success
1269
+ - when: manual
1270
+ if: $CI_COMMIT_TAG
1271
+ needs: []
1272
+ retry: *a1
1273
+ interruptible: true
1274
+ allow_failure: true
1275
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | stage ':
1276
+ stage: rollback stage
1277
+ image: path/to/docker/kubernetes:the-version
1278
+ variables:
1279
+ KUBERNETES_CPU_REQUEST: '0.22'
1280
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1281
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1282
+ GIT_STRATEGY: none
1283
+ script:
1284
+ - collapseable_section_start "injectvars" "Injecting variables"
1285
+ - export ENV_SHORT="stage"
1286
+ - export APP_DIR="api"
1287
+ - export ENV_TYPE="stage"
1288
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1289
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1290
+ - 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")"
1291
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
1292
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1293
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
1294
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1295
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1296
+ - export KUBE_APP_NAME="api"
1297
+ - export KUBE_APP_NAME_PREFIX=""
1298
+ - export POSTGRESQL_PASSWORD="$CL_stage_api_POSTGRESQL_PASSWORD"
1299
+ - export cloudsqlProxyCredentials="$CL_stage_api_cloudsqlProxyCredentials"
1300
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1301
+ - export RELEASE_NAME="pan-test-app-stage-api"
1302
+ - export HELM_EXPERIMENTAL_OCI="1"
1303
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1304
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1305
+ - export HELM_ARGS=""
1306
+ - export COMPONENT_NAME="api"
1307
+ - collapseable_section_end "injectvars"
1308
+ - 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
1309
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1310
+ - 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"
1311
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1312
+ - kubernetesRollback
1313
+ environment:
1314
+ name: stage/api
1315
+ action: access
1316
+ rules:
1317
+ - when: manual
1318
+ if: $CI_COMMIT_TAG
1319
+ needs: []
1320
+ retry: *a1
1321
+ interruptible: true
1322
+ allow_failure: true
1323
+ 'api ๐Ÿ”จ app | prod ':
1324
+ stage: build
1325
+ image: path/to/docker/jobs-default:the-version
1326
+ variables:
1327
+ KUBERNETES_CPU_REQUEST: '0.45'
1328
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1329
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1330
+ script:
1331
+ - collapseable_section_start "injectvars" "Injecting variables"
1332
+ - export ENV_SHORT="prod"
1333
+ - export APP_DIR="api"
1334
+ - export ENV_TYPE="prod"
1335
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1336
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1337
+ - 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")"
1338
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1339
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1340
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1341
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1342
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1343
+ - export KUBE_APP_NAME="api"
1344
+ - export KUBE_APP_NAME_PREFIX=""
1345
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1346
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1347
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1348
+ - collapseable_section_end "injectvars"
1349
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1350
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1351
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1352
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1353
+ - collapseable_section_end "nodeinstall"
1354
+ - cd api
1355
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1356
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1357
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1358
+ - collapseable_section_end "nodeinstall"
1359
+ - collapseable_section_start "yarninstall" "Yarn install"
1360
+ - yarn install --immutable
1361
+ - collapseable_section_end "yarninstall"
1362
+ - yarn build
1363
+ cache:
1364
+ - key: api-yarn
1365
+ policy: pull-push
1366
+ paths:
1367
+ - api/.yarn
1368
+ - key: api-node-modules
1369
+ policy: pull-push
1370
+ paths:
1371
+ - api/node_modules
1372
+ artifacts:
1373
+ paths:
1374
+ - api/__build_info.json
1375
+ - api/.next
1376
+ - api/dist
1377
+ expire_in: 1 day
1378
+ when: always
1379
+ reports: {}
1380
+ rules:
1381
+ - if: $CI_COMMIT_TAG
1382
+ needs: []
1383
+ retry: *a1
1384
+ interruptible: true
1385
+ 'api ๐Ÿ”จ docker | prod ':
1386
+ stage: build
1387
+ image: path/to/docker/docker-build:the-version
1388
+ services:
1389
+ - name: docker:24.0.6-dind
1390
+ command:
1391
+ - --tls=false
1392
+ - --registry-mirror=https://mirror.gcr.io
1393
+ variables:
1394
+ DOCKER_HOST: tcp://docker:2375
1395
+ DOCKER_TLS_CERTDIR: ''
1396
+ DOCKER_DRIVER: overlay2
1397
+ DOCKER_BUILDKIT: '1'
1398
+ KUBERNETES_CPU_REQUEST: '0.45'
1399
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1400
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1401
+ script:
1402
+ - collapseable_section_start "injectvars" "Injecting variables"
1403
+ - export APP_DIR="api"
1404
+ - export DOCKER_BUILD_CONTEXT="."
1405
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1406
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1407
+ - export DOCKER_IMAGE_NAME="prod/api"
1408
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1409
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1410
+ - |-
1411
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1412
+ RUN yarn plugin import workspace-tools
1413
+ RUN yarn workspaces focus --production && yarn rebuild"
1414
+ - |-
1415
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1416
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1417
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1418
+ COPY --chown=node:node .yarn /app/.yarn"
1419
+ - collapseable_section_end "injectvars"
1420
+ - ensureNodeDockerfile
1421
+ - collapseable_section_start "docker-login" "Docker Login"
1422
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1423
+ - collapseable_section_end "docker-login"
1424
+ - collapseable_section_start "docker-build" "Docker build"
1425
+ - 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
1426
+ - collapseable_section_end "docker-build"
1427
+ - collapseable_section_start "docker-push" "Docker push and tag"
1428
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1429
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1430
+ - docker push $DOCKER_CACHE_IMAGE
1431
+ - collapseable_section_end "docker-push"
1432
+ cache:
1433
+ - key: api-yarn
1434
+ policy: pull
1435
+ paths:
1436
+ - api/.yarn
1437
+ rules:
1438
+ - if: $CI_COMMIT_TAG
1439
+ needs:
1440
+ - 'api ๐Ÿ”จ app | prod '
1441
+ retry: *a1
1442
+ interruptible: true
1443
+ 'api ๐Ÿงพ sbom | prod ':
1444
+ stage: build
1445
+ image:
1446
+ name: aquasec/trivy:0.58.2
1447
+ entrypoint:
1448
+ - ''
1449
+ variables: {}
1450
+ script:
1451
+ - collapseable_section_start "injectvars" "Injecting variables"
1452
+ - collapseable_section_end "injectvars"
1453
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1454
+ artifacts:
1455
+ paths:
1456
+ - __sbom.json
1457
+ rules:
1458
+ - if: $CI_COMMIT_TAG
1459
+ needs: []
1460
+ retry: *a1
1461
+ interruptible: true
1462
+ allow_failure: true
1463
+ 'api ๐Ÿš€ Deploy | prod ':
1464
+ stage: deploy prod
1465
+ image: path/to/docker/kubernetes:the-version
1466
+ variables:
1467
+ KUBERNETES_CPU_REQUEST: '0.22'
1468
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1469
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1470
+ script:
1471
+ - collapseable_section_start "injectvars" "Injecting variables"
1472
+ - export ENV_SHORT="prod"
1473
+ - export APP_DIR="api"
1474
+ - export ENV_TYPE="prod"
1475
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1476
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1477
+ - 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")"
1478
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1479
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1480
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1481
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1482
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1483
+ - export KUBE_APP_NAME="api"
1484
+ - export KUBE_APP_NAME_PREFIX=""
1485
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1486
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1487
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1488
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1489
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1490
+ - export DOCKER_IMAGE_NAME="prod/api"
1491
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1492
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1493
+ - export RELEASE_NAME="pan-test-app-prod-api"
1494
+ - export HELM_EXPERIMENTAL_OCI="1"
1495
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1496
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1497
+ - export HELM_ARGS=""
1498
+ - export COMPONENT_NAME="api"
1499
+ - collapseable_section_end "injectvars"
1500
+ - 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
1501
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1502
+ - 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"
1503
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1504
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
1505
+ - |
1506
+ cat > __all_values.yml <<EOF
1507
+ env:
1508
+ secret:
1509
+ POSTGRESQL_PASSWORD: |-
1510
+ $(printf %s "$CL_prod_api_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
1511
+ cloudsqlProxyCredentials: |-
1512
+ $(printf %s "$CL_prod_api_cloudsqlProxyCredentials" | sed '1!s/^/ /')
1513
+ public:
1514
+ ENV_SHORT: |-
1515
+ prod
1516
+ APP_DIR: |-
1517
+ api
1518
+ ENV_TYPE: |-
1519
+ prod
1520
+ BUILD_INFO_BUILD_ID: |-
1521
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1522
+ BUILD_INFO_BUILD_TIME: |-
1523
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1524
+ BUILD_INFO_CURRENT_VERSION: |-
1525
+ $(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/^/ /')
1526
+ HOSTNAME: |-
1527
+ api.prod.test-app.pan.panter.cloud
1528
+ ROOT_URL: |-
1529
+ https://api.prod.test-app.pan.panter.cloud
1530
+ HOSTNAME_INTERNAL: |-
1531
+ api.prod.test-app.pan.panter.cloud
1532
+ ROOT_URL_INTERNAL: |-
1533
+ https://api.prod.test-app.pan.panter.cloud
1534
+ KUBE_NAMESPACE: |-
1535
+ pan-test-app-prod
1536
+ KUBE_APP_NAME: |-
1537
+ api
1538
+ KUBE_APP_NAME_PREFIX: ""
1539
+ _ALL_ENV_VAR_KEYS: |-
1540
+ ["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","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials"]
1541
+ application:
1542
+ host: |-
1543
+ api.prod.test-app.pan.panter.cloud
1544
+ command: |-
1545
+ yarn start
1546
+ livenessProbe:
1547
+ httpGet:
1548
+ path: |-
1549
+ __health
1550
+ readinessProbe:
1551
+ httpGet:
1552
+ path: |-
1553
+ __health
1554
+ startupProbe:
1555
+ httpGet:
1556
+ path: |-
1557
+ __health
1558
+ cloudsql:
1559
+ enabled: true
1560
+ dbUser: |-
1561
+ postgres
1562
+ instanceConnectionName: |-
1563
+ myproject:europe-west6:instance-name
1564
+ proxyCredentials: |-
1565
+ $CL_prod_api_cloudsqlProxyCredentials
1566
+ fullDbName: |-
1567
+ pan-test-app-prod-api
1568
+ type: |-
1569
+ unmanaged
1570
+
1571
+ EOF
1572
+ - collapseable_section_end "writeallvalues"
1573
+ - kubernetesCreateSecret
1574
+ - kubernetesDeploy
1575
+ - echo 'Uploading SBOM to Dependency Track'
1576
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
1577
+ - echo deployment successful ๐Ÿ˜ป
1578
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1579
+ environment:
1580
+ name: prod/api
1581
+ url: $CL_GITLAB_ENVIRONMENT_URL
1582
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | prod '
1583
+ artifacts:
1584
+ reports:
1585
+ dotenv: gitlab_environment.env
1586
+ rules:
1587
+ - when: manual
1588
+ if: $CI_COMMIT_TAG
1589
+ needs:
1590
+ - job: 'api ๐Ÿ”จ app | prod '
1591
+ artifacts: false
1592
+ - job: 'api ๐Ÿ”จ docker | prod '
1593
+ artifacts: false
1594
+ - job: 'api ๐Ÿงพ sbom | prod '
1595
+ artifacts: true
1596
+ retry: *a1
1597
+ interruptible: true
1598
+ allow_failure: true
1599
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1600
+ stage: stop prod
1601
+ image: path/to/docker/kubernetes:the-version
1602
+ variables:
1603
+ KUBERNETES_CPU_REQUEST: '0.22'
1604
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1605
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1606
+ GIT_STRATEGY: none
1607
+ script:
1608
+ - collapseable_section_start "injectvars" "Injecting variables"
1609
+ - export ENV_SHORT="prod"
1610
+ - export APP_DIR="api"
1611
+ - export ENV_TYPE="prod"
1612
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1613
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1614
+ - 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")"
1615
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1616
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1617
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1618
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1619
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1620
+ - export KUBE_APP_NAME="api"
1621
+ - export KUBE_APP_NAME_PREFIX=""
1622
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1623
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1624
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1625
+ - export RELEASE_NAME="pan-test-app-prod-api"
1626
+ - export HELM_EXPERIMENTAL_OCI="1"
1627
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1628
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1629
+ - export HELM_ARGS=""
1630
+ - export COMPONENT_NAME="api"
1631
+ - collapseable_section_end "injectvars"
1632
+ - 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
1633
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1634
+ - 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"
1635
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1636
+ - kubernetesDelete
1637
+ - echo 'Disabling component in Dependency Track'
1638
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
1639
+ environment:
1640
+ name: prod/api
1641
+ action: stop
1642
+ rules:
1643
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1644
+ when: on_success
1645
+ - when: manual
1646
+ if: $CI_COMMIT_TAG
1647
+ needs: []
1648
+ retry: *a1
1649
+ interruptible: true
1650
+ allow_failure: true
1651
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | prod ':
1652
+ stage: rollback prod
1653
+ image: path/to/docker/kubernetes:the-version
1654
+ variables:
1655
+ KUBERNETES_CPU_REQUEST: '0.22'
1656
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1657
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1658
+ GIT_STRATEGY: none
1659
+ script:
1660
+ - collapseable_section_start "injectvars" "Injecting variables"
1661
+ - export ENV_SHORT="prod"
1662
+ - export APP_DIR="api"
1663
+ - export ENV_TYPE="prod"
1664
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1665
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1666
+ - 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")"
1667
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1668
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1669
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1670
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1671
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1672
+ - export KUBE_APP_NAME="api"
1673
+ - export KUBE_APP_NAME_PREFIX=""
1674
+ - export POSTGRESQL_PASSWORD="$CL_prod_api_POSTGRESQL_PASSWORD"
1675
+ - export cloudsqlProxyCredentials="$CL_prod_api_cloudsqlProxyCredentials"
1676
+ - 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\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\"]"
1677
+ - export RELEASE_NAME="pan-test-app-prod-api"
1678
+ - export HELM_EXPERIMENTAL_OCI="1"
1679
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1680
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1681
+ - export HELM_ARGS=""
1682
+ - export COMPONENT_NAME="api"
1683
+ - collapseable_section_end "injectvars"
1684
+ - 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
1685
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1686
+ - 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"
1687
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1688
+ - kubernetesRollback
1689
+ environment:
1690
+ name: prod/api
1691
+ action: access
1692
+ rules:
1693
+ - when: manual
1694
+ if: $CI_COMMIT_TAG
1695
+ needs: []
1696
+ retry: *a1
1697
+ interruptible: true
1698
+ allow_failure: true
1699
+ create release:
1700
+ stage: release
1701
+ image: path/to/docker/semantic-release:the-version
1702
+ script:
1703
+ - semanticRelease
1704
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1705
+ rules:
1706
+ - &a2
1707
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1708
+ when: never
1709
+ - &a3
1710
+ if: $CI_PIPELINE_SOURCE == "schedule"
1711
+ when: never
1712
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1713
+ when: on_success
1714
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1715
+ when: manual
1716
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1717
+ when: manual
1718
+ โš ๏ธ force create release:
1719
+ stage: release
1720
+ image: path/to/docker/semantic-release:the-version
1721
+ script:
1722
+ - semanticRelease
1723
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1724
+ rules:
1725
+ - *a2
1726
+ - *a3
1727
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1728
+ when: manual
1729
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1730
+ when: manual
1731
+ needs: []
1732
+ "
1733
+ `;