@catladder/pipeline 0.0.0-more-collapse-deeb54d7 โ†’ 0.0.0-multiple-gitlab-includes-1a40efc0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/README.md +17 -0
  2. package/dist/bash/BashExpression.d.ts +36 -0
  3. package/dist/bash/BashExpression.js +114 -0
  4. package/dist/bash/bashEscape.d.ts +34 -0
  5. package/dist/bash/bashEscape.js +114 -0
  6. package/dist/bash/bashExpressionPerPipelineType.d.ts +6 -0
  7. package/dist/bash/bashExpressionPerPipelineType.js +11 -0
  8. package/dist/bash/bashYaml.d.ts +10 -0
  9. package/dist/bash/bashYaml.js +69 -0
  10. package/dist/bash/getInjectVarsScript.d.ts +2 -0
  11. package/dist/bash/getInjectVarsScript.js +47 -0
  12. package/dist/bash/index.d.ts +2 -0
  13. package/dist/bash/index.js +26 -0
  14. package/dist/build/artifacts/createBuildJobArtifact.d.ts +3 -0
  15. package/dist/build/artifacts/createBuildJobArtifact.js +97 -0
  16. package/dist/build/base/__tests__/createArtifactsConfig.test.js +3 -1
  17. package/dist/build/base/constants.d.ts +0 -1
  18. package/dist/build/base/constants.js +4 -3
  19. package/dist/build/base/createAppBuildJob.d.ts +5 -3
  20. package/dist/build/base/createAppBuildJob.js +18 -15
  21. package/dist/build/base/createArtifactsConfig.d.ts +1 -1
  22. package/dist/build/base/createArtifactsConfig.js +3 -1
  23. package/dist/build/base/createBuildJobDefinition.d.ts +6 -0
  24. package/dist/build/base/createBuildJobDefinition.js +58 -0
  25. package/dist/build/base/index.d.ts +7 -4
  26. package/dist/build/base/index.js +17 -6
  27. package/dist/build/base/writeBuildInfo.d.ts +2 -2
  28. package/dist/build/base/writeBuildInfo.js +4 -3
  29. package/dist/build/base/writeDotEnv.d.ts +3 -2
  30. package/dist/build/base/writeDotEnv.js +30 -6
  31. package/dist/build/cache/createJobCache.d.ts +7 -0
  32. package/dist/build/cache/createJobCache.js +115 -0
  33. package/dist/build/cache/getAllCacheConfigsFromConfig.d.ts +3 -0
  34. package/dist/build/cache/getAllCacheConfigsFromConfig.js +64 -0
  35. package/dist/build/cache/transformLegacyJobCache.d.ts +3 -0
  36. package/dist/build/cache/transformLegacyJobCache.js +29 -0
  37. package/dist/build/custom/__tests__/testJob.test.js +15 -16
  38. package/dist/build/custom/buildJob.d.ts +2 -2
  39. package/dist/build/custom/buildJob.js +8 -67
  40. package/dist/build/custom/index.d.ts +2 -2
  41. package/dist/build/custom/index.js +3 -1
  42. package/dist/build/custom/testJob.d.ts +4 -4
  43. package/dist/build/custom/testJob.js +25 -21
  44. package/dist/build/docker.d.ts +48 -39
  45. package/dist/build/docker.js +112 -37
  46. package/dist/build/index.d.ts +14 -7
  47. package/dist/build/index.js +44 -16
  48. package/dist/build/node/buildJob.d.ts +6 -2
  49. package/dist/build/node/buildJob.js +39 -48
  50. package/dist/build/node/cache.d.ts +4 -5
  51. package/dist/build/node/cache.js +18 -23
  52. package/dist/build/node/constants.d.ts +0 -1
  53. package/dist/build/node/constants.js +5 -4
  54. package/dist/build/node/index.d.ts +4 -4
  55. package/dist/build/node/index.js +3 -1
  56. package/dist/build/node/meteor.d.ts +2 -2
  57. package/dist/build/node/meteor.js +10 -12
  58. package/dist/build/node/testJob.d.ts +3 -2
  59. package/dist/build/node/testJob.js +29 -19
  60. package/dist/build/node/yarn.d.ts +3 -2
  61. package/dist/build/node/yarn.js +13 -13
  62. package/dist/build/rails/build.d.ts +2 -2
  63. package/dist/build/rails/build.js +24 -8
  64. package/dist/build/rails/index.d.ts +2 -2
  65. package/dist/build/rails/index.js +3 -1
  66. package/dist/build/rails/test.d.ts +2 -2
  67. package/dist/build/rails/test.js +20 -12
  68. package/dist/build/sbom.d.ts +2 -2
  69. package/dist/build/sbom.js +9 -6
  70. package/dist/build/types.d.ts +152 -47
  71. package/dist/build/types.js +10 -2
  72. package/dist/catladder-gitlab.js +129 -49
  73. package/dist/config/__tests__/configruedEnvs.test.js +3 -1
  74. package/dist/config/__tests__/getAllEnvs.test.js +79 -0
  75. package/dist/config/__tests__/getAllEnvsInAllComponents.test.d.ts +1 -0
  76. package/dist/config/__tests__/getAllEnvsInAllComponents.test.js +73 -0
  77. package/dist/config/configruedEnvs.js +3 -1
  78. package/dist/config/index.js +13 -7
  79. package/dist/config/readConfig.d.ts +2 -2
  80. package/dist/config/readConfig.js +191 -40
  81. package/dist/constants.js +5 -3
  82. package/dist/context/createAllComponentsContext.d.ts +12 -0
  83. package/dist/{pipeline/commitInfo/getCommitInfo.js โ†’ context/createAllComponentsContext.js} +35 -19
  84. package/dist/context/createComponentContext.d.ts +11 -0
  85. package/dist/context/createComponentContext.js +255 -0
  86. package/dist/context/createWorkspaceContext.d.ts +16 -0
  87. package/dist/context/createWorkspaceContext.js +173 -0
  88. package/dist/context/getBuildInfoVariables.d.ts +6 -0
  89. package/dist/context/getBuildInfoVariables.js +55 -0
  90. package/dist/context/getEnvConfig.js +5 -2
  91. package/dist/context/getEnvType.js +3 -1
  92. package/dist/context/getEnvironment.d.ts +3 -3
  93. package/dist/context/getEnvironment.js +11 -12
  94. package/dist/context/getEnvironmentContext.d.ts +7 -3
  95. package/dist/context/getEnvironmentContext.js +21 -11
  96. package/dist/context/getEnvironmentVariables.d.ts +22 -5
  97. package/dist/context/getEnvironmentVariables.js +81 -49
  98. package/dist/context/getLabels.d.ts +2 -2
  99. package/dist/context/getLabels.js +9 -7
  100. package/dist/context/getReviewSlug.d.ts +4 -0
  101. package/dist/context/getReviewSlug.js +21 -0
  102. package/dist/context/index.d.ts +2 -4
  103. package/dist/context/index.js +15 -162
  104. package/dist/context/transformJobOnlyVars.d.ts +5 -2
  105. package/dist/context/transformJobOnlyVars.js +4 -2
  106. package/dist/context/utils/envVars.d.ts +1 -1
  107. package/dist/context/utils/envVars.js +5 -2
  108. package/dist/defaults/index.js +3 -1
  109. package/dist/deploy/base/deploy.d.ts +3 -3
  110. package/dist/deploy/base/deploy.js +38 -22
  111. package/dist/deploy/base/index.d.ts +3 -5
  112. package/dist/deploy/base/index.js +3 -1
  113. package/dist/deploy/base/rollback.d.ts +3 -3
  114. package/dist/deploy/base/rollback.js +13 -9
  115. package/dist/deploy/base/stop.d.ts +3 -3
  116. package/dist/deploy/base/stop.js +16 -11
  117. package/dist/deploy/base/types.d.ts +1 -1
  118. package/dist/deploy/base/types.js +3 -1
  119. package/dist/deploy/base/variables.d.ts +0 -1
  120. package/dist/deploy/base/variables.js +4 -3
  121. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +19 -0
  122. package/dist/deploy/cloudRun/artifactsRegistry.js +125 -0
  123. package/dist/deploy/cloudRun/cleanup.d.ts +2 -0
  124. package/dist/deploy/cloudRun/cleanup.js +53 -0
  125. package/dist/deploy/cloudRun/cloudRunRevisions.d.ts +2 -0
  126. package/dist/deploy/cloudRun/cloudRunRevisions.js +62 -0
  127. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.d.ts +7 -0
  128. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +207 -0
  129. package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +4 -0
  130. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +96 -0
  131. package/dist/deploy/cloudRun/createJobs/common.d.ts +18 -0
  132. package/dist/deploy/cloudRun/createJobs/common.js +93 -0
  133. package/dist/deploy/cloudRun/createJobs/constants.d.ts +1 -0
  134. package/dist/deploy/cloudRun/createJobs/constants.js +7 -0
  135. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.d.ts +2 -0
  136. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +62 -0
  137. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.d.ts +2 -0
  138. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +54 -0
  139. package/dist/deploy/cloudRun/createJobs/index.d.ts +3 -0
  140. package/dist/deploy/cloudRun/createJobs/index.js +57 -0
  141. package/dist/deploy/cloudRun/createJobs/volumes.d.ts +3 -0
  142. package/dist/deploy/cloudRun/createJobs/volumes.js +58 -0
  143. package/dist/deploy/cloudRun/index.d.ts +2 -2
  144. package/dist/deploy/cloudRun/index.js +17 -10
  145. package/dist/deploy/cloudRun/utils/createArgsString.d.ts +3 -1
  146. package/dist/deploy/cloudRun/utils/createArgsString.js +25 -17
  147. package/dist/deploy/cloudRun/utils/database.d.ts +6 -4
  148. package/dist/deploy/cloudRun/utils/database.js +28 -15
  149. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.d.ts +2 -2
  150. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +4 -2
  151. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +2 -0
  152. package/dist/deploy/cloudRun/utils/getServiceName.js +10 -0
  153. package/dist/deploy/cloudRun/utils/jobName.d.ts +2 -1
  154. package/dist/deploy/cloudRun/utils/jobName.js +4 -2
  155. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.d.ts +9 -0
  156. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +18 -0
  157. package/dist/deploy/cloudSql/utils.d.ts +2 -1
  158. package/dist/deploy/cloudSql/utils.js +7 -2
  159. package/dist/deploy/custom/deployJob.d.ts +2 -2
  160. package/dist/deploy/custom/deployJob.js +10 -9
  161. package/dist/deploy/custom/index.d.ts +2 -2
  162. package/dist/deploy/custom/index.js +3 -1
  163. package/dist/deploy/dockerTag/deployJob.d.ts +2 -2
  164. package/dist/deploy/dockerTag/deployJob.js +38 -7
  165. package/dist/deploy/dockerTag/index.d.ts +2 -2
  166. package/dist/deploy/dockerTag/index.js +3 -1
  167. package/dist/deploy/index.d.ts +10 -9
  168. package/dist/deploy/index.js +13 -7
  169. package/dist/deploy/kubernetes/additionalSecretKeys.d.ts +3 -1
  170. package/dist/deploy/kubernetes/additionalSecretKeys.js +3 -1
  171. package/dist/deploy/kubernetes/cloudSql/index.d.ts +6 -5
  172. package/dist/deploy/kubernetes/cloudSql/index.js +14 -21
  173. package/dist/deploy/kubernetes/deployJob.d.ts +2 -2
  174. package/dist/deploy/kubernetes/deployJob.js +23 -22
  175. package/dist/deploy/kubernetes/index.d.ts +2 -2
  176. package/dist/deploy/kubernetes/index.js +52 -15
  177. package/dist/deploy/kubernetes/kubeEnv.d.ts +5 -4
  178. package/dist/deploy/kubernetes/kubeEnv.js +9 -5
  179. package/dist/deploy/kubernetes/kubeValues.d.ts +5 -6
  180. package/dist/deploy/kubernetes/kubeValues.js +16 -18
  181. package/dist/deploy/kubernetes/mongodb.d.ts +2 -2
  182. package/dist/deploy/kubernetes/mongodb.js +14 -12
  183. package/dist/deploy/sbom.d.ts +4 -4
  184. package/dist/deploy/sbom.js +7 -4
  185. package/dist/deploy/types/base.d.ts +5 -5
  186. package/dist/deploy/types/base.js +3 -1
  187. package/dist/deploy/types/custom.d.ts +3 -7
  188. package/dist/deploy/types/custom.js +3 -1
  189. package/dist/deploy/types/dockerTag.d.ts +3 -1
  190. package/dist/deploy/types/dockerTag.js +3 -1
  191. package/dist/deploy/types/googleCloudRun.d.ts +127 -24
  192. package/dist/deploy/types/googleCloudRun.js +3 -1
  193. package/dist/deploy/types/index.d.ts +6 -6
  194. package/dist/deploy/types/index.js +14 -8
  195. package/dist/deploy/types/kubernetes.d.ts +25 -54
  196. package/dist/deploy/types/kubernetes.js +3 -1
  197. package/dist/deploy/utils.d.ts +2 -2
  198. package/dist/deploy/utils.js +5 -2
  199. package/dist/globalScriptFunctions/index.d.ts +14 -0
  200. package/dist/globalScriptFunctions/index.js +37 -0
  201. package/dist/index.d.ts +5 -2
  202. package/dist/index.js +18 -9
  203. package/dist/packageInfos.d.ts +4 -0
  204. package/dist/packageInfos.js +20 -0
  205. package/dist/pipeline/__tests__/getPipelineStages.test.d.ts +1 -0
  206. package/dist/pipeline/__tests__/getPipelineStages.test.js +73 -0
  207. package/dist/pipeline/createAllJobs.d.ts +16 -6
  208. package/dist/pipeline/createAllJobs.js +99 -27
  209. package/dist/pipeline/createJobsForComponent.d.ts +2 -2
  210. package/dist/pipeline/createJobsForComponent.js +9 -149
  211. package/dist/pipeline/createJobsForWorkspace.d.ts +3 -0
  212. package/dist/pipeline/createJobsForWorkspace.js +12 -0
  213. package/dist/pipeline/createMainPipeline.d.ts +3 -0
  214. package/dist/pipeline/createMainPipeline.js +283 -0
  215. package/dist/pipeline/generatePipelineFiles.d.ts +7 -0
  216. package/dist/pipeline/generatePipelineFiles.js +304 -0
  217. package/dist/pipeline/getPipelineStages.d.ts +7 -0
  218. package/dist/pipeline/getPipelineStages.js +56 -0
  219. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +11 -14
  220. package/dist/pipeline/gitlab/createGitlabJobs.js +258 -74
  221. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +9 -0
  222. package/dist/pipeline/gitlab/createGitlabPipeline.js +77 -0
  223. package/dist/pipeline/gitlab/gitlabReleaseJobs.d.ts +33 -0
  224. package/dist/pipeline/gitlab/gitlabReleaseJobs.js +25 -0
  225. package/dist/pipeline/gitlab/sortGitLabJobDefProps.d.ts +7 -0
  226. package/dist/pipeline/gitlab/sortGitLabJobDefProps.js +27 -0
  227. package/dist/pipeline/index.d.ts +3 -2
  228. package/dist/pipeline/index.js +16 -9
  229. package/dist/pipeline/packageManager.d.ts +3 -2
  230. package/dist/pipeline/packageManager.js +50 -24
  231. package/dist/pipeline/yarn/yarnUtils.d.ts +3 -2
  232. package/dist/pipeline/yarn/yarnUtils.js +65 -17
  233. package/dist/rules/index.d.ts +7 -2
  234. package/dist/rules/index.js +34 -16
  235. package/dist/runner/index.d.ts +1 -1
  236. package/dist/runner/index.js +3 -1
  237. package/dist/tsconfig.tsbuildinfo +1 -1
  238. package/dist/types/config.d.ts +44 -29
  239. package/dist/types/config.js +5 -2
  240. package/dist/types/context.d.ts +124 -40
  241. package/dist/types/context.js +12 -1
  242. package/dist/types/environmentContext.d.ts +15 -12
  243. package/dist/types/environmentContext.js +3 -1
  244. package/dist/types/gitlab-ci-yml.d.ts +30 -30
  245. package/dist/types/gitlab-ci-yml.js +3 -2
  246. package/dist/types/gitlab-types.d.ts +8 -8
  247. package/dist/types/gitlab-types.js +3 -1
  248. package/dist/types/index.d.ts +1 -0
  249. package/dist/types/index.js +14 -7
  250. package/dist/types/jobDefinition.d.ts +11 -0
  251. package/dist/types/jobDefinition.js +5 -0
  252. package/dist/types/jobs.d.ts +30 -15
  253. package/dist/types/jobs.js +3 -1
  254. package/dist/types/pipeline.d.ts +3 -3
  255. package/dist/types/pipeline.js +3 -1
  256. package/dist/types/utils.d.ts +1 -1
  257. package/dist/types/utils.js +3 -1
  258. package/dist/utils/gitlab.js +7 -2
  259. package/dist/utils/index.d.ts +2 -1
  260. package/dist/utils/index.js +10 -3
  261. package/dist/utils/jsonParse.d.ts +1 -0
  262. package/dist/utils/jsonParse.js +14 -0
  263. package/dist/utils/removeUndefined.d.ts +1 -0
  264. package/dist/utils/removeUndefined.js +36 -0
  265. package/dist/utils/writeFiles.d.ts +11 -0
  266. package/dist/{pipeline/commitInfo/getBuildId.js โ†’ utils/writeFiles.js} +39 -22
  267. package/dist/variables/VariableValue.d.ts +3 -0
  268. package/dist/variables/VariableValue.js +5 -0
  269. package/dist/variables/VariableValueContainingReferences.d.ts +24 -0
  270. package/dist/variables/VariableValueContainingReferences.js +97 -0
  271. package/dist/variables/__tests__/resolveAllReferences.test.d.ts +1 -0
  272. package/dist/variables/__tests__/resolveAllReferences.test.js +218 -0
  273. package/dist/variables/__tests__/resolveAllReferencesOnce.test.d.ts +1 -0
  274. package/dist/variables/__tests__/resolveAllReferencesOnce.test.js +171 -0
  275. package/dist/variables/__tests__/resolveReferencesOnce.test.d.ts +1 -0
  276. package/dist/variables/__tests__/resolveReferencesOnce.test.js +199 -0
  277. package/dist/variables/__tests__/variableValue.test.d.ts +1 -0
  278. package/dist/variables/__tests__/variableValue.test.js +36 -0
  279. package/dist/variables/resolveAllReferences.d.ts +3 -0
  280. package/dist/{pipeline/createChildPipeline.js โ†’ variables/resolveAllReferences.js} +44 -47
  281. package/dist/variables/resolveAllReferencesOnce.d.ts +5 -0
  282. package/dist/variables/resolveAllReferencesOnce.js +191 -0
  283. package/dist/variables/resolveReferencesOnce.d.ts +8 -0
  284. package/dist/variables/resolveReferencesOnce.js +22 -0
  285. package/examples/.test-gen-ignore +1 -0
  286. package/examples/__snapshots__/cloud-run-http2.test.ts.snap +1418 -0
  287. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1418 -0
  288. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1418 -0
  289. package/examples/__snapshots__/cloud-run-nextjs.test.ts.snap +1434 -0
  290. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1418 -0
  291. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1526 -0
  292. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1418 -0
  293. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1436 -0
  294. package/examples/__snapshots__/cloud-run-service-custom-vpc-connector.test.ts.snap +1418 -0
  295. package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +1418 -0
  296. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1418 -0
  297. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1418 -0
  298. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1490 -0
  299. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1302 -0
  300. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1418 -0
  301. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2998 -0
  302. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +1733 -0
  303. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1426 -0
  304. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1285 -0
  305. package/examples/__snapshots__/custom-build-job.test.ts.snap +1174 -0
  306. package/examples/__snapshots__/custom-deploy.test.ts.snap +1168 -0
  307. package/examples/__snapshots__/custom-envs.test.ts.snap +798 -0
  308. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1182 -0
  309. package/examples/__snapshots__/git-submodule.test.ts.snap +1419 -0
  310. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1759 -0
  311. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1779 -0
  312. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3357 -0
  313. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1883 -0
  314. package/examples/__snapshots__/local-dot-env.test.ts.snap +1342 -0
  315. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1836 -0
  316. package/examples/__snapshots__/multiline-var.test.ts.snap +5679 -0
  317. package/examples/__snapshots__/native-app.test.ts.snap +2206 -0
  318. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1418 -0
  319. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1426 -0
  320. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +1487 -0
  321. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1471 -0
  322. package/examples/__snapshots__/referencing-other-vars.test.ts.snap +4739 -0
  323. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1368 -0
  324. package/examples/__snapshots__/workspace-api-www-turbo-cache.test.ts.snap +2338 -0
  325. package/examples/__snapshots__/workspace-api-www.test.ts.snap +2330 -0
  326. package/examples/__utils__/helpers.ts +9 -12
  327. package/examples/cloud-run-http2.test.ts +11 -0
  328. package/examples/cloud-run-http2.ts +29 -0
  329. package/examples/cloud-run-memory-limit.test.ts +11 -0
  330. package/examples/cloud-run-memory-limit.ts +10 -5
  331. package/examples/cloud-run-meteor-with-worker.test.ts +11 -0
  332. package/examples/cloud-run-meteor-with-worker.ts +37 -0
  333. package/examples/cloud-run-nextjs.test.ts +11 -0
  334. package/examples/cloud-run-nextjs.ts +28 -0
  335. package/examples/cloud-run-no-cpu-throttling.test.ts +11 -0
  336. package/examples/cloud-run-no-cpu-throttling.ts +6 -4
  337. package/examples/cloud-run-no-service.test.ts +11 -0
  338. package/examples/cloud-run-no-service.ts +33 -0
  339. package/examples/cloud-run-non-public.test.ts +11 -0
  340. package/examples/cloud-run-non-public.ts +5 -4
  341. package/examples/cloud-run-post-stop-job.test.ts +11 -0
  342. package/examples/cloud-run-post-stop-job.ts +42 -0
  343. package/examples/cloud-run-service-custom-vpc-connector.test.ts +11 -0
  344. package/examples/cloud-run-service-custom-vpc-connector.ts +30 -0
  345. package/examples/cloud-run-service-custom-vpc.test.ts +11 -0
  346. package/examples/cloud-run-service-custom-vpc.ts +31 -0
  347. package/examples/cloud-run-service-gen2.test.ts +11 -0
  348. package/examples/cloud-run-service-gen2.ts +29 -0
  349. package/examples/cloud-run-service-increase-timout.test.ts +11 -0
  350. package/examples/cloud-run-service-increase-timout.ts +29 -0
  351. package/examples/cloud-run-service-with-volumes.test.ts +11 -0
  352. package/examples/cloud-run-service-with-volumes.ts +56 -0
  353. package/examples/cloud-run-storybook.test.ts +11 -0
  354. package/examples/cloud-run-storybook.ts +33 -0
  355. package/examples/cloud-run-with-ngnix.test.ts +11 -0
  356. package/examples/cloud-run-with-ngnix.ts +29 -0
  357. package/examples/cloud-run-with-sql-reuse-db.test.ts +11 -0
  358. package/examples/cloud-run-with-sql-reuse-db.ts +5 -4
  359. package/examples/cloud-run-with-sql.test.ts +11 -0
  360. package/examples/cloud-run-with-sql.ts +6 -20
  361. package/examples/cloud-run-with-worker.test.ts +11 -0
  362. package/examples/cloud-run-with-worker.ts +37 -0
  363. package/examples/custom-build-job-with-tests.test.ts +11 -0
  364. package/examples/custom-build-job-with-tests.ts +5 -4
  365. package/examples/custom-build-job.test.ts +11 -0
  366. package/examples/custom-build-job.ts +5 -4
  367. package/examples/custom-deploy.test.ts +11 -0
  368. package/examples/custom-deploy.ts +12 -4
  369. package/examples/custom-envs.test.ts +11 -0
  370. package/examples/custom-envs.ts +5 -4
  371. package/examples/custom-sbom-java.test.ts +11 -0
  372. package/examples/custom-sbom-java.ts +10 -6
  373. package/examples/git-submodule.test.ts +11 -0
  374. package/examples/git-submodule.ts +30 -0
  375. package/examples/kubernetes-application-customization.test.ts +11 -0
  376. package/examples/kubernetes-application-customization.ts +7 -4
  377. package/examples/kubernetes-with-cloud-sql.test.ts +11 -0
  378. package/examples/kubernetes-with-cloud-sql.ts +7 -4
  379. package/examples/kubernetes-with-jobs.test.ts +11 -0
  380. package/examples/kubernetes-with-jobs.ts +7 -4
  381. package/examples/kubernetes-with-mongodb.test.ts +11 -0
  382. package/examples/kubernetes-with-mongodb.ts +7 -4
  383. package/examples/local-dot-env.test.ts +11 -0
  384. package/examples/local-dot-env.ts +27 -0
  385. package/examples/meteor-kubernetes.test.ts +11 -0
  386. package/examples/meteor-kubernetes.ts +4 -5
  387. package/examples/multiline-var.test.ts +11 -0
  388. package/examples/multiline-var.ts +107 -0
  389. package/examples/native-app.test.ts +11 -0
  390. package/examples/native-app.ts +22 -17
  391. package/examples/node-build-with-custom-image.test.ts +11 -0
  392. package/examples/node-build-with-custom-image.ts +5 -4
  393. package/examples/node-build-with-docker-additions.test.ts +11 -0
  394. package/examples/node-build-with-docker-additions.ts +29 -0
  395. package/examples/rails-k8s-with-worker-dockerfile.test.ts +33 -0
  396. package/examples/rails-k8s-with-worker.test.ts +11 -0
  397. package/examples/rails-k8s-with-worker.ts +14 -11
  398. package/examples/referencing-other-vars.test.ts +11 -0
  399. package/examples/referencing-other-vars.ts +83 -0
  400. package/examples/wait-for-other-deploy.test.ts +11 -0
  401. package/examples/wait-for-other-deploy.ts +5 -4
  402. package/examples/workspace-api-www-turbo-cache.test.ts +11 -0
  403. package/examples/workspace-api-www-turbo-cache.ts +52 -0
  404. package/examples/workspace-api-www.test.ts +11 -0
  405. package/examples/workspace-api-www.ts +46 -0
  406. package/package.json +75 -26
  407. package/scripts/generate-examples-test.ts +84 -0
  408. package/scripts/generate-gitlab-ci-types.ts +2 -2
  409. package/scripts/tsconfig.json +7 -0
  410. package/src/bash/BashExpression.ts +78 -0
  411. package/src/bash/bashEscape.ts +158 -0
  412. package/src/bash/bashExpressionPerPipelineType.ts +16 -0
  413. package/src/bash/bashYaml.ts +80 -0
  414. package/src/bash/getInjectVarsScript.ts +21 -0
  415. package/src/bash/index.ts +2 -0
  416. package/src/build/artifacts/createBuildJobArtifact.ts +61 -0
  417. package/src/build/base/__tests__/createArtifactsConfig.test.ts +3 -3
  418. package/src/build/base/constants.ts +2 -2
  419. package/src/build/base/createAppBuildJob.ts +40 -24
  420. package/src/build/base/createArtifactsConfig.ts +2 -2
  421. package/src/build/base/createBuildJobDefinition.ts +37 -0
  422. package/src/build/base/index.ts +37 -8
  423. package/src/build/base/writeBuildInfo.ts +3 -3
  424. package/src/build/base/writeDotEnv.ts +25 -6
  425. package/src/build/cache/createJobCache.ts +83 -0
  426. package/src/build/cache/getAllCacheConfigsFromConfig.ts +28 -0
  427. package/src/build/cache/transformLegacyJobCache.ts +14 -0
  428. package/src/build/custom/__tests__/testJob.test.ts +10 -13
  429. package/src/build/custom/buildJob.ts +11 -37
  430. package/src/build/custom/index.ts +2 -2
  431. package/src/build/custom/testJob.ts +24 -22
  432. package/src/build/docker.ts +145 -49
  433. package/src/build/index.ts +42 -10
  434. package/src/build/node/buildJob.ts +65 -62
  435. package/src/build/node/cache.ts +30 -35
  436. package/src/build/node/constants.ts +2 -3
  437. package/src/build/node/index.ts +8 -4
  438. package/src/build/node/meteor.ts +16 -24
  439. package/src/build/node/testJob.ts +47 -26
  440. package/src/build/node/yarn.ts +32 -16
  441. package/src/build/rails/build.ts +21 -9
  442. package/src/build/rails/index.ts +2 -2
  443. package/src/build/rails/test.ts +22 -12
  444. package/src/build/sbom.ts +15 -10
  445. package/src/build/types.ts +190 -47
  446. package/src/catladder-gitlab.ts +7 -56
  447. package/src/config/__tests__/__snapshots__/getAllEnvs.test.ts.snap +31 -0
  448. package/src/config/__tests__/__snapshots__/getAllEnvsInAllComponents.test.ts.snap +15 -0
  449. package/src/config/__tests__/getAllEnvs.test.ts +71 -0
  450. package/src/config/__tests__/getAllEnvsInAllComponents.test.ts +63 -0
  451. package/src/config/configruedEnvs.ts +6 -6
  452. package/src/config/readConfig.ts +15 -22
  453. package/src/constants.ts +5 -2
  454. package/src/context/createAllComponentsContext.ts +31 -0
  455. package/src/context/createComponentContext.ts +134 -0
  456. package/src/context/createWorkspaceContext.ts +56 -0
  457. package/src/context/getBuildInfoVariables.ts +36 -0
  458. package/src/context/getEnvConfig.ts +3 -3
  459. package/src/context/getEnvType.ts +1 -1
  460. package/src/context/getEnvironment.ts +8 -24
  461. package/src/context/getEnvironmentContext.ts +25 -29
  462. package/src/context/getEnvironmentVariables.ts +104 -76
  463. package/src/context/getLabels.ts +5 -5
  464. package/src/context/getReviewSlug.ts +27 -0
  465. package/src/context/index.ts +1 -65
  466. package/src/context/transformJobOnlyVars.ts +6 -3
  467. package/src/context/utils/envVars.ts +5 -4
  468. package/src/deploy/base/deploy.ts +63 -47
  469. package/src/deploy/base/index.ts +11 -6
  470. package/src/deploy/base/rollback.ts +11 -16
  471. package/src/deploy/base/stop.ts +11 -15
  472. package/src/deploy/base/variables.ts +1 -2
  473. package/src/deploy/cloudRun/artifactsRegistry.ts +126 -0
  474. package/src/deploy/cloudRun/cleanup.ts +30 -0
  475. package/src/deploy/cloudRun/cloudRunRevisions.ts +65 -0
  476. package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +227 -0
  477. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +86 -0
  478. package/src/deploy/cloudRun/createJobs/common.ts +59 -0
  479. package/src/deploy/cloudRun/createJobs/constants.ts +1 -0
  480. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +71 -0
  481. package/src/deploy/cloudRun/createJobs/getCloudRunStopScripts.ts +34 -0
  482. package/src/deploy/cloudRun/createJobs/index.ts +51 -0
  483. package/src/deploy/cloudRun/createJobs/volumes.ts +23 -0
  484. package/src/deploy/cloudRun/index.ts +85 -59
  485. package/src/deploy/cloudRun/utils/createArgsString.ts +21 -13
  486. package/src/deploy/cloudRun/utils/database.ts +31 -9
  487. package/src/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.ts +9 -11
  488. package/src/deploy/cloudRun/utils/getServiceName.ts +3 -0
  489. package/src/deploy/cloudRun/utils/jobName.ts +7 -2
  490. package/src/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.ts +12 -0
  491. package/src/deploy/cloudSql/utils.ts +13 -10
  492. package/src/deploy/custom/deployJob.ts +15 -10
  493. package/src/deploy/custom/index.ts +2 -2
  494. package/src/deploy/dockerTag/deployJob.ts +7 -8
  495. package/src/deploy/dockerTag/index.ts +8 -7
  496. package/src/deploy/index.ts +15 -12
  497. package/src/deploy/kubernetes/additionalSecretKeys.ts +3 -1
  498. package/src/deploy/kubernetes/cloudSql/index.ts +16 -25
  499. package/src/deploy/kubernetes/deployJob.ts +30 -21
  500. package/src/deploy/kubernetes/index.ts +43 -35
  501. package/src/deploy/kubernetes/kubeEnv.ts +12 -10
  502. package/src/deploy/kubernetes/kubeValues.ts +15 -19
  503. package/src/deploy/kubernetes/mongodb.ts +15 -15
  504. package/src/deploy/sbom.ts +18 -10
  505. package/src/deploy/types/base.ts +3 -3
  506. package/src/deploy/types/custom.ts +3 -7
  507. package/src/deploy/types/dockerTag.ts +2 -0
  508. package/src/deploy/types/googleCloudRun.ts +133 -10
  509. package/src/deploy/types/index.ts +2 -2
  510. package/src/deploy/types/kubernetes.ts +5 -36
  511. package/src/deploy/utils.ts +5 -5
  512. package/src/globalScriptFunctions/index.ts +30 -0
  513. package/src/index.ts +4 -1
  514. package/src/packageInfos.ts +14 -0
  515. package/src/pipeline/__tests__/__snapshots__/getPipelineStages.test.ts.snap +69 -0
  516. package/src/pipeline/__tests__/getPipelineStages.test.ts +63 -0
  517. package/src/pipeline/createAllJobs.ts +67 -33
  518. package/src/pipeline/createJobsForComponent.ts +10 -38
  519. package/src/pipeline/createJobsForWorkspace.ts +12 -0
  520. package/src/pipeline/createMainPipeline.ts +119 -0
  521. package/src/pipeline/generatePipelineFiles.ts +100 -0
  522. package/src/pipeline/getPipelineStages.ts +23 -0
  523. package/src/pipeline/gitlab/createGitlabJobs.ts +388 -108
  524. package/src/pipeline/gitlab/createGitlabPipeline.ts +35 -0
  525. package/src/pipeline/gitlab/gitlabReleaseJobs.ts +23 -0
  526. package/src/pipeline/gitlab/sortGitLabJobDefProps.ts +59 -0
  527. package/src/pipeline/index.ts +2 -1
  528. package/src/pipeline/packageManager.ts +44 -26
  529. package/src/pipeline/yarn/yarnUtils.ts +39 -10
  530. package/src/rules/index.ts +36 -9
  531. package/src/runner/index.ts +0 -1
  532. package/src/types/config.ts +43 -16
  533. package/src/types/context.ts +165 -37
  534. package/src/types/environmentContext.ts +18 -13
  535. package/src/types/gitlab-ci-yml.ts +0 -1
  536. package/src/types/gitlab-types.ts +10 -7
  537. package/src/types/index.ts +1 -0
  538. package/src/types/jobDefinition.ts +34 -0
  539. package/src/types/jobs.ts +31 -15
  540. package/src/types/utils.ts +4 -4
  541. package/src/utils/gitlab.ts +20 -3
  542. package/src/utils/index.ts +6 -3
  543. package/src/utils/jsonParse.ts +7 -0
  544. package/src/utils/removeUndefined.ts +4 -0
  545. package/src/utils/writeFiles.ts +52 -0
  546. package/src/variables/VariableValue.ts +6 -0
  547. package/src/variables/VariableValueContainingReferences.ts +89 -0
  548. package/src/variables/__tests__/resolveAllReferences.test.ts +110 -0
  549. package/src/variables/__tests__/resolveAllReferencesOnce.test.ts +64 -0
  550. package/src/variables/__tests__/resolveReferencesOnce.test.ts +117 -0
  551. package/src/variables/__tests__/variableValue.test.ts +73 -0
  552. package/src/variables/resolveAllReferences.ts +46 -0
  553. package/src/variables/resolveAllReferencesOnce.ts +44 -0
  554. package/src/variables/resolveReferencesOnce.ts +29 -0
  555. package/bin/catladder-gitlab-dev.js +0 -3
  556. package/bin/catladder-gitlab.js +0 -3
  557. package/dist/bundles/catladder-gitlab/index.js +0 -33838
  558. package/dist/context/__tests__/resolveReferences.test.js +0 -336
  559. package/dist/context/resolveReferences.d.ts +0 -4
  560. package/dist/context/resolveReferences.js +0 -254
  561. package/dist/deploy/cloudRun/deployJob.d.ts +0 -3
  562. package/dist/deploy/cloudRun/deployJob.js +0 -248
  563. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +0 -84
  564. package/dist/deploy/kubernetes/processSecretsAsFiles.js +0 -31
  565. package/dist/pipeline/commitInfo/getBuildId.d.ts +0 -6
  566. package/dist/pipeline/commitInfo/getCommitInfo.d.ts +0 -2
  567. package/dist/pipeline/createChildPipeline.d.ts +0 -3
  568. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +0 -1780
  569. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +0 -1780
  570. package/examples/__snapshots__/cloud-run-non-public.ts.snap +0 -1780
  571. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +0 -3532
  572. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +0 -3543
  573. package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +0 -1656
  574. package/examples/__snapshots__/custom-build-job.ts.snap +0 -1362
  575. package/examples/__snapshots__/custom-deploy.ts.snap +0 -1556
  576. package/examples/__snapshots__/custom-envs.ts.snap +0 -1050
  577. package/examples/__snapshots__/custom-sbom-java.ts.snap +0 -1370
  578. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +0 -2468
  579. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +0 -2428
  580. package/examples/__snapshots__/kubernetes-with-cloud-sql.ts.snap +0 -2440
  581. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +0 -4453
  582. package/examples/__snapshots__/kubernetes-with-mongodb.ts.snap +0 -2632
  583. package/examples/__snapshots__/meteor-kubernetes.ts.snap +0 -2557
  584. package/examples/__snapshots__/native-app.ts.snap +0 -2878
  585. package/examples/__snapshots__/node-build-with-custom-image.ts.snap +0 -1780
  586. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +0 -4189
  587. package/examples/__snapshots__/wait-for-other-deploy.ts.snap +0 -1922
  588. package/examples/kubernetes-with-cloud-sql-legacy.ts +0 -33
  589. package/scripts/bundle +0 -2
  590. package/src/context/__tests__/resolveReferences.test.ts +0 -143
  591. package/src/context/resolveReferences.ts +0 -70
  592. package/src/deploy/cloudRun/deployJob.ts +0 -301
  593. package/src/deploy/kubernetes/processSecretsAsFiles.ts +0 -34
  594. package/src/pipeline/commitInfo/getBuildId.ts +0 -17
  595. package/src/pipeline/commitInfo/getCommitInfo.ts +0 -15
  596. package/src/pipeline/createChildPipeline.ts +0 -45
  597. /package/dist/{context/__tests__/resolveReferences.test.d.ts โ†’ config/__tests__/getAllEnvs.test.d.ts} +0 -0
