@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,1402 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for cloud-run-with-worker 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
+ api ๐Ÿ›ก 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="api"
88
+ - collapseable_section_end "injectvars"
89
+ - cd api
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
+ api ๐Ÿ‘ฎ 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="api"
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 api
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: api-yarn
128
+ policy: pull-push
129
+ paths:
130
+ - api/.yarn
131
+ - key: api-node-modules
132
+ policy: pull-push
133
+ paths:
134
+ - api/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
+ api ๐Ÿงช 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="api"
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 api
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: api-yarn
167
+ policy: pull-push
168
+ paths:
169
+ - api/.yarn
170
+ - key: api-node-modules
171
+ policy: pull-push
172
+ paths:
173
+ - api/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
+ 'api ๐Ÿ”จ 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
+ - export ENV_SHORT="dev"
190
+ - export APP_DIR="api"
191
+ - export ENV_TYPE="dev"
192
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
193
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
194
+ - 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")"
195
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
196
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
197
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
198
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
199
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
200
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
201
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
202
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
203
+ - 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\\"]"
204
+ - collapseable_section_end "injectvars"
205
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
206
+ - |-
207
+ cat <<EOF > api/.env
208
+ ENV_SHORT=dev
209
+ APP_DIR=api
210
+ ENV_TYPE=dev
211
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
212
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
213
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
214
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
215
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
216
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
217
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
218
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
219
+ _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"]
220
+ EOF
221
+ - collapseable_section_end "write-dotenv-api"
222
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
223
+ - collapseable_section_start "nodeinstall" "Ensure node version"
224
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
225
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
226
+ - collapseable_section_end "nodeinstall"
227
+ - cd api
228
+ - collapseable_section_start "nodeinstall" "Ensure node version"
229
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
230
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
231
+ - collapseable_section_end "nodeinstall"
232
+ - collapseable_section_start "yarninstall" "Yarn install"
233
+ - yarn install --immutable
234
+ - collapseable_section_end "yarninstall"
235
+ - yarn build
236
+ cache:
237
+ - key: api-yarn
238
+ policy: pull-push
239
+ paths:
240
+ - api/.yarn
241
+ - key: api-node-modules
242
+ policy: pull-push
243
+ paths:
244
+ - api/node_modules
245
+ artifacts:
246
+ paths:
247
+ - api/__build_info.json
248
+ - api/.next
249
+ - api/dist
250
+ exclude:
251
+ - api/.env
252
+ expire_in: 1 day
253
+ when: always
254
+ reports: {}
255
+ rules:
256
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
257
+ needs: []
258
+ retry: *a1
259
+ interruptible: true
260
+ 'api ๐Ÿ”จ docker | dev ':
261
+ stage: build
262
+ image: path/to/docker/docker-build:the-version
263
+ services:
264
+ - name: docker:24.0.6-dind
265
+ command:
266
+ - --tls=false
267
+ - --registry-mirror=https://mirror.gcr.io
268
+ variables:
269
+ DOCKER_HOST: tcp://docker:2375
270
+ DOCKER_TLS_CERTDIR: ''
271
+ DOCKER_DRIVER: overlay2
272
+ DOCKER_BUILDKIT: '1'
273
+ KUBERNETES_CPU_REQUEST: '0.45'
274
+ KUBERNETES_MEMORY_REQUEST: 1Gi
275
+ KUBERNETES_MEMORY_LIMIT: 2Gi
276
+ script:
277
+ - collapseable_section_start "injectvars" "Injecting variables"
278
+ - export APP_DIR="api"
279
+ - export DOCKER_BUILD_CONTEXT="."
280
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
281
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
282
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
283
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
284
+ - |-
285
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
286
+ RUN yarn plugin import workspace-tools
287
+ RUN yarn workspaces focus --production && yarn rebuild"
288
+ - |-
289
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
290
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
291
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
292
+ COPY --chown=node:node .yarn /app/.yarn"
293
+ - collapseable_section_end "injectvars"
294
+ - ensureNodeDockerfile
295
+ - collapseable_section_start "docker-login" "Docker Login"
296
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
297
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
298
+ - collapseable_section_end "docker-login"
299
+ - collapseable_section_start "docker-build" "Docker build"
300
+ - 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
301
+ - collapseable_section_end "docker-build"
302
+ - collapseable_section_start "docker-push" "Docker push and tag"
303
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
304
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
305
+ - docker push $DOCKER_CACHE_IMAGE
306
+ - collapseable_section_end "docker-push"
307
+ cache:
308
+ - key: api-yarn
309
+ policy: pull
310
+ paths:
311
+ - api/.yarn
312
+ rules:
313
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
314
+ needs:
315
+ - 'api ๐Ÿ”จ app | dev '
316
+ retry: *a1
317
+ interruptible: true
318
+ 'api ๐Ÿงพ sbom | dev ':
319
+ stage: build
320
+ image:
321
+ name: aquasec/trivy:0.58.2
322
+ entrypoint:
323
+ - ''
324
+ variables: {}
325
+ script:
326
+ - collapseable_section_start "injectvars" "Injecting variables"
327
+ - collapseable_section_end "injectvars"
328
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
329
+ artifacts:
330
+ paths:
331
+ - __sbom.json
332
+ rules:
333
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
334
+ needs: []
335
+ retry: *a1
336
+ interruptible: true
337
+ allow_failure: true
338
+ 'api ๐Ÿš€ Deploy | dev ':
339
+ stage: deploy dev
340
+ image: path/to/docker/gcloud:the-version
341
+ variables:
342
+ KUBERNETES_CPU_REQUEST: '0.22'
343
+ KUBERNETES_MEMORY_REQUEST: 200Mi
344
+ KUBERNETES_MEMORY_LIMIT: 400Mi
345
+ script:
346
+ - collapseable_section_start "injectvars" "Injecting variables"
347
+ - export ENV_SHORT="dev"
348
+ - export APP_DIR="api"
349
+ - export ENV_TYPE="dev"
350
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
351
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
352
+ - 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")"
353
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
354
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
355
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
356
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
357
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
358
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
359
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
360
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
361
+ - 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\\"]"
362
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
363
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api"
364
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
365
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
366
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
367
+ - collapseable_section_end "injectvars"
368
+ - collapseable_section_start "prepare" "Prepare..."
369
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
370
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
371
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
372
+ - collapseable_section_end "prepare"
373
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
374
+ - |
375
+ cat > ____envvars.yaml <<EOF
376
+ ENV_SHORT: |-
377
+ dev
378
+ APP_DIR: |-
379
+ api
380
+ ENV_TYPE: |-
381
+ dev
382
+ BUILD_INFO_BUILD_ID: |-
383
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
384
+ BUILD_INFO_BUILD_TIME: |-
385
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
386
+ BUILD_INFO_CURRENT_VERSION: |-
387
+ $(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/^/ /')
388
+ HOSTNAME: |-
389
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
390
+ ROOT_URL: |-
391
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
392
+ HOSTNAME_INTERNAL: |-
393
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
394
+ ROOT_URL_INTERNAL: |-
395
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
396
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
397
+ google-project-id
398
+ DEPLOY_CLOUD_RUN_REGION: |-
399
+ europe-west6
400
+ GCLOUD_RUN_canonicalHostSuffix: |-
401
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
402
+ _ALL_ENV_VAR_KEYS: |-
403
+ ["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"]
404
+
405
+ EOF
406
+ - collapseable_section_end "writeenvvars"
407
+ - collapseable_section_start "deploy" "Deploy to cloud run"
408
+ - 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
409
+ - gcloud run deploy pan-test-app-dev-api-worker --command="yarn,start:worker" --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-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
410
+ - collapseable_section_end "deploy"
411
+ - collapseable_section_start "cleanup" "Cleanup"
412
+ - 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
413
+ - 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
414
+ - 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
415
+ - collapseable_section_end "cleanup"
416
+ - echo 'Uploading SBOM to Dependency Track'
417
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
418
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
419
+ environment:
420
+ name: dev/api
421
+ url: $CL_GITLAB_ENVIRONMENT_URL
422
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | dev '
423
+ auto_stop_in: 4 weeks
424
+ artifacts:
425
+ reports:
426
+ dotenv: gitlab_environment.env
427
+ rules:
428
+ - when: on_success
429
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
430
+ needs:
431
+ - job: api ๐Ÿ‘ฎ lint
432
+ artifacts: false
433
+ - job: 'api ๐Ÿ”จ app | dev '
434
+ artifacts: false
435
+ - job: 'api ๐Ÿ”จ docker | dev '
436
+ artifacts: false
437
+ - job: api ๐Ÿงช test
438
+ artifacts: false
439
+ - job: 'api ๐Ÿงพ sbom | dev '
440
+ artifacts: true
441
+ - job: api ๐Ÿ›ก audit
442
+ artifacts: false
443
+ retry: *a1
444
+ interruptible: true
445
+ allow_failure: false
446
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | dev ':
447
+ stage: stop dev
448
+ image: path/to/docker/gcloud:the-version
449
+ variables:
450
+ KUBERNETES_CPU_REQUEST: '0.22'
451
+ KUBERNETES_MEMORY_REQUEST: 200Mi
452
+ KUBERNETES_MEMORY_LIMIT: 400Mi
453
+ GIT_STRATEGY: none
454
+ script:
455
+ - collapseable_section_start "injectvars" "Injecting variables"
456
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
457
+ - collapseable_section_end "injectvars"
458
+ - set +e
459
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
460
+ - gcloud run services delete pan-test-app-dev-api --project=google-project-id --region=europe-west6
461
+ - gcloud run services delete pan-test-app-dev-api-worker --project=google-project-id --region=europe-west6
462
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags
463
+ - 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
464
+ - echo 'Disabling component in Dependency Track'
465
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
466
+ - set -e
467
+ environment:
468
+ name: dev/api
469
+ action: stop
470
+ rules:
471
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
472
+ when: on_success
473
+ - when: manual
474
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
475
+ needs: []
476
+ retry: *a1
477
+ interruptible: true
478
+ allow_failure: true
479
+ 'api ๐Ÿ”จ app | review ':
480
+ stage: build
481
+ image: path/to/docker/jobs-default:the-version
482
+ variables:
483
+ KUBERNETES_CPU_REQUEST: '0.45'
484
+ KUBERNETES_MEMORY_REQUEST: 1Gi
485
+ KUBERNETES_MEMORY_LIMIT: 4Gi
486
+ script:
487
+ - collapseable_section_start "injectvars" "Injecting variables"
488
+ - export ENV_SHORT="review"
489
+ - export APP_DIR="api"
490
+ - export ENV_TYPE="review"
491
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
492
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
493
+ - 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")"
494
+ - 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)}')"
495
+ - 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)}')"
496
+ - 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)}')"
497
+ - 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)}')"
498
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
499
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
500
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
501
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
502
+ - 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\\"]"
503
+ - collapseable_section_end "injectvars"
504
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
505
+ - |-
506
+ cat <<EOF > api/.env
507
+ ENV_SHORT=review
508
+ APP_DIR=api
509
+ ENV_TYPE=review
510
+ 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)
511
+ 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)
512
+ 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)
513
+ 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)
514
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
515
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
516
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
517
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
518
+ _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"]
519
+ EOF
520
+ - collapseable_section_end "write-dotenv-api"
521
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
522
+ - collapseable_section_start "nodeinstall" "Ensure node version"
523
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
524
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
525
+ - collapseable_section_end "nodeinstall"
526
+ - cd api
527
+ - collapseable_section_start "nodeinstall" "Ensure node version"
528
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
529
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
530
+ - collapseable_section_end "nodeinstall"
531
+ - collapseable_section_start "yarninstall" "Yarn install"
532
+ - yarn install --immutable
533
+ - collapseable_section_end "yarninstall"
534
+ - yarn build
535
+ cache:
536
+ - key: api-yarn
537
+ policy: pull-push
538
+ paths:
539
+ - api/.yarn
540
+ - key: api-node-modules
541
+ policy: pull-push
542
+ paths:
543
+ - api/node_modules
544
+ artifacts:
545
+ paths:
546
+ - api/__build_info.json
547
+ - api/.next
548
+ - api/dist
549
+ exclude:
550
+ - api/.env
551
+ expire_in: 1 day
552
+ when: always
553
+ reports: {}
554
+ rules:
555
+ - if: $CI_MERGE_REQUEST_ID
556
+ needs: []
557
+ retry: *a1
558
+ interruptible: true
559
+ 'api ๐Ÿ”จ docker | review ':
560
+ stage: build
561
+ image: path/to/docker/docker-build:the-version
562
+ services:
563
+ - name: docker:24.0.6-dind
564
+ command:
565
+ - --tls=false
566
+ - --registry-mirror=https://mirror.gcr.io
567
+ variables:
568
+ DOCKER_HOST: tcp://docker:2375
569
+ DOCKER_TLS_CERTDIR: ''
570
+ DOCKER_DRIVER: overlay2
571
+ DOCKER_BUILDKIT: '1'
572
+ KUBERNETES_CPU_REQUEST: '0.45'
573
+ KUBERNETES_MEMORY_REQUEST: 1Gi
574
+ KUBERNETES_MEMORY_LIMIT: 2Gi
575
+ script:
576
+ - collapseable_section_start "injectvars" "Injecting variables"
577
+ - export APP_DIR="api"
578
+ - export DOCKER_BUILD_CONTEXT="."
579
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
580
+ - 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"; })"
581
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
582
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
583
+ - |-
584
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
585
+ RUN yarn plugin import workspace-tools
586
+ RUN yarn workspaces focus --production && yarn rebuild"
587
+ - |-
588
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
589
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
590
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
591
+ COPY --chown=node:node .yarn /app/.yarn"
592
+ - collapseable_section_end "injectvars"
593
+ - ensureNodeDockerfile
594
+ - collapseable_section_start "docker-login" "Docker Login"
595
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
596
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
597
+ - collapseable_section_end "docker-login"
598
+ - collapseable_section_start "docker-build" "Docker build"
599
+ - 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
600
+ - collapseable_section_end "docker-build"
601
+ - collapseable_section_start "docker-push" "Docker push and tag"
602
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
603
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
604
+ - docker push $DOCKER_CACHE_IMAGE
605
+ - collapseable_section_end "docker-push"
606
+ cache:
607
+ - key: api-yarn
608
+ policy: pull
609
+ paths:
610
+ - api/.yarn
611
+ rules:
612
+ - if: $CI_MERGE_REQUEST_ID
613
+ needs:
614
+ - 'api ๐Ÿ”จ app | review '
615
+ retry: *a1
616
+ interruptible: true
617
+ 'api ๐Ÿงพ sbom | review ':
618
+ stage: build
619
+ image:
620
+ name: aquasec/trivy:0.58.2
621
+ entrypoint:
622
+ - ''
623
+ variables: {}
624
+ script:
625
+ - collapseable_section_start "injectvars" "Injecting variables"
626
+ - collapseable_section_end "injectvars"
627
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
628
+ artifacts:
629
+ paths:
630
+ - __sbom.json
631
+ rules:
632
+ - if: $CI_MERGE_REQUEST_ID
633
+ needs: []
634
+ retry: *a1
635
+ interruptible: true
636
+ allow_failure: true
637
+ 'api ๐Ÿš€ Deploy | review ':
638
+ stage: deploy review
639
+ image: path/to/docker/gcloud:the-version
640
+ variables:
641
+ KUBERNETES_CPU_REQUEST: '0.22'
642
+ KUBERNETES_MEMORY_REQUEST: 200Mi
643
+ KUBERNETES_MEMORY_LIMIT: 400Mi
644
+ script:
645
+ - collapseable_section_start "injectvars" "Injecting variables"
646
+ - export ENV_SHORT="review"
647
+ - export APP_DIR="api"
648
+ - export ENV_TYPE="review"
649
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
650
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
651
+ - 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")"
652
+ - 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)}')"
653
+ - 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)}')"
654
+ - 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)}')"
655
+ - 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)}')"
656
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
657
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
658
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
659
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
660
+ - 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\\"]"
661
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
662
+ - 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"; })"
663
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
664
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
665
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
666
+ - collapseable_section_end "injectvars"
667
+ - collapseable_section_start "prepare" "Prepare..."
668
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
669
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
670
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
671
+ - collapseable_section_end "prepare"
672
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
673
+ - |
674
+ cat > ____envvars.yaml <<EOF
675
+ ENV_SHORT: |-
676
+ review
677
+ APP_DIR: |-
678
+ api
679
+ ENV_TYPE: |-
680
+ review
681
+ BUILD_INFO_BUILD_ID: |-
682
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
683
+ BUILD_INFO_BUILD_TIME: |-
684
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
685
+ BUILD_INFO_CURRENT_VERSION: |-
686
+ $(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/^/ /')
687
+ HOSTNAME: |-
688
+ $(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/^/ /')
689
+ ROOT_URL: |-
690
+ $(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/^/ /')
691
+ HOSTNAME_INTERNAL: |-
692
+ $(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/^/ /')
693
+ ROOT_URL_INTERNAL: |-
694
+ $(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/^/ /')
695
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
696
+ google-project-id
697
+ DEPLOY_CLOUD_RUN_REGION: |-
698
+ europe-west6
699
+ GCLOUD_RUN_canonicalHostSuffix: |-
700
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
701
+ _ALL_ENV_VAR_KEYS: |-
702
+ ["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"]
703
+
704
+ EOF
705
+ - collapseable_section_end "writeenvvars"
706
+ - collapseable_section_start "deploy" "Deploy to cloud run"
707
+ - 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
708
+ - 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)}')-worker --command="yarn,start:worker" --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)}')-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
709
+ - collapseable_section_end "deploy"
710
+ - collapseable_section_start "cleanup" "Cleanup"
711
+ - 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
712
+ - 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
713
+ - 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
714
+ - set +e
715
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
716
+ - set -e
717
+ - collapseable_section_end "cleanup"
718
+ - echo 'Uploading SBOM to Dependency Track'
719
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
720
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
721
+ environment:
722
+ name: review/$CI_COMMIT_REF_NAME/api
723
+ url: $CL_GITLAB_ENVIRONMENT_URL
724
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | review '
725
+ auto_stop_in: 1 week
726
+ artifacts:
727
+ reports:
728
+ dotenv: gitlab_environment.env
729
+ rules:
730
+ - when: on_success
731
+ if: $CI_MERGE_REQUEST_ID
732
+ needs:
733
+ - job: api ๐Ÿ‘ฎ lint
734
+ artifacts: false
735
+ - job: 'api ๐Ÿ”จ app | review '
736
+ artifacts: false
737
+ - job: 'api ๐Ÿ”จ docker | review '
738
+ artifacts: false
739
+ - job: api ๐Ÿงช test
740
+ artifacts: false
741
+ - job: 'api ๐Ÿงพ sbom | review '
742
+ artifacts: true
743
+ - job: api ๐Ÿ›ก audit
744
+ artifacts: false
745
+ retry: *a1
746
+ interruptible: true
747
+ allow_failure: false
748
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | review ':
749
+ stage: stop review
750
+ image: path/to/docker/gcloud:the-version
751
+ variables:
752
+ KUBERNETES_CPU_REQUEST: '0.22'
753
+ KUBERNETES_MEMORY_REQUEST: 200Mi
754
+ KUBERNETES_MEMORY_LIMIT: 400Mi
755
+ GIT_STRATEGY: none
756
+ script:
757
+ - collapseable_section_start "injectvars" "Injecting variables"
758
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
759
+ - collapseable_section_end "injectvars"
760
+ - set +e
761
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
762
+ - 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
763
+ - 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)}')-worker --project=google-project-id --region=europe-west6
764
+ - 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
765
+ - 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
766
+ - set +e
767
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
768
+ - set -e
769
+ - echo 'Disabling component in Dependency Track'
770
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
771
+ - set -e
772
+ environment:
773
+ name: review/$CI_COMMIT_REF_NAME/api
774
+ action: stop
775
+ rules:
776
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
777
+ when: on_success
778
+ - when: manual
779
+ if: $CI_MERGE_REQUEST_ID
780
+ needs: []
781
+ retry: *a1
782
+ interruptible: true
783
+ allow_failure: true
784
+ 'api ๐Ÿ”จ app | stage ':
785
+ stage: build
786
+ image: path/to/docker/jobs-default:the-version
787
+ variables:
788
+ KUBERNETES_CPU_REQUEST: '0.45'
789
+ KUBERNETES_MEMORY_REQUEST: 1Gi
790
+ KUBERNETES_MEMORY_LIMIT: 4Gi
791
+ script:
792
+ - collapseable_section_start "injectvars" "Injecting variables"
793
+ - export ENV_SHORT="stage"
794
+ - export APP_DIR="api"
795
+ - export ENV_TYPE="stage"
796
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
797
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
798
+ - 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")"
799
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
800
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
801
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
802
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
803
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
804
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
805
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
806
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
807
+ - 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\\"]"
808
+ - collapseable_section_end "injectvars"
809
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
810
+ - |-
811
+ cat <<EOF > api/.env
812
+ ENV_SHORT=stage
813
+ APP_DIR=api
814
+ ENV_TYPE=stage
815
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
816
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
817
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
818
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
819
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
820
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
821
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
822
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
823
+ _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"]
824
+ EOF
825
+ - collapseable_section_end "write-dotenv-api"
826
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
827
+ - collapseable_section_start "nodeinstall" "Ensure node version"
828
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
829
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
830
+ - collapseable_section_end "nodeinstall"
831
+ - cd api
832
+ - collapseable_section_start "nodeinstall" "Ensure node version"
833
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
834
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
835
+ - collapseable_section_end "nodeinstall"
836
+ - collapseable_section_start "yarninstall" "Yarn install"
837
+ - yarn install --immutable
838
+ - collapseable_section_end "yarninstall"
839
+ - yarn build
840
+ cache:
841
+ - key: api-yarn
842
+ policy: pull-push
843
+ paths:
844
+ - api/.yarn
845
+ - key: api-node-modules
846
+ policy: pull-push
847
+ paths:
848
+ - api/node_modules
849
+ artifacts:
850
+ paths:
851
+ - api/__build_info.json
852
+ - api/.next
853
+ - api/dist
854
+ exclude:
855
+ - api/.env
856
+ expire_in: 1 day
857
+ when: always
858
+ reports: {}
859
+ rules:
860
+ - if: $CI_COMMIT_TAG
861
+ needs: []
862
+ retry: *a1
863
+ interruptible: true
864
+ 'api ๐Ÿ”จ docker | stage ':
865
+ stage: build
866
+ image: path/to/docker/docker-build:the-version
867
+ services:
868
+ - name: docker:24.0.6-dind
869
+ command:
870
+ - --tls=false
871
+ - --registry-mirror=https://mirror.gcr.io
872
+ variables:
873
+ DOCKER_HOST: tcp://docker:2375
874
+ DOCKER_TLS_CERTDIR: ''
875
+ DOCKER_DRIVER: overlay2
876
+ DOCKER_BUILDKIT: '1'
877
+ KUBERNETES_CPU_REQUEST: '0.45'
878
+ KUBERNETES_MEMORY_REQUEST: 1Gi
879
+ KUBERNETES_MEMORY_LIMIT: 2Gi
880
+ script:
881
+ - collapseable_section_start "injectvars" "Injecting variables"
882
+ - export APP_DIR="api"
883
+ - export DOCKER_BUILD_CONTEXT="."
884
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
885
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
886
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
887
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
888
+ - |-
889
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
890
+ RUN yarn plugin import workspace-tools
891
+ RUN yarn workspaces focus --production && yarn rebuild"
892
+ - |-
893
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
894
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
895
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
896
+ COPY --chown=node:node .yarn /app/.yarn"
897
+ - collapseable_section_end "injectvars"
898
+ - ensureNodeDockerfile
899
+ - collapseable_section_start "docker-login" "Docker Login"
900
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
901
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
902
+ - collapseable_section_end "docker-login"
903
+ - collapseable_section_start "docker-build" "Docker build"
904
+ - 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
905
+ - collapseable_section_end "docker-build"
906
+ - collapseable_section_start "docker-push" "Docker push and tag"
907
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
908
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
909
+ - docker push $DOCKER_CACHE_IMAGE
910
+ - collapseable_section_end "docker-push"
911
+ cache:
912
+ - key: api-yarn
913
+ policy: pull
914
+ paths:
915
+ - api/.yarn
916
+ rules:
917
+ - if: $CI_COMMIT_TAG
918
+ needs:
919
+ - 'api ๐Ÿ”จ app | stage '
920
+ retry: *a1
921
+ interruptible: true
922
+ 'api ๐Ÿงพ sbom | stage ':
923
+ stage: build
924
+ image:
925
+ name: aquasec/trivy:0.58.2
926
+ entrypoint:
927
+ - ''
928
+ variables: {}
929
+ script:
930
+ - collapseable_section_start "injectvars" "Injecting variables"
931
+ - collapseable_section_end "injectvars"
932
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
933
+ artifacts:
934
+ paths:
935
+ - __sbom.json
936
+ rules:
937
+ - if: $CI_COMMIT_TAG
938
+ needs: []
939
+ retry: *a1
940
+ interruptible: true
941
+ allow_failure: true
942
+ 'api ๐Ÿš€ Deploy | stage ':
943
+ stage: deploy stage
944
+ image: path/to/docker/gcloud:the-version
945
+ variables:
946
+ KUBERNETES_CPU_REQUEST: '0.22'
947
+ KUBERNETES_MEMORY_REQUEST: 200Mi
948
+ KUBERNETES_MEMORY_LIMIT: 400Mi
949
+ script:
950
+ - collapseable_section_start "injectvars" "Injecting variables"
951
+ - export ENV_SHORT="stage"
952
+ - export APP_DIR="api"
953
+ - export ENV_TYPE="stage"
954
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
955
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
956
+ - 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")"
957
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
958
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
959
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
960
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
961
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
962
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
963
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
964
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
965
+ - 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\\"]"
966
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
967
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api"
968
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
969
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
970
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
971
+ - collapseable_section_end "injectvars"
972
+ - collapseable_section_start "prepare" "Prepare..."
973
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
974
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
975
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
976
+ - collapseable_section_end "prepare"
977
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
978
+ - |
979
+ cat > ____envvars.yaml <<EOF
980
+ ENV_SHORT: |-
981
+ stage
982
+ APP_DIR: |-
983
+ api
984
+ ENV_TYPE: |-
985
+ stage
986
+ BUILD_INFO_BUILD_ID: |-
987
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
988
+ BUILD_INFO_BUILD_TIME: |-
989
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
990
+ BUILD_INFO_CURRENT_VERSION: |-
991
+ $(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/^/ /')
992
+ HOSTNAME: |-
993
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
994
+ ROOT_URL: |-
995
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
996
+ HOSTNAME_INTERNAL: |-
997
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
998
+ ROOT_URL_INTERNAL: |-
999
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1000
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1001
+ google-project-id
1002
+ DEPLOY_CLOUD_RUN_REGION: |-
1003
+ europe-west6
1004
+ GCLOUD_RUN_canonicalHostSuffix: |-
1005
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1006
+ _ALL_ENV_VAR_KEYS: |-
1007
+ ["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"]
1008
+
1009
+ EOF
1010
+ - collapseable_section_end "writeenvvars"
1011
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1012
+ - 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
1013
+ - gcloud run deploy pan-test-app-stage-api-worker --command="yarn,start:worker" --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-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1014
+ - collapseable_section_end "deploy"
1015
+ - collapseable_section_start "cleanup" "Cleanup"
1016
+ - 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
1017
+ - 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
1018
+ - 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
1019
+ - collapseable_section_end "cleanup"
1020
+ - echo 'Uploading SBOM to Dependency Track'
1021
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
1022
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1023
+ environment:
1024
+ name: stage/api
1025
+ url: $CL_GITLAB_ENVIRONMENT_URL
1026
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | stage '
1027
+ artifacts:
1028
+ reports:
1029
+ dotenv: gitlab_environment.env
1030
+ rules:
1031
+ - when: on_success
1032
+ if: $CI_COMMIT_TAG
1033
+ needs:
1034
+ - job: 'api ๐Ÿ”จ app | stage '
1035
+ artifacts: false
1036
+ - job: 'api ๐Ÿ”จ docker | stage '
1037
+ artifacts: false
1038
+ - job: 'api ๐Ÿงพ sbom | stage '
1039
+ artifacts: true
1040
+ retry: *a1
1041
+ interruptible: true
1042
+ allow_failure: false
1043
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | stage ':
1044
+ stage: stop stage
1045
+ image: path/to/docker/gcloud:the-version
1046
+ variables:
1047
+ KUBERNETES_CPU_REQUEST: '0.22'
1048
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1049
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1050
+ GIT_STRATEGY: none
1051
+ script:
1052
+ - collapseable_section_start "injectvars" "Injecting variables"
1053
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1054
+ - collapseable_section_end "injectvars"
1055
+ - set +e
1056
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1057
+ - gcloud run services delete pan-test-app-stage-api --project=google-project-id --region=europe-west6
1058
+ - gcloud run services delete pan-test-app-stage-api-worker --project=google-project-id --region=europe-west6
1059
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags
1060
+ - 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
1061
+ - echo 'Disabling component in Dependency Track'
1062
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
1063
+ - set -e
1064
+ environment:
1065
+ name: stage/api
1066
+ action: stop
1067
+ rules:
1068
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1069
+ when: on_success
1070
+ - when: manual
1071
+ if: $CI_COMMIT_TAG
1072
+ needs: []
1073
+ retry: *a1
1074
+ interruptible: true
1075
+ allow_failure: true
1076
+ 'api ๐Ÿ”จ app | prod ':
1077
+ stage: build
1078
+ image: path/to/docker/jobs-default:the-version
1079
+ variables:
1080
+ KUBERNETES_CPU_REQUEST: '0.45'
1081
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1082
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1083
+ script:
1084
+ - collapseable_section_start "injectvars" "Injecting variables"
1085
+ - export ENV_SHORT="prod"
1086
+ - export APP_DIR="api"
1087
+ - export ENV_TYPE="prod"
1088
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1089
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1090
+ - 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")"
1091
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1092
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1093
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1094
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1095
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1096
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1097
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1098
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1099
+ - 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\\"]"
1100
+ - collapseable_section_end "injectvars"
1101
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
1102
+ - |-
1103
+ cat <<EOF > api/.env
1104
+ ENV_SHORT=prod
1105
+ APP_DIR=api
1106
+ ENV_TYPE=prod
1107
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1108
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1109
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1110
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1111
+ DEPLOY_CLOUD_RUN_PROJECT_ID=google-project-id
1112
+ DEPLOY_CLOUD_RUN_REGION=europe-west6
1113
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1114
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1115
+ _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"]
1116
+ EOF
1117
+ - collapseable_section_end "write-dotenv-api"
1118
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1119
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1120
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1121
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1122
+ - collapseable_section_end "nodeinstall"
1123
+ - cd api
1124
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1125
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1126
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1127
+ - collapseable_section_end "nodeinstall"
1128
+ - collapseable_section_start "yarninstall" "Yarn install"
1129
+ - yarn install --immutable
1130
+ - collapseable_section_end "yarninstall"
1131
+ - yarn build
1132
+ cache:
1133
+ - key: api-yarn
1134
+ policy: pull-push
1135
+ paths:
1136
+ - api/.yarn
1137
+ - key: api-node-modules
1138
+ policy: pull-push
1139
+ paths:
1140
+ - api/node_modules
1141
+ artifacts:
1142
+ paths:
1143
+ - api/__build_info.json
1144
+ - api/.next
1145
+ - api/dist
1146
+ exclude:
1147
+ - api/.env
1148
+ expire_in: 1 day
1149
+ when: always
1150
+ reports: {}
1151
+ rules:
1152
+ - if: $CI_COMMIT_TAG
1153
+ needs: []
1154
+ retry: *a1
1155
+ interruptible: true
1156
+ 'api ๐Ÿ”จ docker | prod ':
1157
+ stage: build
1158
+ image: path/to/docker/docker-build:the-version
1159
+ services:
1160
+ - name: docker:24.0.6-dind
1161
+ command:
1162
+ - --tls=false
1163
+ - --registry-mirror=https://mirror.gcr.io
1164
+ variables:
1165
+ DOCKER_HOST: tcp://docker:2375
1166
+ DOCKER_TLS_CERTDIR: ''
1167
+ DOCKER_DRIVER: overlay2
1168
+ DOCKER_BUILDKIT: '1'
1169
+ KUBERNETES_CPU_REQUEST: '0.45'
1170
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1171
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1172
+ script:
1173
+ - collapseable_section_start "injectvars" "Injecting variables"
1174
+ - export APP_DIR="api"
1175
+ - export DOCKER_BUILD_CONTEXT="."
1176
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1177
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1178
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1179
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1180
+ - |-
1181
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1182
+ RUN yarn plugin import workspace-tools
1183
+ RUN yarn workspaces focus --production && yarn rebuild"
1184
+ - |-
1185
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1186
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1187
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1188
+ COPY --chown=node:node .yarn /app/.yarn"
1189
+ - collapseable_section_end "injectvars"
1190
+ - ensureNodeDockerfile
1191
+ - collapseable_section_start "docker-login" "Docker Login"
1192
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1193
+ - gcloud auth configure-docker europe-west6-docker.pkg.dev
1194
+ - collapseable_section_end "docker-login"
1195
+ - collapseable_section_start "docker-build" "Docker build"
1196
+ - 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
1197
+ - collapseable_section_end "docker-build"
1198
+ - collapseable_section_start "docker-push" "Docker push and tag"
1199
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1200
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1201
+ - docker push $DOCKER_CACHE_IMAGE
1202
+ - collapseable_section_end "docker-push"
1203
+ cache:
1204
+ - key: api-yarn
1205
+ policy: pull
1206
+ paths:
1207
+ - api/.yarn
1208
+ rules:
1209
+ - if: $CI_COMMIT_TAG
1210
+ needs:
1211
+ - 'api ๐Ÿ”จ app | prod '
1212
+ retry: *a1
1213
+ interruptible: true
1214
+ 'api ๐Ÿงพ sbom | prod ':
1215
+ stage: build
1216
+ image:
1217
+ name: aquasec/trivy:0.58.2
1218
+ entrypoint:
1219
+ - ''
1220
+ variables: {}
1221
+ script:
1222
+ - collapseable_section_start "injectvars" "Injecting variables"
1223
+ - collapseable_section_end "injectvars"
1224
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1225
+ artifacts:
1226
+ paths:
1227
+ - __sbom.json
1228
+ rules:
1229
+ - if: $CI_COMMIT_TAG
1230
+ needs: []
1231
+ retry: *a1
1232
+ interruptible: true
1233
+ allow_failure: true
1234
+ 'api ๐Ÿš€ Deploy | prod ':
1235
+ stage: deploy prod
1236
+ image: path/to/docker/gcloud:the-version
1237
+ variables:
1238
+ KUBERNETES_CPU_REQUEST: '0.22'
1239
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1240
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1241
+ script:
1242
+ - collapseable_section_start "injectvars" "Injecting variables"
1243
+ - export ENV_SHORT="prod"
1244
+ - export APP_DIR="api"
1245
+ - export ENV_TYPE="prod"
1246
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1247
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1248
+ - 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")"
1249
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1250
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1251
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1252
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1253
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="google-project-id"
1254
+ - export DEPLOY_CLOUD_RUN_REGION="europe-west6"
1255
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1256
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1257
+ - 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\\"]"
1258
+ - export DOCKER_REGISTRY="europe-west6-docker.pkg.dev"
1259
+ - export DOCKER_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api"
1260
+ - export DOCKER_CACHE_IMAGE="europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/caches/api"
1261
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1262
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1263
+ - collapseable_section_end "injectvars"
1264
+ - collapseable_section_start "prepare" "Prepare..."
1265
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1266
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe google-project-id --format="value(projectNumber)")
1267
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1268
+ - collapseable_section_end "prepare"
1269
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1270
+ - |
1271
+ cat > ____envvars.yaml <<EOF
1272
+ ENV_SHORT: |-
1273
+ prod
1274
+ APP_DIR: |-
1275
+ api
1276
+ ENV_TYPE: |-
1277
+ prod
1278
+ BUILD_INFO_BUILD_ID: |-
1279
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1280
+ BUILD_INFO_BUILD_TIME: |-
1281
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1282
+ BUILD_INFO_CURRENT_VERSION: |-
1283
+ $(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/^/ /')
1284
+ HOSTNAME: |-
1285
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1286
+ ROOT_URL: |-
1287
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1288
+ HOSTNAME_INTERNAL: |-
1289
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1290
+ ROOT_URL_INTERNAL: |-
1291
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1292
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1293
+ google-project-id
1294
+ DEPLOY_CLOUD_RUN_REGION: |-
1295
+ europe-west6
1296
+ GCLOUD_RUN_canonicalHostSuffix: |-
1297
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1298
+ _ALL_ENV_VAR_KEYS: |-
1299
+ ["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"]
1300
+
1301
+ EOF
1302
+ - collapseable_section_end "writeenvvars"
1303
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1304
+ - 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
1305
+ - gcloud run deploy pan-test-app-prod-api-worker --command="yarn,start:worker" --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-worker --env-vars-file=____envvars.yaml --min-instances=1 --max-instances=1 --no-cpu-throttling --allow-unauthenticated --ingress=all --cpu-boost
1306
+ - collapseable_section_end "deploy"
1307
+ - collapseable_section_start "cleanup" "Cleanup"
1308
+ - 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
1309
+ - 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
1310
+ - 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
1311
+ - collapseable_section_end "cleanup"
1312
+ - echo 'Uploading SBOM to Dependency Track'
1313
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
1314
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1315
+ environment:
1316
+ name: prod/api
1317
+ url: $CL_GITLAB_ENVIRONMENT_URL
1318
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | prod '
1319
+ artifacts:
1320
+ reports:
1321
+ dotenv: gitlab_environment.env
1322
+ rules:
1323
+ - when: manual
1324
+ if: $CI_COMMIT_TAG
1325
+ needs:
1326
+ - job: 'api ๐Ÿ”จ app | prod '
1327
+ artifacts: false
1328
+ - job: 'api ๐Ÿ”จ docker | prod '
1329
+ artifacts: false
1330
+ - job: 'api ๐Ÿงพ sbom | prod '
1331
+ artifacts: true
1332
+ retry: *a1
1333
+ interruptible: true
1334
+ allow_failure: true
1335
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1336
+ stage: stop prod
1337
+ image: path/to/docker/gcloud:the-version
1338
+ variables:
1339
+ KUBERNETES_CPU_REQUEST: '0.22'
1340
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1341
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1342
+ GIT_STRATEGY: none
1343
+ script:
1344
+ - collapseable_section_start "injectvars" "Injecting variables"
1345
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1346
+ - collapseable_section_end "injectvars"
1347
+ - set +e
1348
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1349
+ - gcloud run services delete pan-test-app-prod-api --project=google-project-id --region=europe-west6
1350
+ - gcloud run services delete pan-test-app-prod-api-worker --project=google-project-id --region=europe-west6
1351
+ - gcloud artifacts docker images delete europe-west6-docker.pkg.dev/google-project-id/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags
1352
+ - 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
1353
+ - echo 'Disabling component in Dependency Track'
1354
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
1355
+ - set -e
1356
+ environment:
1357
+ name: prod/api
1358
+ action: stop
1359
+ rules:
1360
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1361
+ when: on_success
1362
+ - when: manual
1363
+ if: $CI_COMMIT_TAG
1364
+ needs: []
1365
+ retry: *a1
1366
+ interruptible: true
1367
+ allow_failure: true
1368
+ create release:
1369
+ stage: release
1370
+ image: path/to/docker/semantic-release:the-version
1371
+ script:
1372
+ - semanticRelease
1373
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1374
+ rules:
1375
+ - &a2
1376
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1377
+ when: never
1378
+ - &a3
1379
+ if: $CI_PIPELINE_SOURCE == "schedule"
1380
+ when: never
1381
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1382
+ when: on_success
1383
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1384
+ when: manual
1385
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1386
+ when: manual
1387
+ โš ๏ธ force create release:
1388
+ stage: release
1389
+ image: path/to/docker/semantic-release:the-version
1390
+ script:
1391
+ - semanticRelease
1392
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1393
+ rules:
1394
+ - *a2
1395
+ - *a3
1396
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1397
+ when: manual
1398
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1399
+ when: manual
1400
+ needs: []
1401
+ "
1402
+ `;