@catladder/pipeline 0.0.0-node16-ddfae617 → 0.0.0-perf-cli-reduce-bundle-size-with-tsconfig-optimization-3556aaa4

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 (543) hide show
  1. package/README.md +17 -0
  2. package/bin/catladder-gitlab-dev.js +3 -0
  3. package/bin/catladder-gitlab.js +1 -1
  4. package/dist/bash/BashExpression.d.ts +40 -0
  5. package/dist/bash/BashExpression.js +124 -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 +46 -0
  10. package/dist/bash/getInjectVarsScript.d.ts +2 -0
  11. package/dist/bash/getInjectVarsScript.js +45 -0
  12. package/dist/bash/replaceAsync.d.ts +2 -0
  13. package/dist/bash/replaceAsync.js +171 -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 +42 -0
  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 +9 -0
  20. package/dist/build/base/createAppBuildJob.js +87 -0
  21. package/dist/build/base/createArtifactsConfig.d.ts +4 -0
  22. package/dist/build/base/createArtifactsConfig.js +65 -0
  23. package/dist/build/base/index.d.ts +12 -0
  24. package/dist/build/base/index.js +68 -0
  25. package/dist/build/base/writeBuildInfo.d.ts +2 -0
  26. package/dist/build/base/writeBuildInfo.js +10 -0
  27. package/dist/build/base/writeDotEnv.d.ts +8 -0
  28. package/dist/build/base/writeDotEnv.js +66 -0
  29. package/dist/build/custom/__tests__/testJob.test.js +36 -0
  30. package/dist/build/custom/buildJob.d.ts +3 -0
  31. package/dist/build/custom/buildJob.js +67 -0
  32. package/dist/build/custom/index.d.ts +3 -0
  33. package/dist/build/custom/index.js +43 -0
  34. package/dist/build/custom/testJob.d.ts +7 -0
  35. package/dist/build/custom/testJob.js +100 -0
  36. package/dist/build/docker.d.ts +61 -22
  37. package/dist/build/docker.js +110 -73
  38. package/dist/build/index.d.ts +16 -8
  39. package/dist/build/index.js +61 -19
  40. package/dist/build/node/buildJob.d.ts +8 -3
  41. package/dist/build/node/buildJob.js +48 -68
  42. package/dist/build/node/cache.d.ts +4 -3
  43. package/dist/build/node/cache.js +45 -32
  44. package/dist/build/node/constants.d.ts +0 -1
  45. package/dist/build/node/constants.js +5 -4
  46. package/dist/build/node/index.d.ts +5 -5
  47. package/dist/build/node/index.js +6 -17
  48. package/dist/build/node/meteor.d.ts +3 -3
  49. package/dist/build/node/meteor.js +26 -37
  50. package/dist/build/node/testJob.d.ts +4 -3
  51. package/dist/build/node/testJob.js +35 -36
  52. package/dist/build/node/yarn.d.ts +6 -6
  53. package/dist/build/node/yarn.js +40 -25
  54. package/dist/build/rails/build.d.ts +3 -0
  55. package/dist/build/rails/build.js +90 -0
  56. package/dist/build/rails/index.d.ts +3 -0
  57. package/dist/build/rails/index.js +43 -0
  58. package/dist/build/rails/test.d.ts +3 -0
  59. package/dist/build/rails/test.js +103 -0
  60. package/dist/build/sbom.d.ts +5 -0
  61. package/dist/build/sbom.js +32 -0
  62. package/dist/build/types.d.ts +251 -33
  63. package/dist/build/types.js +10 -6
  64. package/dist/bundles/catladder-gitlab/index.js +41626 -0
  65. package/dist/catladder-gitlab.js +130 -68
  66. package/dist/config/{configruedEnvs.test.js → __tests__/configruedEnvs.test.js} +13 -13
  67. package/dist/config/__tests__/getAllEnvs.test.js +79 -0
  68. package/dist/config/__tests__/getAllEnvsInAllComponents.test.d.ts +1 -0
  69. package/dist/config/__tests__/getAllEnvsInAllComponents.test.js +73 -0
  70. package/dist/config/configruedEnvs.d.ts +1 -1
  71. package/dist/config/configruedEnvs.js +10 -23
  72. package/dist/config/index.js +13 -11
  73. package/dist/config/readConfig.d.ts +3 -3
  74. package/dist/config/readConfig.js +193 -52
  75. package/dist/constants.js +5 -3
  76. package/dist/context/__tests__/resolveReferences.test.d.ts +1 -0
  77. package/dist/context/__tests__/resolveReferences.test.js +368 -0
  78. package/dist/context/createAllComponentsContext.d.ts +12 -0
  79. package/dist/context/createAllComponentsContext.js +159 -0
  80. package/dist/context/createComponentContext.d.ts +11 -0
  81. package/dist/context/createComponentContext.js +256 -0
  82. package/dist/context/createWorkspaceContext.d.ts +16 -0
  83. package/dist/context/createWorkspaceContext.js +173 -0
  84. package/dist/context/getBuildInfoVariables.d.ts +6 -0
  85. package/dist/context/getBuildInfoVariables.js +55 -0
  86. package/dist/context/getEnvConfig.d.ts +2 -0
  87. package/dist/context/getEnvConfig.js +20 -0
  88. package/dist/context/getEnvType.d.ts +4 -0
  89. package/dist/context/getEnvType.js +15 -0
  90. package/dist/context/getEnvironment.d.ts +3 -0
  91. package/dist/{pipeline/createChildPipeline.test.js → context/getEnvironment.js} +50 -86
  92. package/dist/context/getEnvironmentContext.d.ts +8 -0
  93. package/dist/context/getEnvironmentContext.js +43 -0
  94. package/dist/context/getEnvironmentVariables.d.ts +27 -0
  95. package/dist/context/getEnvironmentVariables.js +285 -0
  96. package/dist/context/getLabels.d.ts +9 -0
  97. package/dist/context/getLabels.js +41 -0
  98. package/dist/context/getReviewSlug.d.ts +4 -0
  99. package/dist/context/getReviewSlug.js +22 -0
  100. package/dist/context/index.d.ts +3 -6
  101. package/dist/context/index.js +22 -219
  102. package/dist/context/resolveReferences.d.ts +3 -3
  103. package/dist/context/resolveReferences.js +248 -55
  104. package/dist/context/transformJobOnlyVars.d.ts +13 -0
  105. package/dist/{build/tests/storybook.test.js → context/transformJobOnlyVars.js} +54 -106
  106. package/dist/context/utils/envVars.d.ts +8 -0
  107. package/dist/context/utils/envVars.js +55 -0
  108. package/dist/defaults/index.d.ts +1 -1
  109. package/dist/defaults/index.js +3 -1
  110. package/dist/deploy/base/deploy.d.ts +5 -0
  111. package/dist/deploy/base/deploy.js +121 -0
  112. package/dist/deploy/base/index.d.ts +10 -0
  113. package/dist/deploy/base/index.js +44 -0
  114. package/dist/deploy/base/rollback.d.ts +5 -0
  115. package/dist/deploy/base/rollback.js +41 -0
  116. package/dist/deploy/base/stop.d.ts +5 -0
  117. package/dist/deploy/base/stop.js +46 -0
  118. package/dist/deploy/base/types.d.ts +2 -0
  119. package/dist/deploy/base/types.js +5 -0
  120. package/dist/deploy/base/variables.d.ts +5 -0
  121. package/dist/deploy/base/variables.js +11 -0
  122. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +19 -0
  123. package/dist/deploy/cloudRun/artifactsRegistry.js +125 -0
  124. package/dist/deploy/cloudRun/cleanup.d.ts +2 -0
  125. package/dist/deploy/cloudRun/cleanup.js +53 -0
  126. package/dist/deploy/cloudRun/cloudRunRevisions.d.ts +2 -0
  127. package/dist/deploy/cloudRun/cloudRunRevisions.js +62 -0
  128. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.d.ts +7 -0
  129. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +187 -0
  130. package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +4 -0
  131. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +93 -0
  132. package/dist/deploy/cloudRun/createJobs/common.d.ts +18 -0
  133. package/dist/deploy/cloudRun/createJobs/common.js +93 -0
  134. package/dist/deploy/cloudRun/createJobs/constants.d.ts +1 -0
  135. package/dist/deploy/cloudRun/createJobs/constants.js +7 -0
  136. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.d.ts +2 -0
  137. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +62 -0
  138. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.d.ts +2 -0
  139. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +54 -0
  140. package/dist/deploy/cloudRun/createJobs/index.d.ts +3 -0
  141. package/dist/deploy/cloudRun/createJobs/index.js +58 -0
  142. package/dist/deploy/cloudRun/createJobs/volumes.d.ts +3 -0
  143. package/dist/deploy/cloudRun/createJobs/volumes.js +58 -0
  144. package/dist/deploy/cloudRun/index.d.ts +4 -0
  145. package/dist/deploy/cloudRun/index.js +128 -0
  146. package/dist/deploy/cloudRun/utils/createArgsString.d.ts +13 -0
  147. package/dist/deploy/cloudRun/utils/createArgsString.js +63 -0
  148. package/dist/deploy/cloudRun/utils/database.d.ts +6 -0
  149. package/dist/deploy/cloudRun/utils/database.js +77 -0
  150. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.d.ts +2 -0
  151. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +12 -0
  152. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +2 -0
  153. package/dist/deploy/cloudRun/utils/getServiceName.js +10 -0
  154. package/dist/deploy/cloudRun/utils/jobName.d.ts +2 -0
  155. package/dist/deploy/cloudRun/utils/jobName.js +10 -0
  156. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.d.ts +9 -0
  157. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +18 -0
  158. package/dist/deploy/cloudSql/utils.d.ts +4 -0
  159. package/dist/deploy/cloudSql/utils.js +14 -0
  160. package/dist/deploy/custom/deployJob.d.ts +3 -3
  161. package/dist/deploy/custom/deployJob.js +28 -25
  162. package/dist/deploy/custom/index.d.ts +2 -1
  163. package/dist/deploy/custom/index.js +16 -19
  164. package/dist/deploy/dockerTag/deployJob.d.ts +3 -0
  165. package/dist/deploy/dockerTag/deployJob.js +65 -0
  166. package/dist/deploy/dockerTag/index.d.ts +2 -0
  167. package/dist/deploy/dockerTag/index.js +19 -0
  168. package/dist/deploy/index.d.ts +15 -9
  169. package/dist/deploy/index.js +20 -27
  170. package/dist/deploy/kubernetes/additionalSecretKeys.d.ts +8 -0
  171. package/dist/deploy/kubernetes/additionalSecretKeys.js +30 -0
  172. package/dist/deploy/kubernetes/cloudSql/index.d.ts +14 -0
  173. package/dist/deploy/kubernetes/cloudSql/index.js +55 -0
  174. package/dist/deploy/kubernetes/deployJob.d.ts +3 -3
  175. package/dist/deploy/kubernetes/deployJob.js +43 -124
  176. package/dist/deploy/kubernetes/index.d.ts +3 -1
  177. package/dist/deploy/kubernetes/index.js +86 -11
  178. package/dist/deploy/kubernetes/kubeEnv.d.ts +10 -0
  179. package/dist/deploy/kubernetes/kubeEnv.js +76 -0
  180. package/dist/deploy/kubernetes/kubeValues.d.ts +90 -0
  181. package/dist/deploy/kubernetes/kubeValues.js +123 -0
  182. package/dist/deploy/kubernetes/mongodb.d.ts +19 -6
  183. package/dist/deploy/kubernetes/mongodb.js +100 -11
  184. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +27 -29
  185. package/dist/deploy/kubernetes/processSecretsAsFiles.js +5 -11
  186. package/dist/deploy/sbom.d.ts +4 -0
  187. package/dist/deploy/sbom.js +20 -0
  188. package/dist/deploy/types/base.d.ts +36 -0
  189. package/dist/deploy/types/base.js +5 -0
  190. package/dist/deploy/types/custom.d.ts +33 -0
  191. package/dist/deploy/types/custom.js +5 -0
  192. package/dist/deploy/types/dockerTag.d.ts +12 -0
  193. package/dist/deploy/types/dockerTag.js +5 -0
  194. package/dist/deploy/types/googleCloudRun.d.ts +208 -0
  195. package/dist/deploy/types/googleCloudRun.js +5 -0
  196. package/dist/deploy/types/index.d.ts +22 -0
  197. package/dist/deploy/types/index.js +37 -0
  198. package/dist/deploy/types/kubernetes.d.ts +355 -0
  199. package/dist/deploy/types/kubernetes.js +5 -0
  200. package/dist/deploy/utils.d.ts +3 -3
  201. package/dist/deploy/utils.js +8 -12
  202. package/dist/index.d.ts +3 -2
  203. package/dist/index.js +16 -19
  204. package/dist/packageInfos.d.ts +4 -0
  205. package/dist/packageInfos.js +20 -0
  206. package/dist/pipeline/__tests__/getPipelineStages.test.d.ts +1 -0
  207. package/dist/pipeline/__tests__/getPipelineStages.test.js +73 -0
  208. package/dist/pipeline/createAllJobs.d.ts +18 -0
  209. package/dist/pipeline/createAllJobs.js +236 -0
  210. package/dist/pipeline/createChildPipeline.d.ts +3 -3
  211. package/dist/pipeline/createChildPipeline.js +45 -157
  212. package/dist/pipeline/createJobsForComponent.d.ts +3 -0
  213. package/dist/{build/base/createBuildJob.js → pipeline/createJobsForComponent.js} +32 -51
  214. package/dist/pipeline/createJobsForWorkspace.d.ts +3 -0
  215. package/dist/pipeline/createJobsForWorkspace.js +12 -0
  216. package/dist/pipeline/createMainPipeline.d.ts +3 -0
  217. package/dist/pipeline/createMainPipeline.js +269 -0
  218. package/dist/pipeline/generatePipelineFiles.d.ts +40 -0
  219. package/dist/pipeline/generatePipelineFiles.js +240 -0
  220. package/dist/pipeline/getPipelineStages.d.ts +7 -0
  221. package/dist/pipeline/getPipelineStages.js +56 -0
  222. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +11 -0
  223. package/dist/pipeline/gitlab/createGitlabJobs.js +461 -0
  224. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +8 -0
  225. package/dist/pipeline/gitlab/createGitlabPipeline.js +41 -0
  226. package/dist/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.d.ts +1 -0
  227. package/dist/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.js +29 -0
  228. package/dist/pipeline/gitlab/gitlabReleaseJobs.d.ts +35 -0
  229. package/dist/pipeline/gitlab/gitlabReleaseJobs.js +27 -0
  230. package/dist/pipeline/gitlab/sortGitLabJobDefProps.d.ts +7 -0
  231. package/dist/pipeline/gitlab/sortGitLabJobDefProps.js +27 -0
  232. package/dist/pipeline/index.d.ts +3 -1
  233. package/dist/pipeline/index.js +16 -12
  234. package/dist/pipeline/packageManager.d.ts +3 -2
  235. package/dist/pipeline/packageManager.js +69 -196
  236. package/dist/pipeline/yarn/yarnUtils.d.ts +5 -0
  237. package/dist/pipeline/yarn/yarnUtils.js +241 -0
  238. package/dist/rules/index.d.ts +10 -2
  239. package/dist/rules/index.js +36 -16
  240. package/dist/runner/index.d.ts +2 -3
  241. package/dist/runner/index.js +3 -4
  242. package/dist/tsconfig.tsbuildinfo +1 -1
  243. package/dist/types/config.d.ts +56 -32
  244. package/dist/types/config.js +11 -18
  245. package/dist/types/context.d.ts +143 -27
  246. package/dist/types/context.js +12 -1
  247. package/dist/types/environmentContext.d.ts +31 -0
  248. package/dist/types/environmentContext.js +5 -0
  249. package/dist/types/gitlab-ci-yml.d.ts +769 -0
  250. package/dist/types/gitlab-ci-yml.js +10 -0
  251. package/dist/types/gitlab-types.d.ts +12 -60
  252. package/dist/types/gitlab-types.js +3 -1
  253. package/dist/types/index.js +13 -13
  254. package/dist/types/jobs.d.ts +55 -21
  255. package/dist/types/jobs.js +4 -2
  256. package/dist/types/pipeline.d.ts +5 -4
  257. package/dist/types/pipeline.js +3 -1
  258. package/dist/types/utils.d.ts +1 -0
  259. package/dist/types/utils.js +5 -0
  260. package/dist/utils/gitlab.d.ts +6 -0
  261. package/dist/utils/gitlab.js +56 -0
  262. package/dist/utils/index.d.ts +1 -1
  263. package/dist/utils/index.js +8 -16
  264. package/dist/utils/jsonParse.d.ts +1 -0
  265. package/dist/utils/jsonParse.js +14 -0
  266. package/dist/utils/removeUndefined.d.ts +1 -0
  267. package/dist/utils/removeUndefined.js +36 -0
  268. package/dist/utils/writeFiles.d.ts +11 -0
  269. package/dist/utils/writeFiles.js +180 -0
  270. package/examples/.test-gen-ignore +1 -0
  271. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +3300 -0
  272. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +3260 -0
  273. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +3300 -0
  274. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +3404 -0
  275. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +3300 -0
  276. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +3322 -0
  277. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +3300 -0
  278. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +3300 -0
  279. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +3388 -0
  280. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +2900 -0
  281. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +3300 -0
  282. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +6760 -0
  283. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +6030 -0
  284. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +3316 -0
  285. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +2983 -0
  286. package/examples/__snapshots__/custom-build-job.test.ts.snap +2572 -0
  287. package/examples/__snapshots__/custom-deploy.test.ts.snap +2824 -0
  288. package/examples/__snapshots__/custom-envs.test.ts.snap +1884 -0
  289. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +2588 -0
  290. package/examples/__snapshots__/git-submodule.test.ts.snap +3304 -0
  291. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +4228 -0
  292. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.test.ts.snap +4252 -0
  293. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +4268 -0
  294. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +7910 -0
  295. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +4476 -0
  296. package/examples/__snapshots__/local-dot-env.test.ts.snap +3300 -0
  297. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +4342 -0
  298. package/examples/__snapshots__/multiline-var.test.ts.snap +7864 -0
  299. package/examples/__snapshots__/native-app.test.ts.snap +5316 -0
  300. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +3300 -0
  301. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +3316 -0
  302. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +2011 -0
  303. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +3465 -0
  304. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +3380 -0
  305. package/examples/__utils__/helpers.ts +27 -0
  306. package/examples/cloud-run-memory-limit.test.ts +18 -0
  307. package/examples/cloud-run-memory-limit.ts +33 -0
  308. package/examples/cloud-run-meteor-with-worker.test.ts +18 -0
  309. package/examples/cloud-run-meteor-with-worker.ts +37 -0
  310. package/examples/cloud-run-no-cpu-throttling.test.ts +18 -0
  311. package/examples/cloud-run-no-cpu-throttling.ts +35 -0
  312. package/examples/cloud-run-no-service.test.ts +18 -0
  313. package/examples/cloud-run-no-service.ts +33 -0
  314. package/examples/cloud-run-non-public.test.ts +18 -0
  315. package/examples/cloud-run-non-public.ts +28 -0
  316. package/examples/cloud-run-post-stop-job.test.ts +18 -0
  317. package/examples/cloud-run-post-stop-job.ts +42 -0
  318. package/examples/cloud-run-service-gen2.test.ts +18 -0
  319. package/examples/cloud-run-service-gen2.ts +29 -0
  320. package/examples/cloud-run-service-increase-timout.test.ts +18 -0
  321. package/examples/cloud-run-service-increase-timout.ts +29 -0
  322. package/examples/cloud-run-service-with-volumes.test.ts +18 -0
  323. package/examples/cloud-run-service-with-volumes.ts +56 -0
  324. package/examples/cloud-run-storybook.test.ts +18 -0
  325. package/examples/cloud-run-storybook.ts +33 -0
  326. package/examples/cloud-run-with-ngnix.test.ts +18 -0
  327. package/examples/cloud-run-with-ngnix.ts +29 -0
  328. package/examples/cloud-run-with-sql-reuse-db.test.ts +18 -0
  329. package/examples/cloud-run-with-sql-reuse-db.ts +55 -0
  330. package/examples/cloud-run-with-sql.test.ts +18 -0
  331. package/examples/cloud-run-with-sql.ts +71 -0
  332. package/examples/cloud-run-with-worker.test.ts +18 -0
  333. package/examples/cloud-run-with-worker.ts +37 -0
  334. package/examples/custom-build-job-with-tests.test.ts +18 -0
  335. package/examples/custom-build-job-with-tests.ts +56 -0
  336. package/examples/custom-build-job.test.ts +18 -0
  337. package/examples/custom-build-job.ts +29 -0
  338. package/examples/custom-deploy.test.ts +18 -0
  339. package/examples/custom-deploy.ts +36 -0
  340. package/examples/custom-envs.test.ts +18 -0
  341. package/examples/custom-envs.ts +32 -0
  342. package/examples/custom-sbom-java.test.ts +18 -0
  343. package/examples/custom-sbom-java.ts +38 -0
  344. package/examples/git-submodule.test.ts +18 -0
  345. package/examples/git-submodule.ts +30 -0
  346. package/examples/kubernetes-application-customization.test.ts +18 -0
  347. package/examples/kubernetes-application-customization.ts +59 -0
  348. package/examples/kubernetes-with-cloud-sql-legacy.test.ts +18 -0
  349. package/examples/kubernetes-with-cloud-sql-legacy.ts +35 -0
  350. package/examples/kubernetes-with-cloud-sql.test.ts +18 -0
  351. package/examples/kubernetes-with-cloud-sql.ts +37 -0
  352. package/examples/kubernetes-with-jobs.test.ts +18 -0
  353. package/examples/kubernetes-with-jobs.ts +70 -0
  354. package/examples/kubernetes-with-mongodb.test.ts +18 -0
  355. package/examples/kubernetes-with-mongodb.ts +51 -0
  356. package/examples/local-dot-env.test.ts +18 -0
  357. package/examples/local-dot-env.ts +27 -0
  358. package/examples/meteor-kubernetes.test.ts +18 -0
  359. package/examples/meteor-kubernetes.ts +64 -0
  360. package/examples/multiline-var.test.ts +18 -0
  361. package/examples/multiline-var.ts +65 -0
  362. package/examples/native-app.test.ts +18 -0
  363. package/examples/native-app.ts +83 -0
  364. package/examples/node-build-with-custom-image.test.ts +18 -0
  365. package/examples/node-build-with-custom-image.ts +26 -0
  366. package/examples/node-build-with-docker-additions.test.ts +18 -0
  367. package/examples/node-build-with-docker-additions.ts +29 -0
  368. package/examples/rails-k8s-with-worker-dockerfile.test.ts +9 -0
  369. package/examples/rails-k8s-with-worker.test.ts +18 -0
  370. package/examples/rails-k8s-with-worker.ts +95 -0
  371. package/examples/wait-for-other-deploy.test.ts +18 -0
  372. package/examples/wait-for-other-deploy.ts +37 -0
  373. package/package.json +76 -17
  374. package/scripts/bundle +2 -0
  375. package/scripts/generate-examples-test.ts +93 -0
  376. package/scripts/generate-gitlab-ci-types.ts +51 -0
  377. package/scripts/tsconfig.json +7 -0
  378. package/src/bash/BashExpression.ts +81 -0
  379. package/src/bash/bashExpressionPerPipelineType.ts +16 -0
  380. package/src/bash/bashYaml.ts +46 -0
  381. package/src/bash/getInjectVarsScript.ts +12 -0
  382. package/src/bash/replaceAsync.ts +50 -0
  383. package/src/build/artifacts/createBuildJobArtifact.ts +61 -0
  384. package/src/build/base/__tests__/__snapshots__/createArtifactsConfig.test.ts.snap +49 -0
  385. package/src/build/base/__tests__/createArtifactsConfig.test.ts +41 -0
  386. package/src/build/base/constants.ts +2 -2
  387. package/src/build/base/createAppBuildJob.ts +70 -0
  388. package/src/build/base/createArtifactsConfig.ts +34 -0
  389. package/src/build/base/index.ts +62 -0
  390. package/src/build/base/writeBuildInfo.ts +7 -0
  391. package/src/build/base/writeDotEnv.ts +40 -0
  392. package/src/build/custom/__tests__/testJob.test.ts +29 -0
  393. package/src/build/custom/buildJob.ts +41 -0
  394. package/src/build/custom/index.ts +8 -0
  395. package/src/build/custom/testJob.ts +93 -0
  396. package/src/build/docker.ts +173 -63
  397. package/src/build/index.ts +59 -8
  398. package/src/build/node/buildJob.ts +84 -64
  399. package/src/build/node/cache.ts +59 -24
  400. package/src/build/node/constants.ts +2 -3
  401. package/src/build/node/index.ts +9 -5
  402. package/src/build/node/meteor.ts +41 -44
  403. package/src/build/node/testJob.ts +57 -16
  404. package/src/build/node/yarn.ts +81 -25
  405. package/src/build/rails/build.ts +69 -0
  406. package/src/build/rails/index.ts +8 -0
  407. package/src/build/rails/test.ts +103 -0
  408. package/src/build/sbom.ts +48 -0
  409. package/src/build/types.ts +301 -27
  410. package/src/catladder-gitlab.ts +12 -52
  411. package/src/config/__tests__/__snapshots__/getAllEnvs.test.ts.snap +31 -0
  412. package/src/config/__tests__/__snapshots__/getAllEnvsInAllComponents.test.ts.snap +15 -0
  413. package/src/config/{configruedEnvs.test.ts → __tests__/configruedEnvs.test.ts} +3 -3
  414. package/src/config/__tests__/getAllEnvs.test.ts +71 -0
  415. package/src/config/__tests__/getAllEnvsInAllComponents.test.ts +63 -0
  416. package/src/config/configruedEnvs.ts +8 -13
  417. package/src/config/readConfig.ts +17 -23
  418. package/src/constants.ts +5 -2
  419. package/src/context/{resolveReferences.test.ts → __tests__/resolveReferences.test.ts} +34 -44
  420. package/src/context/createAllComponentsContext.ts +31 -0
  421. package/src/context/createComponentContext.ts +135 -0
  422. package/src/context/createWorkspaceContext.ts +56 -0
  423. package/src/context/getBuildInfoVariables.ts +36 -0
  424. package/src/context/getEnvConfig.ts +21 -0
  425. package/src/context/getEnvType.ts +17 -0
  426. package/src/context/getEnvironment.ts +26 -0
  427. package/src/context/getEnvironmentContext.ts +53 -0
  428. package/src/context/getEnvironmentVariables.ts +210 -0
  429. package/src/context/getLabels.ts +21 -0
  430. package/src/context/getReviewSlug.ts +27 -0
  431. package/src/context/index.ts +3 -232
  432. package/src/context/resolveReferences.ts +67 -40
  433. package/src/context/transformJobOnlyVars.ts +45 -0
  434. package/src/context/utils/envVars.ts +27 -0
  435. package/src/defaults/index.ts +1 -1
  436. package/src/deploy/base/deploy.ts +136 -0
  437. package/src/deploy/base/index.ts +22 -0
  438. package/src/deploy/base/rollback.ts +38 -0
  439. package/src/deploy/base/stop.ts +43 -0
  440. package/src/deploy/base/types.ts +3 -0
  441. package/src/deploy/base/variables.ts +5 -0
  442. package/src/deploy/cloudRun/artifactsRegistry.ts +126 -0
  443. package/src/deploy/cloudRun/cleanup.ts +30 -0
  444. package/src/deploy/cloudRun/cloudRunRevisions.ts +65 -0
  445. package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +198 -0
  446. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +86 -0
  447. package/src/deploy/cloudRun/createJobs/common.ts +59 -0
  448. package/src/deploy/cloudRun/createJobs/constants.ts +1 -0
  449. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +79 -0
  450. package/src/deploy/cloudRun/createJobs/getCloudRunStopScripts.ts +34 -0
  451. package/src/deploy/cloudRun/createJobs/index.ts +51 -0
  452. package/src/deploy/cloudRun/createJobs/volumes.ts +23 -0
  453. package/src/deploy/cloudRun/index.ts +127 -0
  454. package/src/deploy/cloudRun/utils/createArgsString.ts +34 -0
  455. package/src/deploy/cloudRun/utils/database.ts +77 -0
  456. package/src/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.ts +12 -0
  457. package/src/deploy/cloudRun/utils/getServiceName.ts +3 -0
  458. package/src/deploy/cloudRun/utils/jobName.ts +7 -0
  459. package/src/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.ts +12 -0
  460. package/src/deploy/cloudSql/utils.ts +26 -0
  461. package/src/deploy/custom/deployJob.ts +41 -16
  462. package/src/deploy/custom/index.ts +9 -1
  463. package/src/deploy/dockerTag/deployJob.ts +29 -0
  464. package/src/deploy/dockerTag/index.ts +10 -0
  465. package/src/deploy/index.ts +32 -17
  466. package/src/deploy/kubernetes/additionalSecretKeys.ts +25 -0
  467. package/src/deploy/kubernetes/cloudSql/index.ts +76 -0
  468. package/src/deploy/kubernetes/deployJob.ts +61 -115
  469. package/src/deploy/kubernetes/index.ts +50 -1
  470. package/src/deploy/kubernetes/kubeEnv.ts +50 -0
  471. package/src/deploy/kubernetes/kubeValues.ts +100 -0
  472. package/src/deploy/kubernetes/mongodb.ts +106 -8
  473. package/src/deploy/kubernetes/processSecretsAsFiles.ts +6 -5
  474. package/src/deploy/sbom.ts +32 -0
  475. package/src/deploy/types/base.ts +43 -0
  476. package/src/deploy/types/custom.ts +36 -0
  477. package/src/deploy/types/dockerTag.ts +14 -0
  478. package/src/deploy/types/googleCloudRun.ts +282 -0
  479. package/src/deploy/types/index.ts +28 -0
  480. package/src/deploy/types/kubernetes.ts +390 -0
  481. package/src/deploy/utils.ts +10 -6
  482. package/src/index.ts +2 -1
  483. package/src/packageInfos.ts +14 -0
  484. package/src/pipeline/__tests__/__snapshots__/getPipelineStages.test.ts.snap +69 -0
  485. package/src/pipeline/__tests__/getPipelineStages.test.ts +63 -0
  486. package/src/pipeline/createAllJobs.ts +72 -0
  487. package/src/pipeline/createChildPipeline.ts +24 -43
  488. package/src/pipeline/createJobsForComponent.ts +35 -0
  489. package/src/pipeline/createJobsForWorkspace.ts +12 -0
  490. package/src/pipeline/createMainPipeline.ts +111 -0
  491. package/src/pipeline/generatePipelineFiles.ts +76 -0
  492. package/src/pipeline/getPipelineStages.ts +23 -0
  493. package/src/pipeline/gitlab/createGitlabJobs.ts +445 -0
  494. package/src/pipeline/gitlab/createGitlabPipeline.ts +28 -0
  495. package/src/pipeline/gitlab/getPipelineTriggerForGitlabChildPipeline.ts +46 -0
  496. package/src/pipeline/gitlab/gitlabReleaseJobs.ts +25 -0
  497. package/src/pipeline/gitlab/sortGitLabJobDefProps.ts +59 -0
  498. package/src/pipeline/index.ts +3 -1
  499. package/src/pipeline/packageManager.ts +47 -64
  500. package/src/pipeline/yarn/yarnUtils.ts +66 -0
  501. package/src/rules/index.ts +46 -13
  502. package/src/runner/index.ts +2 -1
  503. package/src/types/config.ts +72 -16
  504. package/src/types/context.ts +194 -25
  505. package/src/types/environmentContext.ts +38 -0
  506. package/src/types/gitlab-ci-yml.ts +891 -0
  507. package/src/types/gitlab-types.ts +52 -57
  508. package/src/types/jobs.ts +66 -11
  509. package/src/types/pipeline.ts +5 -1
  510. package/src/types/utils.ts +7 -0
  511. package/src/utils/gitlab.ts +33 -0
  512. package/src/utils/index.ts +3 -3
  513. package/src/utils/jsonParse.ts +7 -0
  514. package/src/utils/removeUndefined.ts +4 -0
  515. package/src/utils/writeFiles.ts +53 -0
  516. package/tsconfig.json +4 -2
  517. package/dist/build/base/createBuildJob.d.ts +0 -7
  518. package/dist/build/base/getBuildInfo.d.ts +0 -2
  519. package/dist/build/base/getBuildInfo.js +0 -12
  520. package/dist/context/resolveReferences.test.js +0 -141
  521. package/dist/deploy/base.d.ts +0 -8
  522. package/dist/deploy/base.js +0 -107
  523. package/dist/deploy/kubernetes/cloudsql.d.ts +0 -6
  524. package/dist/deploy/kubernetes/cloudsql.js +0 -16
  525. package/dist/deploy/types.d.ts +0 -196
  526. package/dist/deploy/types.js +0 -16
  527. package/dist/pipeline/createJobs.d.ts +0 -3
  528. package/dist/pipeline/createJobs.js +0 -383
  529. package/dist/pipeline/gitlab/makeGitlabJob.d.ts +0 -8
  530. package/dist/pipeline/gitlab/makeGitlabJob.js +0 -45
  531. package/src/build/base/createBuildJob.ts +0 -43
  532. package/src/build/base/getBuildInfo.ts +0 -7
  533. package/src/build/tests/storybook.test.ts +0 -54
  534. package/src/deploy/base.ts +0 -120
  535. package/src/deploy/kubernetes/cloudsql.ts +0 -12
  536. package/src/deploy/types.ts +0 -189
  537. package/src/pipeline/createChildPipeline.test.ts +0 -49
  538. package/src/pipeline/createJobs.ts +0 -195
  539. package/src/pipeline/gitlab/makeGitlabJob.ts +0 -16
  540. /package/dist/build/{tests/storybook.test.d.ts → base/__tests__/createArtifactsConfig.test.d.ts} +0 -0
  541. /package/dist/{config/configruedEnvs.test.d.ts → build/custom/__tests__/testJob.test.d.ts} +0 -0
  542. /package/dist/{context/resolveReferences.test.d.ts → config/__tests__/configruedEnvs.test.d.ts} +0 -0
  543. /package/dist/{pipeline/createChildPipeline.test.d.ts → config/__tests__/getAllEnvs.test.d.ts} +0 -0
