@catladder/pipeline 0.0.0-mongodb-tolerations-bc2a3387 โ†’ 0.0.0-multiple-gitlab-includes-1a40efc0

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