@@ -0,0 +1,1418 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for cloud-run-meteor-with-worker 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="web"
88
+ - collapseable_section_end "injectvars"
89
+ - cd web
90
+ - yarn npm audit --environment production
91
+ rules:
92
+ - when: never
93
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
94
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
95
+ - if: $CI_MERGE_REQUEST_ID
96
+ needs: []
97
+ retry: &a1
98
+ max: 2
99
+ when:
100
+ - runner_system_failure
101
+ - stuck_or_timeout_failure
102
+ interruptible: true
103
+ allow_failure: true
104
+ web ๐Ÿ‘ฎ lint:
105
+ stage: test
106
+ image: path/to/docker/jobs-default:the-version
107
+ variables:
108
+ KUBERNETES_CPU_REQUEST: '0.45'
109
+ KUBERNETES_MEMORY_REQUEST: 1Gi
110
+ KUBERNETES_MEMORY_LIMIT: 4Gi
111
+ script:
112
+ - collapseable_section_start "injectvars" "Injecting variables"
113
+ - export APP_PATH="web"
114
+ - collapseable_section_end "injectvars"
115
+ - collapseable_section_start "nodeinstall" "Ensure node version"
116
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
117
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
118
+ - collapseable_section_end "nodeinstall"
119
+ - cd web
120
+ - collapseable_section_start "nodeinstall" "Ensure node version"
121
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
122
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
123
+ - collapseable_section_end "nodeinstall"
124
+ - collapseable_section_start "yarninstall" "Yarn install"
125
+ - yarn install --immutable
126
+ - collapseable_section_end "yarninstall"
127
+ - yarn lint
128
+ cache:
129
+ - key: web-yarn
130
+ policy: pull-push
131
+ paths:
132
+ - web/.yarn
133
+ - key: web-node-modules
134
+ policy: pull-push
135
+ paths:
136
+ - web/node_modules
137
+ rules:
138
+ - when: never
139
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
140
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
141
+ - if: $CI_MERGE_REQUEST_ID
142
+ needs: []
143
+ retry: *a1
144
+ interruptible: true
145
+ web ๐Ÿงช test:
146
+ stage: test
147
+ image: path/to/docker/jobs-testing-chrome:the-version
148
+ variables:
149
+ KUBERNETES_CPU_REQUEST: '0.45'
150
+ KUBERNETES_MEMORY_REQUEST: 1Gi
151
+ KUBERNETES_MEMORY_LIMIT: 4Gi
152
+ script:
153
+ - collapseable_section_start "injectvars" "Injecting variables"
154
+ - export APP_PATH="web"
155
+ - collapseable_section_end "injectvars"
156
+ - collapseable_section_start "nodeinstall" "Ensure node version"
157
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
158
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
159
+ - collapseable_section_end "nodeinstall"
160
+ - cd web
161
+ - collapseable_section_start "nodeinstall" "Ensure node version"
162
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
163
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
164
+ - collapseable_section_end "nodeinstall"
165
+ - collapseable_section_start "yarninstall" "Yarn install"
166
+ - yarn install --immutable
167
+ - collapseable_section_end "yarninstall"
168
+ - yarn test
169
+ cache:
170
+ - key: web-yarn
171
+ policy: pull-push
172
+ paths:
173
+ - web/.yarn
174
+ - key: web-node-modules
175
+ policy: pull-push
176
+ paths:
177
+ - web/node_modules
178
+ rules:
179
+ - when: never
180
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
181
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
182
+ - if: $CI_MERGE_REQUEST_ID
183
+ needs: []
184
+ retry: *a1
185
+ interruptible: true
186
+ 'web ๐Ÿ”จ app | dev ':
187
+ stage: build
188
+ image: path/to/docker/jobs-meteor:the-version
189
+ variables:
190
+ KUBERNETES_CPU_REQUEST: '0.45'
191
+ KUBERNETES_MEMORY_REQUEST: 1Gi
192
+ KUBERNETES_MEMORY_LIMIT: 4Gi
193
+ script:
194
+ - collapseable_section_start "injectvars" "Injecting variables"
195
+ - export METEOR_DISABLE_OPTIMISTIC_CACHING="1"
196
+ - export ENV_SHORT="dev"
197
+ - export APP_DIR="web"
198
+ - export ENV_TYPE="dev"
199
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
200
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
201
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
202
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
203
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
204
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
205
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
206
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
207
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
208
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_web_GCLOUD_DEPLOY_credentialsKey"
209
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix"
210
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
211
+ - collapseable_section_end "injectvars"
212
+ - collapseable_section_start "write-dotenv-web" "write dot env for web"
213
+ - |-
214
+ cat <<EOF > web/.env
215
+ ENV_SHORT=dev
216
+ APP_DIR=web
217
+ ENV_TYPE=dev
218
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
219
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
220
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
221
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
222
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
223
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
224
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_web_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
225
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
226
+ _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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
227
+ EOF
228
+ - collapseable_section_end "write-dotenv-web"
229
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > web/__build_info.json
230
+ - collapseable_section_start "nodeinstall" "Ensure node version"
231
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
232
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
233
+ - collapseable_section_end "nodeinstall"
234
+ - cd web
235
+ - collapseable_section_start "nodeinstall" "Ensure node version"
236
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
237
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
238
+ - collapseable_section_end "nodeinstall"
239
+ - collapseable_section_start "yarninstall" "Yarn install"
240
+ - yarn install --immutable
241
+ - collapseable_section_end "yarninstall"
242
+ - echo "add healthcheck package"
243
+ - meteor add panter:healthroute --allow-superuser
244
+ - meteor add qualia:prod-shell --allow-superuser
245
+ - 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
246
+ - cp ./__build_info.json ./dist/bundle/programs/server
247
+ cache:
248
+ - key: web-yarn
249
+ policy: pull-push
250
+ paths:
251
+ - web/.yarn
252
+ - key: web-node-modules
253
+ policy: pull-push
254
+ paths:
255
+ - web/node_modules
256
+ - key: web-meteor-build-cache
257
+ policy: pull-push
258
+ paths:
259
+ - web/.meteor/local/resolver-result-cache.json
260
+ - web/.meteor/local/plugin-cache
261
+ - web/.meteor/local/isopacks
262
+ - web/.meteor/local/bundler-cache/scanner
263
+ artifacts:
264
+ paths:
265
+ - web/__build_info.json
266
+ - web/dist
267
+ exclude:
268
+ - web/.env
269
+ expire_in: 1 day
270
+ when: always
271
+ reports: {}
272
+ rules:
273
+ - when: never
274
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
275
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
276
+ needs: []
277
+ retry: *a1
278
+ interruptible: true
279
+ 'web ๐Ÿ”จ docker | dev ':
280
+ stage: build
281
+ image: path/to/docker/docker-build:the-version
282
+ services:
283
+ - name: docker:24.0.6-dind
284
+ command:
285
+ - --tls=false
286
+ - --registry-mirror=https://mirror.gcr.io
287
+ variables:
288
+ DOCKER_HOST: tcp://0.0.0.0:2375
289
+ DOCKER_TLS_CERTDIR: ''
290
+ DOCKER_DRIVER: overlay2
291
+ DOCKER_BUILDKIT: '1'
292
+ KUBERNETES_CPU_REQUEST: '0.45'
293
+ KUBERNETES_MEMORY_REQUEST: 1Gi
294
+ KUBERNETES_MEMORY_LIMIT: 2Gi
295
+ script:
296
+ - collapseable_section_start "injectvars" "Injecting variables"
297
+ - export APP_DIR="web"
298
+ - export DOCKER_BUILD_CONTEXT="."
299
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
300
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web"
301
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
302
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
303
+ - export METEOR_INSTALL_SCRIPTS=""
304
+ - collapseable_section_end "injectvars"
305
+ - ensureMeteorDockerfile
306
+ - collapseable_section_start "docker-login" "Docker Login"
307
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_web_GCLOUD_DEPLOY_credentialsKey")
308
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
309
+ - collapseable_section_end "docker-login"
310
+ - collapseable_section_start "docker-build" "Docker build"
311
+ - 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
312
+ - collapseable_section_end "docker-build"
313
+ - collapseable_section_start "docker-push" "Docker push and tag"
314
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
315
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
316
+ - docker push $DOCKER_CACHE_IMAGE
317
+ - collapseable_section_end "docker-push"
318
+ rules:
319
+ - when: never
320
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
321
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
322
+ needs:
323
+ - 'web ๐Ÿ”จ app | dev '
324
+ retry: *a1
325
+ interruptible: true
326
+ 'web ๐Ÿงพ sbom | dev ':
327
+ stage: build
328
+ image: aquasec/trivy:0.38.3
329
+ variables: {}
330
+ script:
331
+ - collapseable_section_start "injectvars" "Injecting variables"
332
+ - collapseable_section_end "injectvars"
333
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" web
334
+ artifacts:
335
+ paths:
336
+ - __sbom.json
337
+ rules:
338
+ - when: never
339
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
340
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
341
+ needs: []
342
+ retry: *a1
343
+ interruptible: true
344
+ allow_failure: true
345
+ 'web ๐Ÿš€ Deploy | dev ':
346
+ stage: deploy dev
347
+ image: path/to/docker/gcloud:the-version
348
+ variables:
349
+ KUBERNETES_CPU_REQUEST: '0.22'
350
+ KUBERNETES_MEMORY_REQUEST: 200Mi
351
+ KUBERNETES_MEMORY_LIMIT: 400Mi
352
+ script:
353
+ - collapseable_section_start "injectvars" "Injecting variables"
354
+ - export ENV_SHORT="dev"
355
+ - export APP_DIR="web"
356
+ - export ENV_TYPE="dev"
357
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
358
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
359
+ - 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")"
360
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
361
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
362
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
363
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
364
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
365
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
366
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_web_GCLOUD_DEPLOY_credentialsKey"
367
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix"
368
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
369
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
370
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web"
371
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
372
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
373
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
374
+ - collapseable_section_end "injectvars"
375
+ - collapseable_section_start "prepare" "Prepare..."
376
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_web_GCLOUD_DEPLOY_credentialsKey")
377
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
378
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
379
+ - collapseable_section_end "prepare"
380
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
381
+ - |
382
+ cat > ____envvars.yaml <<EOF
383
+ ENV_SHORT: |-
384
+ dev
385
+ APP_DIR: |-
386
+ web
387
+ ENV_TYPE: |-
388
+ dev
389
+ BUILD_INFO_BUILD_ID: |-
390
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
391
+ BUILD_INFO_BUILD_TIME: |-
392
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
393
+ BUILD_INFO_CURRENT_VERSION: |-
394
+ $(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/^/ /')
395
+ HOSTNAME: |-
396
+ $(printf %s "$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
397
+ ROOT_URL: |-
398
+ $(printf %s "https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
399
+ HOSTNAME_INTERNAL: |-
400
+ $(printf %s "$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
401
+ ROOT_URL_INTERNAL: |-
402
+ $(printf %s "https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
403
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
404
+ google-project-id
405
+ DEPLOY_CLOUD_RUN_REGION: |-
406
+ europe-west6
407
+ GCLOUD_RUN_canonicalHostSuffix: |-
408
+ $(printf %s "$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
409
+ _ALL_ENV_VAR_KEYS: |-
410
+ ["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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
411
+
412
+ EOF
413
+ - collapseable_section_end "writeenvvars"
414
+ - collapseable_section_start "deploy" "Deploy to cloud run"
415
+ - gcloud run deploy pan-test-app-dev-web --command="node,main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=dev,env-name=dev,build-type=meteor,cloud-run-service-name=pan-test-app-dev-web --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
416
+ - gcloud run deploy pan-test-app-dev-web-worker --command="/bin/sh -c,BACKGROUND_JOBS_ENABLED=1 node main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=dev,env-name=dev,build-type=meteor,cloud-run-service-name=pan-test-app-dev-web-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
417
+ - collapseable_section_end "deploy"
418
+ - collapseable_section_start "cleanup" "Cleanup"
419
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-dev-web --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
420
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web@$version --quiet --delete-tags; done
421
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
422
+ - collapseable_section_end "cleanup"
423
+ - echo 'Uploading SBOM to Dependency Track'
424
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
425
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
426
+ environment:
427
+ name: dev/web
428
+ url: $CL_GITLAB_ENVIRONMENT_URL
429
+ on_stop: 'web ๐Ÿ›‘ Stop โš ๏ธ | dev '
430
+ auto_stop_in: 4 weeks
431
+ artifacts:
432
+ reports:
433
+ dotenv: gitlab_environment.env
434
+ rules:
435
+ - when: never
436
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
437
+ - when: on_success
438
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
439
+ needs:
440
+ - job: web ๐Ÿ‘ฎ lint
441
+ artifacts: false
442
+ - job: 'web ๐Ÿ”จ app | dev '
443
+ artifacts: false
444
+ - job: 'web ๐Ÿ”จ docker | dev '
445
+ artifacts: false
446
+ - job: web ๐Ÿงช test
447
+ artifacts: false
448
+ - job: 'web ๐Ÿงพ sbom | dev '
449
+ artifacts: true
450
+ - job: web ๐Ÿ›ก audit
451
+ artifacts: false
452
+ retry: *a1
453
+ interruptible: true
454
+ allow_failure: false
455
+ 'web ๐Ÿ›‘ Stop โš ๏ธ | dev ':
456
+ stage: stop dev
457
+ image: path/to/docker/gcloud:the-version
458
+ variables:
459
+ KUBERNETES_CPU_REQUEST: '0.22'
460
+ KUBERNETES_MEMORY_REQUEST: 200Mi
461
+ KUBERNETES_MEMORY_LIMIT: 400Mi
462
+ GIT_STRATEGY: none
463
+ script:
464
+ - collapseable_section_start "injectvars" "Injecting variables"
465
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
466
+ - collapseable_section_end "injectvars"
467
+ - set +e
468
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_web_GCLOUD_DEPLOY_credentialsKey")
469
+ - gcloud run services delete pan-test-app-dev-web --project=google-project-id --region=europe-west6
470
+ - gcloud run services delete pan-test-app-dev-web-worker --project=google-project-id --region=europe-west6
471
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/web --quiet --delete-tags
472
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
473
+ - echo 'Disabling component in Dependency Track'
474
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
475
+ - set -e
476
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-dev-web-$CL_dev_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
477
+ environment:
478
+ name: dev/web
479
+ url: $CL_GITLAB_ENVIRONMENT_URL
480
+ action: stop
481
+ artifacts:
482
+ reports:
483
+ dotenv: gitlab_environment.env
484
+ rules:
485
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
486
+ when: on_success
487
+ - when: never
488
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
489
+ - when: manual
490
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
491
+ needs: []
492
+ retry: *a1
493
+ interruptible: true
494
+ allow_failure: true
495
+ 'web ๐Ÿ”จ app | review ':
496
+ stage: build
497
+ image: path/to/docker/jobs-meteor:the-version
498
+ variables:
499
+ KUBERNETES_CPU_REQUEST: '0.45'
500
+ KUBERNETES_MEMORY_REQUEST: 1Gi
501
+ KUBERNETES_MEMORY_LIMIT: 4Gi
502
+ script:
503
+ - collapseable_section_start "injectvars" "Injecting variables"
504
+ - export METEOR_DISABLE_OPTIMISTIC_CACHING="1"
505
+ - export ENV_SHORT="review"
506
+ - export APP_DIR="web"
507
+ - export ENV_TYPE="review"
508
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
509
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
510
+ - 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")"
511
+ - export HOSTNAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
512
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
513
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
514
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
515
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
516
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
517
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_web_GCLOUD_DEPLOY_credentialsKey"
518
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_web_GCLOUD_RUN_canonicalHostSuffix"
519
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
520
+ - collapseable_section_end "injectvars"
521
+ - collapseable_section_start "write-dotenv-web" "write dot env for web"
522
+ - |-
523
+ cat <<EOF > web/.env
524
+ ENV_SHORT=review
525
+ APP_DIR=web
526
+ ENV_TYPE=review
527
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
528
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
529
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
530
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
531
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
532
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
533
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_web_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
534
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
535
+ _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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
536
+ EOF
537
+ - collapseable_section_end "write-dotenv-web"
538
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > web/__build_info.json
539
+ - collapseable_section_start "nodeinstall" "Ensure node version"
540
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
541
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
542
+ - collapseable_section_end "nodeinstall"
543
+ - cd web
544
+ - collapseable_section_start "nodeinstall" "Ensure node version"
545
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
546
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
547
+ - collapseable_section_end "nodeinstall"
548
+ - collapseable_section_start "yarninstall" "Yarn install"
549
+ - yarn install --immutable
550
+ - collapseable_section_end "yarninstall"
551
+ - echo "add healthcheck package"
552
+ - meteor add panter:healthroute --allow-superuser
553
+ - meteor add qualia:prod-shell --allow-superuser
554
+ - 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
555
+ - cp ./__build_info.json ./dist/bundle/programs/server
556
+ cache:
557
+ - key: web-yarn
558
+ policy: pull-push
559
+ paths:
560
+ - web/.yarn
561
+ - key: web-node-modules
562
+ policy: pull-push
563
+ paths:
564
+ - web/node_modules
565
+ - key: web-meteor-build-cache
566
+ policy: pull-push
567
+ paths:
568
+ - web/.meteor/local/resolver-result-cache.json
569
+ - web/.meteor/local/plugin-cache
570
+ - web/.meteor/local/isopacks
571
+ - web/.meteor/local/bundler-cache/scanner
572
+ artifacts:
573
+ paths:
574
+ - web/__build_info.json
575
+ - web/dist
576
+ exclude:
577
+ - web/.env
578
+ expire_in: 1 day
579
+ when: always
580
+ reports: {}
581
+ rules:
582
+ - if: $CI_MERGE_REQUEST_ID
583
+ needs: []
584
+ retry: *a1
585
+ interruptible: true
586
+ 'web ๐Ÿ”จ docker | review ':
587
+ stage: build
588
+ image: path/to/docker/docker-build:the-version
589
+ services:
590
+ - name: docker:24.0.6-dind
591
+ command:
592
+ - --tls=false
593
+ - --registry-mirror=https://mirror.gcr.io
594
+ variables:
595
+ DOCKER_HOST: tcp://0.0.0.0:2375
596
+ DOCKER_TLS_CERTDIR: ''
597
+ DOCKER_DRIVER: overlay2
598
+ DOCKER_BUILDKIT: '1'
599
+ KUBERNETES_CPU_REQUEST: '0.45'
600
+ KUBERNETES_MEMORY_REQUEST: 1Gi
601
+ KUBERNETES_MEMORY_LIMIT: 2Gi
602
+ script:
603
+ - collapseable_section_start "injectvars" "Injecting variables"
604
+ - export APP_DIR="web"
605
+ - export DOCKER_BUILD_CONTEXT="."
606
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
607
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
608
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
609
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
610
+ - export METEOR_INSTALL_SCRIPTS=""
611
+ - collapseable_section_end "injectvars"
612
+ - ensureMeteorDockerfile
613
+ - collapseable_section_start "docker-login" "Docker Login"
614
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_web_GCLOUD_DEPLOY_credentialsKey")
615
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
616
+ - collapseable_section_end "docker-login"
617
+ - collapseable_section_start "docker-build" "Docker build"
618
+ - 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
619
+ - collapseable_section_end "docker-build"
620
+ - collapseable_section_start "docker-push" "Docker push and tag"
621
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
622
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
623
+ - docker push $DOCKER_CACHE_IMAGE
624
+ - collapseable_section_end "docker-push"
625
+ rules:
626
+ - if: $CI_MERGE_REQUEST_ID
627
+ needs:
628
+ - 'web ๐Ÿ”จ app | review '
629
+ retry: *a1
630
+ interruptible: true
631
+ 'web ๐Ÿงพ sbom | review ':
632
+ stage: build
633
+ image: aquasec/trivy:0.38.3
634
+ variables: {}
635
+ script:
636
+ - collapseable_section_start "injectvars" "Injecting variables"
637
+ - collapseable_section_end "injectvars"
638
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" web
639
+ artifacts:
640
+ paths:
641
+ - __sbom.json
642
+ rules:
643
+ - if: $CI_MERGE_REQUEST_ID
644
+ needs: []
645
+ retry: *a1
646
+ interruptible: true
647
+ allow_failure: true
648
+ 'web ๐Ÿš€ Deploy | review ':
649
+ stage: deploy review
650
+ image: path/to/docker/gcloud:the-version
651
+ variables:
652
+ KUBERNETES_CPU_REQUEST: '0.22'
653
+ KUBERNETES_MEMORY_REQUEST: 200Mi
654
+ KUBERNETES_MEMORY_LIMIT: 400Mi
655
+ script:
656
+ - collapseable_section_start "injectvars" "Injecting variables"
657
+ - export ENV_SHORT="review"
658
+ - export APP_DIR="web"
659
+ - export ENV_TYPE="review"
660
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
661
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
662
+ - 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")"
663
+ - export HOSTNAME="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
664
+ - export ROOT_URL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
665
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
666
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
667
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
668
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
669
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_web_GCLOUD_DEPLOY_credentialsKey"
670
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_web_GCLOUD_RUN_canonicalHostSuffix"
671
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
672
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
673
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
674
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
675
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
676
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
677
+ - collapseable_section_end "injectvars"
678
+ - collapseable_section_start "prepare" "Prepare..."
679
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_web_GCLOUD_DEPLOY_credentialsKey")
680
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
681
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
682
+ - collapseable_section_end "prepare"
683
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
684
+ - |
685
+ cat > ____envvars.yaml <<EOF
686
+ ENV_SHORT: |-
687
+ review
688
+ APP_DIR: |-
689
+ web
690
+ ENV_TYPE: |-
691
+ review
692
+ BUILD_INFO_BUILD_ID: |-
693
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
694
+ BUILD_INFO_BUILD_TIME: |-
695
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
696
+ BUILD_INFO_CURRENT_VERSION: |-
697
+ $(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/^/ /')
698
+ HOSTNAME: |-
699
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
700
+ ROOT_URL: |-
701
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
702
+ HOSTNAME_INTERNAL: |-
703
+ $(printf %s "$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
704
+ ROOT_URL_INTERNAL: |-
705
+ $(printf %s "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
706
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
707
+ google-project-id
708
+ DEPLOY_CLOUD_RUN_REGION: |-
709
+ europe-west6
710
+ GCLOUD_RUN_canonicalHostSuffix: |-
711
+ $(printf %s "$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
712
+ _ALL_ENV_VAR_KEYS: |-
713
+ ["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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
714
+
715
+ EOF
716
+ - collapseable_section_end "writeenvvars"
717
+ - collapseable_section_start "deploy" "Deploy to cloud run"
718
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}') --command="node,main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=review,env-name=review,build-type=meteor,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
719
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}')-worker --command="/bin/sh -c,BACKGROUND_JOBS_ENABLED=1 node main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }):$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=review,env-name=review,build-type=meteor,cloud-run-service-name=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}')-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
720
+ - collapseable_section_end "deploy"
721
+ - collapseable_section_start "cleanup" "Cleanup"
722
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}') --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
723
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })@$version --quiet --delete-tags; done
724
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
725
+ - set +e
726
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web --quiet --delete-tags
727
+ - set -e
728
+ - collapseable_section_end "cleanup"
729
+ - echo 'Uploading SBOM to Dependency Track'
730
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
731
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
732
+ environment:
733
+ name: review/$CI_COMMIT_REF_NAME/web
734
+ url: $CL_GITLAB_ENVIRONMENT_URL
735
+ on_stop: 'web ๐Ÿ›‘ Stop โš ๏ธ | review '
736
+ auto_stop_in: 1 week
737
+ artifacts:
738
+ reports:
739
+ dotenv: gitlab_environment.env
740
+ rules:
741
+ - when: on_success
742
+ if: $CI_MERGE_REQUEST_ID
743
+ needs:
744
+ - job: web ๐Ÿ‘ฎ lint
745
+ artifacts: false
746
+ - job: 'web ๐Ÿ”จ app | review '
747
+ artifacts: false
748
+ - job: 'web ๐Ÿ”จ docker | review '
749
+ artifacts: false
750
+ - job: web ๐Ÿงช test
751
+ artifacts: false
752
+ - job: 'web ๐Ÿงพ sbom | review '
753
+ artifacts: true
754
+ - job: web ๐Ÿ›ก audit
755
+ artifacts: false
756
+ retry: *a1
757
+ interruptible: true
758
+ allow_failure: false
759
+ 'web ๐Ÿ›‘ Stop โš ๏ธ | review ':
760
+ stage: stop review
761
+ image: path/to/docker/gcloud:the-version
762
+ variables:
763
+ KUBERNETES_CPU_REQUEST: '0.22'
764
+ KUBERNETES_MEMORY_REQUEST: 200Mi
765
+ KUBERNETES_MEMORY_LIMIT: 400Mi
766
+ GIT_STRATEGY: none
767
+ script:
768
+ - collapseable_section_start "injectvars" "Injecting variables"
769
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
770
+ - collapseable_section_end "injectvars"
771
+ - set +e
772
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_web_GCLOUD_DEPLOY_credentialsKey")
773
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6
774
+ - gcloud run services delete $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web" | awk '{print tolower($0)}')-worker --project=google-project-id --region=europe-west6
775
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }) --quiet --delete-tags
776
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
777
+ - set +e
778
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/web --quiet --delete-tags
779
+ - set -e
780
+ - echo 'Disabling component in Dependency Track'
781
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
782
+ - set -e
783
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-web-$CL_review_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
784
+ environment:
785
+ name: review/$CI_COMMIT_REF_NAME/web
786
+ url: $CL_GITLAB_ENVIRONMENT_URL
787
+ action: stop
788
+ artifacts:
789
+ reports:
790
+ dotenv: gitlab_environment.env
791
+ rules:
792
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
793
+ when: on_success
794
+ - when: manual
795
+ if: $CI_MERGE_REQUEST_ID
796
+ needs: []
797
+ retry: *a1
798
+ interruptible: true
799
+ allow_failure: true
800
+ 'web ๐Ÿ”จ app | stage ':
801
+ stage: build
802
+ image: path/to/docker/jobs-meteor:the-version
803
+ variables:
804
+ KUBERNETES_CPU_REQUEST: '0.45'
805
+ KUBERNETES_MEMORY_REQUEST: 1Gi
806
+ KUBERNETES_MEMORY_LIMIT: 4Gi
807
+ script:
808
+ - collapseable_section_start "injectvars" "Injecting variables"
809
+ - export METEOR_DISABLE_OPTIMISTIC_CACHING="1"
810
+ - export ENV_SHORT="stage"
811
+ - export APP_DIR="web"
812
+ - export ENV_TYPE="stage"
813
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
814
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
815
+ - 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")"
816
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
817
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
818
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
819
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
820
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
821
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
822
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_web_GCLOUD_DEPLOY_credentialsKey"
823
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix"
824
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
825
+ - collapseable_section_end "injectvars"
826
+ - collapseable_section_start "write-dotenv-web" "write dot env for web"
827
+ - |-
828
+ cat <<EOF > web/.env
829
+ ENV_SHORT=stage
830
+ APP_DIR=web
831
+ ENV_TYPE=stage
832
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
833
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
834
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
835
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
836
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
837
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
838
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_web_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
839
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
840
+ _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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
841
+ EOF
842
+ - collapseable_section_end "write-dotenv-web"
843
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > web/__build_info.json
844
+ - collapseable_section_start "nodeinstall" "Ensure node version"
845
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
846
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
847
+ - collapseable_section_end "nodeinstall"
848
+ - cd web
849
+ - collapseable_section_start "nodeinstall" "Ensure node version"
850
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
851
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
852
+ - collapseable_section_end "nodeinstall"
853
+ - collapseable_section_start "yarninstall" "Yarn install"
854
+ - yarn install --immutable
855
+ - collapseable_section_end "yarninstall"
856
+ - echo "add healthcheck package"
857
+ - meteor add panter:healthroute --allow-superuser
858
+ - meteor add qualia:prod-shell --allow-superuser
859
+ - 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
860
+ - cp ./__build_info.json ./dist/bundle/programs/server
861
+ cache:
862
+ - key: web-yarn
863
+ policy: pull-push
864
+ paths:
865
+ - web/.yarn
866
+ - key: web-node-modules
867
+ policy: pull-push
868
+ paths:
869
+ - web/node_modules
870
+ - key: web-meteor-build-cache
871
+ policy: pull-push
872
+ paths:
873
+ - web/.meteor/local/resolver-result-cache.json
874
+ - web/.meteor/local/plugin-cache
875
+ - web/.meteor/local/isopacks
876
+ - web/.meteor/local/bundler-cache/scanner
877
+ artifacts:
878
+ paths:
879
+ - web/__build_info.json
880
+ - web/dist
881
+ exclude:
882
+ - web/.env
883
+ expire_in: 1 day
884
+ when: always
885
+ reports: {}
886
+ rules:
887
+ - if: $CI_COMMIT_TAG
888
+ needs: []
889
+ retry: *a1
890
+ interruptible: true
891
+ 'web ๐Ÿ”จ docker | stage ':
892
+ stage: build
893
+ image: path/to/docker/docker-build:the-version
894
+ services:
895
+ - name: docker:24.0.6-dind
896
+ command:
897
+ - --tls=false
898
+ - --registry-mirror=https://mirror.gcr.io
899
+ variables:
900
+ DOCKER_HOST: tcp://0.0.0.0:2375
901
+ DOCKER_TLS_CERTDIR: ''
902
+ DOCKER_DRIVER: overlay2
903
+ DOCKER_BUILDKIT: '1'
904
+ KUBERNETES_CPU_REQUEST: '0.45'
905
+ KUBERNETES_MEMORY_REQUEST: 1Gi
906
+ KUBERNETES_MEMORY_LIMIT: 2Gi
907
+ script:
908
+ - collapseable_section_start "injectvars" "Injecting variables"
909
+ - export APP_DIR="web"
910
+ - export DOCKER_BUILD_CONTEXT="."
911
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
912
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web"
913
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
914
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
915
+ - export METEOR_INSTALL_SCRIPTS=""
916
+ - collapseable_section_end "injectvars"
917
+ - ensureMeteorDockerfile
918
+ - collapseable_section_start "docker-login" "Docker Login"
919
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_web_GCLOUD_DEPLOY_credentialsKey")
920
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
921
+ - collapseable_section_end "docker-login"
922
+ - collapseable_section_start "docker-build" "Docker build"
923
+ - 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
924
+ - collapseable_section_end "docker-build"
925
+ - collapseable_section_start "docker-push" "Docker push and tag"
926
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
927
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
928
+ - docker push $DOCKER_CACHE_IMAGE
929
+ - collapseable_section_end "docker-push"
930
+ rules:
931
+ - if: $CI_COMMIT_TAG
932
+ needs:
933
+ - 'web ๐Ÿ”จ app | stage '
934
+ retry: *a1
935
+ interruptible: true
936
+ 'web ๐Ÿงพ sbom | stage ':
937
+ stage: build
938
+ image: aquasec/trivy:0.38.3
939
+ variables: {}
940
+ script:
941
+ - collapseable_section_start "injectvars" "Injecting variables"
942
+ - collapseable_section_end "injectvars"
943
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" web
944
+ artifacts:
945
+ paths:
946
+ - __sbom.json
947
+ rules:
948
+ - if: $CI_COMMIT_TAG
949
+ needs: []
950
+ retry: *a1
951
+ interruptible: true
952
+ allow_failure: true
953
+ 'web ๐Ÿš€ Deploy | stage ':
954
+ stage: deploy stage
955
+ image: path/to/docker/gcloud:the-version
956
+ variables:
957
+ KUBERNETES_CPU_REQUEST: '0.22'
958
+ KUBERNETES_MEMORY_REQUEST: 200Mi
959
+ KUBERNETES_MEMORY_LIMIT: 400Mi
960
+ script:
961
+ - collapseable_section_start "injectvars" "Injecting variables"
962
+ - export ENV_SHORT="stage"
963
+ - export APP_DIR="web"
964
+ - export ENV_TYPE="stage"
965
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
966
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
967
+ - 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")"
968
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
969
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
970
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
971
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
972
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
973
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
974
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_web_GCLOUD_DEPLOY_credentialsKey"
975
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix"
976
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
977
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
978
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web"
979
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
980
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
981
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
982
+ - collapseable_section_end "injectvars"
983
+ - collapseable_section_start "prepare" "Prepare..."
984
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_web_GCLOUD_DEPLOY_credentialsKey")
985
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
986
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
987
+ - collapseable_section_end "prepare"
988
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
989
+ - |
990
+ cat > ____envvars.yaml <<EOF
991
+ ENV_SHORT: |-
992
+ stage
993
+ APP_DIR: |-
994
+ web
995
+ ENV_TYPE: |-
996
+ stage
997
+ BUILD_INFO_BUILD_ID: |-
998
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
999
+ BUILD_INFO_BUILD_TIME: |-
1000
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1001
+ BUILD_INFO_CURRENT_VERSION: |-
1002
+ $(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/^/ /')
1003
+ HOSTNAME: |-
1004
+ $(printf %s "$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1005
+ ROOT_URL: |-
1006
+ $(printf %s "https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1007
+ HOSTNAME_INTERNAL: |-
1008
+ $(printf %s "$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1009
+ ROOT_URL_INTERNAL: |-
1010
+ $(printf %s "https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1011
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1012
+ google-project-id
1013
+ DEPLOY_CLOUD_RUN_REGION: |-
1014
+ europe-west6
1015
+ GCLOUD_RUN_canonicalHostSuffix: |-
1016
+ $(printf %s "$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1017
+ _ALL_ENV_VAR_KEYS: |-
1018
+ ["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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1019
+
1020
+ EOF
1021
+ - collapseable_section_end "writeenvvars"
1022
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1023
+ - gcloud run deploy pan-test-app-stage-web --command="node,main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=stage,env-name=stage,build-type=meteor,cloud-run-service-name=pan-test-app-stage-web --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1024
+ - gcloud run deploy pan-test-app-stage-web-worker --command="/bin/sh -c,BACKGROUND_JOBS_ENABLED=1 node main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=stage,env-name=stage,build-type=meteor,cloud-run-service-name=pan-test-app-stage-web-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1025
+ - collapseable_section_end "deploy"
1026
+ - collapseable_section_start "cleanup" "Cleanup"
1027
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-stage-web --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
1028
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web@$version --quiet --delete-tags; done
1029
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
1030
+ - collapseable_section_end "cleanup"
1031
+ - echo 'Uploading SBOM to Dependency Track'
1032
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1033
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1034
+ environment:
1035
+ name: stage/web
1036
+ url: $CL_GITLAB_ENVIRONMENT_URL
1037
+ on_stop: 'web ๐Ÿ›‘ Stop โš ๏ธ | stage '
1038
+ artifacts:
1039
+ reports:
1040
+ dotenv: gitlab_environment.env
1041
+ rules:
1042
+ - when: on_success
1043
+ if: $CI_COMMIT_TAG
1044
+ needs:
1045
+ - job: 'web ๐Ÿ”จ app | stage '
1046
+ artifacts: false
1047
+ - job: 'web ๐Ÿ”จ docker | stage '
1048
+ artifacts: false
1049
+ - job: 'web ๐Ÿงพ sbom | stage '
1050
+ artifacts: true
1051
+ retry: *a1
1052
+ interruptible: true
1053
+ allow_failure: false
1054
+ 'web ๐Ÿ›‘ Stop โš ๏ธ | stage ':
1055
+ stage: stop stage
1056
+ image: path/to/docker/gcloud:the-version
1057
+ variables:
1058
+ KUBERNETES_CPU_REQUEST: '0.22'
1059
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1060
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1061
+ GIT_STRATEGY: none
1062
+ script:
1063
+ - collapseable_section_start "injectvars" "Injecting variables"
1064
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1065
+ - collapseable_section_end "injectvars"
1066
+ - set +e
1067
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_web_GCLOUD_DEPLOY_credentialsKey")
1068
+ - gcloud run services delete pan-test-app-stage-web --project=google-project-id --region=europe-west6
1069
+ - gcloud run services delete pan-test-app-stage-web-worker --project=google-project-id --region=europe-west6
1070
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/web --quiet --delete-tags
1071
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
1072
+ - echo 'Disabling component in Dependency Track'
1073
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1074
+ - set -e
1075
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-stage-web-$CL_stage_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1076
+ environment:
1077
+ name: stage/web
1078
+ url: $CL_GITLAB_ENVIRONMENT_URL
1079
+ action: stop
1080
+ artifacts:
1081
+ reports:
1082
+ dotenv: gitlab_environment.env
1083
+ rules:
1084
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1085
+ when: on_success
1086
+ - when: manual
1087
+ if: $CI_COMMIT_TAG
1088
+ needs: []
1089
+ retry: *a1
1090
+ interruptible: true
1091
+ allow_failure: true
1092
+ 'web ๐Ÿ”จ app | prod ':
1093
+ stage: build
1094
+ image: path/to/docker/jobs-meteor:the-version
1095
+ variables:
1096
+ KUBERNETES_CPU_REQUEST: '0.45'
1097
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1098
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1099
+ script:
1100
+ - collapseable_section_start "injectvars" "Injecting variables"
1101
+ - export METEOR_DISABLE_OPTIMISTIC_CACHING="1"
1102
+ - export ENV_SHORT="prod"
1103
+ - export APP_DIR="web"
1104
+ - export ENV_TYPE="prod"
1105
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1106
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1107
+ - 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")"
1108
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1109
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1110
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1111
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1112
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1113
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1114
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_web_GCLOUD_DEPLOY_credentialsKey"
1115
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix"
1116
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1117
+ - collapseable_section_end "injectvars"
1118
+ - collapseable_section_start "write-dotenv-web" "write dot env for web"
1119
+ - |-
1120
+ cat <<EOF > web/.env
1121
+ ENV_SHORT=prod
1122
+ APP_DIR=web
1123
+ ENV_TYPE=prod
1124
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1125
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1126
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1127
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1128
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
1129
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
1130
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_web_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1131
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1132
+ _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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1133
+ EOF
1134
+ - collapseable_section_end "write-dotenv-web"
1135
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > web/__build_info.json
1136
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1137
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1138
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1139
+ - collapseable_section_end "nodeinstall"
1140
+ - cd web
1141
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1142
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1143
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1144
+ - collapseable_section_end "nodeinstall"
1145
+ - collapseable_section_start "yarninstall" "Yarn install"
1146
+ - yarn install --immutable
1147
+ - collapseable_section_end "yarninstall"
1148
+ - echo "add healthcheck package"
1149
+ - meteor add panter:healthroute --allow-superuser
1150
+ - meteor add qualia:prod-shell --allow-superuser
1151
+ - 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
1152
+ - cp ./__build_info.json ./dist/bundle/programs/server
1153
+ cache:
1154
+ - key: web-yarn
1155
+ policy: pull-push
1156
+ paths:
1157
+ - web/.yarn
1158
+ - key: web-node-modules
1159
+ policy: pull-push
1160
+ paths:
1161
+ - web/node_modules
1162
+ - key: web-meteor-build-cache
1163
+ policy: pull-push
1164
+ paths:
1165
+ - web/.meteor/local/resolver-result-cache.json
1166
+ - web/.meteor/local/plugin-cache
1167
+ - web/.meteor/local/isopacks
1168
+ - web/.meteor/local/bundler-cache/scanner
1169
+ artifacts:
1170
+ paths:
1171
+ - web/__build_info.json
1172
+ - web/dist
1173
+ exclude:
1174
+ - web/.env
1175
+ expire_in: 1 day
1176
+ when: always
1177
+ reports: {}
1178
+ rules:
1179
+ - if: $CI_COMMIT_TAG
1180
+ needs: []
1181
+ retry: *a1
1182
+ interruptible: true
1183
+ 'web ๐Ÿ”จ docker | prod ':
1184
+ stage: build
1185
+ image: path/to/docker/docker-build:the-version
1186
+ services:
1187
+ - name: docker:24.0.6-dind
1188
+ command:
1189
+ - --tls=false
1190
+ - --registry-mirror=https://mirror.gcr.io
1191
+ variables:
1192
+ DOCKER_HOST: tcp://0.0.0.0:2375
1193
+ DOCKER_TLS_CERTDIR: ''
1194
+ DOCKER_DRIVER: overlay2
1195
+ DOCKER_BUILDKIT: '1'
1196
+ KUBERNETES_CPU_REQUEST: '0.45'
1197
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1198
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1199
+ script:
1200
+ - collapseable_section_start "injectvars" "Injecting variables"
1201
+ - export APP_DIR="web"
1202
+ - export DOCKER_BUILD_CONTEXT="."
1203
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1204
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web"
1205
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
1206
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1207
+ - export METEOR_INSTALL_SCRIPTS=""
1208
+ - collapseable_section_end "injectvars"
1209
+ - ensureMeteorDockerfile
1210
+ - collapseable_section_start "docker-login" "Docker Login"
1211
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_web_GCLOUD_DEPLOY_credentialsKey")
1212
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
1213
+ - collapseable_section_end "docker-login"
1214
+ - collapseable_section_start "docker-build" "Docker build"
1215
+ - 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
1216
+ - collapseable_section_end "docker-build"
1217
+ - collapseable_section_start "docker-push" "Docker push and tag"
1218
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1219
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1220
+ - docker push $DOCKER_CACHE_IMAGE
1221
+ - collapseable_section_end "docker-push"
1222
+ rules:
1223
+ - if: $CI_COMMIT_TAG
1224
+ needs:
1225
+ - 'web ๐Ÿ”จ app | prod '
1226
+ retry: *a1
1227
+ interruptible: true
1228
+ 'web ๐Ÿงพ sbom | prod ':
1229
+ stage: build
1230
+ image: aquasec/trivy:0.38.3
1231
+ variables: {}
1232
+ script:
1233
+ - collapseable_section_start "injectvars" "Injecting variables"
1234
+ - collapseable_section_end "injectvars"
1235
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" web
1236
+ artifacts:
1237
+ paths:
1238
+ - __sbom.json
1239
+ rules:
1240
+ - if: $CI_COMMIT_TAG
1241
+ needs: []
1242
+ retry: *a1
1243
+ interruptible: true
1244
+ allow_failure: true
1245
+ 'web ๐Ÿš€ Deploy | prod ':
1246
+ stage: deploy prod
1247
+ image: path/to/docker/gcloud:the-version
1248
+ variables:
1249
+ KUBERNETES_CPU_REQUEST: '0.22'
1250
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1251
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1252
+ script:
1253
+ - collapseable_section_start "injectvars" "Injecting variables"
1254
+ - export ENV_SHORT="prod"
1255
+ - export APP_DIR="web"
1256
+ - export ENV_TYPE="prod"
1257
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1258
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1259
+ - 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")"
1260
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1261
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1262
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1263
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1264
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1265
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1266
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_web_GCLOUD_DEPLOY_credentialsKey"
1267
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix"
1268
+ - 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\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
1269
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1270
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web"
1271
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web"
1272
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1273
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1274
+ - collapseable_section_end "injectvars"
1275
+ - collapseable_section_start "prepare" "Prepare..."
1276
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_web_GCLOUD_DEPLOY_credentialsKey")
1277
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1278
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1279
+ - collapseable_section_end "prepare"
1280
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1281
+ - |
1282
+ cat > ____envvars.yaml <<EOF
1283
+ ENV_SHORT: |-
1284
+ prod
1285
+ APP_DIR: |-
1286
+ web
1287
+ ENV_TYPE: |-
1288
+ prod
1289
+ BUILD_INFO_BUILD_ID: |-
1290
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1291
+ BUILD_INFO_BUILD_TIME: |-
1292
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1293
+ BUILD_INFO_CURRENT_VERSION: |-
1294
+ $(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/^/ /')
1295
+ HOSTNAME: |-
1296
+ $(printf %s "$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1297
+ ROOT_URL: |-
1298
+ $(printf %s "https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1299
+ HOSTNAME_INTERNAL: |-
1300
+ $(printf %s "$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1301
+ ROOT_URL_INTERNAL: |-
1302
+ $(printf %s "https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1303
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1304
+ google-project-id
1305
+ DEPLOY_CLOUD_RUN_REGION: |-
1306
+ europe-west6
1307
+ GCLOUD_RUN_canonicalHostSuffix: |-
1308
+ $(printf %s "$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1309
+ _ALL_ENV_VAR_KEYS: |-
1310
+ ["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","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1311
+
1312
+ EOF
1313
+ - collapseable_section_end "writeenvvars"
1314
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1315
+ - gcloud run deploy pan-test-app-prod-web --command="node,main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=prod,env-name=prod,build-type=meteor,cloud-run-service-name=pan-test-app-prod-web --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1316
+ - gcloud run deploy pan-test-app-prod-web-worker --command="/bin/sh -c,BACKGROUND_JOBS_ENABLED=1 node main.js" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=web,app-name=test-app,env-type=prod,env-name=prod,build-type=meteor,cloud-run-service-name=pan-test-app-prod-web-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1317
+ - collapseable_section_end "deploy"
1318
+ - collapseable_section_start "cleanup" "Cleanup"
1319
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-prod-web --limit=unlimited --sort-by=metadata.creationTimestamp --format="value(name)" --filter='(status.conditions.status=False OR status.conditions.status=Unknown)' | tail -n +6 | while read -r revisionname; do gcloud run revisions delete --project=google-project-id --region=europe-west6 --quiet $revisionname ; done
1320
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +7 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web@$version --quiet --delete-tags; done
1321
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
1322
+ - collapseable_section_end "cleanup"
1323
+ - echo 'Uploading SBOM to Dependency Track'
1324
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/web" "https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" "__sbom.json" vex.json || true
1325
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1326
+ environment:
1327
+ name: prod/web
1328
+ url: $CL_GITLAB_ENVIRONMENT_URL
1329
+ on_stop: 'web ๐Ÿ›‘ Stop โš ๏ธ | prod '
1330
+ artifacts:
1331
+ reports:
1332
+ dotenv: gitlab_environment.env
1333
+ rules:
1334
+ - when: manual
1335
+ if: $CI_COMMIT_TAG
1336
+ needs:
1337
+ - job: 'web ๐Ÿ”จ app | prod '
1338
+ artifacts: false
1339
+ - job: 'web ๐Ÿ”จ docker | prod '
1340
+ artifacts: false
1341
+ - job: 'web ๐Ÿงพ sbom | prod '
1342
+ artifacts: true
1343
+ retry: *a1
1344
+ interruptible: true
1345
+ allow_failure: true
1346
+ 'web ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1347
+ stage: stop prod
1348
+ image: path/to/docker/gcloud:the-version
1349
+ variables:
1350
+ KUBERNETES_CPU_REQUEST: '0.22'
1351
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1352
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1353
+ GIT_STRATEGY: none
1354
+ script:
1355
+ - collapseable_section_start "injectvars" "Injecting variables"
1356
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1357
+ - collapseable_section_end "injectvars"
1358
+ - set +e
1359
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_web_GCLOUD_DEPLOY_credentialsKey")
1360
+ - gcloud run services delete pan-test-app-prod-web --project=google-project-id --region=europe-west6
1361
+ - gcloud run services delete pan-test-app-prod-web-worker --project=google-project-id --region=europe-west6
1362
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/web --quiet --delete-tags
1363
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web --sort-by=~CREATE_TIME --format="value(version)" | tail -n +2 | while read -r version; do gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/web@$version --quiet --delete-tags; done
1364
+ - echo 'Disabling component in Dependency Track'
1365
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/web" "https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" || true
1366
+ - set -e
1367
+ - echo "CL_GITLAB_ENVIRONMENT_URL=https://$(printf %s "pan-test-app-prod-web-$CL_prod_web_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" >> gitlab_environment.env
1368
+ environment:
1369
+ name: prod/web
1370
+ url: $CL_GITLAB_ENVIRONMENT_URL
1371
+ action: stop
1372
+ artifacts:
1373
+ reports:
1374
+ dotenv: gitlab_environment.env
1375
+ rules:
1376
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1377
+ when: on_success
1378
+ - when: manual
1379
+ if: $CI_COMMIT_TAG
1380
+ needs: []
1381
+ retry: *a1
1382
+ interruptible: true
1383
+ allow_failure: true
1384
+ create release:
1385
+ stage: release
1386
+ image: path/to/docker/semantic-release:the-version
1387
+ script:
1388
+ - semanticRelease
1389
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1390
+ rules:
1391
+ - &a2
1392
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1393
+ when: never
1394
+ - &a3
1395
+ if: $CI_PIPELINE_SOURCE == "schedule"
1396
+ when: never
1397
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1398
+ when: on_success
1399
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1400
+ when: manual
1401
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1402
+ when: manual
1403
+ โš ๏ธ force create release:
1404
+ stage: release
1405
+ image: path/to/docker/semantic-release:the-version
1406
+ script:
1407
+ - semanticRelease
1408
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1409
+ rules:
1410
+ - *a2
1411
+ - *a3
1412
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1413
+ when: manual
1414
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1415
+ when: manual
1416
+ needs: []
1417
+ "
1418
+ `;