@@ -0,0 +1,2572 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for cloud-run-memory-limit 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
+ 'www 🔨 app | dev ':
49
+ stage: build
50
+ image: foo
51
+ variables:
52
+ KUBERNETES_CPU_REQUEST: '0.45'
53
+ KUBERNETES_MEMORY_REQUEST: 1Gi
54
+ KUBERNETES_MEMORY_LIMIT: 4Gi
55
+ script:
56
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
57
+ - export ENV_SHORT="dev"
58
+ - export APP_DIR="www"
59
+ - export ENV_TYPE="dev"
60
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
61
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
62
+ - 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")"
63
+ - export HOST="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
64
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
65
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
66
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
67
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
68
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
69
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
70
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"
71
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"
72
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
73
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
74
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
75
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
76
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
77
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
78
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
79
+ - cd www
80
+ cache: []
81
+ artifacts:
82
+ paths:
83
+ - www/__build_info.json
84
+ - www/dist
85
+ expire_in: 1 day
86
+ when: always
87
+ reports: {}
88
+ rules:
89
+ - when: never
90
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
91
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
92
+ needs: []
93
+ retry: &a1
94
+ max: 2
95
+ when:
96
+ - runner_system_failure
97
+ - stuck_or_timeout_failure
98
+ interruptible: true
99
+ 'www 🔨 docker | dev ':
100
+ stage: build
101
+ image: path/to/docker/docker-build:the-version
102
+ services:
103
+ - name: docker:24.0.6-dind
104
+ command:
105
+ - --tls=false
106
+ variables:
107
+ DOCKER_HOST: tcp://0.0.0.0:2375
108
+ DOCKER_TLS_CERTDIR: ''
109
+ DOCKER_DRIVER: overlay2
110
+ DOCKER_BUILDKIT: '1'
111
+ KUBERNETES_CPU_REQUEST: '0.45'
112
+ KUBERNETES_MEMORY_REQUEST: 1Gi
113
+ KUBERNETES_MEMORY_LIMIT: 2Gi
114
+ script:
115
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
116
+ - export APP_DIR="www"
117
+ - export DOCKER_BUILD_CONTEXT="."
118
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
119
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www"
120
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
121
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
122
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
123
+ - ensureNginxDockerfile
124
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
125
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
126
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
127
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
128
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
129
+ - 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
130
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
131
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
132
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
133
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
134
+ - docker push $DOCKER_CACHE_IMAGE
135
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
136
+ rules:
137
+ - when: never
138
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
139
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
140
+ needs:
141
+ - 'www 🔨 app | dev '
142
+ retry: *a1
143
+ interruptible: true
144
+ 'www 🧾 sbom | dev ':
145
+ stage: build
146
+ image: aquasec/trivy:0.38.3
147
+ variables: {}
148
+ script:
149
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
150
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
151
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
152
+ artifacts:
153
+ paths:
154
+ - __sbom.json
155
+ rules:
156
+ - when: never
157
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
158
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
159
+ needs: []
160
+ retry: *a1
161
+ interruptible: true
162
+ allow_failure: true
163
+ 'www 🚀 Deploy | dev ':
164
+ stage: deploy dev
165
+ image: path/to/docker/gcloud:the-version
166
+ variables:
167
+ KUBERNETES_CPU_REQUEST: '0.22'
168
+ KUBERNETES_MEMORY_REQUEST: 200Mi
169
+ KUBERNETES_MEMORY_LIMIT: 400Mi
170
+ script:
171
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
172
+ - export ENV_SHORT="dev"
173
+ - export APP_DIR="www"
174
+ - export ENV_TYPE="dev"
175
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
176
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
177
+ - 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")"
178
+ - export HOST="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
179
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
180
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
181
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
182
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
183
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
184
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
185
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"
186
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"
187
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
188
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
189
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www"
190
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
191
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
192
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
193
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
194
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
195
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
196
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
197
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
198
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
199
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
200
+ - |
201
+ cat > ____envvars.yaml <<EOF
202
+ ENV_SHORT: |-
203
+ dev
204
+ APP_DIR: |-
205
+ www
206
+ ENV_TYPE: |-
207
+ dev
208
+ BUILD_INFO_BUILD_ID: |-
209
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
210
+ BUILD_INFO_BUILD_TIME: |-
211
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
212
+ BUILD_INFO_CURRENT_VERSION: |-
213
+ $(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 's/^/ /')
214
+ HOST: |-
215
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
216
+ ROOT_URL: |-
217
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
218
+ HOST_INTERNAL: |-
219
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
220
+ HOST_CANONICAL: |-
221
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
222
+ ROOT_URL_INTERNAL: |-
223
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
224
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
225
+ asdf
226
+ DEPLOY_CLOUD_RUN_REGION: |-
227
+ asia-east1
228
+ GCLOUD_RUN_canonicalHostSuffix: |-
229
+ $(printf %s "$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
230
+ _ALL_ENV_VAR_KEYS: |-
231
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
232
+
233
+ EOF
234
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
235
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
236
+ - gcloud run deploy pan-test-app-dev-www --command="" --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=custom,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
237
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
238
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
239
+ - 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
240
+ - 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
241
+ - 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
242
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
243
+ - echo 'Uploading SBOM to Dependency Track'
244
+ - /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
245
+ - 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
246
+ environment:
247
+ name: dev/www
248
+ url: $CL_GITLAB_ENVIRONMENT_URL
249
+ on_stop: 'www 🛑 Stop ⚠️ | dev '
250
+ auto_stop_in: 4 weeks
251
+ artifacts:
252
+ reports:
253
+ dotenv: gitlab_environment.env
254
+ rules:
255
+ - when: never
256
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
257
+ - when: on_success
258
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
259
+ needs:
260
+ - job: 'www 🔨 app | dev '
261
+ artifacts: false
262
+ - job: 'www 🔨 docker | dev '
263
+ artifacts: false
264
+ - job: 'www 🧾 sbom | dev '
265
+ artifacts: true
266
+ retry: *a1
267
+ interruptible: true
268
+ allow_failure: false
269
+ 'www 🛑 Stop ⚠️ | dev ':
270
+ stage: stop dev
271
+ image: path/to/docker/gcloud:the-version
272
+ variables:
273
+ KUBERNETES_CPU_REQUEST: '0.22'
274
+ KUBERNETES_MEMORY_REQUEST: 200Mi
275
+ KUBERNETES_MEMORY_LIMIT: 400Mi
276
+ GIT_STRATEGY: none
277
+ script:
278
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
279
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
280
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
281
+ - set +e
282
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")
283
+ - gcloud run services delete pan-test-app-dev-www --project=asdf --region=asia-east1
284
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www --quiet --delete-tags
285
+ - 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
286
+ - echo 'Disabling component in Dependency Track'
287
+ - /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
288
+ - set -e
289
+ - 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
290
+ environment:
291
+ name: dev/www
292
+ url: $CL_GITLAB_ENVIRONMENT_URL
293
+ action: stop
294
+ artifacts:
295
+ reports:
296
+ dotenv: gitlab_environment.env
297
+ rules:
298
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
299
+ when: on_success
300
+ - when: never
301
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
302
+ - when: manual
303
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
304
+ needs: []
305
+ retry: *a1
306
+ interruptible: true
307
+ allow_failure: true
308
+ 'www 🔨 app | review ':
309
+ stage: build
310
+ image: foo
311
+ variables:
312
+ KUBERNETES_CPU_REQUEST: '0.45'
313
+ KUBERNETES_MEMORY_REQUEST: 1Gi
314
+ KUBERNETES_MEMORY_LIMIT: 4Gi
315
+ script:
316
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
317
+ - export ENV_SHORT="review"
318
+ - export APP_DIR="www"
319
+ - export ENV_TYPE="review"
320
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
321
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
322
+ - 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")"
323
+ - export HOST="$(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)}')"
324
+ - 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)}')"
325
+ - export HOST_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)}')"
326
+ - export HOST_CANONICAL="$(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)}')"
327
+ - 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)}')"
328
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
329
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
330
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"
331
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"
332
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
333
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
334
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
335
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
336
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
337
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
338
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
339
+ - cd www
340
+ cache: []
341
+ artifacts:
342
+ paths:
343
+ - www/__build_info.json
344
+ - www/dist
345
+ expire_in: 1 day
346
+ when: always
347
+ reports: {}
348
+ rules:
349
+ - if: $CI_MERGE_REQUEST_ID
350
+ needs: []
351
+ retry: *a1
352
+ interruptible: true
353
+ 'www 🔨 docker | review ':
354
+ stage: build
355
+ image: path/to/docker/docker-build:the-version
356
+ services:
357
+ - name: docker:24.0.6-dind
358
+ command:
359
+ - --tls=false
360
+ variables:
361
+ DOCKER_HOST: tcp://0.0.0.0:2375
362
+ DOCKER_TLS_CERTDIR: ''
363
+ DOCKER_DRIVER: overlay2
364
+ DOCKER_BUILDKIT: '1'
365
+ KUBERNETES_CPU_REQUEST: '0.45'
366
+ KUBERNETES_MEMORY_REQUEST: 1Gi
367
+ KUBERNETES_MEMORY_LIMIT: 2Gi
368
+ script:
369
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
370
+ - export APP_DIR="www"
371
+ - export DOCKER_BUILD_CONTEXT="."
372
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
373
+ - 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"; })"
374
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
375
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
376
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
377
+ - ensureNginxDockerfile
378
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
379
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
380
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
381
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
382
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
383
+ - 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
384
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
385
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
386
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
387
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
388
+ - docker push $DOCKER_CACHE_IMAGE
389
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
390
+ rules:
391
+ - if: $CI_MERGE_REQUEST_ID
392
+ needs:
393
+ - 'www 🔨 app | review '
394
+ retry: *a1
395
+ interruptible: true
396
+ 'www 🧾 sbom | review ':
397
+ stage: build
398
+ image: aquasec/trivy:0.38.3
399
+ variables: {}
400
+ script:
401
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
402
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
403
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
404
+ artifacts:
405
+ paths:
406
+ - __sbom.json
407
+ rules:
408
+ - if: $CI_MERGE_REQUEST_ID
409
+ needs: []
410
+ retry: *a1
411
+ interruptible: true
412
+ allow_failure: true
413
+ 'www 🚀 Deploy | review ':
414
+ stage: deploy review
415
+ image: path/to/docker/gcloud:the-version
416
+ variables:
417
+ KUBERNETES_CPU_REQUEST: '0.22'
418
+ KUBERNETES_MEMORY_REQUEST: 200Mi
419
+ KUBERNETES_MEMORY_LIMIT: 400Mi
420
+ script:
421
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
422
+ - export ENV_SHORT="review"
423
+ - export APP_DIR="www"
424
+ - export ENV_TYPE="review"
425
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
426
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
427
+ - 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")"
428
+ - export HOST="$(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)}')"
429
+ - 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)}')"
430
+ - export HOST_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)}')"
431
+ - export HOST_CANONICAL="$(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)}')"
432
+ - 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)}')"
433
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
434
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
435
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"
436
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"
437
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
438
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
439
+ - 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"; })"
440
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
441
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
442
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
443
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
444
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
445
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
446
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
447
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
448
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
449
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
450
+ - |
451
+ cat > ____envvars.yaml <<EOF
452
+ ENV_SHORT: |-
453
+ review
454
+ APP_DIR: |-
455
+ www
456
+ ENV_TYPE: |-
457
+ review
458
+ BUILD_INFO_BUILD_ID: |-
459
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
460
+ BUILD_INFO_BUILD_TIME: |-
461
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
462
+ BUILD_INFO_CURRENT_VERSION: |-
463
+ $(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 's/^/ /')
464
+ HOST: |-
465
+ $(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 's/^/ /')
466
+ ROOT_URL: |-
467
+ $(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 's/^/ /')
468
+ HOST_INTERNAL: |-
469
+ $(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 's/^/ /')
470
+ HOST_CANONICAL: |-
471
+ $(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 's/^/ /')
472
+ ROOT_URL_INTERNAL: |-
473
+ $(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 's/^/ /')
474
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
475
+ asdf
476
+ DEPLOY_CLOUD_RUN_REGION: |-
477
+ asia-east1
478
+ GCLOUD_RUN_canonicalHostSuffix: |-
479
+ $(printf %s "$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
480
+ _ALL_ENV_VAR_KEYS: |-
481
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
482
+
483
+ EOF
484
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
485
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
486
+ - 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="" --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=custom,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
487
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
488
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
489
+ - 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
490
+ - 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
491
+ - 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
492
+ - set +e
493
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags
494
+ - set -e
495
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
496
+ - echo 'Uploading SBOM to Dependency Track'
497
+ - /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
498
+ - 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
499
+ environment:
500
+ name: review/$CI_COMMIT_REF_NAME/www
501
+ url: $CL_GITLAB_ENVIRONMENT_URL
502
+ on_stop: 'www 🛑 Stop ⚠️ | review '
503
+ auto_stop_in: 1 week
504
+ artifacts:
505
+ reports:
506
+ dotenv: gitlab_environment.env
507
+ rules:
508
+ - when: on_success
509
+ if: $CI_MERGE_REQUEST_ID
510
+ needs:
511
+ - job: 'www 🔨 app | review '
512
+ artifacts: false
513
+ - job: 'www 🔨 docker | review '
514
+ artifacts: false
515
+ - job: 'www 🧾 sbom | review '
516
+ artifacts: true
517
+ retry: *a1
518
+ interruptible: true
519
+ allow_failure: false
520
+ 'www 🛑 Stop ⚠️ | review ':
521
+ stage: stop review
522
+ image: path/to/docker/gcloud:the-version
523
+ variables:
524
+ KUBERNETES_CPU_REQUEST: '0.22'
525
+ KUBERNETES_MEMORY_REQUEST: 200Mi
526
+ KUBERNETES_MEMORY_LIMIT: 400Mi
527
+ GIT_STRATEGY: none
528
+ script:
529
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
530
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
531
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
532
+ - set +e
533
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")
534
+ - 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
535
+ - 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
536
+ - 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
537
+ - set +e
538
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags
539
+ - set -e
540
+ - echo 'Disabling component in Dependency Track'
541
+ - /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
542
+ - set -e
543
+ - 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
544
+ environment:
545
+ name: review/$CI_COMMIT_REF_NAME/www
546
+ url: $CL_GITLAB_ENVIRONMENT_URL
547
+ action: stop
548
+ artifacts:
549
+ reports:
550
+ dotenv: gitlab_environment.env
551
+ rules:
552
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
553
+ when: on_success
554
+ - when: manual
555
+ if: $CI_MERGE_REQUEST_ID
556
+ needs: []
557
+ retry: *a1
558
+ interruptible: true
559
+ allow_failure: true
560
+ 'www 🔨 app | stage ':
561
+ stage: build
562
+ image: foo
563
+ variables:
564
+ KUBERNETES_CPU_REQUEST: '0.45'
565
+ KUBERNETES_MEMORY_REQUEST: 1Gi
566
+ KUBERNETES_MEMORY_LIMIT: 4Gi
567
+ script:
568
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
569
+ - export ENV_SHORT="stage"
570
+ - export APP_DIR="www"
571
+ - export ENV_TYPE="stage"
572
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
573
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
574
+ - 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")"
575
+ - export HOST="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
576
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
577
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
578
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
579
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
580
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
581
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
582
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"
583
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"
584
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
585
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
586
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
587
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
588
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
589
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
590
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
591
+ - cd www
592
+ cache: []
593
+ artifacts:
594
+ paths:
595
+ - www/__build_info.json
596
+ - www/dist
597
+ expire_in: 1 day
598
+ when: always
599
+ reports: {}
600
+ rules:
601
+ - if: $CI_COMMIT_TAG
602
+ needs: []
603
+ retry: *a1
604
+ interruptible: true
605
+ 'www 🔨 docker | stage ':
606
+ stage: build
607
+ image: path/to/docker/docker-build:the-version
608
+ services:
609
+ - name: docker:24.0.6-dind
610
+ command:
611
+ - --tls=false
612
+ variables:
613
+ DOCKER_HOST: tcp://0.0.0.0:2375
614
+ DOCKER_TLS_CERTDIR: ''
615
+ DOCKER_DRIVER: overlay2
616
+ DOCKER_BUILDKIT: '1'
617
+ KUBERNETES_CPU_REQUEST: '0.45'
618
+ KUBERNETES_MEMORY_REQUEST: 1Gi
619
+ KUBERNETES_MEMORY_LIMIT: 2Gi
620
+ script:
621
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
622
+ - export APP_DIR="www"
623
+ - export DOCKER_BUILD_CONTEXT="."
624
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
625
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www"
626
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
627
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
628
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
629
+ - ensureNginxDockerfile
630
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
631
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
632
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
633
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
634
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
635
+ - 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
636
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
637
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
638
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
639
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
640
+ - docker push $DOCKER_CACHE_IMAGE
641
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
642
+ rules:
643
+ - if: $CI_COMMIT_TAG
644
+ needs:
645
+ - 'www 🔨 app | stage '
646
+ retry: *a1
647
+ interruptible: true
648
+ 'www 🧾 sbom | stage ':
649
+ stage: build
650
+ image: aquasec/trivy:0.38.3
651
+ variables: {}
652
+ script:
653
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
654
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
655
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
656
+ artifacts:
657
+ paths:
658
+ - __sbom.json
659
+ rules:
660
+ - if: $CI_COMMIT_TAG
661
+ needs: []
662
+ retry: *a1
663
+ interruptible: true
664
+ allow_failure: true
665
+ 'www 🚀 Deploy | stage ':
666
+ stage: deploy stage
667
+ image: path/to/docker/gcloud:the-version
668
+ variables:
669
+ KUBERNETES_CPU_REQUEST: '0.22'
670
+ KUBERNETES_MEMORY_REQUEST: 200Mi
671
+ KUBERNETES_MEMORY_LIMIT: 400Mi
672
+ script:
673
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
674
+ - export ENV_SHORT="stage"
675
+ - export APP_DIR="www"
676
+ - export ENV_TYPE="stage"
677
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
678
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
679
+ - 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")"
680
+ - export HOST="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
681
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
682
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
683
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
684
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
685
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
686
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
687
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"
688
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"
689
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
690
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
691
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www"
692
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
693
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
694
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
695
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
696
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
697
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
698
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
699
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
700
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
701
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
702
+ - |
703
+ cat > ____envvars.yaml <<EOF
704
+ ENV_SHORT: |-
705
+ stage
706
+ APP_DIR: |-
707
+ www
708
+ ENV_TYPE: |-
709
+ stage
710
+ BUILD_INFO_BUILD_ID: |-
711
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
712
+ BUILD_INFO_BUILD_TIME: |-
713
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
714
+ BUILD_INFO_CURRENT_VERSION: |-
715
+ $(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 's/^/ /')
716
+ HOST: |-
717
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
718
+ ROOT_URL: |-
719
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
720
+ HOST_INTERNAL: |-
721
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
722
+ HOST_CANONICAL: |-
723
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
724
+ ROOT_URL_INTERNAL: |-
725
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
726
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
727
+ asdf
728
+ DEPLOY_CLOUD_RUN_REGION: |-
729
+ asia-east1
730
+ GCLOUD_RUN_canonicalHostSuffix: |-
731
+ $(printf %s "$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
732
+ _ALL_ENV_VAR_KEYS: |-
733
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
734
+
735
+ EOF
736
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
737
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
738
+ - gcloud run deploy pan-test-app-stage-www --command="" --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=custom,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
739
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
740
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
741
+ - 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
742
+ - 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
743
+ - 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
744
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
745
+ - echo 'Uploading SBOM to Dependency Track'
746
+ - /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
747
+ - 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
748
+ environment:
749
+ name: stage/www
750
+ url: $CL_GITLAB_ENVIRONMENT_URL
751
+ on_stop: 'www 🛑 Stop ⚠️ | stage '
752
+ artifacts:
753
+ reports:
754
+ dotenv: gitlab_environment.env
755
+ rules:
756
+ - when: on_success
757
+ if: $CI_COMMIT_TAG
758
+ needs:
759
+ - job: 'www 🔨 app | stage '
760
+ artifacts: false
761
+ - job: 'www 🔨 docker | stage '
762
+ artifacts: false
763
+ - job: 'www 🧾 sbom | stage '
764
+ artifacts: true
765
+ retry: *a1
766
+ interruptible: true
767
+ allow_failure: false
768
+ 'www 🛑 Stop ⚠️ | stage ':
769
+ stage: stop stage
770
+ image: path/to/docker/gcloud:the-version
771
+ variables:
772
+ KUBERNETES_CPU_REQUEST: '0.22'
773
+ KUBERNETES_MEMORY_REQUEST: 200Mi
774
+ KUBERNETES_MEMORY_LIMIT: 400Mi
775
+ GIT_STRATEGY: none
776
+ script:
777
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
778
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
779
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
780
+ - set +e
781
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")
782
+ - gcloud run services delete pan-test-app-stage-www --project=asdf --region=asia-east1
783
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www --quiet --delete-tags
784
+ - 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
785
+ - echo 'Disabling component in Dependency Track'
786
+ - /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
787
+ - set -e
788
+ - 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
789
+ environment:
790
+ name: stage/www
791
+ url: $CL_GITLAB_ENVIRONMENT_URL
792
+ action: stop
793
+ artifacts:
794
+ reports:
795
+ dotenv: gitlab_environment.env
796
+ rules:
797
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
798
+ when: on_success
799
+ - when: manual
800
+ if: $CI_COMMIT_TAG
801
+ needs: []
802
+ retry: *a1
803
+ interruptible: true
804
+ allow_failure: true
805
+ 'www 🔨 app | prod ':
806
+ stage: build
807
+ image: foo
808
+ variables:
809
+ KUBERNETES_CPU_REQUEST: '0.45'
810
+ KUBERNETES_MEMORY_REQUEST: 1Gi
811
+ KUBERNETES_MEMORY_LIMIT: 4Gi
812
+ script:
813
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
814
+ - export ENV_SHORT="prod"
815
+ - export APP_DIR="www"
816
+ - export ENV_TYPE="prod"
817
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
818
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
819
+ - 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")"
820
+ - export HOST="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
821
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
822
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
823
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
824
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
825
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
826
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
827
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"
828
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"
829
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
830
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
831
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
832
+ - echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"
833
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
834
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
835
+ - echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"
836
+ - cd www
837
+ cache: []
838
+ artifacts:
839
+ paths:
840
+ - www/__build_info.json
841
+ - www/dist
842
+ expire_in: 1 day
843
+ when: always
844
+ reports: {}
845
+ rules:
846
+ - if: $CI_COMMIT_TAG
847
+ needs: []
848
+ retry: *a1
849
+ interruptible: true
850
+ 'www 🔨 docker | prod ':
851
+ stage: build
852
+ image: path/to/docker/docker-build:the-version
853
+ services:
854
+ - name: docker:24.0.6-dind
855
+ command:
856
+ - --tls=false
857
+ variables:
858
+ DOCKER_HOST: tcp://0.0.0.0:2375
859
+ DOCKER_TLS_CERTDIR: ''
860
+ DOCKER_DRIVER: overlay2
861
+ DOCKER_BUILDKIT: '1'
862
+ KUBERNETES_CPU_REQUEST: '0.45'
863
+ KUBERNETES_MEMORY_REQUEST: 1Gi
864
+ KUBERNETES_MEMORY_LIMIT: 2Gi
865
+ script:
866
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
867
+ - export APP_DIR="www"
868
+ - export DOCKER_BUILD_CONTEXT="."
869
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
870
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www"
871
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
872
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
873
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
874
+ - ensureNginxDockerfile
875
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"
876
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
877
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
878
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"
879
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"
880
+ - 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
881
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"
882
+ - echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"
883
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
884
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
885
+ - docker push $DOCKER_CACHE_IMAGE
886
+ - echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"
887
+ rules:
888
+ - if: $CI_COMMIT_TAG
889
+ needs:
890
+ - 'www 🔨 app | prod '
891
+ retry: *a1
892
+ interruptible: true
893
+ 'www 🧾 sbom | prod ':
894
+ stage: build
895
+ image: aquasec/trivy:0.38.3
896
+ variables: {}
897
+ script:
898
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
899
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
900
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
901
+ artifacts:
902
+ paths:
903
+ - __sbom.json
904
+ rules:
905
+ - if: $CI_COMMIT_TAG
906
+ needs: []
907
+ retry: *a1
908
+ interruptible: true
909
+ allow_failure: true
910
+ 'www 🚀 Deploy | prod ':
911
+ stage: deploy prod
912
+ image: path/to/docker/gcloud:the-version
913
+ variables:
914
+ KUBERNETES_CPU_REQUEST: '0.22'
915
+ KUBERNETES_MEMORY_REQUEST: 200Mi
916
+ KUBERNETES_MEMORY_LIMIT: 400Mi
917
+ script:
918
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
919
+ - export ENV_SHORT="prod"
920
+ - export APP_DIR="www"
921
+ - export ENV_TYPE="prod"
922
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
923
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
924
+ - 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")"
925
+ - export HOST="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
926
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
927
+ - export HOST_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
928
+ - export HOST_CANONICAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
929
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
930
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
931
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
932
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"
933
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"
934
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"
935
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
936
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www"
937
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"
938
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
939
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
940
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
941
+ - echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."
942
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
943
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
944
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
945
+ - echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"
946
+ - echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"
947
+ - |
948
+ cat > ____envvars.yaml <<EOF
949
+ ENV_SHORT: |-
950
+ prod
951
+ APP_DIR: |-
952
+ www
953
+ ENV_TYPE: |-
954
+ prod
955
+ BUILD_INFO_BUILD_ID: |-
956
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
957
+ BUILD_INFO_BUILD_TIME: |-
958
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
959
+ BUILD_INFO_CURRENT_VERSION: |-
960
+ $(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 's/^/ /')
961
+ HOST: |-
962
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
963
+ ROOT_URL: |-
964
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
965
+ HOST_INTERNAL: |-
966
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
967
+ HOST_CANONICAL: |-
968
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
969
+ ROOT_URL_INTERNAL: |-
970
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
971
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
972
+ asdf
973
+ DEPLOY_CLOUD_RUN_REGION: |-
974
+ asia-east1
975
+ GCLOUD_RUN_canonicalHostSuffix: |-
976
+ $(printf %s "$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
977
+ _ALL_ENV_VAR_KEYS: |-
978
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
979
+
980
+ EOF
981
+ - echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"
982
+ - echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"
983
+ - gcloud run deploy pan-test-app-prod-www --command="" --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=custom,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
984
+ - echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"
985
+ - echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"
986
+ - 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
987
+ - 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
988
+ - 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
989
+ - echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"
990
+ - echo 'Uploading SBOM to Dependency Track'
991
+ - /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
992
+ - 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
993
+ environment:
994
+ name: prod/www
995
+ url: $CL_GITLAB_ENVIRONMENT_URL
996
+ on_stop: 'www 🛑 Stop ⚠️ | prod '
997
+ artifacts:
998
+ reports:
999
+ dotenv: gitlab_environment.env
1000
+ rules:
1001
+ - when: manual
1002
+ if: $CI_COMMIT_TAG
1003
+ needs:
1004
+ - job: 'www 🔨 app | prod '
1005
+ artifacts: false
1006
+ - job: 'www 🔨 docker | prod '
1007
+ artifacts: false
1008
+ - job: 'www 🧾 sbom | prod '
1009
+ artifacts: true
1010
+ retry: *a1
1011
+ interruptible: true
1012
+ allow_failure: true
1013
+ 'www 🛑 Stop ⚠️ | prod ':
1014
+ stage: stop prod
1015
+ image: path/to/docker/gcloud:the-version
1016
+ variables:
1017
+ KUBERNETES_CPU_REQUEST: '0.22'
1018
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1019
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1020
+ GIT_STRATEGY: none
1021
+ script:
1022
+ - echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"
1023
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1024
+ - echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"
1025
+ - set +e
1026
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")
1027
+ - gcloud run services delete pan-test-app-prod-www --project=asdf --region=asia-east1
1028
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www --quiet --delete-tags
1029
+ - 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
1030
+ - echo 'Disabling component in Dependency Track'
1031
+ - /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
1032
+ - set -e
1033
+ - 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
1034
+ environment:
1035
+ name: prod/www
1036
+ url: $CL_GITLAB_ENVIRONMENT_URL
1037
+ action: stop
1038
+ artifacts:
1039
+ reports:
1040
+ dotenv: gitlab_environment.env
1041
+ rules:
1042
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1043
+ when: on_success
1044
+ - when: manual
1045
+ if: $CI_COMMIT_TAG
1046
+ needs: []
1047
+ retry: *a1
1048
+ interruptible: true
1049
+ allow_failure: true
1050
+ create release:
1051
+ stage: release
1052
+ image: path/to/docker/semantic-release:the-version
1053
+ script:
1054
+ - semanticRelease
1055
+ after_script:
1056
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1057
+ rules:
1058
+ - &a2
1059
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1060
+ when: never
1061
+ - &a3
1062
+ if: $CI_PIPELINE_SOURCE == "schedule"
1063
+ when: never
1064
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1065
+ when: on_success
1066
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1067
+ when: manual
1068
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1069
+ when: manual
1070
+ ⚠️ force create release:
1071
+ stage: release
1072
+ image: path/to/docker/semantic-release:the-version
1073
+ script:
1074
+ - semanticRelease
1075
+ after_script:
1076
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1077
+ rules:
1078
+ - *a2
1079
+ - *a3
1080
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1081
+ when: manual
1082
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1083
+ when: manual
1084
+ needs: []
1085
+ "
1086
+ `;
1087
+
1088
+ exports[`matches snapshot for custom-build-job 1`] = `
1089
+ {
1090
+ "mainBranch": {
1091
+ "image": "path/to/docker/jobs-default:the-version",
1092
+ "jobs": {
1093
+ "www 🔨 app | dev ": {
1094
+ "artifacts": {
1095
+ "expire_in": "1 day",
1096
+ "paths": [
1097
+ "www/__build_info.json",
1098
+ "www/dist",
1099
+ ],
1100
+ "reports": {
1101
+ "junit": undefined,
1102
+ },
1103
+ "when": "always",
1104
+ },
1105
+ "cache": [],
1106
+ "image": "foo",
1107
+ "interruptible": true,
1108
+ "needs": [],
1109
+ "retry": {
1110
+ "max": 2,
1111
+ "when": [
1112
+ "runner_system_failure",
1113
+ "stuck_or_timeout_failure",
1114
+ ],
1115
+ },
1116
+ "script": [
1117
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1118
+ "export ENV_SHORT="dev"",
1119
+ "export APP_DIR="www"",
1120
+ "export ENV_TYPE="dev"",
1121
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1122
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1123
+ "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")"",
1124
+ "export HOST="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1125
+ "export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1126
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1127
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1128
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1129
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1130
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1131
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"",
1132
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"",
1133
+ "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1134
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1135
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json",
1136
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1137
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1138
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1139
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1140
+ "cd www",
1141
+ ],
1142
+ "stage": "build",
1143
+ "variables": {
1144
+ "KUBERNETES_CPU_REQUEST": "0.45",
1145
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1146
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1147
+ },
1148
+ },
1149
+ "www 🔨 docker | dev ": {
1150
+ "image": "path/to/docker/docker-build:the-version",
1151
+ "interruptible": true,
1152
+ "needs": [
1153
+ "www 🔨 app | dev ",
1154
+ ],
1155
+ "retry": {
1156
+ "max": 2,
1157
+ "when": [
1158
+ "runner_system_failure",
1159
+ "stuck_or_timeout_failure",
1160
+ ],
1161
+ },
1162
+ "script": [
1163
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1164
+ "export APP_DIR="www"",
1165
+ "export DOCKER_BUILD_CONTEXT="."",
1166
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
1167
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www"",
1168
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
1169
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1170
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1171
+ "ensureNginxDockerfile",
1172
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1173
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")",
1174
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
1175
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
1176
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
1177
+ "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",
1178
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
1179
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
1180
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1181
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1182
+ "docker push $DOCKER_CACHE_IMAGE",
1183
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
1184
+ ],
1185
+ "services": [
1186
+ {
1187
+ "command": [
1188
+ "--tls=false",
1189
+ ],
1190
+ "name": "docker:24.0.6-dind",
1191
+ },
1192
+ ],
1193
+ "stage": "build",
1194
+ "variables": {
1195
+ "DOCKER_BUILDKIT": "1",
1196
+ "DOCKER_DRIVER": "overlay2",
1197
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1198
+ "DOCKER_TLS_CERTDIR": "",
1199
+ "KUBERNETES_CPU_REQUEST": "0.45",
1200
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1201
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1202
+ },
1203
+ },
1204
+ "www 🚀 Deploy | dev ": {
1205
+ "allow_failure": false,
1206
+ "artifacts": {
1207
+ "reports": {
1208
+ "dotenv": "gitlab_environment.env",
1209
+ },
1210
+ },
1211
+ "environment": {
1212
+ "auto_stop_in": "4 weeks",
1213
+ "name": "dev/www",
1214
+ "on_stop": "www 🛑 Stop ⚠️ | dev ",
1215
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1216
+ },
1217
+ "image": "path/to/docker/gcloud:the-version",
1218
+ "interruptible": true,
1219
+ "needs": [
1220
+ {
1221
+ "artifacts": false,
1222
+ "job": "www 🔨 app | dev ",
1223
+ },
1224
+ {
1225
+ "artifacts": false,
1226
+ "job": "www 🔨 docker | dev ",
1227
+ },
1228
+ {
1229
+ "artifacts": true,
1230
+ "job": "www 🧾 sbom | dev ",
1231
+ },
1232
+ ],
1233
+ "retry": {
1234
+ "max": 2,
1235
+ "when": [
1236
+ "runner_system_failure",
1237
+ "stuck_or_timeout_failure",
1238
+ ],
1239
+ },
1240
+ "rules": [
1241
+ {
1242
+ "when": "on_success",
1243
+ },
1244
+ ],
1245
+ "script": [
1246
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1247
+ "export ENV_SHORT="dev"",
1248
+ "export APP_DIR="www"",
1249
+ "export ENV_TYPE="dev"",
1250
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1251
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1252
+ "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")"",
1253
+ "export HOST="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1254
+ "export ROOT_URL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1255
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1256
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1257
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1258
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1259
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1260
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_dev_www_GCLOUD_DEPLOY_credentialsKey"",
1261
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix"",
1262
+ "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1263
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
1264
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www"",
1265
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
1266
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1267
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1268
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1269
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1270
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")",
1271
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
1272
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1273
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1274
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
1275
+ "cat > ____envvars.yaml <<EOF
1276
+ ENV_SHORT: |-
1277
+ dev
1278
+ APP_DIR: |-
1279
+ www
1280
+ ENV_TYPE: |-
1281
+ dev
1282
+ BUILD_INFO_BUILD_ID: |-
1283
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1284
+ BUILD_INFO_BUILD_TIME: |-
1285
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1286
+ BUILD_INFO_CURRENT_VERSION: |-
1287
+ $(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 's/^/ /')
1288
+ HOST: |-
1289
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1290
+ ROOT_URL: |-
1291
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1292
+ HOST_INTERNAL: |-
1293
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1294
+ HOST_CANONICAL: |-
1295
+ $(printf %s "$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1296
+ ROOT_URL_INTERNAL: |-
1297
+ $(printf %s "https://$(printf %s "pan-test-app-dev-www-$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
1298
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1299
+ asdf
1300
+ DEPLOY_CLOUD_RUN_REGION: |-
1301
+ asia-east1
1302
+ GCLOUD_RUN_canonicalHostSuffix: |-
1303
+ $(printf %s "$CL_dev_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1304
+ _ALL_ENV_VAR_KEYS: |-
1305
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1306
+
1307
+ EOF
1308
+ ",
1309
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
1310
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1311
+ "gcloud run deploy pan-test-app-dev-www --command="" --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=custom,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",
1312
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1313
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1314
+ "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",
1315
+ "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",
1316
+ "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",
1317
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1318
+ "echo 'Uploading SBOM to Dependency Track'",
1319
+ "/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",
1320
+ "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",
1321
+ ],
1322
+ "stage": "deploy dev",
1323
+ "variables": {
1324
+ "KUBERNETES_CPU_REQUEST": "0.22",
1325
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1326
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1327
+ },
1328
+ },
1329
+ "www 🛑 Stop ⚠️ | dev ": {
1330
+ "allow_failure": true,
1331
+ "artifacts": {
1332
+ "reports": {
1333
+ "dotenv": "gitlab_environment.env",
1334
+ },
1335
+ },
1336
+ "environment": {
1337
+ "action": "stop",
1338
+ "name": "dev/www",
1339
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1340
+ },
1341
+ "image": "path/to/docker/gcloud:the-version",
1342
+ "interruptible": true,
1343
+ "needs": [],
1344
+ "retry": {
1345
+ "max": 2,
1346
+ "when": [
1347
+ "runner_system_failure",
1348
+ "stuck_or_timeout_failure",
1349
+ ],
1350
+ },
1351
+ "rules": [
1352
+ {
1353
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1354
+ "when": "on_success",
1355
+ },
1356
+ {
1357
+ "when": "manual",
1358
+ },
1359
+ ],
1360
+ "script": [
1361
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1362
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1363
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1364
+ "set +e",
1365
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_dev_www_GCLOUD_DEPLOY_credentialsKey")",
1366
+ "gcloud run services delete pan-test-app-dev-www --project=asdf --region=asia-east1",
1367
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/www --quiet --delete-tags",
1368
+ "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",
1369
+ "echo 'Disabling component in Dependency Track'",
1370
+ "/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",
1371
+ "set -e",
1372
+ "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",
1373
+ ],
1374
+ "stage": "stop dev",
1375
+ "variables": {
1376
+ "GIT_STRATEGY": "none",
1377
+ "KUBERNETES_CPU_REQUEST": "0.22",
1378
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1379
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1380
+ },
1381
+ },
1382
+ "www 🧾 sbom | dev ": {
1383
+ "allow_failure": true,
1384
+ "artifacts": {
1385
+ "paths": [
1386
+ "__sbom.json",
1387
+ ],
1388
+ },
1389
+ "image": "aquasec/trivy:0.38.3",
1390
+ "interruptible": true,
1391
+ "needs": [],
1392
+ "retry": {
1393
+ "max": 2,
1394
+ "when": [
1395
+ "runner_system_failure",
1396
+ "stuck_or_timeout_failure",
1397
+ ],
1398
+ },
1399
+ "script": [
1400
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1401
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1402
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" www",
1403
+ ],
1404
+ "stage": "build",
1405
+ "variables": {},
1406
+ },
1407
+ },
1408
+ "stages": [
1409
+ "setup",
1410
+ "setup dev",
1411
+ "setup review",
1412
+ "setup stage",
1413
+ "setup prod",
1414
+ "test",
1415
+ "test dev",
1416
+ "test review",
1417
+ "test stage",
1418
+ "test prod",
1419
+ "build",
1420
+ "build dev",
1421
+ "build review",
1422
+ "build stage",
1423
+ "build prod",
1424
+ "deploy",
1425
+ "deploy dev",
1426
+ "deploy review",
1427
+ "deploy stage",
1428
+ "deploy prod",
1429
+ "verify",
1430
+ "verify dev",
1431
+ "verify review",
1432
+ "verify stage",
1433
+ "verify prod",
1434
+ "rollback",
1435
+ "rollback dev",
1436
+ "rollback review",
1437
+ "rollback stage",
1438
+ "rollback prod",
1439
+ "stop",
1440
+ "stop dev",
1441
+ "stop review",
1442
+ "stop stage",
1443
+ "stop prod",
1444
+ ],
1445
+ "variables": {
1446
+ "ARTIFACT_COMPRESSION_LEVEL": "fast",
1447
+ "CACHE_COMPRESSION_LEVEL": "fast",
1448
+ "FF_USE_FASTZIP": "true",
1449
+ "GIT_DEPTH": "1",
1450
+ "TRANSFER_METER_FREQUENCY": "5s",
1451
+ },
1452
+ "workflow": {
1453
+ "rules": [
1454
+ {
1455
+ "if": "$CI_COMMIT_TAG",
1456
+ },
1457
+ {
1458
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1459
+ "when": "never",
1460
+ },
1461
+ {
1462
+ "if": "$CI_PIPELINE_SOURCE == "schedule"",
1463
+ "when": "never",
1464
+ },
1465
+ {
1466
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1467
+ },
1468
+ {
1469
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1470
+ },
1471
+ {
1472
+ "if": "$CI_MERGE_REQUEST_ID",
1473
+ },
1474
+ ],
1475
+ },
1476
+ },
1477
+ "mr": {
1478
+ "image": "path/to/docker/jobs-default:the-version",
1479
+ "jobs": {
1480
+ "www 🔨 app | review ": {
1481
+ "artifacts": {
1482
+ "expire_in": "1 day",
1483
+ "paths": [
1484
+ "www/__build_info.json",
1485
+ "www/dist",
1486
+ ],
1487
+ "reports": {
1488
+ "junit": undefined,
1489
+ },
1490
+ "when": "always",
1491
+ },
1492
+ "cache": [],
1493
+ "image": "foo",
1494
+ "interruptible": true,
1495
+ "needs": [],
1496
+ "retry": {
1497
+ "max": 2,
1498
+ "when": [
1499
+ "runner_system_failure",
1500
+ "stuck_or_timeout_failure",
1501
+ ],
1502
+ },
1503
+ "script": [
1504
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1505
+ "export ENV_SHORT="review"",
1506
+ "export APP_DIR="www"",
1507
+ "export ENV_TYPE="review"",
1508
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1509
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1510
+ "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")"",
1511
+ "export HOST="$(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)}')"",
1512
+ "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)}')"",
1513
+ "export HOST_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)}')"",
1514
+ "export HOST_CANONICAL="$(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)}')"",
1515
+ "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)}')"",
1516
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1517
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1518
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"",
1519
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"",
1520
+ "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1521
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1522
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json",
1523
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1524
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1525
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1526
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1527
+ "cd www",
1528
+ ],
1529
+ "stage": "build",
1530
+ "variables": {
1531
+ "KUBERNETES_CPU_REQUEST": "0.45",
1532
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1533
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1534
+ },
1535
+ },
1536
+ "www 🔨 docker | review ": {
1537
+ "image": "path/to/docker/docker-build:the-version",
1538
+ "interruptible": true,
1539
+ "needs": [
1540
+ "www 🔨 app | review ",
1541
+ ],
1542
+ "retry": {
1543
+ "max": 2,
1544
+ "when": [
1545
+ "runner_system_failure",
1546
+ "stuck_or_timeout_failure",
1547
+ ],
1548
+ },
1549
+ "script": [
1550
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1551
+ "export APP_DIR="www"",
1552
+ "export DOCKER_BUILD_CONTEXT="."",
1553
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
1554
+ "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"; })"",
1555
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
1556
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1557
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1558
+ "ensureNginxDockerfile",
1559
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
1560
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")",
1561
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
1562
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
1563
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
1564
+ "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",
1565
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
1566
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
1567
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
1568
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
1569
+ "docker push $DOCKER_CACHE_IMAGE",
1570
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
1571
+ ],
1572
+ "services": [
1573
+ {
1574
+ "command": [
1575
+ "--tls=false",
1576
+ ],
1577
+ "name": "docker:24.0.6-dind",
1578
+ },
1579
+ ],
1580
+ "stage": "build",
1581
+ "variables": {
1582
+ "DOCKER_BUILDKIT": "1",
1583
+ "DOCKER_DRIVER": "overlay2",
1584
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
1585
+ "DOCKER_TLS_CERTDIR": "",
1586
+ "KUBERNETES_CPU_REQUEST": "0.45",
1587
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
1588
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1589
+ },
1590
+ },
1591
+ "www 🚀 Deploy | review ": {
1592
+ "allow_failure": false,
1593
+ "artifacts": {
1594
+ "reports": {
1595
+ "dotenv": "gitlab_environment.env",
1596
+ },
1597
+ },
1598
+ "environment": {
1599
+ "auto_stop_in": "1 week",
1600
+ "name": "review/$CI_COMMIT_REF_NAME/www",
1601
+ "on_stop": "www 🛑 Stop ⚠️ | review ",
1602
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1603
+ },
1604
+ "image": "path/to/docker/gcloud:the-version",
1605
+ "interruptible": true,
1606
+ "needs": [
1607
+ {
1608
+ "artifacts": false,
1609
+ "job": "www 🔨 app | review ",
1610
+ },
1611
+ {
1612
+ "artifacts": false,
1613
+ "job": "www 🔨 docker | review ",
1614
+ },
1615
+ {
1616
+ "artifacts": true,
1617
+ "job": "www 🧾 sbom | review ",
1618
+ },
1619
+ ],
1620
+ "retry": {
1621
+ "max": 2,
1622
+ "when": [
1623
+ "runner_system_failure",
1624
+ "stuck_or_timeout_failure",
1625
+ ],
1626
+ },
1627
+ "rules": [
1628
+ {
1629
+ "when": "on_success",
1630
+ },
1631
+ ],
1632
+ "script": [
1633
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1634
+ "export ENV_SHORT="review"",
1635
+ "export APP_DIR="www"",
1636
+ "export ENV_TYPE="review"",
1637
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1638
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1639
+ "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")"",
1640
+ "export HOST="$(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)}')"",
1641
+ "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)}')"",
1642
+ "export HOST_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)}')"",
1643
+ "export HOST_CANONICAL="$(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)}')"",
1644
+ "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)}')"",
1645
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1646
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1647
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_review_www_GCLOUD_DEPLOY_credentialsKey"",
1648
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_review_www_GCLOUD_RUN_canonicalHostSuffix"",
1649
+ "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1650
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
1651
+ "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"; })"",
1652
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
1653
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
1654
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1655
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1656
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
1657
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")",
1658
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
1659
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
1660
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
1661
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
1662
+ "cat > ____envvars.yaml <<EOF
1663
+ ENV_SHORT: |-
1664
+ review
1665
+ APP_DIR: |-
1666
+ www
1667
+ ENV_TYPE: |-
1668
+ review
1669
+ BUILD_INFO_BUILD_ID: |-
1670
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
1671
+ BUILD_INFO_BUILD_TIME: |-
1672
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
1673
+ BUILD_INFO_CURRENT_VERSION: |-
1674
+ $(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 's/^/ /')
1675
+ HOST: |-
1676
+ $(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 's/^/ /')
1677
+ ROOT_URL: |-
1678
+ $(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 's/^/ /')
1679
+ HOST_INTERNAL: |-
1680
+ $(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 's/^/ /')
1681
+ HOST_CANONICAL: |-
1682
+ $(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 's/^/ /')
1683
+ ROOT_URL_INTERNAL: |-
1684
+ $(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 's/^/ /')
1685
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1686
+ asdf
1687
+ DEPLOY_CLOUD_RUN_REGION: |-
1688
+ asia-east1
1689
+ GCLOUD_RUN_canonicalHostSuffix: |-
1690
+ $(printf %s "$CL_review_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
1691
+ _ALL_ENV_VAR_KEYS: |-
1692
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
1693
+
1694
+ EOF
1695
+ ",
1696
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
1697
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
1698
+ "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="" --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=custom,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",
1699
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
1700
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
1701
+ "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",
1702
+ "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",
1703
+ "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",
1704
+ "set +e",
1705
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags",
1706
+ "set -e",
1707
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
1708
+ "echo 'Uploading SBOM to Dependency Track'",
1709
+ "/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",
1710
+ "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",
1711
+ ],
1712
+ "stage": "deploy review",
1713
+ "variables": {
1714
+ "KUBERNETES_CPU_REQUEST": "0.22",
1715
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1716
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1717
+ },
1718
+ },
1719
+ "www 🛑 Stop ⚠️ | review ": {
1720
+ "allow_failure": true,
1721
+ "artifacts": {
1722
+ "reports": {
1723
+ "dotenv": "gitlab_environment.env",
1724
+ },
1725
+ },
1726
+ "environment": {
1727
+ "action": "stop",
1728
+ "name": "review/$CI_COMMIT_REF_NAME/www",
1729
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
1730
+ },
1731
+ "image": "path/to/docker/gcloud:the-version",
1732
+ "interruptible": true,
1733
+ "needs": [],
1734
+ "retry": {
1735
+ "max": 2,
1736
+ "when": [
1737
+ "runner_system_failure",
1738
+ "stuck_or_timeout_failure",
1739
+ ],
1740
+ },
1741
+ "rules": [
1742
+ {
1743
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
1744
+ "when": "on_success",
1745
+ },
1746
+ {
1747
+ "when": "manual",
1748
+ },
1749
+ ],
1750
+ "script": [
1751
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1752
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
1753
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1754
+ "set +e",
1755
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_review_www_GCLOUD_DEPLOY_credentialsKey")",
1756
+ "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",
1757
+ "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",
1758
+ "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",
1759
+ "set +e",
1760
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/www --quiet --delete-tags",
1761
+ "set -e",
1762
+ "echo 'Disabling component in Dependency Track'",
1763
+ "/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",
1764
+ "set -e",
1765
+ "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",
1766
+ ],
1767
+ "stage": "stop review",
1768
+ "variables": {
1769
+ "GIT_STRATEGY": "none",
1770
+ "KUBERNETES_CPU_REQUEST": "0.22",
1771
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
1772
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
1773
+ },
1774
+ },
1775
+ "www 🧾 sbom | review ": {
1776
+ "allow_failure": true,
1777
+ "artifacts": {
1778
+ "paths": [
1779
+ "__sbom.json",
1780
+ ],
1781
+ },
1782
+ "image": "aquasec/trivy:0.38.3",
1783
+ "interruptible": true,
1784
+ "needs": [],
1785
+ "retry": {
1786
+ "max": 2,
1787
+ "when": [
1788
+ "runner_system_failure",
1789
+ "stuck_or_timeout_failure",
1790
+ ],
1791
+ },
1792
+ "script": [
1793
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1794
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1795
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" www",
1796
+ ],
1797
+ "stage": "build",
1798
+ "variables": {},
1799
+ },
1800
+ },
1801
+ "stages": [
1802
+ "setup",
1803
+ "setup dev",
1804
+ "setup review",
1805
+ "setup stage",
1806
+ "setup prod",
1807
+ "test",
1808
+ "test dev",
1809
+ "test review",
1810
+ "test stage",
1811
+ "test prod",
1812
+ "build",
1813
+ "build dev",
1814
+ "build review",
1815
+ "build stage",
1816
+ "build prod",
1817
+ "deploy",
1818
+ "deploy dev",
1819
+ "deploy review",
1820
+ "deploy stage",
1821
+ "deploy prod",
1822
+ "verify",
1823
+ "verify dev",
1824
+ "verify review",
1825
+ "verify stage",
1826
+ "verify prod",
1827
+ "rollback",
1828
+ "rollback dev",
1829
+ "rollback review",
1830
+ "rollback stage",
1831
+ "rollback prod",
1832
+ "stop",
1833
+ "stop dev",
1834
+ "stop review",
1835
+ "stop stage",
1836
+ "stop prod",
1837
+ ],
1838
+ "variables": {
1839
+ "ARTIFACT_COMPRESSION_LEVEL": "fast",
1840
+ "CACHE_COMPRESSION_LEVEL": "fast",
1841
+ "FF_USE_FASTZIP": "true",
1842
+ "GIT_DEPTH": "1",
1843
+ "TRANSFER_METER_FREQUENCY": "5s",
1844
+ },
1845
+ "workflow": {
1846
+ "rules": [
1847
+ {
1848
+ "if": "$CI_COMMIT_TAG",
1849
+ },
1850
+ {
1851
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
1852
+ "when": "never",
1853
+ },
1854
+ {
1855
+ "if": "$CI_PIPELINE_SOURCE == "schedule"",
1856
+ "when": "never",
1857
+ },
1858
+ {
1859
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
1860
+ },
1861
+ {
1862
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
1863
+ },
1864
+ {
1865
+ "if": "$CI_MERGE_REQUEST_ID",
1866
+ },
1867
+ ],
1868
+ },
1869
+ },
1870
+ "taggedRelease": {
1871
+ "image": "path/to/docker/jobs-default:the-version",
1872
+ "jobs": {
1873
+ "www 🔨 app | prod ": {
1874
+ "artifacts": {
1875
+ "expire_in": "1 day",
1876
+ "paths": [
1877
+ "www/__build_info.json",
1878
+ "www/dist",
1879
+ ],
1880
+ "reports": {
1881
+ "junit": undefined,
1882
+ },
1883
+ "when": "always",
1884
+ },
1885
+ "cache": [],
1886
+ "image": "foo",
1887
+ "interruptible": true,
1888
+ "needs": [],
1889
+ "retry": {
1890
+ "max": 2,
1891
+ "when": [
1892
+ "runner_system_failure",
1893
+ "stuck_or_timeout_failure",
1894
+ ],
1895
+ },
1896
+ "script": [
1897
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1898
+ "export ENV_SHORT="prod"",
1899
+ "export APP_DIR="www"",
1900
+ "export ENV_TYPE="prod"",
1901
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1902
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1903
+ "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")"",
1904
+ "export HOST="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1905
+ "export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1906
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1907
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1908
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1909
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1910
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1911
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"",
1912
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"",
1913
+ "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1914
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1915
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json",
1916
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1917
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1918
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1919
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1920
+ "cd www",
1921
+ ],
1922
+ "stage": "build",
1923
+ "variables": {
1924
+ "KUBERNETES_CPU_REQUEST": "0.45",
1925
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1926
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1927
+ },
1928
+ },
1929
+ "www 🔨 app | stage ": {
1930
+ "artifacts": {
1931
+ "expire_in": "1 day",
1932
+ "paths": [
1933
+ "www/__build_info.json",
1934
+ "www/dist",
1935
+ ],
1936
+ "reports": {
1937
+ "junit": undefined,
1938
+ },
1939
+ "when": "always",
1940
+ },
1941
+ "cache": [],
1942
+ "image": "foo",
1943
+ "interruptible": true,
1944
+ "needs": [],
1945
+ "retry": {
1946
+ "max": 2,
1947
+ "when": [
1948
+ "runner_system_failure",
1949
+ "stuck_or_timeout_failure",
1950
+ ],
1951
+ },
1952
+ "script": [
1953
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
1954
+ "export ENV_SHORT="stage"",
1955
+ "export APP_DIR="www"",
1956
+ "export ENV_TYPE="stage"",
1957
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
1958
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
1959
+ "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")"",
1960
+ "export HOST="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1961
+ "export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1962
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1963
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1964
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
1965
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
1966
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
1967
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"",
1968
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"",
1969
+ "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
1970
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
1971
+ "echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json",
1972
+ "echo -e "\\e[0Ksection_start:$(date +%s):nodeinstall[collapsed=true]\\r\\e[0KEnsure node version"",
1973
+ "if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi",
1974
+ "if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi",
1975
+ "echo -e "\\e[0Ksection_end:$(date +%s):nodeinstall\\r\\e[0K"",
1976
+ "cd www",
1977
+ ],
1978
+ "stage": "build",
1979
+ "variables": {
1980
+ "KUBERNETES_CPU_REQUEST": "0.45",
1981
+ "KUBERNETES_MEMORY_LIMIT": "4Gi",
1982
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
1983
+ },
1984
+ },
1985
+ "www 🔨 docker | prod ": {
1986
+ "image": "path/to/docker/docker-build:the-version",
1987
+ "interruptible": true,
1988
+ "needs": [
1989
+ "www 🔨 app | prod ",
1990
+ ],
1991
+ "retry": {
1992
+ "max": 2,
1993
+ "when": [
1994
+ "runner_system_failure",
1995
+ "stuck_or_timeout_failure",
1996
+ ],
1997
+ },
1998
+ "script": [
1999
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2000
+ "export APP_DIR="www"",
2001
+ "export DOCKER_BUILD_CONTEXT="."",
2002
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
2003
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www"",
2004
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
2005
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2006
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2007
+ "ensureNginxDockerfile",
2008
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
2009
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")",
2010
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
2011
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
2012
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
2013
+ "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",
2014
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
2015
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
2016
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2017
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2018
+ "docker push $DOCKER_CACHE_IMAGE",
2019
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
2020
+ ],
2021
+ "services": [
2022
+ {
2023
+ "command": [
2024
+ "--tls=false",
2025
+ ],
2026
+ "name": "docker:24.0.6-dind",
2027
+ },
2028
+ ],
2029
+ "stage": "build",
2030
+ "variables": {
2031
+ "DOCKER_BUILDKIT": "1",
2032
+ "DOCKER_DRIVER": "overlay2",
2033
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2034
+ "DOCKER_TLS_CERTDIR": "",
2035
+ "KUBERNETES_CPU_REQUEST": "0.45",
2036
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2037
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2038
+ },
2039
+ },
2040
+ "www 🔨 docker | stage ": {
2041
+ "image": "path/to/docker/docker-build:the-version",
2042
+ "interruptible": true,
2043
+ "needs": [
2044
+ "www 🔨 app | stage ",
2045
+ ],
2046
+ "retry": {
2047
+ "max": 2,
2048
+ "when": [
2049
+ "runner_system_failure",
2050
+ "stuck_or_timeout_failure",
2051
+ ],
2052
+ },
2053
+ "script": [
2054
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2055
+ "export APP_DIR="www"",
2056
+ "export DOCKER_BUILD_CONTEXT="."",
2057
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
2058
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www"",
2059
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
2060
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2061
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2062
+ "ensureNginxDockerfile",
2063
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-login[collapsed=true]\\r\\e[0KDocker Login"",
2064
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")",
2065
+ "gcloud auth configure-docker asia-east1-docker.pkg.dev",
2066
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-login\\r\\e[0K"",
2067
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-build[collapsed=true]\\r\\e[0KDocker build"",
2068
+ "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",
2069
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-build\\r\\e[0K"",
2070
+ "echo -e "\\e[0Ksection_start:$(date +%s):docker-push[collapsed=true]\\r\\e[0KDocker push and tag"",
2071
+ "docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG",
2072
+ "docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE",
2073
+ "docker push $DOCKER_CACHE_IMAGE",
2074
+ "echo -e "\\e[0Ksection_end:$(date +%s):docker-push\\r\\e[0K"",
2075
+ ],
2076
+ "services": [
2077
+ {
2078
+ "command": [
2079
+ "--tls=false",
2080
+ ],
2081
+ "name": "docker:24.0.6-dind",
2082
+ },
2083
+ ],
2084
+ "stage": "build",
2085
+ "variables": {
2086
+ "DOCKER_BUILDKIT": "1",
2087
+ "DOCKER_DRIVER": "overlay2",
2088
+ "DOCKER_HOST": "tcp://0.0.0.0:2375",
2089
+ "DOCKER_TLS_CERTDIR": "",
2090
+ "KUBERNETES_CPU_REQUEST": "0.45",
2091
+ "KUBERNETES_MEMORY_LIMIT": "2Gi",
2092
+ "KUBERNETES_MEMORY_REQUEST": "1Gi",
2093
+ },
2094
+ },
2095
+ "www 🚀 Deploy | prod ": {
2096
+ "allow_failure": true,
2097
+ "artifacts": {
2098
+ "reports": {
2099
+ "dotenv": "gitlab_environment.env",
2100
+ },
2101
+ },
2102
+ "environment": {
2103
+ "auto_stop_in": undefined,
2104
+ "name": "prod/www",
2105
+ "on_stop": "www 🛑 Stop ⚠️ | prod ",
2106
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2107
+ },
2108
+ "image": "path/to/docker/gcloud:the-version",
2109
+ "interruptible": true,
2110
+ "needs": [
2111
+ {
2112
+ "artifacts": false,
2113
+ "job": "www 🔨 app | prod ",
2114
+ },
2115
+ {
2116
+ "artifacts": false,
2117
+ "job": "www 🔨 docker | prod ",
2118
+ },
2119
+ {
2120
+ "artifacts": true,
2121
+ "job": "www 🧾 sbom | prod ",
2122
+ },
2123
+ ],
2124
+ "retry": {
2125
+ "max": 2,
2126
+ "when": [
2127
+ "runner_system_failure",
2128
+ "stuck_or_timeout_failure",
2129
+ ],
2130
+ },
2131
+ "rules": [
2132
+ {
2133
+ "when": "manual",
2134
+ },
2135
+ ],
2136
+ "script": [
2137
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2138
+ "export ENV_SHORT="prod"",
2139
+ "export APP_DIR="www"",
2140
+ "export ENV_TYPE="prod"",
2141
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2142
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2143
+ "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")"",
2144
+ "export HOST="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2145
+ "export ROOT_URL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2146
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2147
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2148
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2149
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
2150
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
2151
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_prod_www_GCLOUD_DEPLOY_credentialsKey"",
2152
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix"",
2153
+ "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
2154
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
2155
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www"",
2156
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
2157
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2158
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
2159
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2160
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
2161
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")",
2162
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
2163
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2164
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
2165
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
2166
+ "cat > ____envvars.yaml <<EOF
2167
+ ENV_SHORT: |-
2168
+ prod
2169
+ APP_DIR: |-
2170
+ www
2171
+ ENV_TYPE: |-
2172
+ prod
2173
+ BUILD_INFO_BUILD_ID: |-
2174
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2175
+ BUILD_INFO_BUILD_TIME: |-
2176
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2177
+ BUILD_INFO_CURRENT_VERSION: |-
2178
+ $(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 's/^/ /')
2179
+ HOST: |-
2180
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2181
+ ROOT_URL: |-
2182
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2183
+ HOST_INTERNAL: |-
2184
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2185
+ HOST_CANONICAL: |-
2186
+ $(printf %s "$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2187
+ ROOT_URL_INTERNAL: |-
2188
+ $(printf %s "https://$(printf %s "pan-test-app-prod-www-$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2189
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2190
+ asdf
2191
+ DEPLOY_CLOUD_RUN_REGION: |-
2192
+ asia-east1
2193
+ GCLOUD_RUN_canonicalHostSuffix: |-
2194
+ $(printf %s "$CL_prod_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2195
+ _ALL_ENV_VAR_KEYS: |-
2196
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2197
+
2198
+ EOF
2199
+ ",
2200
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
2201
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
2202
+ "gcloud run deploy pan-test-app-prod-www --command="" --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=custom,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",
2203
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
2204
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
2205
+ "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",
2206
+ "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",
2207
+ "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",
2208
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
2209
+ "echo 'Uploading SBOM to Dependency Track'",
2210
+ "/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",
2211
+ "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",
2212
+ ],
2213
+ "stage": "deploy prod",
2214
+ "variables": {
2215
+ "KUBERNETES_CPU_REQUEST": "0.22",
2216
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2217
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2218
+ },
2219
+ },
2220
+ "www 🚀 Deploy | stage ": {
2221
+ "allow_failure": false,
2222
+ "artifacts": {
2223
+ "reports": {
2224
+ "dotenv": "gitlab_environment.env",
2225
+ },
2226
+ },
2227
+ "environment": {
2228
+ "auto_stop_in": undefined,
2229
+ "name": "stage/www",
2230
+ "on_stop": "www 🛑 Stop ⚠️ | stage ",
2231
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2232
+ },
2233
+ "image": "path/to/docker/gcloud:the-version",
2234
+ "interruptible": true,
2235
+ "needs": [
2236
+ {
2237
+ "artifacts": false,
2238
+ "job": "www 🔨 app | stage ",
2239
+ },
2240
+ {
2241
+ "artifacts": false,
2242
+ "job": "www 🔨 docker | stage ",
2243
+ },
2244
+ {
2245
+ "artifacts": true,
2246
+ "job": "www 🧾 sbom | stage ",
2247
+ },
2248
+ ],
2249
+ "retry": {
2250
+ "max": 2,
2251
+ "when": [
2252
+ "runner_system_failure",
2253
+ "stuck_or_timeout_failure",
2254
+ ],
2255
+ },
2256
+ "rules": [
2257
+ {
2258
+ "when": "on_success",
2259
+ },
2260
+ ],
2261
+ "script": [
2262
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2263
+ "export ENV_SHORT="stage"",
2264
+ "export APP_DIR="www"",
2265
+ "export ENV_TYPE="stage"",
2266
+ "export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"",
2267
+ "export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"",
2268
+ "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")"",
2269
+ "export HOST="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2270
+ "export ROOT_URL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2271
+ "export HOST_INTERNAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2272
+ "export HOST_CANONICAL="$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2273
+ "export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"",
2274
+ "export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"",
2275
+ "export DEPLOY_CLOUD_RUN_REGION="asia-east1"",
2276
+ "export GCLOUD_DEPLOY_credentialsKey="$CL_stage_www_GCLOUD_DEPLOY_credentialsKey"",
2277
+ "export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix"",
2278
+ "export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOST\\",\\"ROOT_URL\\",\\"HOST_INTERNAL\\",\\"HOST_CANONICAL\\",\\"ROOT_URL_INTERNAL\\",\\"DEPLOY_CLOUD_RUN_PROJECT_ID\\",\\"DEPLOY_CLOUD_RUN_REGION\\",\\"GCLOUD_DEPLOY_credentialsKey\\",\\"GCLOUD_RUN_canonicalHostSuffix\\"]"",
2279
+ "export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"",
2280
+ "export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www"",
2281
+ "export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/www"",
2282
+ "export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"",
2283
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
2284
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2285
+ "echo -e "\\e[0Ksection_start:$(date +%s):prepare[collapsed=true]\\r\\e[0KPrepare..."",
2286
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")",
2287
+ "export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")",
2288
+ "echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"",
2289
+ "echo -e "\\e[0Ksection_end:$(date +%s):prepare\\r\\e[0K"",
2290
+ "echo -e "\\e[0Ksection_start:$(date +%s):writeenvvars[collapsed=true]\\r\\e[0KWrite env vars to file"",
2291
+ "cat > ____envvars.yaml <<EOF
2292
+ ENV_SHORT: |-
2293
+ stage
2294
+ APP_DIR: |-
2295
+ www
2296
+ ENV_TYPE: |-
2297
+ stage
2298
+ BUILD_INFO_BUILD_ID: |-
2299
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed 's/^/ /')
2300
+ BUILD_INFO_BUILD_TIME: |-
2301
+ $(printf %s "$CI_JOB_STARTED_AT" | sed 's/^/ /')
2302
+ BUILD_INFO_CURRENT_VERSION: |-
2303
+ $(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 's/^/ /')
2304
+ HOST: |-
2305
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2306
+ ROOT_URL: |-
2307
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2308
+ HOST_INTERNAL: |-
2309
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2310
+ HOST_CANONICAL: |-
2311
+ $(printf %s "$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2312
+ ROOT_URL_INTERNAL: |-
2313
+ $(printf %s "https://$(printf %s "pan-test-app-stage-www-$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed 's/^/ /')
2314
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2315
+ asdf
2316
+ DEPLOY_CLOUD_RUN_REGION: |-
2317
+ asia-east1
2318
+ GCLOUD_RUN_canonicalHostSuffix: |-
2319
+ $(printf %s "$CL_stage_www_GCLOUD_RUN_canonicalHostSuffix" | sed 's/^/ /')
2320
+ _ALL_ENV_VAR_KEYS: |-
2321
+ ["ENV_SHORT","APP_DIR","ENV_TYPE","BUILD_INFO_BUILD_ID","BUILD_INFO_BUILD_TIME","BUILD_INFO_CURRENT_VERSION","HOST","ROOT_URL","HOST_INTERNAL","HOST_CANONICAL","ROOT_URL_INTERNAL","DEPLOY_CLOUD_RUN_PROJECT_ID","DEPLOY_CLOUD_RUN_REGION","GCLOUD_DEPLOY_credentialsKey","GCLOUD_RUN_canonicalHostSuffix"]
2322
+
2323
+ EOF
2324
+ ",
2325
+ "echo -e "\\e[0Ksection_end:$(date +%s):writeenvvars\\r\\e[0K"",
2326
+ "echo -e "\\e[0Ksection_start:$(date +%s):deploy[collapsed=true]\\r\\e[0KDeploy to cloud run"",
2327
+ "gcloud run deploy pan-test-app-stage-www --command="" --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=custom,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",
2328
+ "echo -e "\\e[0Ksection_end:$(date +%s):deploy\\r\\e[0K"",
2329
+ "echo -e "\\e[0Ksection_start:$(date +%s):cleanup[collapsed=true]\\r\\e[0KCleanup"",
2330
+ "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",
2331
+ "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",
2332
+ "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",
2333
+ "echo -e "\\e[0Ksection_end:$(date +%s):cleanup\\r\\e[0K"",
2334
+ "echo 'Uploading SBOM to Dependency Track'",
2335
+ "/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",
2336
+ "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",
2337
+ ],
2338
+ "stage": "deploy stage",
2339
+ "variables": {
2340
+ "KUBERNETES_CPU_REQUEST": "0.22",
2341
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2342
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2343
+ },
2344
+ },
2345
+ "www 🛑 Stop ⚠️ | prod ": {
2346
+ "allow_failure": true,
2347
+ "artifacts": {
2348
+ "reports": {
2349
+ "dotenv": "gitlab_environment.env",
2350
+ },
2351
+ },
2352
+ "environment": {
2353
+ "action": "stop",
2354
+ "name": "prod/www",
2355
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2356
+ },
2357
+ "image": "path/to/docker/gcloud:the-version",
2358
+ "interruptible": true,
2359
+ "needs": [],
2360
+ "retry": {
2361
+ "max": 2,
2362
+ "when": [
2363
+ "runner_system_failure",
2364
+ "stuck_or_timeout_failure",
2365
+ ],
2366
+ },
2367
+ "rules": [
2368
+ {
2369
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2370
+ "when": "on_success",
2371
+ },
2372
+ {
2373
+ "when": "manual",
2374
+ },
2375
+ ],
2376
+ "script": [
2377
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2378
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
2379
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2380
+ "set +e",
2381
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_prod_www_GCLOUD_DEPLOY_credentialsKey")",
2382
+ "gcloud run services delete pan-test-app-prod-www --project=asdf --region=asia-east1",
2383
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/www --quiet --delete-tags",
2384
+ "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",
2385
+ "echo 'Disabling component in Dependency Track'",
2386
+ "/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",
2387
+ "set -e",
2388
+ "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",
2389
+ ],
2390
+ "stage": "stop prod",
2391
+ "variables": {
2392
+ "GIT_STRATEGY": "none",
2393
+ "KUBERNETES_CPU_REQUEST": "0.22",
2394
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2395
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2396
+ },
2397
+ },
2398
+ "www 🛑 Stop ⚠️ | stage ": {
2399
+ "allow_failure": true,
2400
+ "artifacts": {
2401
+ "reports": {
2402
+ "dotenv": "gitlab_environment.env",
2403
+ },
2404
+ },
2405
+ "environment": {
2406
+ "action": "stop",
2407
+ "name": "stage/www",
2408
+ "url": "$CL_GITLAB_ENVIRONMENT_URL",
2409
+ },
2410
+ "image": "path/to/docker/gcloud:the-version",
2411
+ "interruptible": true,
2412
+ "needs": [],
2413
+ "retry": {
2414
+ "max": 2,
2415
+ "when": [
2416
+ "runner_system_failure",
2417
+ "stuck_or_timeout_failure",
2418
+ ],
2419
+ },
2420
+ "rules": [
2421
+ {
2422
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/",
2423
+ "when": "on_success",
2424
+ },
2425
+ {
2426
+ "when": "manual",
2427
+ },
2428
+ ],
2429
+ "script": [
2430
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2431
+ "export CLOUDSDK_CORE_DISABLE_PROMPTS="1"",
2432
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2433
+ "set +e",
2434
+ "gcloud auth activate-service-account --key-file=<(echo "$CL_stage_www_GCLOUD_DEPLOY_credentialsKey")",
2435
+ "gcloud run services delete pan-test-app-stage-www --project=asdf --region=asia-east1",
2436
+ "gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/www --quiet --delete-tags",
2437
+ "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",
2438
+ "echo 'Disabling component in Dependency Track'",
2439
+ "/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",
2440
+ "set -e",
2441
+ "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",
2442
+ ],
2443
+ "stage": "stop stage",
2444
+ "variables": {
2445
+ "GIT_STRATEGY": "none",
2446
+ "KUBERNETES_CPU_REQUEST": "0.22",
2447
+ "KUBERNETES_MEMORY_LIMIT": "400Mi",
2448
+ "KUBERNETES_MEMORY_REQUEST": "200Mi",
2449
+ },
2450
+ },
2451
+ "www 🧾 sbom | prod ": {
2452
+ "allow_failure": true,
2453
+ "artifacts": {
2454
+ "paths": [
2455
+ "__sbom.json",
2456
+ ],
2457
+ },
2458
+ "image": "aquasec/trivy:0.38.3",
2459
+ "interruptible": true,
2460
+ "needs": [],
2461
+ "retry": {
2462
+ "max": 2,
2463
+ "when": [
2464
+ "runner_system_failure",
2465
+ "stuck_or_timeout_failure",
2466
+ ],
2467
+ },
2468
+ "script": [
2469
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2470
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2471
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" www",
2472
+ ],
2473
+ "stage": "build",
2474
+ "variables": {},
2475
+ },
2476
+ "www 🧾 sbom | stage ": {
2477
+ "allow_failure": true,
2478
+ "artifacts": {
2479
+ "paths": [
2480
+ "__sbom.json",
2481
+ ],
2482
+ },
2483
+ "image": "aquasec/trivy:0.38.3",
2484
+ "interruptible": true,
2485
+ "needs": [],
2486
+ "retry": {
2487
+ "max": 2,
2488
+ "when": [
2489
+ "runner_system_failure",
2490
+ "stuck_or_timeout_failure",
2491
+ ],
2492
+ },
2493
+ "script": [
2494
+ "echo -e "\\e[0Ksection_start:$(date +%s):injectvars[collapsed=true]\\r\\e[0KInjecting variables"",
2495
+ "echo -e "\\e[0Ksection_end:$(date +%s):injectvars\\r\\e[0K"",
2496
+ "trivy fs --quiet --format cyclonedx --output "__sbom.json" www",
2497
+ ],
2498
+ "stage": "build",
2499
+ "variables": {},
2500
+ },
2501
+ },
2502
+ "stages": [
2503
+ "setup",
2504
+ "setup dev",
2505
+ "setup review",
2506
+ "setup stage",
2507
+ "setup prod",
2508
+ "test",
2509
+ "test dev",
2510
+ "test review",
2511
+ "test stage",
2512
+ "test prod",
2513
+ "build",
2514
+ "build dev",
2515
+ "build review",
2516
+ "build stage",
2517
+ "build prod",
2518
+ "deploy",
2519
+ "deploy dev",
2520
+ "deploy review",
2521
+ "deploy stage",
2522
+ "deploy prod",
2523
+ "verify",
2524
+ "verify dev",
2525
+ "verify review",
2526
+ "verify stage",
2527
+ "verify prod",
2528
+ "rollback",
2529
+ "rollback dev",
2530
+ "rollback review",
2531
+ "rollback stage",
2532
+ "rollback prod",
2533
+ "stop",
2534
+ "stop dev",
2535
+ "stop review",
2536
+ "stop stage",
2537
+ "stop prod",
2538
+ ],
2539
+ "variables": {
2540
+ "ARTIFACT_COMPRESSION_LEVEL": "fast",
2541
+ "CACHE_COMPRESSION_LEVEL": "fast",
2542
+ "FF_USE_FASTZIP": "true",
2543
+ "GIT_DEPTH": "1",
2544
+ "TRANSFER_METER_FREQUENCY": "5s",
2545
+ },
2546
+ "workflow": {
2547
+ "rules": [
2548
+ {
2549
+ "if": "$CI_COMMIT_TAG",
2550
+ },
2551
+ {
2552
+ "if": "$CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/",
2553
+ "when": "never",
2554
+ },
2555
+ {
2556
+ "if": "$CI_PIPELINE_SOURCE == "schedule"",
2557
+ "when": "never",
2558
+ },
2559
+ {
2560
+ "if": "$CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/",
2561
+ },
2562
+ {
2563
+ "if": "$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH",
2564
+ },
2565
+ {
2566
+ "if": "$CI_MERGE_REQUEST_ID",
2567
+ },
2568
+ ],
2569
+ },
2570
+ },
2571
+ }
2572
+ `;