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