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

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