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

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