@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,1410 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for cloud-run-nextjs 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
+ www ๐Ÿ›ก 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="www"
88
+ - collapseable_section_end "injectvars"
89
+ - cd www
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
+ www ๐Ÿ‘ฎ 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="www"
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 www
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: www-yarn
128
+ policy: pull-push
129
+ paths:
130
+ - www/.yarn
131
+ - key: www-node-modules
132
+ policy: pull-push
133
+ paths:
134
+ - www/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
+ www ๐Ÿงช 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="www"
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 www
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: www-yarn
167
+ policy: pull-push
168
+ paths:
169
+ - www/.yarn
170
+ - key: www-node-modules
171
+ policy: pull-push
172
+ paths:
173
+ - www/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
+ 'www ๐Ÿ”จ app | dev ':
181
+ stage: build
182
+ image: path/to/docker/jobs-default: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 ENV_SHORT="dev"
190
+ - export APP_DIR="www"
191
+ - export ENV_TYPE="dev"
192
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
193
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
194
+ - 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")"
195
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
196
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
197
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
198
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
199
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
200
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
201
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"
202
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"
203
+ - 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\\"]"
204
+ - collapseable_section_end "injectvars"
205
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
206
+ - |-
207
+ cat <<EOF > www/.env
208
+ ENV_SHORT=dev
209
+ APP_DIR=www
210
+ ENV_TYPE=dev
211
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
212
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
213
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
214
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
215
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
216
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
217
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
218
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
219
+ _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"]
220
+ EOF
221
+ - collapseable_section_end "write-dotenv-www"
222
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
223
+ - collapseable_section_start "nodeinstall" "Ensure node version"
224
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
225
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
226
+ - collapseable_section_end "nodeinstall"
227
+ - cd www
228
+ - collapseable_section_start "nodeinstall" "Ensure node version"
229
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
230
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
231
+ - collapseable_section_end "nodeinstall"
232
+ - collapseable_section_start "yarninstall" "Yarn install"
233
+ - yarn install --immutable
234
+ - collapseable_section_end "yarninstall"
235
+ - yarn build
236
+ cache:
237
+ - key: www-yarn
238
+ policy: pull-push
239
+ paths:
240
+ - www/.yarn
241
+ - key: www-node-modules
242
+ policy: pull-push
243
+ paths:
244
+ - www/node_modules
245
+ - key: www-default
246
+ policy: pull-push
247
+ paths:
248
+ - www/.next/cache
249
+ artifacts:
250
+ paths:
251
+ - www/__build_info.json
252
+ - www/.next
253
+ - www/dist
254
+ exclude:
255
+ - www/.env
256
+ expire_in: 1 day
257
+ when: always
258
+ reports: {}
259
+ rules:
260
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
261
+ needs: []
262
+ retry: *a1
263
+ interruptible: true
264
+ 'www ๐Ÿ”จ docker | dev ':
265
+ stage: build
266
+ image: path/to/docker/docker-build:the-version
267
+ services:
268
+ - name: docker:24.0.6-dind
269
+ command:
270
+ - --tls=false
271
+ - --registry-mirror=https://mirror.gcr.io
272
+ variables:
273
+ DOCKER_HOST: tcp://docker:2375
274
+ DOCKER_TLS_CERTDIR: ''
275
+ DOCKER_DRIVER: overlay2
276
+ DOCKER_BUILDKIT: '1'
277
+ KUBERNETES_CPU_REQUEST: '0.45'
278
+ KUBERNETES_MEMORY_REQUEST: 1Gi
279
+ KUBERNETES_MEMORY_LIMIT: 2Gi
280
+ script:
281
+ - collapseable_section_start "injectvars" "Injecting variables"
282
+ - export APP_DIR="www"
283
+ - export DOCKER_BUILD_CONTEXT="."
284
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
285
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www"
286
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
287
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
288
+ - |-
289
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
290
+ RUN yarn plugin import workspace-tools
291
+ RUN yarn workspaces focus --production && yarn rebuild"
292
+ - |-
293
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
294
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
295
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
296
+ COPY --chown=node:node .yarn /app/.yarn"
297
+ - collapseable_section_end "injectvars"
298
+ - ensureNodeDockerfile
299
+ - collapseable_section_start "docker-login" "Docker Login"
300
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
301
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
302
+ - collapseable_section_end "docker-login"
303
+ - collapseable_section_start "docker-build" "Docker build"
304
+ - 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
305
+ - collapseable_section_end "docker-build"
306
+ - collapseable_section_start "docker-push" "Docker push and tag"
307
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
308
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
309
+ - docker push $DOCKER_CACHE_IMAGE
310
+ - collapseable_section_end "docker-push"
311
+ cache:
312
+ - key: www-yarn
313
+ policy: pull
314
+ paths:
315
+ - www/.yarn
316
+ rules:
317
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
318
+ needs:
319
+ - 'www ๐Ÿ”จ app | dev '
320
+ retry: *a1
321
+ interruptible: true
322
+ 'www ๐Ÿงพ sbom | dev ':
323
+ stage: build
324
+ image:
325
+ name: aquasec/trivy:0.58.2
326
+ entrypoint:
327
+ - ''
328
+ variables: {}
329
+ script:
330
+ - collapseable_section_start "injectvars" "Injecting variables"
331
+ - collapseable_section_end "injectvars"
332
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
333
+ artifacts:
334
+ paths:
335
+ - __sbom.json
336
+ rules:
337
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
338
+ needs: []
339
+ retry: *a1
340
+ interruptible: true
341
+ allow_failure: true
342
+ 'www ๐Ÿš€ Deploy | dev ':
343
+ stage: deploy dev
344
+ image: path/to/docker/gcloud:the-version
345
+ variables:
346
+ KUBERNETES_CPU_REQUEST: '0.22'
347
+ KUBERNETES_MEMORY_REQUEST: 200Mi
348
+ KUBERNETES_MEMORY_LIMIT: 400Mi
349
+ script:
350
+ - collapseable_section_start "injectvars" "Injecting variables"
351
+ - export ENV_SHORT="dev"
352
+ - export APP_DIR="www"
353
+ - export ENV_TYPE="dev"
354
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
355
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
356
+ - 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")"
357
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
358
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
359
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
360
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
361
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
362
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
363
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"
364
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"
365
+ - 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\\"]"
366
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
367
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www"
368
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
369
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
370
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
371
+ - collapseable_section_end "injectvars"
372
+ - collapseable_section_start "prepare" "Prepare..."
373
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
374
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
375
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
376
+ - collapseable_section_end "prepare"
377
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
378
+ - |
379
+ cat > ____envvars.yaml <<EOF
380
+ ENV_SHORT: |-
381
+ dev
382
+ APP_DIR: |-
383
+ www
384
+ ENV_TYPE: |-
385
+ dev
386
+ BUILD_INFO_BUILD_ID: |-
387
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
388
+ BUILD_INFO_BUILD_TIME: |-
389
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
390
+ BUILD_INFO_CURRENT_VERSION: |-
391
+ $(printf %s "$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")" | sed '1!s/^/ /')
392
+ HOSTNAME: |-
393
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
394
+ ROOT_URL: |-
395
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
396
+ HOSTNAME_INTERNAL: |-
397
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
398
+ ROOT_URL_INTERNAL: |-
399
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
400
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
401
+ google-project-id
402
+ DEPLOY_CLOUD_RUN_REGION: |-
403
+ europe-west6
404
+ GCLOUD_RUN_canonicalHostSuffix: |-
405
+ $(printf %s "$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
406
+ _ALL_ENV_VAR_KEYS: |-
407
+ ["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"]
408
+
409
+ EOF
410
+ - collapseable_section_end "writeenvvars"
411
+ - collapseable_section_start "deploy" "Deploy to cloud run"
412
+ - gcloud run deploy pan-test-app-dev-www --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=dev,env-name=dev,build-type=node,cloud-run-service-name=pan-test-app-dev-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
413
+ - collapseable_section_end "deploy"
414
+ - collapseable_section_start "cleanup" "Cleanup"
415
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-dev-www --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
416
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www --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/www@$version --quiet --delete-tags; done
417
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
418
+ - collapseable_section_end "cleanup"
419
+ - echo 'Uploading SBOM to Dependency Track'
420
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
421
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
422
+ environment:
423
+ name: dev/www
424
+ url: $CL_GITLAB_ENVIRONMENT_URL
425
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | dev '
426
+ auto_stop_in: 4 weeks
427
+ artifacts:
428
+ reports:
429
+ dotenv: gitlab_environment.env
430
+ rules:
431
+ - when: on_success
432
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
433
+ needs:
434
+ - job: www ๐Ÿ‘ฎ lint
435
+ artifacts: false
436
+ - job: 'www ๐Ÿ”จ app | dev '
437
+ artifacts: false
438
+ - job: 'www ๐Ÿ”จ docker | dev '
439
+ artifacts: false
440
+ - job: www ๐Ÿงช test
441
+ artifacts: false
442
+ - job: 'www ๐Ÿงพ sbom | dev '
443
+ artifacts: true
444
+ - job: www ๐Ÿ›ก audit
445
+ artifacts: false
446
+ retry: *a1
447
+ interruptible: true
448
+ allow_failure: false
449
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | dev ':
450
+ stage: stop dev
451
+ image: path/to/docker/gcloud:the-version
452
+ variables:
453
+ KUBERNETES_CPU_REQUEST: '0.22'
454
+ KUBERNETES_MEMORY_REQUEST: 200Mi
455
+ KUBERNETES_MEMORY_LIMIT: 400Mi
456
+ GIT_STRATEGY: none
457
+ script:
458
+ - collapseable_section_start "injectvars" "Injecting variables"
459
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
460
+ - collapseable_section_end "injectvars"
461
+ - set +e
462
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
463
+ - gcloud run services delete pan-test-app-dev-www --project=google-project-id --region=europe-west6
464
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/www --quiet --delete-tags
465
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
466
+ - echo 'Disabling component in Dependency Track'
467
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
468
+ - set -e
469
+ environment:
470
+ name: dev/www
471
+ action: stop
472
+ rules:
473
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
474
+ when: on_success
475
+ - when: manual
476
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
477
+ needs: []
478
+ retry: *a1
479
+ interruptible: true
480
+ allow_failure: true
481
+ 'www ๐Ÿ”จ app | review ':
482
+ stage: build
483
+ image: path/to/docker/jobs-default:the-version
484
+ variables:
485
+ KUBERNETES_CPU_REQUEST: '0.45'
486
+ KUBERNETES_MEMORY_REQUEST: 1Gi
487
+ KUBERNETES_MEMORY_LIMIT: 4Gi
488
+ script:
489
+ - collapseable_section_start "injectvars" "Injecting variables"
490
+ - export ENV_SHORT="review"
491
+ - export APP_DIR="www"
492
+ - export ENV_TYPE="review"
493
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
494
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
495
+ - 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")"
496
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
497
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
498
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
499
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
500
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
501
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
502
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"
503
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"
504
+ - 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\\"]"
505
+ - collapseable_section_end "injectvars"
506
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
507
+ - |-
508
+ cat <<EOF > www/.env
509
+ ENV_SHORT=review
510
+ APP_DIR=www
511
+ ENV_TYPE=review
512
+ 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
513
+ 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
514
+ 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
515
+ 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
516
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
517
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
518
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_www_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
519
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
520
+ _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"]
521
+ EOF
522
+ - collapseable_section_end "write-dotenv-www"
523
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
524
+ - collapseable_section_start "nodeinstall" "Ensure node version"
525
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
526
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
527
+ - collapseable_section_end "nodeinstall"
528
+ - cd www
529
+ - collapseable_section_start "nodeinstall" "Ensure node version"
530
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
531
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
532
+ - collapseable_section_end "nodeinstall"
533
+ - collapseable_section_start "yarninstall" "Yarn install"
534
+ - yarn install --immutable
535
+ - collapseable_section_end "yarninstall"
536
+ - yarn build
537
+ cache:
538
+ - key: www-yarn
539
+ policy: pull-push
540
+ paths:
541
+ - www/.yarn
542
+ - key: www-node-modules
543
+ policy: pull-push
544
+ paths:
545
+ - www/node_modules
546
+ - key: www-default
547
+ policy: pull-push
548
+ paths:
549
+ - www/.next/cache
550
+ artifacts:
551
+ paths:
552
+ - www/__build_info.json
553
+ - www/.next
554
+ - www/dist
555
+ exclude:
556
+ - www/.env
557
+ expire_in: 1 day
558
+ when: always
559
+ reports: {}
560
+ rules:
561
+ - if: $CI_MERGE_REQUEST_ID
562
+ needs: []
563
+ retry: *a1
564
+ interruptible: true
565
+ 'www ๐Ÿ”จ docker | review ':
566
+ stage: build
567
+ image: path/to/docker/docker-build:the-version
568
+ services:
569
+ - name: docker:24.0.6-dind
570
+ command:
571
+ - --tls=false
572
+ - --registry-mirror=https://mirror.gcr.io
573
+ variables:
574
+ DOCKER_HOST: tcp://docker:2375
575
+ DOCKER_TLS_CERTDIR: ''
576
+ DOCKER_DRIVER: overlay2
577
+ DOCKER_BUILDKIT: '1'
578
+ KUBERNETES_CPU_REQUEST: '0.45'
579
+ KUBERNETES_MEMORY_REQUEST: 1Gi
580
+ KUBERNETES_MEMORY_LIMIT: 2Gi
581
+ script:
582
+ - collapseable_section_start "injectvars" "Injecting variables"
583
+ - export APP_DIR="www"
584
+ - export DOCKER_BUILD_CONTEXT="."
585
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
586
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
587
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
588
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
589
+ - |-
590
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
591
+ RUN yarn plugin import workspace-tools
592
+ RUN yarn workspaces focus --production && yarn rebuild"
593
+ - |-
594
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
595
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
596
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
597
+ COPY --chown=node:node .yarn /app/.yarn"
598
+ - collapseable_section_end "injectvars"
599
+ - ensureNodeDockerfile
600
+ - collapseable_section_start "docker-login" "Docker Login"
601
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
602
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
603
+ - collapseable_section_end "docker-login"
604
+ - collapseable_section_start "docker-build" "Docker build"
605
+ - 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
606
+ - collapseable_section_end "docker-build"
607
+ - collapseable_section_start "docker-push" "Docker push and tag"
608
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
609
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
610
+ - docker push $DOCKER_CACHE_IMAGE
611
+ - collapseable_section_end "docker-push"
612
+ cache:
613
+ - key: www-yarn
614
+ policy: pull
615
+ paths:
616
+ - www/.yarn
617
+ rules:
618
+ - if: $CI_MERGE_REQUEST_ID
619
+ needs:
620
+ - 'www ๐Ÿ”จ app | review '
621
+ retry: *a1
622
+ interruptible: true
623
+ 'www ๐Ÿงพ sbom | review ':
624
+ stage: build
625
+ image:
626
+ name: aquasec/trivy:0.58.2
627
+ entrypoint:
628
+ - ''
629
+ variables: {}
630
+ script:
631
+ - collapseable_section_start "injectvars" "Injecting variables"
632
+ - collapseable_section_end "injectvars"
633
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
634
+ artifacts:
635
+ paths:
636
+ - __sbom.json
637
+ rules:
638
+ - if: $CI_MERGE_REQUEST_ID
639
+ needs: []
640
+ retry: *a1
641
+ interruptible: true
642
+ allow_failure: true
643
+ 'www ๐Ÿš€ Deploy | review ':
644
+ stage: deploy review
645
+ image: path/to/docker/gcloud:the-version
646
+ variables:
647
+ KUBERNETES_CPU_REQUEST: '0.22'
648
+ KUBERNETES_MEMORY_REQUEST: 200Mi
649
+ KUBERNETES_MEMORY_LIMIT: 400Mi
650
+ script:
651
+ - collapseable_section_start "injectvars" "Injecting variables"
652
+ - export ENV_SHORT="review"
653
+ - export APP_DIR="www"
654
+ - export ENV_TYPE="review"
655
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
656
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
657
+ - 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")"
658
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
659
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
660
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
661
+ - 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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
662
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
663
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
664
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"
665
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"
666
+ - 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\\"]"
667
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
668
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })"
669
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
670
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
671
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
672
+ - collapseable_section_end "injectvars"
673
+ - collapseable_section_start "prepare" "Prepare..."
674
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
675
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
676
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
677
+ - collapseable_section_end "prepare"
678
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
679
+ - |
680
+ cat > ____envvars.yaml <<EOF
681
+ ENV_SHORT: |-
682
+ review
683
+ APP_DIR: |-
684
+ www
685
+ ENV_TYPE: |-
686
+ review
687
+ BUILD_INFO_BUILD_ID: |-
688
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
689
+ BUILD_INFO_BUILD_TIME: |-
690
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
691
+ BUILD_INFO_CURRENT_VERSION: |-
692
+ $(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/^/ /')
693
+ HOSTNAME: |-
694
+ $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
695
+ ROOT_URL: |-
696
+ $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
697
+ HOSTNAME_INTERNAL: |-
698
+ $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
699
+ ROOT_URL_INTERNAL: |-
700
+ $(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"; })-www-$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
701
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
702
+ google-project-id
703
+ DEPLOY_CLOUD_RUN_REGION: |-
704
+ europe-west6
705
+ GCLOUD_RUN_canonicalHostSuffix: |-
706
+ $(printf %s "$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
707
+ _ALL_ENV_VAR_KEYS: |-
708
+ ["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"]
709
+
710
+ EOF
711
+ - collapseable_section_end "writeenvvars"
712
+ - collapseable_section_start "deploy" "Deploy to cloud run"
713
+ - 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"; })-www" | awk '{print tolower($0)}') --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -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=www,app-name=test-app,env-type=review,env-name=review,build-type=node,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"; })-www" | awk '{print tolower($0)}') --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
714
+ - collapseable_section_end "deploy"
715
+ - collapseable_section_start "cleanup" "Cleanup"
716
+ - 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"; })-www" | 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
717
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -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/www/$([ -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
718
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
719
+ - set +e
720
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www --quiet --delete-tags
721
+ - set -e
722
+ - collapseable_section_end "cleanup"
723
+ - echo 'Uploading SBOM to Dependency Track'
724
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
725
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
726
+ environment:
727
+ name: review/$CI_COMMIT_REF_NAME/www
728
+ url: $CL_GITLAB_ENVIRONMENT_URL
729
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | review '
730
+ auto_stop_in: 1 week
731
+ artifacts:
732
+ reports:
733
+ dotenv: gitlab_environment.env
734
+ rules:
735
+ - when: on_success
736
+ if: $CI_MERGE_REQUEST_ID
737
+ needs:
738
+ - job: www ๐Ÿ‘ฎ lint
739
+ artifacts: false
740
+ - job: 'www ๐Ÿ”จ app | review '
741
+ artifacts: false
742
+ - job: 'www ๐Ÿ”จ docker | review '
743
+ artifacts: false
744
+ - job: www ๐Ÿงช test
745
+ artifacts: false
746
+ - job: 'www ๐Ÿงพ sbom | review '
747
+ artifacts: true
748
+ - job: www ๐Ÿ›ก audit
749
+ artifacts: false
750
+ retry: *a1
751
+ interruptible: true
752
+ allow_failure: false
753
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | review ':
754
+ stage: stop review
755
+ image: path/to/docker/gcloud:the-version
756
+ variables:
757
+ KUBERNETES_CPU_REQUEST: '0.22'
758
+ KUBERNETES_MEMORY_REQUEST: 200Mi
759
+ KUBERNETES_MEMORY_LIMIT: 400Mi
760
+ GIT_STRATEGY: none
761
+ script:
762
+ - collapseable_section_start "injectvars" "Injecting variables"
763
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
764
+ - collapseable_section_end "injectvars"
765
+ - set +e
766
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
767
+ - 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"; })-www" | awk '{print tolower($0)}') --project=google-project-id --region=europe-west6
768
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www/$([ -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
769
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
770
+ - set +e
771
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/www --quiet --delete-tags
772
+ - set -e
773
+ - echo 'Disabling component in Dependency Track'
774
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
775
+ - set -e
776
+ environment:
777
+ name: review/$CI_COMMIT_REF_NAME/www
778
+ action: stop
779
+ rules:
780
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
781
+ when: on_success
782
+ - when: manual
783
+ if: $CI_MERGE_REQUEST_ID
784
+ needs: []
785
+ retry: *a1
786
+ interruptible: true
787
+ allow_failure: true
788
+ 'www ๐Ÿ”จ app | stage ':
789
+ stage: build
790
+ image: path/to/docker/jobs-default:the-version
791
+ variables:
792
+ KUBERNETES_CPU_REQUEST: '0.45'
793
+ KUBERNETES_MEMORY_REQUEST: 1Gi
794
+ KUBERNETES_MEMORY_LIMIT: 4Gi
795
+ script:
796
+ - collapseable_section_start "injectvars" "Injecting variables"
797
+ - export ENV_SHORT="stage"
798
+ - export APP_DIR="www"
799
+ - export ENV_TYPE="stage"
800
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
801
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
802
+ - 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")"
803
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
804
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
805
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
806
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
807
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
808
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
809
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"
810
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"
811
+ - 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\\"]"
812
+ - collapseable_section_end "injectvars"
813
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
814
+ - |-
815
+ cat <<EOF > www/.env
816
+ ENV_SHORT=stage
817
+ APP_DIR=www
818
+ ENV_TYPE=stage
819
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
820
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
821
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
822
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
823
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
824
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
825
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
826
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
827
+ _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"]
828
+ EOF
829
+ - collapseable_section_end "write-dotenv-www"
830
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
831
+ - collapseable_section_start "nodeinstall" "Ensure node version"
832
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
833
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
834
+ - collapseable_section_end "nodeinstall"
835
+ - cd www
836
+ - collapseable_section_start "nodeinstall" "Ensure node version"
837
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
838
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
839
+ - collapseable_section_end "nodeinstall"
840
+ - collapseable_section_start "yarninstall" "Yarn install"
841
+ - yarn install --immutable
842
+ - collapseable_section_end "yarninstall"
843
+ - yarn build
844
+ cache:
845
+ - key: www-yarn
846
+ policy: pull-push
847
+ paths:
848
+ - www/.yarn
849
+ - key: www-node-modules
850
+ policy: pull-push
851
+ paths:
852
+ - www/node_modules
853
+ - key: www-default
854
+ policy: pull-push
855
+ paths:
856
+ - www/.next/cache
857
+ artifacts:
858
+ paths:
859
+ - www/__build_info.json
860
+ - www/.next
861
+ - www/dist
862
+ exclude:
863
+ - www/.env
864
+ expire_in: 1 day
865
+ when: always
866
+ reports: {}
867
+ rules:
868
+ - if: $CI_COMMIT_TAG
869
+ needs: []
870
+ retry: *a1
871
+ interruptible: true
872
+ 'www ๐Ÿ”จ docker | stage ':
873
+ stage: build
874
+ image: path/to/docker/docker-build:the-version
875
+ services:
876
+ - name: docker:24.0.6-dind
877
+ command:
878
+ - --tls=false
879
+ - --registry-mirror=https://mirror.gcr.io
880
+ variables:
881
+ DOCKER_HOST: tcp://docker:2375
882
+ DOCKER_TLS_CERTDIR: ''
883
+ DOCKER_DRIVER: overlay2
884
+ DOCKER_BUILDKIT: '1'
885
+ KUBERNETES_CPU_REQUEST: '0.45'
886
+ KUBERNETES_MEMORY_REQUEST: 1Gi
887
+ KUBERNETES_MEMORY_LIMIT: 2Gi
888
+ script:
889
+ - collapseable_section_start "injectvars" "Injecting variables"
890
+ - export APP_DIR="www"
891
+ - export DOCKER_BUILD_CONTEXT="."
892
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
893
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www"
894
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
895
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
896
+ - |-
897
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
898
+ RUN yarn plugin import workspace-tools
899
+ RUN yarn workspaces focus --production && yarn rebuild"
900
+ - |-
901
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
902
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
903
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
904
+ COPY --chown=node:node .yarn /app/.yarn"
905
+ - collapseable_section_end "injectvars"
906
+ - ensureNodeDockerfile
907
+ - collapseable_section_start "docker-login" "Docker Login"
908
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
909
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
910
+ - collapseable_section_end "docker-login"
911
+ - collapseable_section_start "docker-build" "Docker build"
912
+ - 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
913
+ - collapseable_section_end "docker-build"
914
+ - collapseable_section_start "docker-push" "Docker push and tag"
915
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
916
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
917
+ - docker push $DOCKER_CACHE_IMAGE
918
+ - collapseable_section_end "docker-push"
919
+ cache:
920
+ - key: www-yarn
921
+ policy: pull
922
+ paths:
923
+ - www/.yarn
924
+ rules:
925
+ - if: $CI_COMMIT_TAG
926
+ needs:
927
+ - 'www ๐Ÿ”จ app | stage '
928
+ retry: *a1
929
+ interruptible: true
930
+ 'www ๐Ÿงพ sbom | stage ':
931
+ stage: build
932
+ image:
933
+ name: aquasec/trivy:0.58.2
934
+ entrypoint:
935
+ - ''
936
+ variables: {}
937
+ script:
938
+ - collapseable_section_start "injectvars" "Injecting variables"
939
+ - collapseable_section_end "injectvars"
940
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
941
+ artifacts:
942
+ paths:
943
+ - __sbom.json
944
+ rules:
945
+ - if: $CI_COMMIT_TAG
946
+ needs: []
947
+ retry: *a1
948
+ interruptible: true
949
+ allow_failure: true
950
+ 'www ๐Ÿš€ Deploy | stage ':
951
+ stage: deploy stage
952
+ image: path/to/docker/gcloud:the-version
953
+ variables:
954
+ KUBERNETES_CPU_REQUEST: '0.22'
955
+ KUBERNETES_MEMORY_REQUEST: 200Mi
956
+ KUBERNETES_MEMORY_LIMIT: 400Mi
957
+ script:
958
+ - collapseable_section_start "injectvars" "Injecting variables"
959
+ - export ENV_SHORT="stage"
960
+ - export APP_DIR="www"
961
+ - export ENV_TYPE="stage"
962
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
963
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
964
+ - 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")"
965
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
966
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
967
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
968
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
969
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
970
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
971
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"
972
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"
973
+ - 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\\"]"
974
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
975
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www"
976
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
977
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
978
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
979
+ - collapseable_section_end "injectvars"
980
+ - collapseable_section_start "prepare" "Prepare..."
981
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
982
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
983
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
984
+ - collapseable_section_end "prepare"
985
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
986
+ - |
987
+ cat > ____envvars.yaml <<EOF
988
+ ENV_SHORT: |-
989
+ stage
990
+ APP_DIR: |-
991
+ www
992
+ ENV_TYPE: |-
993
+ stage
994
+ BUILD_INFO_BUILD_ID: |-
995
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
996
+ BUILD_INFO_BUILD_TIME: |-
997
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
998
+ BUILD_INFO_CURRENT_VERSION: |-
999
+ $(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/^/ /')
1000
+ HOSTNAME: |-
1001
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1002
+ ROOT_URL: |-
1003
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1004
+ HOSTNAME_INTERNAL: |-
1005
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1006
+ ROOT_URL_INTERNAL: |-
1007
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1008
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1009
+ google-project-id
1010
+ DEPLOY_CLOUD_RUN_REGION: |-
1011
+ europe-west6
1012
+ GCLOUD_RUN_canonicalHostSuffix: |-
1013
+ $(printf %s "$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1014
+ _ALL_ENV_VAR_KEYS: |-
1015
+ ["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"]
1016
+
1017
+ EOF
1018
+ - collapseable_section_end "writeenvvars"
1019
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1020
+ - gcloud run deploy pan-test-app-stage-www --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=stage,env-name=stage,build-type=node,cloud-run-service-name=pan-test-app-stage-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1021
+ - collapseable_section_end "deploy"
1022
+ - collapseable_section_start "cleanup" "Cleanup"
1023
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-stage-www --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
1024
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www --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/www@$version --quiet --delete-tags; done
1025
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
1026
+ - collapseable_section_end "cleanup"
1027
+ - echo 'Uploading SBOM to Dependency Track'
1028
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
1029
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1030
+ environment:
1031
+ name: stage/www
1032
+ url: $CL_GITLAB_ENVIRONMENT_URL
1033
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | stage '
1034
+ artifacts:
1035
+ reports:
1036
+ dotenv: gitlab_environment.env
1037
+ rules:
1038
+ - when: on_success
1039
+ if: $CI_COMMIT_TAG
1040
+ needs:
1041
+ - job: 'www ๐Ÿ”จ app | stage '
1042
+ artifacts: false
1043
+ - job: 'www ๐Ÿ”จ docker | stage '
1044
+ artifacts: false
1045
+ - job: 'www ๐Ÿงพ sbom | stage '
1046
+ artifacts: true
1047
+ retry: *a1
1048
+ interruptible: true
1049
+ allow_failure: false
1050
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | stage ':
1051
+ stage: stop stage
1052
+ image: path/to/docker/gcloud:the-version
1053
+ variables:
1054
+ KUBERNETES_CPU_REQUEST: '0.22'
1055
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1056
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1057
+ GIT_STRATEGY: none
1058
+ script:
1059
+ - collapseable_section_start "injectvars" "Injecting variables"
1060
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1061
+ - collapseable_section_end "injectvars"
1062
+ - set +e
1063
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
1064
+ - gcloud run services delete pan-test-app-stage-www --project=google-project-id --region=europe-west6
1065
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/www --quiet --delete-tags
1066
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
1067
+ - echo 'Disabling component in Dependency Track'
1068
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
1069
+ - set -e
1070
+ environment:
1071
+ name: stage/www
1072
+ action: stop
1073
+ rules:
1074
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1075
+ when: on_success
1076
+ - when: manual
1077
+ if: $CI_COMMIT_TAG
1078
+ needs: []
1079
+ retry: *a1
1080
+ interruptible: true
1081
+ allow_failure: true
1082
+ 'www ๐Ÿ”จ app | prod ':
1083
+ stage: build
1084
+ image: path/to/docker/jobs-default:the-version
1085
+ variables:
1086
+ KUBERNETES_CPU_REQUEST: '0.45'
1087
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1088
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1089
+ script:
1090
+ - collapseable_section_start "injectvars" "Injecting variables"
1091
+ - export ENV_SHORT="prod"
1092
+ - export APP_DIR="www"
1093
+ - export ENV_TYPE="prod"
1094
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1095
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1096
+ - 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")"
1097
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1098
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1099
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1100
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1101
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1102
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1103
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"
1104
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"
1105
+ - 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\\"]"
1106
+ - collapseable_section_end "injectvars"
1107
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
1108
+ - |-
1109
+ cat <<EOF > www/.env
1110
+ ENV_SHORT=prod
1111
+ APP_DIR=www
1112
+ ENV_TYPE=prod
1113
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1114
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1115
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1116
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1117
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
1118
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
1119
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1120
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1121
+ _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"]
1122
+ EOF
1123
+ - collapseable_section_end "write-dotenv-www"
1124
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
1125
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1126
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1127
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1128
+ - collapseable_section_end "nodeinstall"
1129
+ - cd www
1130
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1131
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1132
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1133
+ - collapseable_section_end "nodeinstall"
1134
+ - collapseable_section_start "yarninstall" "Yarn install"
1135
+ - yarn install --immutable
1136
+ - collapseable_section_end "yarninstall"
1137
+ - yarn build
1138
+ cache:
1139
+ - key: www-yarn
1140
+ policy: pull-push
1141
+ paths:
1142
+ - www/.yarn
1143
+ - key: www-node-modules
1144
+ policy: pull-push
1145
+ paths:
1146
+ - www/node_modules
1147
+ - key: www-default
1148
+ policy: pull-push
1149
+ paths:
1150
+ - www/.next/cache
1151
+ artifacts:
1152
+ paths:
1153
+ - www/__build_info.json
1154
+ - www/.next
1155
+ - www/dist
1156
+ exclude:
1157
+ - www/.env
1158
+ expire_in: 1 day
1159
+ when: always
1160
+ reports: {}
1161
+ rules:
1162
+ - if: $CI_COMMIT_TAG
1163
+ needs: []
1164
+ retry: *a1
1165
+ interruptible: true
1166
+ 'www ๐Ÿ”จ docker | prod ':
1167
+ stage: build
1168
+ image: path/to/docker/docker-build:the-version
1169
+ services:
1170
+ - name: docker:24.0.6-dind
1171
+ command:
1172
+ - --tls=false
1173
+ - --registry-mirror=https://mirror.gcr.io
1174
+ variables:
1175
+ DOCKER_HOST: tcp://docker:2375
1176
+ DOCKER_TLS_CERTDIR: ''
1177
+ DOCKER_DRIVER: overlay2
1178
+ DOCKER_BUILDKIT: '1'
1179
+ KUBERNETES_CPU_REQUEST: '0.45'
1180
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1181
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1182
+ script:
1183
+ - collapseable_section_start "injectvars" "Injecting variables"
1184
+ - export APP_DIR="www"
1185
+ - export DOCKER_BUILD_CONTEXT="."
1186
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1187
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www"
1188
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
1189
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1190
+ - |-
1191
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1192
+ RUN yarn plugin import workspace-tools
1193
+ RUN yarn workspaces focus --production && yarn rebuild"
1194
+ - |-
1195
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
1196
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
1197
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1198
+ COPY --chown=node:node .yarn /app/.yarn"
1199
+ - collapseable_section_end "injectvars"
1200
+ - ensureNodeDockerfile
1201
+ - collapseable_section_start "docker-login" "Docker Login"
1202
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
1203
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
1204
+ - collapseable_section_end "docker-login"
1205
+ - collapseable_section_start "docker-build" "Docker build"
1206
+ - 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
1207
+ - collapseable_section_end "docker-build"
1208
+ - collapseable_section_start "docker-push" "Docker push and tag"
1209
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1210
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1211
+ - docker push $DOCKER_CACHE_IMAGE
1212
+ - collapseable_section_end "docker-push"
1213
+ cache:
1214
+ - key: www-yarn
1215
+ policy: pull
1216
+ paths:
1217
+ - www/.yarn
1218
+ rules:
1219
+ - if: $CI_COMMIT_TAG
1220
+ needs:
1221
+ - 'www ๐Ÿ”จ app | prod '
1222
+ retry: *a1
1223
+ interruptible: true
1224
+ 'www ๐Ÿงพ sbom | prod ':
1225
+ stage: build
1226
+ image:
1227
+ name: aquasec/trivy:0.58.2
1228
+ entrypoint:
1229
+ - ''
1230
+ variables: {}
1231
+ script:
1232
+ - collapseable_section_start "injectvars" "Injecting variables"
1233
+ - collapseable_section_end "injectvars"
1234
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
1235
+ artifacts:
1236
+ paths:
1237
+ - __sbom.json
1238
+ rules:
1239
+ - if: $CI_COMMIT_TAG
1240
+ needs: []
1241
+ retry: *a1
1242
+ interruptible: true
1243
+ allow_failure: true
1244
+ 'www ๐Ÿš€ Deploy | prod ':
1245
+ stage: deploy prod
1246
+ image: path/to/docker/gcloud:the-version
1247
+ variables:
1248
+ KUBERNETES_CPU_REQUEST: '0.22'
1249
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1250
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1251
+ script:
1252
+ - collapseable_section_start "injectvars" "Injecting variables"
1253
+ - export ENV_SHORT="prod"
1254
+ - export APP_DIR="www"
1255
+ - export ENV_TYPE="prod"
1256
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1257
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1258
+ - 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")"
1259
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1260
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1261
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1262
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1263
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1264
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1265
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"
1266
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"
1267
+ - 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\\"]"
1268
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1269
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www"
1270
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www"
1271
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1272
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1273
+ - collapseable_section_end "injectvars"
1274
+ - collapseable_section_start "prepare" "Prepare..."
1275
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
1276
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1277
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1278
+ - collapseable_section_end "prepare"
1279
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1280
+ - |
1281
+ cat > ____envvars.yaml <<EOF
1282
+ ENV_SHORT: |-
1283
+ prod
1284
+ APP_DIR: |-
1285
+ www
1286
+ ENV_TYPE: |-
1287
+ prod
1288
+ BUILD_INFO_BUILD_ID: |-
1289
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1290
+ BUILD_INFO_BUILD_TIME: |-
1291
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1292
+ BUILD_INFO_CURRENT_VERSION: |-
1293
+ $(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/^/ /')
1294
+ HOSTNAME: |-
1295
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1296
+ ROOT_URL: |-
1297
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1298
+ HOSTNAME_INTERNAL: |-
1299
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1300
+ ROOT_URL_INTERNAL: |-
1301
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1302
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1303
+ google-project-id
1304
+ DEPLOY_CLOUD_RUN_REGION: |-
1305
+ europe-west6
1306
+ GCLOUD_RUN_canonicalHostSuffix: |-
1307
+ $(printf %s "$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1308
+ _ALL_ENV_VAR_KEYS: |-
1309
+ ["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"]
1310
+
1311
+ EOF
1312
+ - collapseable_section_end "writeenvvars"
1313
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1314
+ - gcloud run deploy pan-test-app-prod-www --command="yarn,start" --image=europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www:$DOCKER_IMAGE_TAG --project=google-project-id --region=europe-west6 --labels=customer-name=pan,component-name=www,app-name=test-app,env-type=prod,env-name=prod,build-type=node,cloud-run-service-name=pan-test-app-prod-www --env-vars-file=____envvars.yaml --min-instances=0 --max-instances=100 --cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1315
+ - collapseable_section_end "deploy"
1316
+ - collapseable_section_start "cleanup" "Cleanup"
1317
+ - gcloud run revisions list --project=google-project-id --region=europe-west6 --service=pan-test-app-prod-www --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
1318
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www --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/www@$version --quiet --delete-tags; done
1319
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
1320
+ - collapseable_section_end "cleanup"
1321
+ - echo 'Uploading SBOM to Dependency Track'
1322
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
1323
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1324
+ environment:
1325
+ name: prod/www
1326
+ url: $CL_GITLAB_ENVIRONMENT_URL
1327
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | prod '
1328
+ artifacts:
1329
+ reports:
1330
+ dotenv: gitlab_environment.env
1331
+ rules:
1332
+ - when: manual
1333
+ if: $CI_COMMIT_TAG
1334
+ needs:
1335
+ - job: 'www ๐Ÿ”จ app | prod '
1336
+ artifacts: false
1337
+ - job: 'www ๐Ÿ”จ docker | prod '
1338
+ artifacts: false
1339
+ - job: 'www ๐Ÿงพ sbom | prod '
1340
+ artifacts: true
1341
+ retry: *a1
1342
+ interruptible: true
1343
+ allow_failure: true
1344
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1345
+ stage: stop prod
1346
+ image: path/to/docker/gcloud:the-version
1347
+ variables:
1348
+ KUBERNETES_CPU_REQUEST: '0.22'
1349
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1350
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1351
+ GIT_STRATEGY: none
1352
+ script:
1353
+ - collapseable_section_start "injectvars" "Injecting variables"
1354
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1355
+ - collapseable_section_end "injectvars"
1356
+ - set +e
1357
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
1358
+ - gcloud run services delete pan-test-app-prod-www --project=google-project-id --region=europe-west6
1359
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/www --quiet --delete-tags
1360
+ - gcloud artifacts docker images list europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/www --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/www@$version --quiet --delete-tags; done
1361
+ - echo 'Disabling component in Dependency Track'
1362
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
1363
+ - set -e
1364
+ environment:
1365
+ name: prod/www
1366
+ action: stop
1367
+ rules:
1368
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1369
+ when: on_success
1370
+ - when: manual
1371
+ if: $CI_COMMIT_TAG
1372
+ needs: []
1373
+ retry: *a1
1374
+ interruptible: true
1375
+ allow_failure: true
1376
+ create release:
1377
+ stage: release
1378
+ image: path/to/docker/semantic-release:the-version
1379
+ script:
1380
+ - semanticRelease
1381
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1382
+ rules:
1383
+ - &a2
1384
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1385
+ when: never
1386
+ - &a3
1387
+ if: $CI_PIPELINE_SOURCE == "schedule"
1388
+ when: never
1389
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1390
+ when: on_success
1391
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1392
+ when: manual
1393
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1394
+ when: manual
1395
+ โš ๏ธ force create release:
1396
+ stage: release
1397
+ image: path/to/docker/semantic-release:the-version
1398
+ script:
1399
+ - semanticRelease
1400
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1401
+ rules:
1402
+ - *a2
1403
+ - *a3
1404
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1405
+ when: manual
1406
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1407
+ when: manual
1408
+ needs: []
1409
+ "
1410
+ `;