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

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