@catladder/pipeline 0.0.0-more-collapse-deeb54d7 โ†’ 0.0.0-multiple-gitlab-includes-3df5566d

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