@catladder/pipeline 0.0.0-more-collapse-deeb54d7 โ†’ 0.0.0-multiple-gitlab-includes-3df5566d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/README.md +17 -0
  2. package/dist/bash/BashExpression.d.ts +36 -0
  3. package/dist/bash/BashExpression.js +114 -0
  4. package/dist/bash/bashEscape.d.ts +34 -0
  5. package/dist/bash/bashEscape.js +114 -0
  6. package/dist/bash/bashExpressionPerPipelineType.d.ts +6 -0
  7. package/dist/bash/bashExpressionPerPipelineType.js +11 -0
  8. package/dist/bash/bashYaml.d.ts +10 -0
  9. package/dist/bash/bashYaml.js +69 -0
  10. package/dist/bash/getInjectVarsScript.d.ts +2 -0
  11. package/dist/bash/getInjectVarsScript.js +47 -0
  12. package/dist/bash/index.d.ts +2 -0
  13. package/dist/bash/index.js +26 -0
  14. package/dist/build/artifacts/createBuildJobArtifact.d.ts +3 -0
  15. package/dist/build/artifacts/createBuildJobArtifact.js +97 -0
  16. package/dist/build/base/__tests__/createArtifactsConfig.test.js +3 -1
  17. package/dist/build/base/constants.d.ts +0 -1
  18. package/dist/build/base/constants.js +4 -3
  19. package/dist/build/base/createAppBuildJob.d.ts +5 -3
  20. package/dist/build/base/createAppBuildJob.js +18 -15
  21. package/dist/build/base/createArtifactsConfig.d.ts +1 -1
  22. package/dist/build/base/createArtifactsConfig.js +3 -1
  23. package/dist/build/base/createBuildJobDefinition.d.ts +6 -0
  24. package/dist/build/base/createBuildJobDefinition.js +58 -0
  25. package/dist/build/base/index.d.ts +7 -4
  26. package/dist/build/base/index.js +17 -6
  27. package/dist/build/base/writeBuildInfo.d.ts +2 -2
  28. package/dist/build/base/writeBuildInfo.js +4 -3
  29. package/dist/build/base/writeDotEnv.d.ts +3 -2
  30. package/dist/build/base/writeDotEnv.js +30 -6
  31. package/dist/build/cache/createJobCache.d.ts +7 -0
  32. package/dist/build/cache/createJobCache.js +115 -0
  33. package/dist/build/cache/getAllCacheConfigsFromConfig.d.ts +3 -0
  34. package/dist/build/cache/getAllCacheConfigsFromConfig.js +64 -0
  35. package/dist/build/cache/transformLegacyJobCache.d.ts +3 -0
  36. package/dist/build/cache/transformLegacyJobCache.js +29 -0
  37. package/dist/build/custom/__tests__/testJob.test.js +15 -16
  38. package/dist/build/custom/buildJob.d.ts +2 -2
  39. package/dist/build/custom/buildJob.js +8 -67
  40. package/dist/build/custom/index.d.ts +2 -2
  41. package/dist/build/custom/index.js +3 -1
  42. package/dist/build/custom/testJob.d.ts +4 -4
  43. package/dist/build/custom/testJob.js +25 -21
  44. package/dist/build/docker.d.ts +48 -39
  45. package/dist/build/docker.js +112 -37
  46. package/dist/build/index.d.ts +14 -7
  47. package/dist/build/index.js +44 -16
  48. package/dist/build/node/buildJob.d.ts +6 -2
  49. package/dist/build/node/buildJob.js +39 -48
  50. package/dist/build/node/cache.d.ts +4 -5
  51. package/dist/build/node/cache.js +18 -23
  52. package/dist/build/node/constants.d.ts +0 -1
  53. package/dist/build/node/constants.js +5 -4
  54. package/dist/build/node/index.d.ts +4 -4
  55. package/dist/build/node/index.js +3 -1
  56. package/dist/build/node/meteor.d.ts +2 -2
  57. package/dist/build/node/meteor.js +10 -12
  58. package/dist/build/node/testJob.d.ts +3 -2
  59. package/dist/build/node/testJob.js +29 -19
  60. package/dist/build/node/yarn.d.ts +3 -2
  61. package/dist/build/node/yarn.js +13 -13
  62. package/dist/build/rails/build.d.ts +2 -2
  63. package/dist/build/rails/build.js +24 -8
  64. package/dist/build/rails/index.d.ts +2 -2
  65. package/dist/build/rails/index.js +3 -1
  66. package/dist/build/rails/test.d.ts +2 -2
  67. package/dist/build/rails/test.js +20 -12
  68. package/dist/build/sbom.d.ts +2 -2
  69. package/dist/build/sbom.js +9 -6
  70. package/dist/build/types.d.ts +152 -47
  71. package/dist/build/types.js +10 -2
  72. package/dist/catladder-gitlab.js +129 -49
  73. package/dist/config/__tests__/configruedEnvs.test.js +3 -1
  74. package/dist/config/__tests__/getAllEnvs.test.js +79 -0
  75. package/dist/config/__tests__/getAllEnvsInAllComponents.test.d.ts +1 -0
  76. package/dist/config/__tests__/getAllEnvsInAllComponents.test.js +73 -0
  77. package/dist/config/configruedEnvs.js +3 -1
  78. package/dist/config/index.js +13 -7
  79. package/dist/config/readConfig.d.ts +2 -2
  80. package/dist/config/readConfig.js +191 -40
  81. package/dist/constants.js +5 -3
  82. package/dist/context/createAllComponentsContext.d.ts +12 -0
  83. package/dist/{pipeline/commitInfo/getCommitInfo.js โ†’ context/createAllComponentsContext.js} +35 -19
  84. package/dist/context/createComponentContext.d.ts +11 -0
  85. package/dist/context/createComponentContext.js +255 -0
  86. package/dist/context/createWorkspaceContext.d.ts +16 -0
  87. package/dist/context/createWorkspaceContext.js +173 -0
  88. package/dist/context/getBuildInfoVariables.d.ts +6 -0
  89. package/dist/context/getBuildInfoVariables.js +55 -0
  90. package/dist/context/getEnvConfig.js +5 -2
  91. package/dist/context/getEnvType.js +3 -1
  92. package/dist/context/getEnvironment.d.ts +3 -3
  93. package/dist/context/getEnvironment.js +11 -12
  94. package/dist/context/getEnvironmentContext.d.ts +7 -3
  95. package/dist/context/getEnvironmentContext.js +21 -11
  96. package/dist/context/getEnvironmentVariables.d.ts +22 -5
  97. package/dist/context/getEnvironmentVariables.js +81 -49
  98. package/dist/context/getLabels.d.ts +2 -2
  99. package/dist/context/getLabels.js +9 -7
  100. package/dist/context/getReviewSlug.d.ts +4 -0
  101. package/dist/context/getReviewSlug.js +21 -0
  102. package/dist/context/index.d.ts +2 -4
  103. package/dist/context/index.js +15 -162
  104. package/dist/context/transformJobOnlyVars.d.ts +5 -2
  105. package/dist/context/transformJobOnlyVars.js +4 -2
  106. package/dist/context/utils/envVars.d.ts +1 -1
  107. package/dist/context/utils/envVars.js +5 -2
  108. package/dist/defaults/index.js +3 -1
  109. package/dist/deploy/base/deploy.d.ts +3 -3
  110. package/dist/deploy/base/deploy.js +38 -22
  111. package/dist/deploy/base/index.d.ts +3 -5
  112. package/dist/deploy/base/index.js +3 -1
  113. package/dist/deploy/base/rollback.d.ts +3 -3
  114. package/dist/deploy/base/rollback.js +13 -9
  115. package/dist/deploy/base/stop.d.ts +3 -3
  116. package/dist/deploy/base/stop.js +16 -11
  117. package/dist/deploy/base/types.d.ts +1 -1
  118. package/dist/deploy/base/types.js +3 -1
  119. package/dist/deploy/base/variables.d.ts +0 -1
  120. package/dist/deploy/base/variables.js +4 -3
  121. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +19 -0
  122. package/dist/deploy/cloudRun/artifactsRegistry.js +125 -0
  123. package/dist/deploy/cloudRun/cleanup.d.ts +2 -0
  124. package/dist/deploy/cloudRun/cleanup.js +53 -0
  125. package/dist/deploy/cloudRun/cloudRunRevisions.d.ts +2 -0
  126. package/dist/deploy/cloudRun/cloudRunRevisions.js +62 -0
  127. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.d.ts +7 -0
  128. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +207 -0
  129. package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +4 -0
  130. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +96 -0
  131. package/dist/deploy/cloudRun/createJobs/common.d.ts +18 -0
  132. package/dist/deploy/cloudRun/createJobs/common.js +93 -0
  133. package/dist/deploy/cloudRun/createJobs/constants.d.ts +1 -0
  134. package/dist/deploy/cloudRun/createJobs/constants.js +7 -0
  135. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.d.ts +2 -0
  136. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +62 -0
  137. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.d.ts +2 -0
  138. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +54 -0
  139. package/dist/deploy/cloudRun/createJobs/index.d.ts +3 -0
  140. package/dist/deploy/cloudRun/createJobs/index.js +57 -0
  141. package/dist/deploy/cloudRun/createJobs/volumes.d.ts +3 -0
  142. package/dist/deploy/cloudRun/createJobs/volumes.js +58 -0
  143. package/dist/deploy/cloudRun/index.d.ts +2 -2
  144. package/dist/deploy/cloudRun/index.js +17 -10
  145. package/dist/deploy/cloudRun/utils/createArgsString.d.ts +3 -1
  146. package/dist/deploy/cloudRun/utils/createArgsString.js +25 -17
  147. package/dist/deploy/cloudRun/utils/database.d.ts +6 -4
  148. package/dist/deploy/cloudRun/utils/database.js +28 -15
  149. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.d.ts +2 -2
  150. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +4 -2
  151. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +2 -0
  152. package/dist/deploy/cloudRun/utils/getServiceName.js +10 -0
  153. package/dist/deploy/cloudRun/utils/jobName.d.ts +2 -1
  154. package/dist/deploy/cloudRun/utils/jobName.js +4 -2
  155. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.d.ts +9 -0
  156. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +18 -0
  157. package/dist/deploy/cloudSql/utils.d.ts +2 -1
  158. package/dist/deploy/cloudSql/utils.js +7 -2
  159. package/dist/deploy/custom/deployJob.d.ts +2 -2
  160. package/dist/deploy/custom/deployJob.js +10 -9
  161. package/dist/deploy/custom/index.d.ts +2 -2
  162. package/dist/deploy/custom/index.js +3 -1
  163. package/dist/deploy/dockerTag/deployJob.d.ts +2 -2
  164. package/dist/deploy/dockerTag/deployJob.js +38 -7
  165. package/dist/deploy/dockerTag/index.d.ts +2 -2
  166. package/dist/deploy/dockerTag/index.js +3 -1
  167. package/dist/deploy/index.d.ts +10 -9
  168. package/dist/deploy/index.js +13 -7
  169. package/dist/deploy/kubernetes/additionalSecretKeys.d.ts +3 -1
  170. package/dist/deploy/kubernetes/additionalSecretKeys.js +3 -1
  171. package/dist/deploy/kubernetes/cloudSql/index.d.ts +6 -5
  172. package/dist/deploy/kubernetes/cloudSql/index.js +14 -21
  173. package/dist/deploy/kubernetes/deployJob.d.ts +2 -2
  174. package/dist/deploy/kubernetes/deployJob.js +23 -22
  175. package/dist/deploy/kubernetes/index.d.ts +2 -2
  176. package/dist/deploy/kubernetes/index.js +52 -15
  177. package/dist/deploy/kubernetes/kubeEnv.d.ts +5 -4
  178. package/dist/deploy/kubernetes/kubeEnv.js +9 -5
  179. package/dist/deploy/kubernetes/kubeValues.d.ts +5 -6
  180. package/dist/deploy/kubernetes/kubeValues.js +16 -18
  181. package/dist/deploy/kubernetes/mongodb.d.ts +2 -2
  182. package/dist/deploy/kubernetes/mongodb.js +14 -12
  183. package/dist/deploy/sbom.d.ts +4 -4
  184. package/dist/deploy/sbom.js +7 -4
  185. package/dist/deploy/types/base.d.ts +5 -5
  186. package/dist/deploy/types/base.js +3 -1
  187. package/dist/deploy/types/custom.d.ts +3 -7
  188. package/dist/deploy/types/custom.js +3 -1
  189. package/dist/deploy/types/dockerTag.d.ts +3 -1
  190. package/dist/deploy/types/dockerTag.js +3 -1
  191. package/dist/deploy/types/googleCloudRun.d.ts +127 -24
  192. package/dist/deploy/types/googleCloudRun.js +3 -1
  193. package/dist/deploy/types/index.d.ts +6 -6
  194. package/dist/deploy/types/index.js +14 -8
  195. package/dist/deploy/types/kubernetes.d.ts +25 -54
  196. package/dist/deploy/types/kubernetes.js +3 -1
  197. package/dist/deploy/utils.d.ts +2 -2
  198. package/dist/deploy/utils.js +5 -2
  199. package/dist/globalScriptFunctions/index.d.ts +14 -0
  200. package/dist/globalScriptFunctions/index.js +37 -0
  201. package/dist/index.d.ts +5 -2
  202. package/dist/index.js +18 -9
  203. package/dist/packageInfos.d.ts +4 -0
  204. package/dist/packageInfos.js +20 -0
  205. package/dist/pipeline/__tests__/getPipelineStages.test.d.ts +1 -0
  206. package/dist/pipeline/__tests__/getPipelineStages.test.js +73 -0
  207. package/dist/pipeline/createAllJobs.d.ts +16 -6
  208. package/dist/pipeline/createAllJobs.js +99 -27
  209. package/dist/pipeline/createJobsForComponent.d.ts +2 -2
  210. package/dist/pipeline/createJobsForComponent.js +9 -149
  211. package/dist/pipeline/createJobsForWorkspace.d.ts +3 -0
  212. package/dist/pipeline/createJobsForWorkspace.js +12 -0
  213. package/dist/pipeline/createMainPipeline.d.ts +3 -0
  214. package/dist/pipeline/createMainPipeline.js +283 -0
  215. package/dist/pipeline/generatePipelineFiles.d.ts +7 -0
  216. package/dist/pipeline/generatePipelineFiles.js +304 -0
  217. package/dist/pipeline/getPipelineStages.d.ts +7 -0
  218. package/dist/pipeline/getPipelineStages.js +56 -0
  219. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +11 -14
  220. package/dist/pipeline/gitlab/createGitlabJobs.js +258 -74
  221. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +9 -0
  222. package/dist/pipeline/gitlab/createGitlabPipeline.js +77 -0
  223. package/dist/pipeline/gitlab/gitlabReleaseJobs.d.ts +33 -0
  224. package/dist/pipeline/gitlab/gitlabReleaseJobs.js +25 -0
  225. package/dist/pipeline/gitlab/sortGitLabJobDefProps.d.ts +7 -0
  226. package/dist/pipeline/gitlab/sortGitLabJobDefProps.js +27 -0
  227. package/dist/pipeline/index.d.ts +3 -2
  228. package/dist/pipeline/index.js +16 -9
  229. package/dist/pipeline/packageManager.d.ts +3 -2
  230. package/dist/pipeline/packageManager.js +50 -24
  231. package/dist/pipeline/yarn/yarnUtils.d.ts +3 -2
  232. package/dist/pipeline/yarn/yarnUtils.js +65 -17
  233. package/dist/rules/index.d.ts +7 -2
  234. package/dist/rules/index.js +34 -16
  235. package/dist/runner/index.d.ts +1 -1
  236. package/dist/runner/index.js +3 -1
  237. package/dist/tsconfig.tsbuildinfo +1 -1
  238. package/dist/types/config.d.ts +44 -29
  239. package/dist/types/config.js +5 -2
  240. package/dist/types/context.d.ts +124 -40
  241. package/dist/types/context.js +12 -1
  242. package/dist/types/environmentContext.d.ts +15 -12
  243. package/dist/types/environmentContext.js +3 -1
  244. package/dist/types/gitlab-ci-yml.d.ts +30 -30
  245. package/dist/types/gitlab-ci-yml.js +3 -2
  246. package/dist/types/gitlab-types.d.ts +8 -8
  247. package/dist/types/gitlab-types.js +3 -1
  248. package/dist/types/index.d.ts +1 -0
  249. package/dist/types/index.js +14 -7
  250. package/dist/types/jobDefinition.d.ts +11 -0
  251. package/dist/types/jobDefinition.js +5 -0
  252. package/dist/types/jobs.d.ts +30 -15
  253. package/dist/types/jobs.js +3 -1
  254. package/dist/types/pipeline.d.ts +3 -3
  255. package/dist/types/pipeline.js +3 -1
  256. package/dist/types/utils.d.ts +1 -1
  257. package/dist/types/utils.js +3 -1
  258. package/dist/utils/gitlab.js +7 -2
  259. package/dist/utils/index.d.ts +2 -1
  260. package/dist/utils/index.js +10 -3
  261. package/dist/utils/jsonParse.d.ts +1 -0
  262. package/dist/utils/jsonParse.js +14 -0
  263. package/dist/utils/removeUndefined.d.ts +1 -0
  264. package/dist/utils/removeUndefined.js +36 -0
  265. package/dist/utils/writeFiles.d.ts +11 -0
  266. package/dist/{pipeline/commitInfo/getBuildId.js โ†’ utils/writeFiles.js} +39 -22
  267. package/dist/variables/VariableValue.d.ts +3 -0
  268. package/dist/variables/VariableValue.js +5 -0
  269. package/dist/variables/VariableValueContainingReferences.d.ts +24 -0
  270. package/dist/variables/VariableValueContainingReferences.js +97 -0
  271. package/dist/variables/__tests__/resolveAllReferences.test.d.ts +1 -0
  272. package/dist/variables/__tests__/resolveAllReferences.test.js +218 -0
  273. package/dist/variables/__tests__/resolveAllReferencesOnce.test.d.ts +1 -0
  274. package/dist/variables/__tests__/resolveAllReferencesOnce.test.js +171 -0
  275. package/dist/variables/__tests__/resolveReferencesOnce.test.d.ts +1 -0
  276. package/dist/variables/__tests__/resolveReferencesOnce.test.js +199 -0
  277. package/dist/variables/__tests__/variableValue.test.d.ts +1 -0
  278. package/dist/variables/__tests__/variableValue.test.js +36 -0
  279. package/dist/variables/resolveAllReferences.d.ts +3 -0
  280. package/dist/{pipeline/createChildPipeline.js โ†’ variables/resolveAllReferences.js} +44 -47
  281. package/dist/variables/resolveAllReferencesOnce.d.ts +5 -0
  282. package/dist/variables/resolveAllReferencesOnce.js +191 -0
  283. package/dist/variables/resolveReferencesOnce.d.ts +8 -0
  284. package/dist/variables/resolveReferencesOnce.js +22 -0
  285. package/examples/.test-gen-ignore +1 -0
  286. package/examples/__snapshots__/cloud-run-http2.test.ts.snap +1418 -0
  287. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1418 -0
  288. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1418 -0
  289. package/examples/__snapshots__/cloud-run-nextjs.test.ts.snap +1434 -0
  290. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1418 -0
  291. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1526 -0
  292. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1418 -0
  293. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1436 -0
  294. package/examples/__snapshots__/cloud-run-service-custom-vpc-connector.test.ts.snap +1418 -0
  295. package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +1418 -0
  296. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1418 -0
  297. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1418 -0
  298. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1490 -0
  299. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1302 -0
  300. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1418 -0
  301. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2998 -0
  302. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +1733 -0
  303. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1426 -0
  304. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1285 -0
  305. package/examples/__snapshots__/custom-build-job.test.ts.snap +1174 -0
  306. package/examples/__snapshots__/custom-deploy.test.ts.snap +1168 -0
  307. package/examples/__snapshots__/custom-envs.test.ts.snap +798 -0
  308. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1182 -0
  309. package/examples/__snapshots__/git-submodule.test.ts.snap +1419 -0
  310. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1759 -0
  311. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1779 -0
  312. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3357 -0
  313. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1883 -0
  314. package/examples/__snapshots__/local-dot-env.test.ts.snap +1342 -0
  315. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1836 -0
  316. package/examples/__snapshots__/multiline-var.test.ts.snap +5679 -0
  317. package/examples/__snapshots__/native-app.test.ts.snap +2206 -0
  318. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1418 -0
  319. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1426 -0
  320. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +1487 -0
  321. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1471 -0
  322. package/examples/__snapshots__/referencing-other-vars.test.ts.snap +4739 -0
  323. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1368 -0
  324. package/examples/__snapshots__/workspace-api-www-turbo-cache.test.ts.snap +2338 -0
  325. package/examples/__snapshots__/workspace-api-www.test.ts.snap +2330 -0
  326. package/examples/__utils__/helpers.ts +9 -12
  327. package/examples/cloud-run-http2.test.ts +11 -0
  328. package/examples/cloud-run-http2.ts +29 -0
  329. package/examples/cloud-run-memory-limit.test.ts +11 -0
  330. package/examples/cloud-run-memory-limit.ts +10 -5
  331. package/examples/cloud-run-meteor-with-worker.test.ts +11 -0
  332. package/examples/cloud-run-meteor-with-worker.ts +37 -0
  333. package/examples/cloud-run-nextjs.test.ts +11 -0
  334. package/examples/cloud-run-nextjs.ts +28 -0
  335. package/examples/cloud-run-no-cpu-throttling.test.ts +11 -0
  336. package/examples/cloud-run-no-cpu-throttling.ts +6 -4
  337. package/examples/cloud-run-no-service.test.ts +11 -0
  338. package/examples/cloud-run-no-service.ts +33 -0
  339. package/examples/cloud-run-non-public.test.ts +11 -0
  340. package/examples/cloud-run-non-public.ts +5 -4
  341. package/examples/cloud-run-post-stop-job.test.ts +11 -0
  342. package/examples/cloud-run-post-stop-job.ts +42 -0
  343. package/examples/cloud-run-service-custom-vpc-connector.test.ts +11 -0
  344. package/examples/cloud-run-service-custom-vpc-connector.ts +30 -0
  345. package/examples/cloud-run-service-custom-vpc.test.ts +11 -0
  346. package/examples/cloud-run-service-custom-vpc.ts +31 -0
  347. package/examples/cloud-run-service-gen2.test.ts +11 -0
  348. package/examples/cloud-run-service-gen2.ts +29 -0
  349. package/examples/cloud-run-service-increase-timout.test.ts +11 -0
  350. package/examples/cloud-run-service-increase-timout.ts +29 -0
  351. package/examples/cloud-run-service-with-volumes.test.ts +11 -0
  352. package/examples/cloud-run-service-with-volumes.ts +56 -0
  353. package/examples/cloud-run-storybook.test.ts +11 -0
  354. package/examples/cloud-run-storybook.ts +33 -0
  355. package/examples/cloud-run-with-ngnix.test.ts +11 -0
  356. package/examples/cloud-run-with-ngnix.ts +29 -0
  357. package/examples/cloud-run-with-sql-reuse-db.test.ts +11 -0
  358. package/examples/cloud-run-with-sql-reuse-db.ts +5 -4
  359. package/examples/cloud-run-with-sql.test.ts +11 -0
  360. package/examples/cloud-run-with-sql.ts +6 -20
  361. package/examples/cloud-run-with-worker.test.ts +11 -0
  362. package/examples/cloud-run-with-worker.ts +37 -0
  363. package/examples/custom-build-job-with-tests.test.ts +11 -0
  364. package/examples/custom-build-job-with-tests.ts +5 -4
  365. package/examples/custom-build-job.test.ts +11 -0
  366. package/examples/custom-build-job.ts +5 -4
  367. package/examples/custom-deploy.test.ts +11 -0
  368. package/examples/custom-deploy.ts +12 -4
  369. package/examples/custom-envs.test.ts +11 -0
  370. package/examples/custom-envs.ts +5 -4
  371. package/examples/custom-sbom-java.test.ts +11 -0
  372. package/examples/custom-sbom-java.ts +10 -6
  373. package/examples/git-submodule.test.ts +11 -0
  374. package/examples/git-submodule.ts +30 -0
  375. package/examples/kubernetes-application-customization.test.ts +11 -0
  376. package/examples/kubernetes-application-customization.ts +7 -4
  377. package/examples/kubernetes-with-cloud-sql.test.ts +11 -0
  378. package/examples/kubernetes-with-cloud-sql.ts +7 -4
  379. package/examples/kubernetes-with-jobs.test.ts +11 -0
  380. package/examples/kubernetes-with-jobs.ts +7 -4
  381. package/examples/kubernetes-with-mongodb.test.ts +11 -0
  382. package/examples/kubernetes-with-mongodb.ts +7 -4
  383. package/examples/local-dot-env.test.ts +11 -0
  384. package/examples/local-dot-env.ts +27 -0
  385. package/examples/meteor-kubernetes.test.ts +11 -0
  386. package/examples/meteor-kubernetes.ts +4 -5
  387. package/examples/multiline-var.test.ts +11 -0
  388. package/examples/multiline-var.ts +107 -0
  389. package/examples/native-app.test.ts +11 -0
  390. package/examples/native-app.ts +22 -17
  391. package/examples/node-build-with-custom-image.test.ts +11 -0
  392. package/examples/node-build-with-custom-image.ts +5 -4
  393. package/examples/node-build-with-docker-additions.test.ts +11 -0
  394. package/examples/node-build-with-docker-additions.ts +29 -0
  395. package/examples/rails-k8s-with-worker-dockerfile.test.ts +33 -0
  396. package/examples/rails-k8s-with-worker.test.ts +11 -0
  397. package/examples/rails-k8s-with-worker.ts +14 -11
  398. package/examples/referencing-other-vars.test.ts +11 -0
  399. package/examples/referencing-other-vars.ts +83 -0
  400. package/examples/wait-for-other-deploy.test.ts +11 -0
  401. package/examples/wait-for-other-deploy.ts +5 -4
  402. package/examples/workspace-api-www-turbo-cache.test.ts +11 -0
  403. package/examples/workspace-api-www-turbo-cache.ts +52 -0
  404. package/examples/workspace-api-www.test.ts +11 -0
  405. package/examples/workspace-api-www.ts +46 -0
  406. package/package.json +75 -26
  407. package/scripts/generate-examples-test.ts +84 -0
  408. package/scripts/generate-gitlab-ci-types.ts +2 -2
  409. package/scripts/tsconfig.json +7 -0
  410. package/src/bash/BashExpression.ts +78 -0
  411. package/src/bash/bashEscape.ts +158 -0
  412. package/src/bash/bashExpressionPerPipelineType.ts +16 -0
  413. package/src/bash/bashYaml.ts +80 -0
  414. package/src/bash/getInjectVarsScript.ts +21 -0
  415. package/src/bash/index.ts +2 -0
  416. package/src/build/artifacts/createBuildJobArtifact.ts +61 -0
  417. package/src/build/base/__tests__/createArtifactsConfig.test.ts +3 -3
  418. package/src/build/base/constants.ts +2 -2
  419. package/src/build/base/createAppBuildJob.ts +40 -24
  420. package/src/build/base/createArtifactsConfig.ts +2 -2
  421. package/src/build/base/createBuildJobDefinition.ts +37 -0
  422. package/src/build/base/index.ts +37 -8
  423. package/src/build/base/writeBuildInfo.ts +3 -3
  424. package/src/build/base/writeDotEnv.ts +25 -6
  425. package/src/build/cache/createJobCache.ts +83 -0
  426. package/src/build/cache/getAllCacheConfigsFromConfig.ts +28 -0
  427. package/src/build/cache/transformLegacyJobCache.ts +14 -0
  428. package/src/build/custom/__tests__/testJob.test.ts +10 -13
  429. package/src/build/custom/buildJob.ts +11 -37
  430. package/src/build/custom/index.ts +2 -2
  431. package/src/build/custom/testJob.ts +24 -22
  432. package/src/build/docker.ts +145 -49
  433. package/src/build/index.ts +42 -10
  434. package/src/build/node/buildJob.ts +65 -62
  435. package/src/build/node/cache.ts +30 -35
  436. package/src/build/node/constants.ts +2 -3
  437. package/src/build/node/index.ts +8 -4
  438. package/src/build/node/meteor.ts +16 -24
  439. package/src/build/node/testJob.ts +47 -26
  440. package/src/build/node/yarn.ts +32 -16
  441. package/src/build/rails/build.ts +21 -9
  442. package/src/build/rails/index.ts +2 -2
  443. package/src/build/rails/test.ts +22 -12
  444. package/src/build/sbom.ts +15 -10
  445. package/src/build/types.ts +190 -47
  446. package/src/catladder-gitlab.ts +7 -56
  447. package/src/config/__tests__/__snapshots__/getAllEnvs.test.ts.snap +31 -0
  448. package/src/config/__tests__/__snapshots__/getAllEnvsInAllComponents.test.ts.snap +15 -0
  449. package/src/config/__tests__/getAllEnvs.test.ts +71 -0
  450. package/src/config/__tests__/getAllEnvsInAllComponents.test.ts +63 -0
  451. package/src/config/configruedEnvs.ts +6 -6
  452. package/src/config/readConfig.ts +15 -22
  453. package/src/constants.ts +5 -2
  454. package/src/context/createAllComponentsContext.ts +31 -0
  455. package/src/context/createComponentContext.ts +134 -0
  456. package/src/context/createWorkspaceContext.ts +56 -0
  457. package/src/context/getBuildInfoVariables.ts +36 -0
  458. package/src/context/getEnvConfig.ts +3 -3
  459. package/src/context/getEnvType.ts +1 -1
  460. package/src/context/getEnvironment.ts +8 -24
  461. package/src/context/getEnvironmentContext.ts +25 -29
  462. package/src/context/getEnvironmentVariables.ts +104 -76
  463. package/src/context/getLabels.ts +5 -5
  464. package/src/context/getReviewSlug.ts +27 -0
  465. package/src/context/index.ts +1 -65
  466. package/src/context/transformJobOnlyVars.ts +6 -3
  467. package/src/context/utils/envVars.ts +5 -4
  468. package/src/deploy/base/deploy.ts +63 -47
  469. package/src/deploy/base/index.ts +11 -6
  470. package/src/deploy/base/rollback.ts +11 -16
  471. package/src/deploy/base/stop.ts +11 -15
  472. package/src/deploy/base/variables.ts +1 -2
  473. package/src/deploy/cloudRun/artifactsRegistry.ts +126 -0
  474. package/src/deploy/cloudRun/cleanup.ts +30 -0
  475. package/src/deploy/cloudRun/cloudRunRevisions.ts +65 -0
  476. package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +227 -0
  477. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +86 -0
  478. package/src/deploy/cloudRun/createJobs/common.ts +59 -0
  479. package/src/deploy/cloudRun/createJobs/constants.ts +1 -0
  480. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +71 -0
  481. package/src/deploy/cloudRun/createJobs/getCloudRunStopScripts.ts +34 -0
  482. package/src/deploy/cloudRun/createJobs/index.ts +51 -0
  483. package/src/deploy/cloudRun/createJobs/volumes.ts +23 -0
  484. package/src/deploy/cloudRun/index.ts +85 -59
  485. package/src/deploy/cloudRun/utils/createArgsString.ts +21 -13
  486. package/src/deploy/cloudRun/utils/database.ts +31 -9
  487. package/src/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.ts +9 -11
  488. package/src/deploy/cloudRun/utils/getServiceName.ts +3 -0
  489. package/src/deploy/cloudRun/utils/jobName.ts +7 -2
  490. package/src/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.ts +12 -0
  491. package/src/deploy/cloudSql/utils.ts +13 -10
  492. package/src/deploy/custom/deployJob.ts +15 -10
  493. package/src/deploy/custom/index.ts +2 -2
  494. package/src/deploy/dockerTag/deployJob.ts +7 -8
  495. package/src/deploy/dockerTag/index.ts +8 -7
  496. package/src/deploy/index.ts +15 -12
  497. package/src/deploy/kubernetes/additionalSecretKeys.ts +3 -1
  498. package/src/deploy/kubernetes/cloudSql/index.ts +16 -25
  499. package/src/deploy/kubernetes/deployJob.ts +30 -21
  500. package/src/deploy/kubernetes/index.ts +43 -35
  501. package/src/deploy/kubernetes/kubeEnv.ts +12 -10
  502. package/src/deploy/kubernetes/kubeValues.ts +15 -19
  503. package/src/deploy/kubernetes/mongodb.ts +15 -15
  504. package/src/deploy/sbom.ts +18 -10
  505. package/src/deploy/types/base.ts +3 -3
  506. package/src/deploy/types/custom.ts +3 -7
  507. package/src/deploy/types/dockerTag.ts +2 -0
  508. package/src/deploy/types/googleCloudRun.ts +133 -10
  509. package/src/deploy/types/index.ts +2 -2
  510. package/src/deploy/types/kubernetes.ts +5 -36
  511. package/src/deploy/utils.ts +5 -5
  512. package/src/globalScriptFunctions/index.ts +30 -0
  513. package/src/index.ts +4 -1
  514. package/src/packageInfos.ts +14 -0
  515. package/src/pipeline/__tests__/__snapshots__/getPipelineStages.test.ts.snap +69 -0
  516. package/src/pipeline/__tests__/getPipelineStages.test.ts +63 -0
  517. package/src/pipeline/createAllJobs.ts +67 -33
  518. package/src/pipeline/createJobsForComponent.ts +10 -38
  519. package/src/pipeline/createJobsForWorkspace.ts +12 -0
  520. package/src/pipeline/createMainPipeline.ts +119 -0
  521. package/src/pipeline/generatePipelineFiles.ts +100 -0
  522. package/src/pipeline/getPipelineStages.ts +23 -0
  523. package/src/pipeline/gitlab/createGitlabJobs.ts +388 -108
  524. package/src/pipeline/gitlab/createGitlabPipeline.ts +35 -0
  525. package/src/pipeline/gitlab/gitlabReleaseJobs.ts +23 -0
  526. package/src/pipeline/gitlab/sortGitLabJobDefProps.ts +59 -0
  527. package/src/pipeline/index.ts +2 -1
  528. package/src/pipeline/packageManager.ts +44 -26
  529. package/src/pipeline/yarn/yarnUtils.ts +39 -10
  530. package/src/rules/index.ts +36 -9
  531. package/src/runner/index.ts +0 -1
  532. package/src/types/config.ts +43 -16
  533. package/src/types/context.ts +165 -37
  534. package/src/types/environmentContext.ts +18 -13
  535. package/src/types/gitlab-ci-yml.ts +0 -1
  536. package/src/types/gitlab-types.ts +10 -7
  537. package/src/types/index.ts +1 -0
  538. package/src/types/jobDefinition.ts +34 -0
  539. package/src/types/jobs.ts +31 -15
  540. package/src/types/utils.ts +4 -4
  541. package/src/utils/gitlab.ts +20 -3
  542. package/src/utils/index.ts +6 -3
  543. package/src/utils/jsonParse.ts +7 -0
  544. package/src/utils/removeUndefined.ts +4 -0
  545. package/src/utils/writeFiles.ts +52 -0
  546. package/src/variables/VariableValue.ts +6 -0
  547. package/src/variables/VariableValueContainingReferences.ts +89 -0
  548. package/src/variables/__tests__/resolveAllReferences.test.ts +110 -0
  549. package/src/variables/__tests__/resolveAllReferencesOnce.test.ts +64 -0
  550. package/src/variables/__tests__/resolveReferencesOnce.test.ts +117 -0
  551. package/src/variables/__tests__/variableValue.test.ts +73 -0
  552. package/src/variables/resolveAllReferences.ts +46 -0
  553. package/src/variables/resolveAllReferencesOnce.ts +44 -0
  554. package/src/variables/resolveReferencesOnce.ts +29 -0
  555. package/bin/catladder-gitlab-dev.js +0 -3
  556. package/bin/catladder-gitlab.js +0 -3
  557. package/dist/bundles/catladder-gitlab/index.js +0 -33838
  558. package/dist/context/__tests__/resolveReferences.test.js +0 -336
  559. package/dist/context/resolveReferences.d.ts +0 -4
  560. package/dist/context/resolveReferences.js +0 -254
  561. package/dist/deploy/cloudRun/deployJob.d.ts +0 -3
  562. package/dist/deploy/cloudRun/deployJob.js +0 -248
  563. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +0 -84
  564. package/dist/deploy/kubernetes/processSecretsAsFiles.js +0 -31
  565. package/dist/pipeline/commitInfo/getBuildId.d.ts +0 -6
  566. package/dist/pipeline/commitInfo/getCommitInfo.d.ts +0 -2
  567. package/dist/pipeline/createChildPipeline.d.ts +0 -3
  568. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +0 -1780
  569. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +0 -1780
  570. package/examples/__snapshots__/cloud-run-non-public.ts.snap +0 -1780
  571. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +0 -3532
  572. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +0 -3543
  573. package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +0 -1656
  574. package/examples/__snapshots__/custom-build-job.ts.snap +0 -1362
  575. package/examples/__snapshots__/custom-deploy.ts.snap +0 -1556
  576. package/examples/__snapshots__/custom-envs.ts.snap +0 -1050
  577. package/examples/__snapshots__/custom-sbom-java.ts.snap +0 -1370
  578. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +0 -2468
  579. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +0 -2428
  580. package/examples/__snapshots__/kubernetes-with-cloud-sql.ts.snap +0 -2440
  581. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +0 -4453
  582. package/examples/__snapshots__/kubernetes-with-mongodb.ts.snap +0 -2632
  583. package/examples/__snapshots__/meteor-kubernetes.ts.snap +0 -2557
  584. package/examples/__snapshots__/native-app.ts.snap +0 -2878
  585. package/examples/__snapshots__/node-build-with-custom-image.ts.snap +0 -1780
  586. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +0 -4189
  587. package/examples/__snapshots__/wait-for-other-deploy.ts.snap +0 -1922
  588. package/examples/kubernetes-with-cloud-sql-legacy.ts +0 -33
  589. package/scripts/bundle +0 -2
  590. package/src/context/__tests__/resolveReferences.test.ts +0 -143
  591. package/src/context/resolveReferences.ts +0 -70
  592. package/src/deploy/cloudRun/deployJob.ts +0 -301
  593. package/src/deploy/kubernetes/processSecretsAsFiles.ts +0 -34
  594. package/src/pipeline/commitInfo/getBuildId.ts +0 -17
  595. package/src/pipeline/commitInfo/getCommitInfo.ts +0 -15
  596. package/src/pipeline/createChildPipeline.ts +0 -45
  597. /package/dist/{context/__tests__/resolveReferences.test.d.ts โ†’ config/__tests__/getAllEnvs.test.d.ts} +0 -0
