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

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