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