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

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