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

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