@catladder/pipeline 0.0.0-more-collapse-deeb54d7 โ†’ 0.0.0-multiple-gitlab-includes-1a40efc0

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