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

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