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

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