@catladder/pipeline 0.0.0-more-collapse-deeb54d7 → 0.0.0-multiple-gitlab-includes-3df5566d

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