@@ -0,0 +1,2206 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for native-app 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
+ app ๐Ÿ›ก audit:
79
+ stage: test
80
+ image: path/to/docker/jobs-default:the-version
81
+ variables:
82
+ KUBERNETES_CPU_REQUEST: '0.45'
83
+ KUBERNETES_MEMORY_REQUEST: 1Gi
84
+ KUBERNETES_MEMORY_LIMIT: 4Gi
85
+ script:
86
+ - collapseable_section_start "injectvars" "Injecting variables"
87
+ - export APP_PATH="app"
88
+ - export LC_A="L=en_US.UTF-8"
89
+ - export LANG="en_US.UTF-8"
90
+ - collapseable_section_end "injectvars"
91
+ - cd app
92
+ - yarn npm audit --environment production
93
+ rules:
94
+ - when: never
95
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
96
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
97
+ - if: $CI_MERGE_REQUEST_ID
98
+ needs: []
99
+ retry: &a1
100
+ max: 2
101
+ when:
102
+ - runner_system_failure
103
+ - stuck_or_timeout_failure
104
+ interruptible: true
105
+ allow_failure: true
106
+ app ๐Ÿ‘ฎ lint:
107
+ stage: test
108
+ image: path/to/docker/jobs-default:the-version
109
+ variables:
110
+ KUBERNETES_CPU_REQUEST: '0.45'
111
+ KUBERNETES_MEMORY_REQUEST: 1Gi
112
+ KUBERNETES_MEMORY_LIMIT: 4Gi
113
+ script:
114
+ - collapseable_section_start "injectvars" "Injecting variables"
115
+ - export APP_PATH="app"
116
+ - export LC_A="L=en_US.UTF-8"
117
+ - export LANG="en_US.UTF-8"
118
+ - collapseable_section_end "injectvars"
119
+ - collapseable_section_start "nodeinstall" "Ensure node version"
120
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
121
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
122
+ - collapseable_section_end "nodeinstall"
123
+ - cd app
124
+ - collapseable_section_start "nodeinstall" "Ensure node version"
125
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
126
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
127
+ - collapseable_section_end "nodeinstall"
128
+ - collapseable_section_start "yarninstall" "Yarn install"
129
+ - yarn install --immutable
130
+ - collapseable_section_end "yarninstall"
131
+ - yarn lint
132
+ cache:
133
+ - key: app-yarn
134
+ policy: pull-push
135
+ paths:
136
+ - app/.yarn
137
+ - key: app-node-modules
138
+ policy: pull-push
139
+ paths:
140
+ - app/node_modules
141
+ rules:
142
+ - when: never
143
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
144
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
145
+ - if: $CI_MERGE_REQUEST_ID
146
+ needs: []
147
+ retry: *a1
148
+ interruptible: true
149
+ app ๐Ÿงช test:
150
+ stage: test
151
+ image: path/to/docker/jobs-testing-chrome:the-version
152
+ variables:
153
+ KUBERNETES_CPU_REQUEST: '0.45'
154
+ KUBERNETES_MEMORY_REQUEST: 1Gi
155
+ KUBERNETES_MEMORY_LIMIT: 4Gi
156
+ script:
157
+ - collapseable_section_start "injectvars" "Injecting variables"
158
+ - export APP_PATH="app"
159
+ - export LC_A="L=en_US.UTF-8"
160
+ - export LANG="en_US.UTF-8"
161
+ - collapseable_section_end "injectvars"
162
+ - collapseable_section_start "nodeinstall" "Ensure node version"
163
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
164
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
165
+ - collapseable_section_end "nodeinstall"
166
+ - cd app
167
+ - collapseable_section_start "nodeinstall" "Ensure node version"
168
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
169
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
170
+ - collapseable_section_end "nodeinstall"
171
+ - collapseable_section_start "yarninstall" "Yarn install"
172
+ - yarn install --immutable
173
+ - collapseable_section_end "yarninstall"
174
+ - yarn test
175
+ cache:
176
+ - key: app-yarn
177
+ policy: pull-push
178
+ paths:
179
+ - app/.yarn
180
+ - key: app-node-modules
181
+ policy: pull-push
182
+ paths:
183
+ - app/node_modules
184
+ rules:
185
+ - when: never
186
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
187
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
188
+ - if: $CI_MERGE_REQUEST_ID
189
+ needs: []
190
+ retry: *a1
191
+ interruptible: true
192
+ 'app ๐Ÿ”จ app | dev ':
193
+ stage: build
194
+ tags:
195
+ - mac-runner
196
+ image: path/to/docker/jobs-default:the-version
197
+ variables:
198
+ KUBERNETES_CPU_REQUEST: '0.45'
199
+ KUBERNETES_MEMORY_REQUEST: 1Gi
200
+ KUBERNETES_MEMORY_LIMIT: 4Gi
201
+ script:
202
+ - collapseable_section_start "injectvars" "Injecting variables"
203
+ - export ENV_SHORT="dev"
204
+ - export APP_DIR="app"
205
+ - export ENV_TYPE="dev"
206
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
207
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
208
+ - 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")"
209
+ - export HOSTNAME="unknown-host.example.com"
210
+ - export ROOT_URL="https://unknown-host.example.com"
211
+ - export HOSTNAME_INTERNAL="unknown-host.example.com"
212
+ - export ROOT_URL_INTERNAL="https://unknown-host.example.com"
213
+ - export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_dev_app_APP_STORE_CONNECT_API_KEY_CONTENT"
214
+ - export APP_STORE_CONNECT_ISSUER_ID="$CL_dev_app_APP_STORE_CONNECT_ISSUER_ID"
215
+ - export APP_STORE_CONNECT_API_KEY_ID="$CL_dev_app_APP_STORE_CONNECT_API_KEY_ID"
216
+ - export GRAPHQL_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
217
+ - 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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"
218
+ - export LC_A="L=en_US.UTF-8"
219
+ - export LANG="en_US.UTF-8"
220
+ - collapseable_section_end "injectvars"
221
+ - collapseable_section_start "write-dotenv-app" "write dot env for app"
222
+ - |-
223
+ cat <<EOF > app/.env
224
+ ENV_SHORT=dev
225
+ APP_DIR=app
226
+ ENV_TYPE=dev
227
+ HOSTNAME=unknown-host.example.com
228
+ ROOT_URL=https://unknown-host.example.com
229
+ HOSTNAME_INTERNAL=unknown-host.example.com
230
+ ROOT_URL_INTERNAL=https://unknown-host.example.com
231
+ APP_STORE_CONNECT_API_KEY_CONTENT=$(printf %s "$CL_dev_app_APP_STORE_CONNECT_API_KEY_CONTENT" | escapeForDotEnv)
232
+ APP_STORE_CONNECT_ISSUER_ID=$(printf %s "$CL_dev_app_APP_STORE_CONNECT_ISSUER_ID" | escapeForDotEnv)
233
+ APP_STORE_CONNECT_API_KEY_ID=$(printf %s "$CL_dev_app_APP_STORE_CONNECT_API_KEY_ID" | escapeForDotEnv)
234
+ GRAPHQL_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | escapeForDotEnv)
235
+ _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","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
236
+ EOF
237
+ - collapseable_section_end "write-dotenv-app"
238
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json
239
+ - collapseable_section_start "nodeinstall" "Ensure node version"
240
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
241
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
242
+ - collapseable_section_end "nodeinstall"
243
+ - cd app
244
+ - collapseable_section_start "nodeinstall" "Ensure node version"
245
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
246
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
247
+ - collapseable_section_end "nodeinstall"
248
+ - collapseable_section_start "yarninstall" "Yarn install"
249
+ - yarn install --immutable
250
+ - collapseable_section_end "yarninstall"
251
+ - bundle config set --local path 'vendor/ruby'
252
+ - gem install bundler
253
+ - bundle install
254
+ - bundle exec pod install --project-directory=ios
255
+ - bundle exec fastlane build
256
+ cache:
257
+ - key: app-yarn
258
+ policy: pull-push
259
+ paths:
260
+ - app/.yarn
261
+ - key: app-node-modules
262
+ policy: pull-push
263
+ paths:
264
+ - app/node_modules
265
+ - key:
266
+ files:
267
+ - app/Gemfile.lock
268
+ policy: pull-push
269
+ paths:
270
+ - app/vendor
271
+ artifacts:
272
+ paths:
273
+ - app/__build_info.json
274
+ - app/.next
275
+ - app/dist
276
+ exclude:
277
+ - app/.env
278
+ expire_in: 1 day
279
+ when: always
280
+ reports: {}
281
+ rules:
282
+ - when: never
283
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
284
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
285
+ needs: []
286
+ retry: *a1
287
+ interruptible: true
288
+ 'app ๐Ÿงพ sbom | dev ':
289
+ stage: build
290
+ image: aquasec/trivy:0.38.3
291
+ variables: {}
292
+ script:
293
+ - collapseable_section_start "injectvars" "Injecting variables"
294
+ - collapseable_section_end "injectvars"
295
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app
296
+ artifacts:
297
+ paths:
298
+ - __sbom.json
299
+ rules:
300
+ - when: never
301
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
302
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
303
+ needs: []
304
+ retry: *a1
305
+ interruptible: true
306
+ allow_failure: true
307
+ 'app ๐Ÿš€ Deploy | dev ':
308
+ stage: deploy dev
309
+ tags:
310
+ - mac-runner
311
+ image: path/to/docker/jobs-default:the-version
312
+ variables:
313
+ KUBERNETES_CPU_REQUEST: '0.22'
314
+ KUBERNETES_MEMORY_REQUEST: 200Mi
315
+ KUBERNETES_MEMORY_LIMIT: 400Mi
316
+ script:
317
+ - collapseable_section_start "injectvars" "Injecting variables"
318
+ - export ENV_SHORT="dev"
319
+ - export APP_DIR="app"
320
+ - export ENV_TYPE="dev"
321
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
322
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
323
+ - 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")"
324
+ - export HOSTNAME="unknown-host.example.com"
325
+ - export ROOT_URL="https://unknown-host.example.com"
326
+ - export HOSTNAME_INTERNAL="unknown-host.example.com"
327
+ - export ROOT_URL_INTERNAL="https://unknown-host.example.com"
328
+ - export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_dev_app_APP_STORE_CONNECT_API_KEY_CONTENT"
329
+ - export APP_STORE_CONNECT_ISSUER_ID="$CL_dev_app_APP_STORE_CONNECT_ISSUER_ID"
330
+ - export APP_STORE_CONNECT_API_KEY_ID="$CL_dev_app_APP_STORE_CONNECT_API_KEY_ID"
331
+ - export GRAPHQL_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
332
+ - 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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"
333
+ - export LC_A="L=en_US.UTF-8"
334
+ - export LANG="en_US.UTF-8"
335
+ - collapseable_section_end "injectvars"
336
+ - cd app
337
+ - bundle config set --local path 'vendor/ruby'
338
+ - gem install bundler
339
+ - bundle install
340
+ - bundle exec fastlane deploy_test
341
+ - echo 'Uploading SBOM to Dependency Track'
342
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://unknown-host.example.com" "__sbom.json" vex.json || true
343
+ cache:
344
+ - key:
345
+ files:
346
+ - app/Gemfile.lock
347
+ policy: pull-push
348
+ paths:
349
+ - app/vendor
350
+ rules:
351
+ - when: never
352
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
353
+ - when: on_success
354
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
355
+ needs:
356
+ - job: app ๐Ÿ‘ฎ lint
357
+ artifacts: false
358
+ - job: 'app ๐Ÿ”จ app | dev '
359
+ artifacts: true
360
+ - job: app ๐Ÿงช test
361
+ artifacts: false
362
+ - job: 'app ๐Ÿงพ sbom | dev '
363
+ artifacts: true
364
+ - job: app ๐Ÿ›ก audit
365
+ artifacts: false
366
+ retry: *a1
367
+ interruptible: true
368
+ allow_failure: false
369
+ 'app ๐Ÿ”จ app | review ':
370
+ stage: build
371
+ tags:
372
+ - mac-runner
373
+ image: path/to/docker/jobs-default:the-version
374
+ variables:
375
+ KUBERNETES_CPU_REQUEST: '0.45'
376
+ KUBERNETES_MEMORY_REQUEST: 1Gi
377
+ KUBERNETES_MEMORY_LIMIT: 4Gi
378
+ script:
379
+ - collapseable_section_start "injectvars" "Injecting variables"
380
+ - export ENV_SHORT="review"
381
+ - export APP_DIR="app"
382
+ - export ENV_TYPE="review"
383
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
384
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
385
+ - 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")"
386
+ - export HOSTNAME="unknown-host.example.com"
387
+ - export ROOT_URL="https://unknown-host.example.com"
388
+ - export HOSTNAME_INTERNAL="unknown-host.example.com"
389
+ - export ROOT_URL_INTERNAL="https://unknown-host.example.com"
390
+ - export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_review_app_APP_STORE_CONNECT_API_KEY_CONTENT"
391
+ - export APP_STORE_CONNECT_ISSUER_ID="$CL_review_app_APP_STORE_CONNECT_ISSUER_ID"
392
+ - export APP_STORE_CONNECT_API_KEY_ID="$CL_review_app_APP_STORE_CONNECT_API_KEY_ID"
393
+ - export GRAPHQL_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)}')/graphql"
394
+ - 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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"
395
+ - export LC_A="L=en_US.UTF-8"
396
+ - export LANG="en_US.UTF-8"
397
+ - collapseable_section_end "injectvars"
398
+ - collapseable_section_start "write-dotenv-app" "write dot env for app"
399
+ - |-
400
+ cat <<EOF > app/.env
401
+ ENV_SHORT=review
402
+ APP_DIR=app
403
+ ENV_TYPE=review
404
+ HOSTNAME=unknown-host.example.com
405
+ ROOT_URL=https://unknown-host.example.com
406
+ HOSTNAME_INTERNAL=unknown-host.example.com
407
+ ROOT_URL_INTERNAL=https://unknown-host.example.com
408
+ APP_STORE_CONNECT_API_KEY_CONTENT=$(printf %s "$CL_review_app_APP_STORE_CONNECT_API_KEY_CONTENT" | escapeForDotEnv)
409
+ APP_STORE_CONNECT_ISSUER_ID=$(printf %s "$CL_review_app_APP_STORE_CONNECT_ISSUER_ID" | escapeForDotEnv)
410
+ APP_STORE_CONNECT_API_KEY_ID=$(printf %s "$CL_review_app_APP_STORE_CONNECT_API_KEY_ID" | escapeForDotEnv)
411
+ GRAPHQL_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)}')/graphql" | escapeForDotEnv)
412
+ _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","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
413
+ EOF
414
+ - collapseable_section_end "write-dotenv-app"
415
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json
416
+ - collapseable_section_start "nodeinstall" "Ensure node version"
417
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
418
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
419
+ - collapseable_section_end "nodeinstall"
420
+ - cd app
421
+ - collapseable_section_start "nodeinstall" "Ensure node version"
422
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
423
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
424
+ - collapseable_section_end "nodeinstall"
425
+ - collapseable_section_start "yarninstall" "Yarn install"
426
+ - yarn install --immutable
427
+ - collapseable_section_end "yarninstall"
428
+ - bundle config set --local path 'vendor/ruby'
429
+ - gem install bundler
430
+ - bundle install
431
+ - bundle exec pod install --project-directory=ios
432
+ - bundle exec fastlane build
433
+ cache:
434
+ - key: app-yarn
435
+ policy: pull-push
436
+ paths:
437
+ - app/.yarn
438
+ - key: app-node-modules
439
+ policy: pull-push
440
+ paths:
441
+ - app/node_modules
442
+ - key:
443
+ files:
444
+ - app/Gemfile.lock
445
+ policy: pull-push
446
+ paths:
447
+ - app/vendor
448
+ artifacts:
449
+ paths:
450
+ - app/__build_info.json
451
+ - app/.next
452
+ - app/dist
453
+ exclude:
454
+ - app/.env
455
+ expire_in: 1 day
456
+ when: always
457
+ reports: {}
458
+ rules:
459
+ - if: $CI_MERGE_REQUEST_ID
460
+ needs: []
461
+ retry: *a1
462
+ interruptible: true
463
+ 'app ๐Ÿงพ sbom | review ':
464
+ stage: build
465
+ image: aquasec/trivy:0.38.3
466
+ variables: {}
467
+ script:
468
+ - collapseable_section_start "injectvars" "Injecting variables"
469
+ - collapseable_section_end "injectvars"
470
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app
471
+ artifacts:
472
+ paths:
473
+ - __sbom.json
474
+ rules:
475
+ - if: $CI_MERGE_REQUEST_ID
476
+ needs: []
477
+ retry: *a1
478
+ interruptible: true
479
+ allow_failure: true
480
+ 'app ๐Ÿš€ Deploy | review ':
481
+ stage: deploy review
482
+ tags:
483
+ - mac-runner
484
+ image: path/to/docker/jobs-default:the-version
485
+ variables:
486
+ KUBERNETES_CPU_REQUEST: '0.22'
487
+ KUBERNETES_MEMORY_REQUEST: 200Mi
488
+ KUBERNETES_MEMORY_LIMIT: 400Mi
489
+ script:
490
+ - collapseable_section_start "injectvars" "Injecting variables"
491
+ - export ENV_SHORT="review"
492
+ - export APP_DIR="app"
493
+ - export ENV_TYPE="review"
494
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
495
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
496
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
497
+ - export HOSTNAME="unknown-host.example.com"
498
+ - export ROOT_URL="https://unknown-host.example.com"
499
+ - export HOSTNAME_INTERNAL="unknown-host.example.com"
500
+ - export ROOT_URL_INTERNAL="https://unknown-host.example.com"
501
+ - export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_review_app_APP_STORE_CONNECT_API_KEY_CONTENT"
502
+ - export APP_STORE_CONNECT_ISSUER_ID="$CL_review_app_APP_STORE_CONNECT_ISSUER_ID"
503
+ - export APP_STORE_CONNECT_API_KEY_ID="$CL_review_app_APP_STORE_CONNECT_API_KEY_ID"
504
+ - export GRAPHQL_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)}')/graphql"
505
+ - 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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"
506
+ - export LC_A="L=en_US.UTF-8"
507
+ - export LANG="en_US.UTF-8"
508
+ - collapseable_section_end "injectvars"
509
+ - cd app
510
+ - bundle config set --local path 'vendor/ruby'
511
+ - gem install bundler
512
+ - bundle install
513
+ - bundle exec fastlane deploy_test
514
+ - echo 'Uploading SBOM to Dependency Track'
515
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://unknown-host.example.com" "__sbom.json" vex.json || true
516
+ cache:
517
+ - key:
518
+ files:
519
+ - app/Gemfile.lock
520
+ policy: pull-push
521
+ paths:
522
+ - app/vendor
523
+ rules:
524
+ - when: on_success
525
+ if: $CI_MERGE_REQUEST_ID
526
+ needs:
527
+ - job: app ๐Ÿ‘ฎ lint
528
+ artifacts: false
529
+ - job: 'app ๐Ÿ”จ app | review '
530
+ artifacts: true
531
+ - job: app ๐Ÿงช test
532
+ artifacts: false
533
+ - job: 'app ๐Ÿงพ sbom | review '
534
+ artifacts: true
535
+ - job: app ๐Ÿ›ก audit
536
+ artifacts: false
537
+ retry: *a1
538
+ interruptible: true
539
+ allow_failure: false
540
+ 'app ๐Ÿ”จ app | stage ':
541
+ stage: build
542
+ tags:
543
+ - mac-runner
544
+ image: path/to/docker/jobs-default:the-version
545
+ variables:
546
+ KUBERNETES_CPU_REQUEST: '0.45'
547
+ KUBERNETES_MEMORY_REQUEST: 1Gi
548
+ KUBERNETES_MEMORY_LIMIT: 4Gi
549
+ script:
550
+ - collapseable_section_start "injectvars" "Injecting variables"
551
+ - export ENV_SHORT="stage"
552
+ - export APP_DIR="app"
553
+ - export ENV_TYPE="stage"
554
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
555
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
556
+ - 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")"
557
+ - export HOSTNAME="unknown-host.example.com"
558
+ - export ROOT_URL="https://unknown-host.example.com"
559
+ - export HOSTNAME_INTERNAL="unknown-host.example.com"
560
+ - export ROOT_URL_INTERNAL="https://unknown-host.example.com"
561
+ - export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_stage_app_APP_STORE_CONNECT_API_KEY_CONTENT"
562
+ - export APP_STORE_CONNECT_ISSUER_ID="$CL_stage_app_APP_STORE_CONNECT_ISSUER_ID"
563
+ - export APP_STORE_CONNECT_API_KEY_ID="$CL_stage_app_APP_STORE_CONNECT_API_KEY_ID"
564
+ - export GRAPHQL_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
565
+ - 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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"
566
+ - export LC_A="L=en_US.UTF-8"
567
+ - export LANG="en_US.UTF-8"
568
+ - collapseable_section_end "injectvars"
569
+ - collapseable_section_start "write-dotenv-app" "write dot env for app"
570
+ - |-
571
+ cat <<EOF > app/.env
572
+ ENV_SHORT=stage
573
+ APP_DIR=app
574
+ ENV_TYPE=stage
575
+ HOSTNAME=unknown-host.example.com
576
+ ROOT_URL=https://unknown-host.example.com
577
+ HOSTNAME_INTERNAL=unknown-host.example.com
578
+ ROOT_URL_INTERNAL=https://unknown-host.example.com
579
+ APP_STORE_CONNECT_API_KEY_CONTENT=$(printf %s "$CL_stage_app_APP_STORE_CONNECT_API_KEY_CONTENT" | escapeForDotEnv)
580
+ APP_STORE_CONNECT_ISSUER_ID=$(printf %s "$CL_stage_app_APP_STORE_CONNECT_ISSUER_ID" | escapeForDotEnv)
581
+ APP_STORE_CONNECT_API_KEY_ID=$(printf %s "$CL_stage_app_APP_STORE_CONNECT_API_KEY_ID" | escapeForDotEnv)
582
+ GRAPHQL_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | escapeForDotEnv)
583
+ _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","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
584
+ EOF
585
+ - collapseable_section_end "write-dotenv-app"
586
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json
587
+ - collapseable_section_start "nodeinstall" "Ensure node version"
588
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
589
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
590
+ - collapseable_section_end "nodeinstall"
591
+ - cd app
592
+ - collapseable_section_start "nodeinstall" "Ensure node version"
593
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
594
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
595
+ - collapseable_section_end "nodeinstall"
596
+ - collapseable_section_start "yarninstall" "Yarn install"
597
+ - yarn install --immutable
598
+ - collapseable_section_end "yarninstall"
599
+ - bundle config set --local path 'vendor/ruby'
600
+ - gem install bundler
601
+ - bundle install
602
+ - bundle exec pod install --project-directory=ios
603
+ - bundle exec fastlane build
604
+ cache:
605
+ - key: app-yarn
606
+ policy: pull-push
607
+ paths:
608
+ - app/.yarn
609
+ - key: app-node-modules
610
+ policy: pull-push
611
+ paths:
612
+ - app/node_modules
613
+ - key:
614
+ files:
615
+ - app/Gemfile.lock
616
+ policy: pull-push
617
+ paths:
618
+ - app/vendor
619
+ artifacts:
620
+ paths:
621
+ - app/__build_info.json
622
+ - app/.next
623
+ - app/dist
624
+ exclude:
625
+ - app/.env
626
+ expire_in: 1 day
627
+ when: always
628
+ reports: {}
629
+ rules:
630
+ - if: $CI_COMMIT_TAG
631
+ needs: []
632
+ retry: *a1
633
+ interruptible: true
634
+ 'app ๐Ÿงพ sbom | stage ':
635
+ stage: build
636
+ image: aquasec/trivy:0.38.3
637
+ variables: {}
638
+ script:
639
+ - collapseable_section_start "injectvars" "Injecting variables"
640
+ - collapseable_section_end "injectvars"
641
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app
642
+ artifacts:
643
+ paths:
644
+ - __sbom.json
645
+ rules:
646
+ - if: $CI_COMMIT_TAG
647
+ needs: []
648
+ retry: *a1
649
+ interruptible: true
650
+ allow_failure: true
651
+ 'app ๐Ÿš€ Deploy | stage ':
652
+ stage: deploy stage
653
+ tags:
654
+ - mac-runner
655
+ image: path/to/docker/jobs-default:the-version
656
+ variables:
657
+ KUBERNETES_CPU_REQUEST: '0.22'
658
+ KUBERNETES_MEMORY_REQUEST: 200Mi
659
+ KUBERNETES_MEMORY_LIMIT: 400Mi
660
+ script:
661
+ - collapseable_section_start "injectvars" "Injecting variables"
662
+ - export ENV_SHORT="stage"
663
+ - export APP_DIR="app"
664
+ - export ENV_TYPE="stage"
665
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
666
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
667
+ - 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")"
668
+ - export HOSTNAME="unknown-host.example.com"
669
+ - export ROOT_URL="https://unknown-host.example.com"
670
+ - export HOSTNAME_INTERNAL="unknown-host.example.com"
671
+ - export ROOT_URL_INTERNAL="https://unknown-host.example.com"
672
+ - export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_stage_app_APP_STORE_CONNECT_API_KEY_CONTENT"
673
+ - export APP_STORE_CONNECT_ISSUER_ID="$CL_stage_app_APP_STORE_CONNECT_ISSUER_ID"
674
+ - export APP_STORE_CONNECT_API_KEY_ID="$CL_stage_app_APP_STORE_CONNECT_API_KEY_ID"
675
+ - export GRAPHQL_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
676
+ - 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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"
677
+ - export LC_A="L=en_US.UTF-8"
678
+ - export LANG="en_US.UTF-8"
679
+ - collapseable_section_end "injectvars"
680
+ - cd app
681
+ - bundle config set --local path 'vendor/ruby'
682
+ - gem install bundler
683
+ - bundle install
684
+ - bundle exec fastlane deploy_test
685
+ - echo 'Uploading SBOM to Dependency Track'
686
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://unknown-host.example.com" "__sbom.json" vex.json || true
687
+ cache:
688
+ - key:
689
+ files:
690
+ - app/Gemfile.lock
691
+ policy: pull-push
692
+ paths:
693
+ - app/vendor
694
+ rules:
695
+ - when: on_success
696
+ if: $CI_COMMIT_TAG
697
+ needs:
698
+ - job: 'app ๐Ÿ”จ app | stage '
699
+ artifacts: true
700
+ - job: 'app ๐Ÿงพ sbom | stage '
701
+ artifacts: true
702
+ retry: *a1
703
+ interruptible: true
704
+ allow_failure: false
705
+ 'app ๐Ÿ”จ app | prod ':
706
+ stage: build
707
+ tags:
708
+ - mac-runner
709
+ image: path/to/docker/jobs-default:the-version
710
+ variables:
711
+ KUBERNETES_CPU_REQUEST: '0.45'
712
+ KUBERNETES_MEMORY_REQUEST: 1Gi
713
+ KUBERNETES_MEMORY_LIMIT: 4Gi
714
+ script:
715
+ - collapseable_section_start "injectvars" "Injecting variables"
716
+ - export ENV_SHORT="prod"
717
+ - export APP_DIR="app"
718
+ - export ENV_TYPE="prod"
719
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
720
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
721
+ - 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")"
722
+ - export HOSTNAME="unknown-host.example.com"
723
+ - export ROOT_URL="https://unknown-host.example.com"
724
+ - export HOSTNAME_INTERNAL="unknown-host.example.com"
725
+ - export ROOT_URL_INTERNAL="https://unknown-host.example.com"
726
+ - export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_prod_app_APP_STORE_CONNECT_API_KEY_CONTENT"
727
+ - export APP_STORE_CONNECT_ISSUER_ID="$CL_prod_app_APP_STORE_CONNECT_ISSUER_ID"
728
+ - export APP_STORE_CONNECT_API_KEY_ID="$CL_prod_app_APP_STORE_CONNECT_API_KEY_ID"
729
+ - export GRAPHQL_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
730
+ - 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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"
731
+ - export LC_A="L=en_US.UTF-8"
732
+ - export LANG="en_US.UTF-8"
733
+ - collapseable_section_end "injectvars"
734
+ - collapseable_section_start "write-dotenv-app" "write dot env for app"
735
+ - |-
736
+ cat <<EOF > app/.env
737
+ ENV_SHORT=prod
738
+ APP_DIR=app
739
+ ENV_TYPE=prod
740
+ HOSTNAME=unknown-host.example.com
741
+ ROOT_URL=https://unknown-host.example.com
742
+ HOSTNAME_INTERNAL=unknown-host.example.com
743
+ ROOT_URL_INTERNAL=https://unknown-host.example.com
744
+ APP_STORE_CONNECT_API_KEY_CONTENT=$(printf %s "$CL_prod_app_APP_STORE_CONNECT_API_KEY_CONTENT" | escapeForDotEnv)
745
+ APP_STORE_CONNECT_ISSUER_ID=$(printf %s "$CL_prod_app_APP_STORE_CONNECT_ISSUER_ID" | escapeForDotEnv)
746
+ APP_STORE_CONNECT_API_KEY_ID=$(printf %s "$CL_prod_app_APP_STORE_CONNECT_API_KEY_ID" | escapeForDotEnv)
747
+ GRAPHQL_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql" | escapeForDotEnv)
748
+ _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","APP_STORE_CONNECT_API_KEY_CONTENT","APP_STORE_CONNECT_ISSUER_ID","APP_STORE_CONNECT_API_KEY_ID","GRAPHQL_URL"]
749
+ EOF
750
+ - collapseable_section_end "write-dotenv-app"
751
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > app/__build_info.json
752
+ - collapseable_section_start "nodeinstall" "Ensure node version"
753
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
754
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
755
+ - collapseable_section_end "nodeinstall"
756
+ - cd app
757
+ - collapseable_section_start "nodeinstall" "Ensure node version"
758
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
759
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
760
+ - collapseable_section_end "nodeinstall"
761
+ - collapseable_section_start "yarninstall" "Yarn install"
762
+ - yarn install --immutable
763
+ - collapseable_section_end "yarninstall"
764
+ - bundle config set --local path 'vendor/ruby'
765
+ - gem install bundler
766
+ - bundle install
767
+ - bundle exec pod install --project-directory=ios
768
+ - bundle exec fastlane build
769
+ cache:
770
+ - key: app-yarn
771
+ policy: pull-push
772
+ paths:
773
+ - app/.yarn
774
+ - key: app-node-modules
775
+ policy: pull-push
776
+ paths:
777
+ - app/node_modules
778
+ - key:
779
+ files:
780
+ - app/Gemfile.lock
781
+ policy: pull-push
782
+ paths:
783
+ - app/vendor
784
+ artifacts:
785
+ paths:
786
+ - app/__build_info.json
787
+ - app/.next
788
+ - app/dist
789
+ exclude:
790
+ - app/.env
791
+ expire_in: 1 day
792
+ when: always
793
+ reports: {}
794
+ rules:
795
+ - if: $CI_COMMIT_TAG
796
+ needs: []
797
+ retry: *a1
798
+ interruptible: true
799
+ 'app ๐Ÿงพ sbom | prod ':
800
+ stage: build
801
+ image: aquasec/trivy:0.38.3
802
+ variables: {}
803
+ script:
804
+ - collapseable_section_start "injectvars" "Injecting variables"
805
+ - collapseable_section_end "injectvars"
806
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" app
807
+ artifacts:
808
+ paths:
809
+ - __sbom.json
810
+ rules:
811
+ - if: $CI_COMMIT_TAG
812
+ needs: []
813
+ retry: *a1
814
+ interruptible: true
815
+ allow_failure: true
816
+ 'app ๐Ÿš€ Deploy | prod ':
817
+ stage: deploy prod
818
+ tags:
819
+ - mac-runner
820
+ image: path/to/docker/jobs-default:the-version
821
+ variables:
822
+ KUBERNETES_CPU_REQUEST: '0.22'
823
+ KUBERNETES_MEMORY_REQUEST: 200Mi
824
+ KUBERNETES_MEMORY_LIMIT: 400Mi
825
+ script:
826
+ - collapseable_section_start "injectvars" "Injecting variables"
827
+ - export ENV_SHORT="prod"
828
+ - export APP_DIR="app"
829
+ - export ENV_TYPE="prod"
830
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
831
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
832
+ - 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")"
833
+ - export HOSTNAME="unknown-host.example.com"
834
+ - export ROOT_URL="https://unknown-host.example.com"
835
+ - export HOSTNAME_INTERNAL="unknown-host.example.com"
836
+ - export ROOT_URL_INTERNAL="https://unknown-host.example.com"
837
+ - export APP_STORE_CONNECT_API_KEY_CONTENT="$CL_prod_app_APP_STORE_CONNECT_API_KEY_CONTENT"
838
+ - export APP_STORE_CONNECT_ISSUER_ID="$CL_prod_app_APP_STORE_CONNECT_ISSUER_ID"
839
+ - export APP_STORE_CONNECT_API_KEY_ID="$CL_prod_app_APP_STORE_CONNECT_API_KEY_ID"
840
+ - export GRAPHQL_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')/graphql"
841
+ - 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\\",\\"APP_STORE_CONNECT_API_KEY_CONTENT\\",\\"APP_STORE_CONNECT_ISSUER_ID\\",\\"APP_STORE_CONNECT_API_KEY_ID\\",\\"GRAPHQL_URL\\"]"
842
+ - export LC_A="L=en_US.UTF-8"
843
+ - export LANG="en_US.UTF-8"
844
+ - collapseable_section_end "injectvars"
845
+ - cd app
846
+ - bundle config set --local path 'vendor/ruby'
847
+ - gem install bundler
848
+ - bundle install
849
+ - bundle exec fastlane deploy_test
850
+ - echo 'Uploading SBOM to Dependency Track'
851
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "https://unknown-host.example.com" "__sbom.json" vex.json || true
852
+ cache:
853
+ - key:
854
+ files:
855
+ - app/Gemfile.lock
856
+ policy: pull-push
857
+ paths:
858
+ - app/vendor
859
+ rules:
860
+ - when: manual
861
+ if: $CI_COMMIT_TAG
862
+ needs:
863
+ - job: 'app ๐Ÿ”จ app | prod '
864
+ artifacts: true
865
+ - job: 'app ๐Ÿงพ sbom | prod '
866
+ artifacts: true
867
+ retry: *a1
868
+ interruptible: true
869
+ allow_failure: true
870
+ api ๐Ÿ›ก audit:
871
+ stage: test
872
+ image: path/to/docker/jobs-default:the-version
873
+ variables:
874
+ KUBERNETES_CPU_REQUEST: '0.45'
875
+ KUBERNETES_MEMORY_REQUEST: 1Gi
876
+ KUBERNETES_MEMORY_LIMIT: 4Gi
877
+ script:
878
+ - collapseable_section_start "injectvars" "Injecting variables"
879
+ - export APP_PATH="api"
880
+ - collapseable_section_end "injectvars"
881
+ - cd api
882
+ - yarn npm audit --environment production
883
+ rules:
884
+ - when: never
885
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
886
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
887
+ - if: $CI_MERGE_REQUEST_ID
888
+ needs: []
889
+ retry: *a1
890
+ interruptible: true
891
+ allow_failure: true
892
+ api ๐Ÿ‘ฎ lint:
893
+ stage: test
894
+ image: path/to/docker/jobs-default:the-version
895
+ variables:
896
+ KUBERNETES_CPU_REQUEST: '0.45'
897
+ KUBERNETES_MEMORY_REQUEST: 1Gi
898
+ KUBERNETES_MEMORY_LIMIT: 4Gi
899
+ script:
900
+ - collapseable_section_start "injectvars" "Injecting variables"
901
+ - export APP_PATH="api"
902
+ - collapseable_section_end "injectvars"
903
+ - collapseable_section_start "nodeinstall" "Ensure node version"
904
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
905
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
906
+ - collapseable_section_end "nodeinstall"
907
+ - cd api
908
+ - collapseable_section_start "nodeinstall" "Ensure node version"
909
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
910
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
911
+ - collapseable_section_end "nodeinstall"
912
+ - collapseable_section_start "yarninstall" "Yarn install"
913
+ - yarn install --immutable
914
+ - collapseable_section_end "yarninstall"
915
+ - yarn lint
916
+ cache:
917
+ - key: api-yarn
918
+ policy: pull-push
919
+ paths:
920
+ - api/.yarn
921
+ - key: api-node-modules
922
+ policy: pull-push
923
+ paths:
924
+ - api/node_modules
925
+ rules:
926
+ - when: never
927
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
928
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
929
+ - if: $CI_MERGE_REQUEST_ID
930
+ needs: []
931
+ retry: *a1
932
+ interruptible: true
933
+ api ๐Ÿงช test:
934
+ stage: test
935
+ image: path/to/docker/jobs-testing-chrome:the-version
936
+ variables:
937
+ KUBERNETES_CPU_REQUEST: '0.45'
938
+ KUBERNETES_MEMORY_REQUEST: 1Gi
939
+ KUBERNETES_MEMORY_LIMIT: 4Gi
940
+ script:
941
+ - collapseable_section_start "injectvars" "Injecting variables"
942
+ - export APP_PATH="api"
943
+ - collapseable_section_end "injectvars"
944
+ - collapseable_section_start "nodeinstall" "Ensure node version"
945
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
946
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
947
+ - collapseable_section_end "nodeinstall"
948
+ - cd api
949
+ - collapseable_section_start "nodeinstall" "Ensure node version"
950
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
951
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
952
+ - collapseable_section_end "nodeinstall"
953
+ - collapseable_section_start "yarninstall" "Yarn install"
954
+ - yarn install --immutable
955
+ - collapseable_section_end "yarninstall"
956
+ - yarn test
957
+ cache:
958
+ - key: api-yarn
959
+ policy: pull-push
960
+ paths:
961
+ - api/.yarn
962
+ - key: api-node-modules
963
+ policy: pull-push
964
+ paths:
965
+ - api/node_modules
966
+ rules:
967
+ - when: never
968
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
969
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
970
+ - if: $CI_MERGE_REQUEST_ID
971
+ needs: []
972
+ retry: *a1
973
+ interruptible: true
974
+ 'api ๐Ÿ”จ app | dev ':
975
+ stage: build
976
+ image: path/to/docker/jobs-default:the-version
977
+ variables:
978
+ KUBERNETES_CPU_REQUEST: '0.45'
979
+ KUBERNETES_MEMORY_REQUEST: 1Gi
980
+ KUBERNETES_MEMORY_LIMIT: 4Gi
981
+ script:
982
+ - collapseable_section_start "injectvars" "Injecting variables"
983
+ - export ENV_SHORT="dev"
984
+ - export APP_DIR="api"
985
+ - export ENV_TYPE="dev"
986
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
987
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
988
+ - 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")"
989
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
990
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
991
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
992
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
993
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
994
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
995
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
996
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
997
+ - 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\\"]"
998
+ - collapseable_section_end "injectvars"
999
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
1000
+ - |-
1001
+ cat <<EOF > api/.env
1002
+ ENV_SHORT=dev
1003
+ APP_DIR=api
1004
+ ENV_TYPE=dev
1005
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1006
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1007
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1008
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1009
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
1010
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
1011
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1012
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1013
+ _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"]
1014
+ EOF
1015
+ - collapseable_section_end "write-dotenv-api"
1016
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1017
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1018
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1019
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1020
+ - collapseable_section_end "nodeinstall"
1021
+ - cd api
1022
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1023
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1024
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1025
+ - collapseable_section_end "nodeinstall"
1026
+ - collapseable_section_start "yarninstall" "Yarn install"
1027
+ - yarn install --immutable
1028
+ - collapseable_section_end "yarninstall"
1029
+ - yarn build
1030
+ cache:
1031
+ - key: api-yarn
1032
+ policy: pull-push
1033
+ paths:
1034
+ - api/.yarn
1035
+ - key: api-node-modules
1036
+ policy: pull-push
1037
+ paths:
1038
+ - api/node_modules
1039
+ artifacts:
1040
+ paths:
1041
+ - api/__build_info.json
1042
+ - api/.next
1043
+ - api/dist
1044
+ exclude:
1045
+ - api/.env
1046
+ expire_in: 1 day
1047
+ when: always
1048
+ reports: {}
1049
+ rules:
1050
+ - when: never
1051
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1052
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1053
+ needs: []
1054
+ retry: *a1
1055
+ interruptible: true
1056
+ 'api ๐Ÿ”จ docker | dev ':
1057
+ stage: build
1058
+ image: path/to/docker/docker-build:the-version
1059
+ services:
1060
+ - name: docker:24.0.6-dind
1061
+ command:
1062
+ - --tls=false
1063
+ - --registry-mirror=https://mirror.gcr.io
1064
+ variables:
1065
+ DOCKER_HOST: tcp://0.0.0.0:2375
1066
+ DOCKER_TLS_CERTDIR: ''
1067
+ DOCKER_DRIVER: overlay2
1068
+ DOCKER_BUILDKIT: '1'
1069
+ KUBERNETES_CPU_REQUEST: '0.45'
1070
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1071
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1072
+ script:
1073
+ - collapseable_section_start "injectvars" "Injecting variables"
1074
+ - export APP_DIR="api"
1075
+ - export DOCKER_BUILD_CONTEXT="."
1076
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1077
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api"
1078
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
1079
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1080
+ - |-
1081
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1082
+ RUN yarn plugin import workspace-tools
1083
+ RUN yarn workspaces focus --production && yarn rebuild"
1084
+ - |-
1085
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1086
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1087
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1088
+ COPY --chown=node:node .yarn /app/.yarn"
1089
+ - collapseable_section_end "injectvars"
1090
+ - ensureNodeDockerfile
1091
+ - collapseable_section_start "docker-login" "Docker Login"
1092
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
1093
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1094
+ - collapseable_section_end "docker-login"
1095
+ - collapseable_section_start "docker-build" "Docker build"
1096
+ - 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
1097
+ - collapseable_section_end "docker-build"
1098
+ - collapseable_section_start "docker-push" "Docker push and tag"
1099
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1100
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1101
+ - docker push $DOCKER_CACHE_IMAGE
1102
+ - collapseable_section_end "docker-push"
1103
+ cache:
1104
+ - key: api-yarn
1105
+ policy: pull
1106
+ paths:
1107
+ - api/.yarn
1108
+ rules:
1109
+ - when: never
1110
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1111
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1112
+ needs:
1113
+ - 'api ๐Ÿ”จ app | dev '
1114
+ retry: *a1
1115
+ interruptible: true
1116
+ 'api ๐Ÿงพ sbom | dev ':
1117
+ stage: build
1118
+ image: aquasec/trivy:0.38.3
1119
+ variables: {}
1120
+ script:
1121
+ - collapseable_section_start "injectvars" "Injecting variables"
1122
+ - collapseable_section_end "injectvars"
1123
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1124
+ artifacts:
1125
+ paths:
1126
+ - __sbom.json
1127
+ rules:
1128
+ - when: never
1129
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1130
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1131
+ needs: []
1132
+ retry: *a1
1133
+ interruptible: true
1134
+ allow_failure: true
1135
+ 'api ๐Ÿš€ Deploy | dev ':
1136
+ stage: deploy dev
1137
+ image: path/to/docker/gcloud:the-version
1138
+ variables:
1139
+ KUBERNETES_CPU_REQUEST: '0.22'
1140
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1141
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1142
+ script:
1143
+ - collapseable_section_start "injectvars" "Injecting variables"
1144
+ - export ENV_SHORT="dev"
1145
+ - export APP_DIR="api"
1146
+ - export ENV_TYPE="dev"
1147
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1148
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1149
+ - 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")"
1150
+ - export HOSTNAME="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1151
+ - export ROOT_URL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1152
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1153
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1154
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1155
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1156
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_dev_api_GCLOUD_DEPLOY_credentialsKey"
1157
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix"
1158
+ - 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\\"]"
1159
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1160
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api"
1161
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
1162
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1163
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1164
+ - collapseable_section_end "injectvars"
1165
+ - collapseable_section_start "prepare" "Prepare..."
1166
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
1167
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1168
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1169
+ - collapseable_section_end "prepare"
1170
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1171
+ - |
1172
+ cat > ____envvars.yaml <<EOF
1173
+ ENV_SHORT: |-
1174
+ dev
1175
+ APP_DIR: |-
1176
+ api
1177
+ ENV_TYPE: |-
1178
+ dev
1179
+ BUILD_INFO_BUILD_ID: |-
1180
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1181
+ BUILD_INFO_BUILD_TIME: |-
1182
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1183
+ BUILD_INFO_CURRENT_VERSION: |-
1184
+ $(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/^/ /')
1185
+ HOSTNAME: |-
1186
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1187
+ ROOT_URL: |-
1188
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1189
+ HOSTNAME_INTERNAL: |-
1190
+ $(printf %s "$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1191
+ ROOT_URL_INTERNAL: |-
1192
+ $(printf %s "https://$(printf %s "pan-test-app-dev-api-$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1193
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1194
+ asdf
1195
+ DEPLOY_CLOUD_RUN_REGION: |-
1196
+ asia-east1
1197
+ GCLOUD_RUN_canonicalHostSuffix: |-
1198
+ $(printf %s "$CL_dev_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1199
+ _ALL_ENV_VAR_KEYS: |-
1200
+ ["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"]
1201
+
1202
+ EOF
1203
+ - collapseable_section_end "writeenvvars"
1204
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1205
+ - gcloud run deploy pan-test-app-dev-api --command="yarn,start" --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
1206
+ - collapseable_section_end "deploy"
1207
+ - collapseable_section_start "cleanup" "Cleanup"
1208
+ - 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
1209
+ - 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
1210
+ - 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
1211
+ - collapseable_section_end "cleanup"
1212
+ - echo 'Uploading SBOM to Dependency Track'
1213
+ - /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
1214
+ - 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
1215
+ environment:
1216
+ name: dev/api
1217
+ url: $CL_GITLAB_ENVIRONMENT_URL
1218
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | dev '
1219
+ auto_stop_in: 4 weeks
1220
+ artifacts:
1221
+ reports:
1222
+ dotenv: gitlab_environment.env
1223
+ rules:
1224
+ - when: never
1225
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1226
+ - when: on_success
1227
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1228
+ needs:
1229
+ - job: api ๐Ÿ‘ฎ lint
1230
+ artifacts: false
1231
+ - job: 'api ๐Ÿ”จ app | dev '
1232
+ artifacts: false
1233
+ - job: 'api ๐Ÿ”จ docker | dev '
1234
+ artifacts: false
1235
+ - job: api ๐Ÿงช test
1236
+ artifacts: false
1237
+ - job: 'api ๐Ÿงพ sbom | dev '
1238
+ artifacts: true
1239
+ - job: api ๐Ÿ›ก audit
1240
+ artifacts: false
1241
+ retry: *a1
1242
+ interruptible: true
1243
+ allow_failure: false
1244
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | dev ':
1245
+ stage: stop dev
1246
+ image: path/to/docker/gcloud:the-version
1247
+ variables:
1248
+ KUBERNETES_CPU_REQUEST: '0.22'
1249
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1250
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1251
+ GIT_STRATEGY: none
1252
+ script:
1253
+ - collapseable_section_start "injectvars" "Injecting variables"
1254
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1255
+ - collapseable_section_end "injectvars"
1256
+ - set +e
1257
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_dev_api_GCLOUD_DEPLOY_credentialsKey")
1258
+ - gcloud run services delete pan-test-app-dev-api --project=asdf --region=asia-east1
1259
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/dev/api --quiet --delete-tags
1260
+ - 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
1261
+ - echo 'Disabling component in Dependency Track'
1262
+ - /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
1263
+ - set -e
1264
+ - 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
1265
+ environment:
1266
+ name: dev/api
1267
+ url: $CL_GITLAB_ENVIRONMENT_URL
1268
+ action: stop
1269
+ artifacts:
1270
+ reports:
1271
+ dotenv: gitlab_environment.env
1272
+ rules:
1273
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1274
+ when: on_success
1275
+ - when: never
1276
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1277
+ - when: manual
1278
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1279
+ needs: []
1280
+ retry: *a1
1281
+ interruptible: true
1282
+ allow_failure: true
1283
+ 'api ๐Ÿ”จ app | review ':
1284
+ stage: build
1285
+ image: path/to/docker/jobs-default:the-version
1286
+ variables:
1287
+ KUBERNETES_CPU_REQUEST: '0.45'
1288
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1289
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1290
+ script:
1291
+ - collapseable_section_start "injectvars" "Injecting variables"
1292
+ - export ENV_SHORT="review"
1293
+ - export APP_DIR="api"
1294
+ - export ENV_TYPE="review"
1295
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1296
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1297
+ - 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")"
1298
+ - 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)}')"
1299
+ - 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)}')"
1300
+ - 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)}')"
1301
+ - 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)}')"
1302
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1303
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1304
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
1305
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
1306
+ - 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\\"]"
1307
+ - collapseable_section_end "injectvars"
1308
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
1309
+ - |-
1310
+ cat <<EOF > api/.env
1311
+ ENV_SHORT=review
1312
+ APP_DIR=api
1313
+ ENV_TYPE=review
1314
+ 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)
1315
+ 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)
1316
+ 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)
1317
+ 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)
1318
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
1319
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
1320
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_review_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1321
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1322
+ _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"]
1323
+ EOF
1324
+ - collapseable_section_end "write-dotenv-api"
1325
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1326
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1327
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1328
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1329
+ - collapseable_section_end "nodeinstall"
1330
+ - cd api
1331
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1332
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1333
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1334
+ - collapseable_section_end "nodeinstall"
1335
+ - collapseable_section_start "yarninstall" "Yarn install"
1336
+ - yarn install --immutable
1337
+ - collapseable_section_end "yarninstall"
1338
+ - yarn build
1339
+ cache:
1340
+ - key: api-yarn
1341
+ policy: pull-push
1342
+ paths:
1343
+ - api/.yarn
1344
+ - key: api-node-modules
1345
+ policy: pull-push
1346
+ paths:
1347
+ - api/node_modules
1348
+ artifacts:
1349
+ paths:
1350
+ - api/__build_info.json
1351
+ - api/.next
1352
+ - api/dist
1353
+ exclude:
1354
+ - api/.env
1355
+ expire_in: 1 day
1356
+ when: always
1357
+ reports: {}
1358
+ rules:
1359
+ - if: $CI_MERGE_REQUEST_ID
1360
+ needs: []
1361
+ retry: *a1
1362
+ interruptible: true
1363
+ 'api ๐Ÿ”จ docker | review ':
1364
+ stage: build
1365
+ image: path/to/docker/docker-build:the-version
1366
+ services:
1367
+ - name: docker:24.0.6-dind
1368
+ command:
1369
+ - --tls=false
1370
+ - --registry-mirror=https://mirror.gcr.io
1371
+ variables:
1372
+ DOCKER_HOST: tcp://0.0.0.0:2375
1373
+ DOCKER_TLS_CERTDIR: ''
1374
+ DOCKER_DRIVER: overlay2
1375
+ DOCKER_BUILDKIT: '1'
1376
+ KUBERNETES_CPU_REQUEST: '0.45'
1377
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1378
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1379
+ script:
1380
+ - collapseable_section_start "injectvars" "Injecting variables"
1381
+ - export APP_DIR="api"
1382
+ - export DOCKER_BUILD_CONTEXT="."
1383
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1384
+ - 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"; })"
1385
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
1386
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1387
+ - |-
1388
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1389
+ RUN yarn plugin import workspace-tools
1390
+ RUN yarn workspaces focus --production && yarn rebuild"
1391
+ - |-
1392
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1393
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1394
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1395
+ COPY --chown=node:node .yarn /app/.yarn"
1396
+ - collapseable_section_end "injectvars"
1397
+ - ensureNodeDockerfile
1398
+ - collapseable_section_start "docker-login" "Docker Login"
1399
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
1400
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1401
+ - collapseable_section_end "docker-login"
1402
+ - collapseable_section_start "docker-build" "Docker build"
1403
+ - 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
1404
+ - collapseable_section_end "docker-build"
1405
+ - collapseable_section_start "docker-push" "Docker push and tag"
1406
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1407
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1408
+ - docker push $DOCKER_CACHE_IMAGE
1409
+ - collapseable_section_end "docker-push"
1410
+ cache:
1411
+ - key: api-yarn
1412
+ policy: pull
1413
+ paths:
1414
+ - api/.yarn
1415
+ rules:
1416
+ - if: $CI_MERGE_REQUEST_ID
1417
+ needs:
1418
+ - 'api ๐Ÿ”จ app | review '
1419
+ retry: *a1
1420
+ interruptible: true
1421
+ 'api ๐Ÿงพ sbom | review ':
1422
+ stage: build
1423
+ image: aquasec/trivy:0.38.3
1424
+ variables: {}
1425
+ script:
1426
+ - collapseable_section_start "injectvars" "Injecting variables"
1427
+ - collapseable_section_end "injectvars"
1428
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1429
+ artifacts:
1430
+ paths:
1431
+ - __sbom.json
1432
+ rules:
1433
+ - if: $CI_MERGE_REQUEST_ID
1434
+ needs: []
1435
+ retry: *a1
1436
+ interruptible: true
1437
+ allow_failure: true
1438
+ 'api ๐Ÿš€ Deploy | review ':
1439
+ stage: deploy review
1440
+ image: path/to/docker/gcloud:the-version
1441
+ variables:
1442
+ KUBERNETES_CPU_REQUEST: '0.22'
1443
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1444
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1445
+ script:
1446
+ - collapseable_section_start "injectvars" "Injecting variables"
1447
+ - export ENV_SHORT="review"
1448
+ - export APP_DIR="api"
1449
+ - export ENV_TYPE="review"
1450
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1451
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1452
+ - 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")"
1453
+ - 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)}')"
1454
+ - 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)}')"
1455
+ - 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)}')"
1456
+ - 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)}')"
1457
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1458
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1459
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_review_api_GCLOUD_DEPLOY_credentialsKey"
1460
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_review_api_GCLOUD_RUN_canonicalHostSuffix"
1461
+ - 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\\"]"
1462
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1463
+ - 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"; })"
1464
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
1465
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1466
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1467
+ - collapseable_section_end "injectvars"
1468
+ - collapseable_section_start "prepare" "Prepare..."
1469
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
1470
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1471
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1472
+ - collapseable_section_end "prepare"
1473
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1474
+ - |
1475
+ cat > ____envvars.yaml <<EOF
1476
+ ENV_SHORT: |-
1477
+ review
1478
+ APP_DIR: |-
1479
+ api
1480
+ ENV_TYPE: |-
1481
+ review
1482
+ BUILD_INFO_BUILD_ID: |-
1483
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1484
+ BUILD_INFO_BUILD_TIME: |-
1485
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1486
+ BUILD_INFO_CURRENT_VERSION: |-
1487
+ $(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/^/ /')
1488
+ HOSTNAME: |-
1489
+ $(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/^/ /')
1490
+ ROOT_URL: |-
1491
+ $(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/^/ /')
1492
+ HOSTNAME_INTERNAL: |-
1493
+ $(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/^/ /')
1494
+ ROOT_URL_INTERNAL: |-
1495
+ $(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/^/ /')
1496
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1497
+ asdf
1498
+ DEPLOY_CLOUD_RUN_REGION: |-
1499
+ asia-east1
1500
+ GCLOUD_RUN_canonicalHostSuffix: |-
1501
+ $(printf %s "$CL_review_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1502
+ _ALL_ENV_VAR_KEYS: |-
1503
+ ["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"]
1504
+
1505
+ EOF
1506
+ - collapseable_section_end "writeenvvars"
1507
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1508
+ - gcloud run deploy $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | awk '{print tolower($0)}') --command="yarn,start" --image=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
1509
+ - collapseable_section_end "deploy"
1510
+ - collapseable_section_start "cleanup" "Cleanup"
1511
+ - 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
1512
+ - 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
1513
+ - 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
1514
+ - set +e
1515
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
1516
+ - set -e
1517
+ - collapseable_section_end "cleanup"
1518
+ - echo 'Uploading SBOM to Dependency Track'
1519
+ - /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
1520
+ - 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
1521
+ environment:
1522
+ name: review/$CI_COMMIT_REF_NAME/api
1523
+ url: $CL_GITLAB_ENVIRONMENT_URL
1524
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | review '
1525
+ auto_stop_in: 1 week
1526
+ artifacts:
1527
+ reports:
1528
+ dotenv: gitlab_environment.env
1529
+ rules:
1530
+ - when: on_success
1531
+ if: $CI_MERGE_REQUEST_ID
1532
+ needs:
1533
+ - job: api ๐Ÿ‘ฎ lint
1534
+ artifacts: false
1535
+ - job: 'api ๐Ÿ”จ app | review '
1536
+ artifacts: false
1537
+ - job: 'api ๐Ÿ”จ docker | review '
1538
+ artifacts: false
1539
+ - job: api ๐Ÿงช test
1540
+ artifacts: false
1541
+ - job: 'api ๐Ÿงพ sbom | review '
1542
+ artifacts: true
1543
+ - job: api ๐Ÿ›ก audit
1544
+ artifacts: false
1545
+ retry: *a1
1546
+ interruptible: true
1547
+ allow_failure: false
1548
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | review ':
1549
+ stage: stop review
1550
+ image: path/to/docker/gcloud:the-version
1551
+ variables:
1552
+ KUBERNETES_CPU_REQUEST: '0.22'
1553
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1554
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1555
+ GIT_STRATEGY: none
1556
+ script:
1557
+ - collapseable_section_start "injectvars" "Injecting variables"
1558
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1559
+ - collapseable_section_end "injectvars"
1560
+ - set +e
1561
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_review_api_GCLOUD_DEPLOY_credentialsKey")
1562
+ - 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
1563
+ - 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
1564
+ - 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
1565
+ - set +e
1566
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/review/api --quiet --delete-tags
1567
+ - set -e
1568
+ - echo 'Disabling component in Dependency Track'
1569
+ - /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
1570
+ - set -e
1571
+ - 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
1572
+ environment:
1573
+ name: review/$CI_COMMIT_REF_NAME/api
1574
+ url: $CL_GITLAB_ENVIRONMENT_URL
1575
+ action: stop
1576
+ artifacts:
1577
+ reports:
1578
+ dotenv: gitlab_environment.env
1579
+ rules:
1580
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1581
+ when: on_success
1582
+ - when: manual
1583
+ if: $CI_MERGE_REQUEST_ID
1584
+ needs: []
1585
+ retry: *a1
1586
+ interruptible: true
1587
+ allow_failure: true
1588
+ 'api ๐Ÿ”จ app | stage ':
1589
+ stage: build
1590
+ image: path/to/docker/jobs-default:the-version
1591
+ variables:
1592
+ KUBERNETES_CPU_REQUEST: '0.45'
1593
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1594
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1595
+ script:
1596
+ - collapseable_section_start "injectvars" "Injecting variables"
1597
+ - export ENV_SHORT="stage"
1598
+ - export APP_DIR="api"
1599
+ - export ENV_TYPE="stage"
1600
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1601
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1602
+ - 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")"
1603
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1604
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1605
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1606
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1607
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1608
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1609
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
1610
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
1611
+ - 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\\"]"
1612
+ - collapseable_section_end "injectvars"
1613
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
1614
+ - |-
1615
+ cat <<EOF > api/.env
1616
+ ENV_SHORT=stage
1617
+ APP_DIR=api
1618
+ ENV_TYPE=stage
1619
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1620
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1621
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1622
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1623
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
1624
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
1625
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1626
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1627
+ _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"]
1628
+ EOF
1629
+ - collapseable_section_end "write-dotenv-api"
1630
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1631
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1632
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1633
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1634
+ - collapseable_section_end "nodeinstall"
1635
+ - cd api
1636
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1637
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1638
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1639
+ - collapseable_section_end "nodeinstall"
1640
+ - collapseable_section_start "yarninstall" "Yarn install"
1641
+ - yarn install --immutable
1642
+ - collapseable_section_end "yarninstall"
1643
+ - yarn build
1644
+ cache:
1645
+ - key: api-yarn
1646
+ policy: pull-push
1647
+ paths:
1648
+ - api/.yarn
1649
+ - key: api-node-modules
1650
+ policy: pull-push
1651
+ paths:
1652
+ - api/node_modules
1653
+ artifacts:
1654
+ paths:
1655
+ - api/__build_info.json
1656
+ - api/.next
1657
+ - api/dist
1658
+ exclude:
1659
+ - api/.env
1660
+ expire_in: 1 day
1661
+ when: always
1662
+ reports: {}
1663
+ rules:
1664
+ - if: $CI_COMMIT_TAG
1665
+ needs: []
1666
+ retry: *a1
1667
+ interruptible: true
1668
+ 'api ๐Ÿ”จ docker | stage ':
1669
+ stage: build
1670
+ image: path/to/docker/docker-build:the-version
1671
+ services:
1672
+ - name: docker:24.0.6-dind
1673
+ command:
1674
+ - --tls=false
1675
+ - --registry-mirror=https://mirror.gcr.io
1676
+ variables:
1677
+ DOCKER_HOST: tcp://0.0.0.0:2375
1678
+ DOCKER_TLS_CERTDIR: ''
1679
+ DOCKER_DRIVER: overlay2
1680
+ DOCKER_BUILDKIT: '1'
1681
+ KUBERNETES_CPU_REQUEST: '0.45'
1682
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1683
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1684
+ script:
1685
+ - collapseable_section_start "injectvars" "Injecting variables"
1686
+ - export APP_DIR="api"
1687
+ - export DOCKER_BUILD_CONTEXT="."
1688
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1689
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api"
1690
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
1691
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1692
+ - |-
1693
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1694
+ RUN yarn plugin import workspace-tools
1695
+ RUN yarn workspaces focus --production && yarn rebuild"
1696
+ - |-
1697
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1698
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1699
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1700
+ COPY --chown=node:node .yarn /app/.yarn"
1701
+ - collapseable_section_end "injectvars"
1702
+ - ensureNodeDockerfile
1703
+ - collapseable_section_start "docker-login" "Docker Login"
1704
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1705
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1706
+ - collapseable_section_end "docker-login"
1707
+ - collapseable_section_start "docker-build" "Docker build"
1708
+ - 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
1709
+ - collapseable_section_end "docker-build"
1710
+ - collapseable_section_start "docker-push" "Docker push and tag"
1711
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1712
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1713
+ - docker push $DOCKER_CACHE_IMAGE
1714
+ - collapseable_section_end "docker-push"
1715
+ cache:
1716
+ - key: api-yarn
1717
+ policy: pull
1718
+ paths:
1719
+ - api/.yarn
1720
+ rules:
1721
+ - if: $CI_COMMIT_TAG
1722
+ needs:
1723
+ - 'api ๐Ÿ”จ app | stage '
1724
+ retry: *a1
1725
+ interruptible: true
1726
+ 'api ๐Ÿงพ sbom | stage ':
1727
+ stage: build
1728
+ image: aquasec/trivy:0.38.3
1729
+ variables: {}
1730
+ script:
1731
+ - collapseable_section_start "injectvars" "Injecting variables"
1732
+ - collapseable_section_end "injectvars"
1733
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1734
+ artifacts:
1735
+ paths:
1736
+ - __sbom.json
1737
+ rules:
1738
+ - if: $CI_COMMIT_TAG
1739
+ needs: []
1740
+ retry: *a1
1741
+ interruptible: true
1742
+ allow_failure: true
1743
+ 'api ๐Ÿš€ Deploy | stage ':
1744
+ stage: deploy stage
1745
+ image: path/to/docker/gcloud:the-version
1746
+ variables:
1747
+ KUBERNETES_CPU_REQUEST: '0.22'
1748
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1749
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1750
+ script:
1751
+ - collapseable_section_start "injectvars" "Injecting variables"
1752
+ - export ENV_SHORT="stage"
1753
+ - export APP_DIR="api"
1754
+ - export ENV_TYPE="stage"
1755
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1756
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1757
+ - 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")"
1758
+ - export HOSTNAME="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1759
+ - export ROOT_URL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1760
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1761
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1762
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1763
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1764
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_stage_api_GCLOUD_DEPLOY_credentialsKey"
1765
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix"
1766
+ - 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\\"]"
1767
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1768
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api"
1769
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
1770
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1771
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1772
+ - collapseable_section_end "injectvars"
1773
+ - collapseable_section_start "prepare" "Prepare..."
1774
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1775
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
1776
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
1777
+ - collapseable_section_end "prepare"
1778
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
1779
+ - |
1780
+ cat > ____envvars.yaml <<EOF
1781
+ ENV_SHORT: |-
1782
+ stage
1783
+ APP_DIR: |-
1784
+ api
1785
+ ENV_TYPE: |-
1786
+ stage
1787
+ BUILD_INFO_BUILD_ID: |-
1788
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1789
+ BUILD_INFO_BUILD_TIME: |-
1790
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1791
+ BUILD_INFO_CURRENT_VERSION: |-
1792
+ $(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/^/ /')
1793
+ HOSTNAME: |-
1794
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1795
+ ROOT_URL: |-
1796
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1797
+ HOSTNAME_INTERNAL: |-
1798
+ $(printf %s "$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1799
+ ROOT_URL_INTERNAL: |-
1800
+ $(printf %s "https://$(printf %s "pan-test-app-stage-api-$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
1801
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
1802
+ asdf
1803
+ DEPLOY_CLOUD_RUN_REGION: |-
1804
+ asia-east1
1805
+ GCLOUD_RUN_canonicalHostSuffix: |-
1806
+ $(printf %s "$CL_stage_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
1807
+ _ALL_ENV_VAR_KEYS: |-
1808
+ ["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"]
1809
+
1810
+ EOF
1811
+ - collapseable_section_end "writeenvvars"
1812
+ - collapseable_section_start "deploy" "Deploy to cloud run"
1813
+ - gcloud run deploy pan-test-app-stage-api --command="yarn,start" --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
1814
+ - collapseable_section_end "deploy"
1815
+ - collapseable_section_start "cleanup" "Cleanup"
1816
+ - 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
1817
+ - 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
1818
+ - 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
1819
+ - collapseable_section_end "cleanup"
1820
+ - echo 'Uploading SBOM to Dependency Track'
1821
+ - /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
1822
+ - 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
1823
+ environment:
1824
+ name: stage/api
1825
+ url: $CL_GITLAB_ENVIRONMENT_URL
1826
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | stage '
1827
+ artifacts:
1828
+ reports:
1829
+ dotenv: gitlab_environment.env
1830
+ rules:
1831
+ - when: on_success
1832
+ if: $CI_COMMIT_TAG
1833
+ needs:
1834
+ - job: 'api ๐Ÿ”จ app | stage '
1835
+ artifacts: false
1836
+ - job: 'api ๐Ÿ”จ docker | stage '
1837
+ artifacts: false
1838
+ - job: 'api ๐Ÿงพ sbom | stage '
1839
+ artifacts: true
1840
+ retry: *a1
1841
+ interruptible: true
1842
+ allow_failure: false
1843
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | stage ':
1844
+ stage: stop stage
1845
+ image: path/to/docker/gcloud:the-version
1846
+ variables:
1847
+ KUBERNETES_CPU_REQUEST: '0.22'
1848
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1849
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1850
+ GIT_STRATEGY: none
1851
+ script:
1852
+ - collapseable_section_start "injectvars" "Injecting variables"
1853
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
1854
+ - collapseable_section_end "injectvars"
1855
+ - set +e
1856
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_stage_api_GCLOUD_DEPLOY_credentialsKey")
1857
+ - gcloud run services delete pan-test-app-stage-api --project=asdf --region=asia-east1
1858
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/stage/api --quiet --delete-tags
1859
+ - 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
1860
+ - echo 'Disabling component in Dependency Track'
1861
+ - /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
1862
+ - set -e
1863
+ - 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
1864
+ environment:
1865
+ name: stage/api
1866
+ url: $CL_GITLAB_ENVIRONMENT_URL
1867
+ action: stop
1868
+ artifacts:
1869
+ reports:
1870
+ dotenv: gitlab_environment.env
1871
+ rules:
1872
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1873
+ when: on_success
1874
+ - when: manual
1875
+ if: $CI_COMMIT_TAG
1876
+ needs: []
1877
+ retry: *a1
1878
+ interruptible: true
1879
+ allow_failure: true
1880
+ 'api ๐Ÿ”จ app | prod ':
1881
+ stage: build
1882
+ image: path/to/docker/jobs-default:the-version
1883
+ variables:
1884
+ KUBERNETES_CPU_REQUEST: '0.45'
1885
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1886
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1887
+ script:
1888
+ - collapseable_section_start "injectvars" "Injecting variables"
1889
+ - export ENV_SHORT="prod"
1890
+ - export APP_DIR="api"
1891
+ - export ENV_TYPE="prod"
1892
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1893
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1894
+ - 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")"
1895
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1896
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1897
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1898
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
1899
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
1900
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
1901
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
1902
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
1903
+ - 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\\"]"
1904
+ - collapseable_section_end "injectvars"
1905
+ - collapseable_section_start "write-dotenv-api" "write dot env for api"
1906
+ - |-
1907
+ cat <<EOF > api/.env
1908
+ ENV_SHORT=prod
1909
+ APP_DIR=api
1910
+ ENV_TYPE=prod
1911
+ HOSTNAME=$(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1912
+ ROOT_URL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1913
+ HOSTNAME_INTERNAL=$(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1914
+ ROOT_URL_INTERNAL=$(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | escapeForDotEnv)
1915
+ DEPLOY_CLOUD_RUN_PROJECT_ID=asdf
1916
+ DEPLOY_CLOUD_RUN_REGION=asia-east1
1917
+ GCLOUD_DEPLOY_credentialsKey=$(printf %s "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey" | escapeForDotEnv)
1918
+ GCLOUD_RUN_canonicalHostSuffix=$(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | escapeForDotEnv)
1919
+ _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"]
1920
+ EOF
1921
+ - collapseable_section_end "write-dotenv-api"
1922
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1923
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1924
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1925
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1926
+ - collapseable_section_end "nodeinstall"
1927
+ - cd api
1928
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1929
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1930
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1931
+ - collapseable_section_end "nodeinstall"
1932
+ - collapseable_section_start "yarninstall" "Yarn install"
1933
+ - yarn install --immutable
1934
+ - collapseable_section_end "yarninstall"
1935
+ - yarn build
1936
+ cache:
1937
+ - key: api-yarn
1938
+ policy: pull-push
1939
+ paths:
1940
+ - api/.yarn
1941
+ - key: api-node-modules
1942
+ policy: pull-push
1943
+ paths:
1944
+ - api/node_modules
1945
+ artifacts:
1946
+ paths:
1947
+ - api/__build_info.json
1948
+ - api/.next
1949
+ - api/dist
1950
+ exclude:
1951
+ - api/.env
1952
+ expire_in: 1 day
1953
+ when: always
1954
+ reports: {}
1955
+ rules:
1956
+ - if: $CI_COMMIT_TAG
1957
+ needs: []
1958
+ retry: *a1
1959
+ interruptible: true
1960
+ 'api ๐Ÿ”จ docker | prod ':
1961
+ stage: build
1962
+ image: path/to/docker/docker-build:the-version
1963
+ services:
1964
+ - name: docker:24.0.6-dind
1965
+ command:
1966
+ - --tls=false
1967
+ - --registry-mirror=https://mirror.gcr.io
1968
+ variables:
1969
+ DOCKER_HOST: tcp://0.0.0.0:2375
1970
+ DOCKER_TLS_CERTDIR: ''
1971
+ DOCKER_DRIVER: overlay2
1972
+ DOCKER_BUILDKIT: '1'
1973
+ KUBERNETES_CPU_REQUEST: '0.45'
1974
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1975
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1976
+ script:
1977
+ - collapseable_section_start "injectvars" "Injecting variables"
1978
+ - export APP_DIR="api"
1979
+ - export DOCKER_BUILD_CONTEXT="."
1980
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
1981
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api"
1982
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
1983
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1984
+ - |-
1985
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1986
+ RUN yarn plugin import workspace-tools
1987
+ RUN yarn workspaces focus --production && yarn rebuild"
1988
+ - |-
1989
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1990
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1991
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1992
+ COPY --chown=node:node .yarn /app/.yarn"
1993
+ - collapseable_section_end "injectvars"
1994
+ - ensureNodeDockerfile
1995
+ - collapseable_section_start "docker-login" "Docker Login"
1996
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
1997
+ - gcloud auth configure-docker asia-east1-docker.pkg.dev
1998
+ - collapseable_section_end "docker-login"
1999
+ - collapseable_section_start "docker-build" "Docker build"
2000
+ - 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
2001
+ - collapseable_section_end "docker-build"
2002
+ - collapseable_section_start "docker-push" "Docker push and tag"
2003
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2004
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2005
+ - docker push $DOCKER_CACHE_IMAGE
2006
+ - collapseable_section_end "docker-push"
2007
+ cache:
2008
+ - key: api-yarn
2009
+ policy: pull
2010
+ paths:
2011
+ - api/.yarn
2012
+ rules:
2013
+ - if: $CI_COMMIT_TAG
2014
+ needs:
2015
+ - 'api ๐Ÿ”จ app | prod '
2016
+ retry: *a1
2017
+ interruptible: true
2018
+ 'api ๐Ÿงพ sbom | prod ':
2019
+ stage: build
2020
+ image: aquasec/trivy:0.38.3
2021
+ variables: {}
2022
+ script:
2023
+ - collapseable_section_start "injectvars" "Injecting variables"
2024
+ - collapseable_section_end "injectvars"
2025
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
2026
+ artifacts:
2027
+ paths:
2028
+ - __sbom.json
2029
+ rules:
2030
+ - if: $CI_COMMIT_TAG
2031
+ needs: []
2032
+ retry: *a1
2033
+ interruptible: true
2034
+ allow_failure: true
2035
+ 'api ๐Ÿš€ Deploy | prod ':
2036
+ stage: deploy prod
2037
+ image: path/to/docker/gcloud:the-version
2038
+ variables:
2039
+ KUBERNETES_CPU_REQUEST: '0.22'
2040
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2041
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2042
+ script:
2043
+ - collapseable_section_start "injectvars" "Injecting variables"
2044
+ - export ENV_SHORT="prod"
2045
+ - export APP_DIR="api"
2046
+ - export ENV_TYPE="prod"
2047
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2048
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2049
+ - 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")"
2050
+ - export HOSTNAME="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2051
+ - export ROOT_URL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2052
+ - export HOSTNAME_INTERNAL="$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2053
+ - export ROOT_URL_INTERNAL="https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')"
2054
+ - export DEPLOY_CLOUD_RUN_PROJECT_ID="asdf"
2055
+ - export DEPLOY_CLOUD_RUN_REGION="asia-east1"
2056
+ - export GCLOUD_DEPLOY_credentialsKey="$CL_prod_api_GCLOUD_DEPLOY_credentialsKey"
2057
+ - export GCLOUD_RUN_canonicalHostSuffix="$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix"
2058
+ - 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\\"]"
2059
+ - export DOCKER_REGISTRY="asia-east1-docker.pkg.dev"
2060
+ - export DOCKER_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api"
2061
+ - export DOCKER_CACHE_IMAGE="asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/caches/api"
2062
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2063
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2064
+ - collapseable_section_end "injectvars"
2065
+ - collapseable_section_start "prepare" "Prepare..."
2066
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
2067
+ - export GCLOUD_PROJECT_NUMBER=$(gcloud projects describe asdf --format="value(projectNumber)")
2068
+ - 'echo "GCLOUD_PROJECT_NUMBER: $GCLOUD_PROJECT_NUMBER"'
2069
+ - collapseable_section_end "prepare"
2070
+ - collapseable_section_start "writeenvvars" "Write env vars to file"
2071
+ - |
2072
+ cat > ____envvars.yaml <<EOF
2073
+ ENV_SHORT: |-
2074
+ prod
2075
+ APP_DIR: |-
2076
+ api
2077
+ ENV_TYPE: |-
2078
+ prod
2079
+ BUILD_INFO_BUILD_ID: |-
2080
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2081
+ BUILD_INFO_BUILD_TIME: |-
2082
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2083
+ BUILD_INFO_CURRENT_VERSION: |-
2084
+ $(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/^/ /')
2085
+ HOSTNAME: |-
2086
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2087
+ ROOT_URL: |-
2088
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2089
+ HOSTNAME_INTERNAL: |-
2090
+ $(printf %s "$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2091
+ ROOT_URL_INTERNAL: |-
2092
+ $(printf %s "https://$(printf %s "pan-test-app-prod-api-$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | awk '{print tolower($0)}')" | sed '1!s/^/ /')
2093
+ DEPLOY_CLOUD_RUN_PROJECT_ID: |-
2094
+ asdf
2095
+ DEPLOY_CLOUD_RUN_REGION: |-
2096
+ asia-east1
2097
+ GCLOUD_RUN_canonicalHostSuffix: |-
2098
+ $(printf %s "$CL_prod_api_GCLOUD_RUN_canonicalHostSuffix" | sed '1!s/^/ /')
2099
+ _ALL_ENV_VAR_KEYS: |-
2100
+ ["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"]
2101
+
2102
+ EOF
2103
+ - collapseable_section_end "writeenvvars"
2104
+ - collapseable_section_start "deploy" "Deploy to cloud run"
2105
+ - gcloud run deploy pan-test-app-prod-api --command="yarn,start" --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
2106
+ - collapseable_section_end "deploy"
2107
+ - collapseable_section_start "cleanup" "Cleanup"
2108
+ - 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
2109
+ - 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
2110
+ - 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
2111
+ - collapseable_section_end "cleanup"
2112
+ - echo 'Uploading SBOM to Dependency Track'
2113
+ - /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
2114
+ - 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
2115
+ environment:
2116
+ name: prod/api
2117
+ url: $CL_GITLAB_ENVIRONMENT_URL
2118
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | prod '
2119
+ artifacts:
2120
+ reports:
2121
+ dotenv: gitlab_environment.env
2122
+ rules:
2123
+ - when: manual
2124
+ if: $CI_COMMIT_TAG
2125
+ needs:
2126
+ - job: 'api ๐Ÿ”จ app | prod '
2127
+ artifacts: false
2128
+ - job: 'api ๐Ÿ”จ docker | prod '
2129
+ artifacts: false
2130
+ - job: 'api ๐Ÿงพ sbom | prod '
2131
+ artifacts: true
2132
+ retry: *a1
2133
+ interruptible: true
2134
+ allow_failure: true
2135
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | prod ':
2136
+ stage: stop prod
2137
+ image: path/to/docker/gcloud:the-version
2138
+ variables:
2139
+ KUBERNETES_CPU_REQUEST: '0.22'
2140
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2141
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2142
+ GIT_STRATEGY: none
2143
+ script:
2144
+ - collapseable_section_start "injectvars" "Injecting variables"
2145
+ - export CLOUDSDK_CORE_DISABLE_PROMPTS="1"
2146
+ - collapseable_section_end "injectvars"
2147
+ - set +e
2148
+ - gcloud auth activate-service-account --key-file=<(echo "$CL_prod_api_GCLOUD_DEPLOY_credentialsKey")
2149
+ - gcloud run services delete pan-test-app-prod-api --project=asdf --region=asia-east1
2150
+ - gcloud artifacts docker images delete asia-east1-docker.pkg.dev/asdf/catladder-deploy/pan-test-app/prod/api --quiet --delete-tags
2151
+ - 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
2152
+ - echo 'Disabling component in Dependency Track'
2153
+ - /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
2154
+ - set -e
2155
+ - 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
2156
+ environment:
2157
+ name: prod/api
2158
+ url: $CL_GITLAB_ENVIRONMENT_URL
2159
+ action: stop
2160
+ artifacts:
2161
+ reports:
2162
+ dotenv: gitlab_environment.env
2163
+ rules:
2164
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2165
+ when: on_success
2166
+ - when: manual
2167
+ if: $CI_COMMIT_TAG
2168
+ needs: []
2169
+ retry: *a1
2170
+ interruptible: true
2171
+ allow_failure: true
2172
+ create release:
2173
+ stage: release
2174
+ image: path/to/docker/semantic-release:the-version
2175
+ script:
2176
+ - semanticRelease
2177
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
2178
+ rules:
2179
+ - &a2
2180
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
2181
+ when: never
2182
+ - &a3
2183
+ if: $CI_PIPELINE_SOURCE == "schedule"
2184
+ when: never
2185
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
2186
+ when: on_success
2187
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2188
+ when: manual
2189
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
2190
+ when: manual
2191
+ โš ๏ธ force create release:
2192
+ stage: release
2193
+ image: path/to/docker/semantic-release:the-version
2194
+ script:
2195
+ - semanticRelease
2196
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
2197
+ rules:
2198
+ - *a2
2199
+ - *a3
2200
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
2201
+ when: manual
2202
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
2203
+ when: manual
2204
+ needs: []
2205
+ "
2206
+ `;