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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (639) hide show
  1. package/README.md +15 -1
  2. package/dist/bash/BashExpression.d.ts +36 -0
  3. package/dist/bash/BashExpression.js +114 -0
  4. package/dist/bash/bashEscape.d.ts +37 -0
  5. package/dist/bash/bashEscape.js +119 -0
  6. package/dist/bash/bashExpressionPerPipelineType.d.ts +6 -0
  7. package/dist/bash/bashExpressionPerPipelineType.js +11 -0
  8. package/dist/bash/bashYaml.d.ts +10 -0
  9. package/dist/bash/bashYaml.js +69 -0
  10. package/dist/bash/getInjectVarsScript.d.ts +2 -0
  11. package/dist/bash/getInjectVarsScript.js +47 -0
  12. package/dist/bash/index.d.ts +2 -0
  13. package/dist/bash/index.js +26 -0
  14. package/dist/build/artifacts/createBuildJobArtifact.d.ts +3 -0
  15. package/dist/build/artifacts/createBuildJobArtifact.js +97 -0
  16. package/dist/build/base/__tests__/createArtifactsConfig.test.js +3 -1
  17. package/dist/build/base/constants.js +4 -2
  18. package/dist/build/base/createAppBuildJob.d.ts +5 -3
  19. package/dist/build/base/createAppBuildJob.js +18 -15
  20. package/dist/build/base/createArtifactsConfig.d.ts +1 -1
  21. package/dist/build/base/createArtifactsConfig.js +3 -1
  22. package/dist/build/base/createBuildJobDefinition.d.ts +6 -0
  23. package/dist/build/base/createBuildJobDefinition.js +58 -0
  24. package/dist/build/base/index.d.ts +6 -4
  25. package/dist/build/base/index.js +17 -6
  26. package/dist/build/base/writeBuildInfo.d.ts +2 -2
  27. package/dist/build/base/writeBuildInfo.js +4 -3
  28. package/dist/build/base/writeDotEnv.d.ts +3 -2
  29. package/dist/build/base/writeDotEnv.js +30 -6
  30. package/dist/build/cache/createJobCache.d.ts +7 -0
  31. package/dist/build/cache/createJobCache.js +115 -0
  32. package/dist/build/cache/getAllCacheConfigsFromConfig.d.ts +3 -0
  33. package/dist/build/cache/getAllCacheConfigsFromConfig.js +64 -0
  34. package/dist/build/cache/transformLegacyJobCache.d.ts +3 -0
  35. package/dist/build/cache/transformLegacyJobCache.js +29 -0
  36. package/dist/build/custom/__tests__/testJob.test.js +15 -16
  37. package/dist/build/custom/buildJob.d.ts +2 -2
  38. package/dist/build/custom/buildJob.js +8 -66
  39. package/dist/build/custom/index.d.ts +2 -2
  40. package/dist/build/custom/index.js +3 -1
  41. package/dist/build/custom/testJob.d.ts +4 -4
  42. package/dist/build/custom/testJob.js +25 -20
  43. package/dist/build/docker.d.ts +37 -46
  44. package/dist/build/docker.js +65 -34
  45. package/dist/build/index.d.ts +14 -7
  46. package/dist/build/index.js +44 -17
  47. package/dist/build/node/buildJob.d.ts +8 -2
  48. package/dist/build/node/buildJob.js +39 -52
  49. package/dist/build/node/cache.d.ts +4 -5
  50. package/dist/build/node/cache.js +18 -24
  51. package/dist/build/node/constants.js +5 -3
  52. package/dist/build/node/index.d.ts +4 -4
  53. package/dist/build/node/index.js +3 -1
  54. package/dist/build/node/meteor.d.ts +2 -2
  55. package/dist/build/node/meteor.js +10 -12
  56. package/dist/build/node/testJob.d.ts +3 -2
  57. package/dist/build/node/testJob.js +29 -19
  58. package/dist/build/node/yarn.d.ts +4 -3
  59. package/dist/build/node/yarn.js +11 -12
  60. package/dist/build/rails/build.d.ts +2 -2
  61. package/dist/build/rails/build.js +13 -6
  62. package/dist/build/rails/index.d.ts +2 -2
  63. package/dist/build/rails/index.js +3 -1
  64. package/dist/build/rails/test.d.ts +2 -2
  65. package/dist/build/rails/test.js +30 -11
  66. package/dist/build/sbom.d.ts +2 -2
  67. package/dist/build/sbom.js +13 -7
  68. package/dist/build/types.d.ts +160 -47
  69. package/dist/build/types.js +10 -2
  70. package/dist/catladder-gitlab.js +129 -49
  71. package/dist/config/__tests__/configruedEnvs.test.js +3 -1
  72. package/dist/config/__tests__/getAllEnvs.test.js +79 -0
  73. package/dist/config/__tests__/getAllEnvsInAllComponents.test.d.ts +1 -0
  74. package/dist/config/__tests__/getAllEnvsInAllComponents.test.js +73 -0
  75. package/dist/config/configruedEnvs.js +3 -1
  76. package/dist/config/index.js +13 -7
  77. package/dist/config/readConfig.d.ts +2 -2
  78. package/dist/config/readConfig.js +191 -40
  79. package/dist/constants.js +5 -3
  80. package/dist/context/createAllComponentsContext.d.ts +12 -0
  81. package/dist/{pipeline/commitInfo/getCommitInfo.js โ†’ context/createAllComponentsContext.js} +35 -19
  82. package/dist/context/createComponentContext.d.ts +11 -0
  83. package/dist/context/createComponentContext.js +262 -0
  84. package/dist/context/createWorkspaceContext.d.ts +16 -0
  85. package/dist/context/createWorkspaceContext.js +173 -0
  86. package/dist/context/getBuildInfoVariables.d.ts +6 -0
  87. package/dist/context/getBuildInfoVariables.js +55 -0
  88. package/dist/context/getEnvConfig.js +21 -4
  89. package/dist/context/getEnvType.js +3 -1
  90. package/dist/context/getEnvironment.d.ts +3 -3
  91. package/dist/context/getEnvironment.js +11 -12
  92. package/dist/context/getEnvironmentContext.d.ts +7 -3
  93. package/dist/context/getEnvironmentContext.js +21 -11
  94. package/dist/context/getEnvironmentVariables.d.ts +22 -5
  95. package/dist/context/getEnvironmentVariables.js +79 -53
  96. package/dist/context/getLabels.d.ts +2 -2
  97. package/dist/context/getLabels.js +9 -7
  98. package/dist/context/getReviewSlug.d.ts +4 -0
  99. package/dist/context/getReviewSlug.js +21 -0
  100. package/dist/context/index.d.ts +2 -4
  101. package/dist/context/index.js +15 -162
  102. package/dist/context/transformJobOnlyVars.d.ts +5 -2
  103. package/dist/context/transformJobOnlyVars.js +4 -2
  104. package/dist/context/utils/envVars.d.ts +1 -1
  105. package/dist/context/utils/envVars.js +5 -2
  106. package/dist/defaults/index.js +3 -1
  107. package/dist/deploy/base/deploy.d.ts +3 -3
  108. package/dist/deploy/base/deploy.js +37 -21
  109. package/dist/deploy/base/index.d.ts +3 -5
  110. package/dist/deploy/base/index.js +3 -1
  111. package/dist/deploy/base/rollback.d.ts +3 -3
  112. package/dist/deploy/base/rollback.js +13 -9
  113. package/dist/deploy/base/stop.d.ts +3 -3
  114. package/dist/deploy/base/stop.js +16 -11
  115. package/dist/deploy/base/types.d.ts +1 -1
  116. package/dist/deploy/base/types.js +3 -1
  117. package/dist/deploy/base/variables.js +4 -2
  118. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +8 -11
  119. package/dist/deploy/cloudRun/artifactsRegistry.js +15 -14
  120. package/dist/deploy/cloudRun/cleanup.d.ts +2 -2
  121. package/dist/deploy/cloudRun/cleanup.js +3 -1
  122. package/dist/deploy/cloudRun/cloudRunRevisions.d.ts +2 -2
  123. package/dist/deploy/cloudRun/cloudRunRevisions.js +7 -6
  124. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.d.ts +8 -6
  125. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +57 -106
  126. package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +3 -3
  127. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +79 -15
  128. package/dist/deploy/cloudRun/createJobs/common.d.ts +7 -7
  129. package/dist/deploy/cloudRun/createJobs/common.js +6 -3
  130. package/dist/deploy/cloudRun/createJobs/constants.d.ts +1 -0
  131. package/dist/deploy/cloudRun/createJobs/constants.js +7 -0
  132. package/dist/deploy/cloudRun/createJobs/execute/onDeploy.d.ts +3 -0
  133. package/dist/deploy/cloudRun/createJobs/execute/onDeploy.js +115 -0
  134. package/dist/deploy/cloudRun/createJobs/execute/schedules.d.ts +3 -0
  135. package/dist/deploy/cloudRun/createJobs/execute/schedules.js +173 -0
  136. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.d.ts +2 -2
  137. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +13 -5
  138. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.d.ts +2 -2
  139. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +7 -3
  140. package/dist/deploy/cloudRun/createJobs/healthCheck.d.ts +5 -0
  141. package/dist/deploy/cloudRun/createJobs/healthCheck.js +82 -0
  142. package/dist/deploy/cloudRun/createJobs/index.d.ts +2 -2
  143. package/dist/deploy/cloudRun/createJobs/index.js +26 -12
  144. package/dist/deploy/cloudRun/createJobs/volumes.d.ts +3 -0
  145. package/dist/deploy/cloudRun/createJobs/volumes.js +58 -0
  146. package/dist/deploy/cloudRun/index.d.ts +2 -2
  147. package/dist/deploy/cloudRun/index.js +25 -13
  148. package/dist/deploy/cloudRun/utils/cloudRunExecutionUrl.d.ts +10 -0
  149. package/dist/deploy/cloudRun/utils/cloudRunExecutionUrl.js +16 -0
  150. package/dist/deploy/cloudRun/utils/createArgsString.d.ts +2 -2
  151. package/dist/deploy/cloudRun/utils/createArgsString.js +3 -1
  152. package/dist/deploy/cloudRun/utils/database.d.ts +25 -4
  153. package/dist/deploy/cloudRun/utils/database.js +49 -15
  154. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.d.ts +2 -2
  155. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +3 -1
  156. package/dist/deploy/cloudRun/utils/getJobOrServiceArgs.d.ts +2 -0
  157. package/dist/deploy/cloudRun/utils/getJobOrServiceArgs.js +12 -0
  158. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +2 -2
  159. package/dist/deploy/cloudRun/utils/getServiceName.js +3 -1
  160. package/dist/deploy/cloudRun/utils/jobName.d.ts +6 -1
  161. package/dist/deploy/cloudRun/utils/jobName.js +18 -4
  162. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +3 -1
  163. package/dist/deploy/cloudSql/utils.d.ts +2 -1
  164. package/dist/deploy/cloudSql/utils.js +7 -2
  165. package/dist/deploy/custom/deployJob.d.ts +2 -2
  166. package/dist/deploy/custom/deployJob.js +10 -9
  167. package/dist/deploy/custom/index.d.ts +2 -2
  168. package/dist/deploy/custom/index.js +3 -1
  169. package/dist/deploy/dockerTag/deployJob.d.ts +2 -2
  170. package/dist/deploy/dockerTag/deployJob.js +6 -6
  171. package/dist/deploy/dockerTag/index.d.ts +2 -2
  172. package/dist/deploy/dockerTag/index.js +3 -1
  173. package/dist/deploy/index.d.ts +10 -9
  174. package/dist/deploy/index.js +13 -7
  175. package/dist/deploy/kubernetes/additionalSecretKeys.d.ts +3 -1
  176. package/dist/deploy/kubernetes/additionalSecretKeys.js +3 -1
  177. package/dist/deploy/kubernetes/cloudSql/index.d.ts +6 -5
  178. package/dist/deploy/kubernetes/cloudSql/index.js +14 -21
  179. package/dist/deploy/kubernetes/deployJob.d.ts +2 -2
  180. package/dist/deploy/kubernetes/deployJob.js +23 -22
  181. package/dist/deploy/kubernetes/index.d.ts +2 -2
  182. package/dist/deploy/kubernetes/index.js +52 -15
  183. package/dist/deploy/kubernetes/kubeEnv.d.ts +5 -4
  184. package/dist/deploy/kubernetes/kubeEnv.js +9 -5
  185. package/dist/deploy/kubernetes/kubeValues.d.ts +5 -6
  186. package/dist/deploy/kubernetes/kubeValues.js +17 -19
  187. package/dist/deploy/kubernetes/mongodb.d.ts +2 -2
  188. package/dist/deploy/kubernetes/mongodb.js +14 -12
  189. package/dist/deploy/sbom.d.ts +4 -4
  190. package/dist/deploy/sbom.js +8 -4
  191. package/dist/deploy/types/base.d.ts +5 -5
  192. package/dist/deploy/types/base.js +3 -1
  193. package/dist/deploy/types/custom.d.ts +3 -7
  194. package/dist/deploy/types/custom.js +3 -1
  195. package/dist/deploy/types/dockerTag.d.ts +1 -1
  196. package/dist/deploy/types/dockerTag.js +3 -1
  197. package/dist/deploy/types/googleCloudRun.d.ts +291 -16
  198. package/dist/deploy/types/googleCloudRun.js +28 -1
  199. package/dist/deploy/types/index.d.ts +8 -7
  200. package/dist/deploy/types/index.js +21 -10
  201. package/dist/deploy/types/kubernetes.d.ts +21 -54
  202. package/dist/deploy/types/kubernetes.js +3 -1
  203. package/dist/deploy/utils.d.ts +2 -2
  204. package/dist/deploy/utils.js +5 -2
  205. package/dist/globalScriptFunctions/index.d.ts +14 -0
  206. package/dist/globalScriptFunctions/index.js +37 -0
  207. package/dist/index.d.ts +5 -2
  208. package/dist/index.js +18 -9
  209. package/dist/packageInfos.d.ts +4 -0
  210. package/dist/packageInfos.js +20 -0
  211. package/dist/pipeline/__tests__/getPipelineStages.test.d.ts +1 -0
  212. package/dist/pipeline/__tests__/getPipelineStages.test.js +73 -0
  213. package/dist/pipeline/createAllJobs.d.ts +16 -6
  214. package/dist/pipeline/createAllJobs.js +99 -27
  215. package/dist/pipeline/createJobsForComponent.d.ts +2 -2
  216. package/dist/pipeline/createJobsForComponent.js +9 -149
  217. package/dist/pipeline/createJobsForWorkspace.d.ts +3 -0
  218. package/dist/pipeline/createJobsForWorkspace.js +12 -0
  219. package/dist/pipeline/createMainPipeline.d.ts +3 -0
  220. package/dist/pipeline/createMainPipeline.js +283 -0
  221. package/dist/pipeline/generatePipelineFiles.d.ts +7 -0
  222. package/dist/pipeline/generatePipelineFiles.js +305 -0
  223. package/dist/pipeline/getPipelineStages.d.ts +7 -0
  224. package/dist/pipeline/getPipelineStages.js +56 -0
  225. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +11 -14
  226. package/dist/pipeline/gitlab/createGitlabJobs.js +264 -74
  227. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +9 -0
  228. package/dist/pipeline/gitlab/createGitlabPipeline.js +77 -0
  229. package/dist/pipeline/gitlab/gitlabReleaseJobs.d.ts +33 -0
  230. package/dist/pipeline/gitlab/gitlabReleaseJobs.js +25 -0
  231. package/dist/pipeline/gitlab/sortGitLabJobDefProps.d.ts +7 -0
  232. package/dist/pipeline/gitlab/sortGitLabJobDefProps.js +27 -0
  233. package/dist/pipeline/index.d.ts +3 -2
  234. package/dist/pipeline/index.js +16 -9
  235. package/dist/pipeline/packageManager.d.ts +4 -2
  236. package/dist/pipeline/packageManager.js +56 -19
  237. package/dist/pipeline/yarn/yarnUtils.d.ts +2 -2
  238. package/dist/pipeline/yarn/yarnUtils.js +18 -15
  239. package/dist/rules/index.d.ts +10 -3
  240. package/dist/rules/index.js +35 -17
  241. package/dist/runner/index.d.ts +1 -1
  242. package/dist/runner/index.js +3 -1
  243. package/dist/tsconfig.tsbuildinfo +1 -1
  244. package/dist/types/config.d.ts +54 -36
  245. package/dist/types/config.js +5 -2
  246. package/dist/types/context.d.ts +123 -38
  247. package/dist/types/context.js +12 -1
  248. package/dist/types/environmentContext.d.ts +15 -12
  249. package/dist/types/environmentContext.js +3 -1
  250. package/dist/types/gitlab-ci-yml.d.ts +30 -30
  251. package/dist/types/gitlab-ci-yml.js +3 -2
  252. package/dist/types/gitlab-types.d.ts +8 -8
  253. package/dist/types/gitlab-types.js +3 -1
  254. package/dist/types/index.d.ts +3 -1
  255. package/dist/types/index.js +16 -8
  256. package/dist/types/jobDefinition.d.ts +11 -0
  257. package/dist/types/jobDefinition.js +5 -0
  258. package/dist/types/jobs.d.ts +30 -15
  259. package/dist/types/jobs.js +3 -1
  260. package/dist/types/pipeline.d.ts +3 -3
  261. package/dist/types/pipeline.js +3 -1
  262. package/dist/types/utils.d.ts +1 -1
  263. package/dist/types/utils.js +3 -1
  264. package/dist/utils/gitlab.js +7 -2
  265. package/dist/utils/index.d.ts +2 -1
  266. package/dist/utils/index.js +10 -3
  267. package/dist/utils/jsonParse.d.ts +1 -0
  268. package/dist/utils/jsonParse.js +14 -0
  269. package/dist/utils/removeUndefined.d.ts +1 -0
  270. package/dist/utils/removeUndefined.js +36 -0
  271. package/dist/utils/writeFiles.d.ts +11 -0
  272. package/dist/{pipeline/commitInfo/getBuildId.js โ†’ utils/writeFiles.js} +39 -22
  273. package/dist/variables/VariableValue.d.ts +3 -0
  274. package/dist/variables/VariableValue.js +5 -0
  275. package/dist/variables/VariableValueContainingReferences.d.ts +24 -0
  276. package/dist/variables/VariableValueContainingReferences.js +97 -0
  277. package/dist/variables/__tests__/resolveAllReferences.test.d.ts +1 -0
  278. package/dist/variables/__tests__/resolveAllReferences.test.js +218 -0
  279. package/dist/variables/__tests__/resolveAllReferencesOnce.test.d.ts +1 -0
  280. package/dist/variables/__tests__/resolveAllReferencesOnce.test.js +171 -0
  281. package/dist/variables/__tests__/resolveReferencesOnce.test.d.ts +1 -0
  282. package/dist/variables/__tests__/resolveReferencesOnce.test.js +199 -0
  283. package/dist/variables/__tests__/variableValue.test.d.ts +1 -0
  284. package/dist/variables/__tests__/variableValue.test.js +36 -0
  285. package/dist/variables/resolveAllReferences.d.ts +3 -0
  286. package/dist/{pipeline/createChildPipeline.js โ†’ variables/resolveAllReferences.js} +44 -48
  287. package/dist/variables/resolveAllReferencesOnce.d.ts +5 -0
  288. package/dist/variables/resolveAllReferencesOnce.js +191 -0
  289. package/dist/variables/resolveReferencesOnce.d.ts +8 -0
  290. package/dist/variables/resolveReferencesOnce.js +22 -0
  291. package/examples/.test-gen-ignore +1 -0
  292. package/examples/__snapshots__/cloud-run-health-check-defaults.test.ts.snap +1394 -0
  293. package/examples/__snapshots__/cloud-run-health-check-only-startup.test.ts.snap +1394 -0
  294. package/examples/__snapshots__/cloud-run-health-check.test.ts.snap +1394 -0
  295. package/examples/__snapshots__/cloud-run-http2.test.ts.snap +1394 -0
  296. package/examples/__snapshots__/cloud-run-llama.test.ts.snap +624 -0
  297. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1394 -0
  298. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1394 -0
  299. package/examples/__snapshots__/cloud-run-nextjs.test.ts.snap +1410 -0
  300. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1394 -0
  301. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1502 -0
  302. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1394 -0
  303. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1412 -0
  304. package/examples/__snapshots__/cloud-run-service-custom-vpc-connector.test.ts.snap +1462 -0
  305. package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +1462 -0
  306. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1394 -0
  307. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1394 -0
  308. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1466 -0
  309. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1284 -0
  310. package/examples/__snapshots__/cloud-run-with-gpu.test.ts.snap +1394 -0
  311. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1394 -0
  312. package/examples/__snapshots__/cloud-run-with-sql-legacy-jobs.test.ts.snap +1709 -0
  313. package/examples/__snapshots__/cloud-run-with-sql-multiple-dbs.test.ts.snap +4515 -0
  314. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2950 -0
  315. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +1772 -0
  316. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1402 -0
  317. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1261 -0
  318. package/examples/__snapshots__/custom-build-job.test.ts.snap +1156 -0
  319. package/examples/__snapshots__/custom-deploy.test.ts.snap +1059 -0
  320. package/examples/__snapshots__/custom-envs.test.ts.snap +786 -0
  321. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1152 -0
  322. package/examples/__snapshots__/custom-verify-job.test.ts.snap +1606 -0
  323. package/examples/__snapshots__/git-submodule.test.ts.snap +1395 -0
  324. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1713 -0
  325. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1733 -0
  326. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3265 -0
  327. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1837 -0
  328. package/examples/__snapshots__/local-dot-env.test.ts.snap +1318 -0
  329. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1790 -0
  330. package/examples/__snapshots__/multiline-var.test.ts.snap +5585 -0
  331. package/examples/__snapshots__/native-app.test.ts.snap +2210 -0
  332. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1394 -0
  333. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1402 -0
  334. package/examples/__snapshots__/override-secrets.test.ts.snap +1419 -0
  335. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +1464 -0
  336. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1444 -0
  337. package/examples/__snapshots__/referencing-other-vars.test.ts.snap +4645 -0
  338. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1424 -0
  339. package/examples/__snapshots__/workspace-api-www-turbo-cache.test.ts.snap +2298 -0
  340. package/examples/__snapshots__/workspace-api-www.test.ts.snap +2290 -0
  341. package/examples/__utils__/helpers.ts +9 -12
  342. package/examples/cloud-run-health-check-defaults.test.ts +11 -0
  343. package/examples/cloud-run-health-check-defaults.ts +28 -0
  344. package/examples/cloud-run-health-check-only-startup.test.ts +11 -0
  345. package/examples/cloud-run-health-check-only-startup.ts +38 -0
  346. package/examples/cloud-run-health-check.test.ts +11 -0
  347. package/examples/cloud-run-health-check.ts +45 -0
  348. package/examples/cloud-run-http2.test.ts +11 -0
  349. package/examples/cloud-run-http2.ts +29 -0
  350. package/examples/cloud-run-llama.test.ts +11 -0
  351. package/examples/cloud-run-llama.ts +40 -0
  352. package/examples/cloud-run-memory-limit.test.ts +11 -0
  353. package/examples/cloud-run-memory-limit.ts +12 -7
  354. package/examples/cloud-run-meteor-with-worker.test.ts +11 -0
  355. package/examples/cloud-run-meteor-with-worker.ts +13 -7
  356. package/examples/cloud-run-nextjs.test.ts +11 -0
  357. package/examples/cloud-run-nextjs.ts +28 -0
  358. package/examples/cloud-run-no-cpu-throttling.test.ts +11 -0
  359. package/examples/cloud-run-no-cpu-throttling.ts +8 -6
  360. package/examples/cloud-run-no-service.test.ts +11 -0
  361. package/examples/cloud-run-no-service.ts +39 -0
  362. package/examples/cloud-run-non-public.test.ts +11 -0
  363. package/examples/cloud-run-non-public.ts +7 -6
  364. package/examples/cloud-run-post-stop-job.test.ts +11 -0
  365. package/examples/cloud-run-post-stop-job.ts +15 -6
  366. package/examples/cloud-run-service-custom-vpc-connector.test.ts +11 -0
  367. package/examples/cloud-run-service-custom-vpc-connector.ts +37 -0
  368. package/examples/cloud-run-service-custom-vpc.test.ts +11 -0
  369. package/examples/cloud-run-service-custom-vpc.ts +39 -0
  370. package/examples/cloud-run-service-gen2.test.ts +11 -0
  371. package/examples/cloud-run-service-gen2.ts +8 -6
  372. package/examples/cloud-run-service-increase-timout.test.ts +11 -0
  373. package/examples/cloud-run-service-increase-timout.ts +29 -0
  374. package/examples/cloud-run-service-with-volumes.test.ts +11 -0
  375. package/examples/cloud-run-service-with-volumes.ts +64 -0
  376. package/examples/cloud-run-storybook.test.ts +11 -0
  377. package/examples/cloud-run-storybook.ts +33 -0
  378. package/examples/cloud-run-with-gpu.test.ts +11 -0
  379. package/examples/cloud-run-with-gpu.ts +30 -0
  380. package/examples/cloud-run-with-ngnix.test.ts +11 -0
  381. package/examples/cloud-run-with-ngnix.ts +29 -0
  382. package/examples/cloud-run-with-sql-legacy-jobs.test.ts +11 -0
  383. package/examples/cloud-run-with-sql-legacy-jobs.ts +49 -0
  384. package/examples/cloud-run-with-sql-multiple-dbs.test.ts +11 -0
  385. package/examples/cloud-run-with-sql-multiple-dbs.ts +87 -0
  386. package/examples/cloud-run-with-sql-reuse-db.test.ts +11 -0
  387. package/examples/cloud-run-with-sql-reuse-db.ts +7 -6
  388. package/examples/cloud-run-with-sql.test.ts +11 -0
  389. package/examples/cloud-run-with-sql.ts +45 -24
  390. package/examples/cloud-run-with-worker.test.ts +11 -0
  391. package/examples/cloud-run-with-worker.ts +8 -6
  392. package/examples/custom-build-job-with-tests.test.ts +11 -0
  393. package/examples/custom-build-job-with-tests.ts +7 -6
  394. package/examples/custom-build-job.test.ts +11 -0
  395. package/examples/custom-build-job.ts +7 -6
  396. package/examples/custom-deploy.test.ts +11 -0
  397. package/examples/custom-deploy.ts +22 -14
  398. package/examples/custom-envs.test.ts +11 -0
  399. package/examples/custom-envs.ts +7 -6
  400. package/examples/custom-sbom-java.test.ts +11 -0
  401. package/examples/custom-sbom-java.ts +12 -8
  402. package/examples/custom-verify-job.test.ts +11 -0
  403. package/examples/custom-verify-job.ts +65 -0
  404. package/examples/git-submodule.test.ts +11 -0
  405. package/examples/git-submodule.ts +30 -0
  406. package/examples/kubernetes-application-customization.test.ts +11 -0
  407. package/examples/kubernetes-application-customization.ts +9 -6
  408. package/examples/kubernetes-with-cloud-sql.test.ts +11 -0
  409. package/examples/kubernetes-with-cloud-sql.ts +9 -6
  410. package/examples/kubernetes-with-jobs.test.ts +11 -0
  411. package/examples/kubernetes-with-jobs.ts +9 -6
  412. package/examples/kubernetes-with-mongodb.test.ts +11 -0
  413. package/examples/kubernetes-with-mongodb.ts +9 -6
  414. package/examples/local-dot-env.test.ts +11 -0
  415. package/examples/local-dot-env.ts +27 -0
  416. package/examples/meteor-kubernetes.test.ts +11 -0
  417. package/examples/meteor-kubernetes.ts +6 -7
  418. package/examples/multiline-var.test.ts +11 -0
  419. package/examples/multiline-var.ts +107 -0
  420. package/examples/native-app.test.ts +11 -0
  421. package/examples/native-app.ts +24 -19
  422. package/examples/node-build-with-custom-image.test.ts +11 -0
  423. package/examples/node-build-with-custom-image.ts +7 -6
  424. package/examples/node-build-with-docker-additions.test.ts +11 -0
  425. package/examples/node-build-with-docker-additions.ts +7 -6
  426. package/examples/override-secrets.test.ts +11 -0
  427. package/examples/override-secrets.ts +44 -0
  428. package/examples/rails-k8s-with-worker-dockerfile.test.ts +33 -0
  429. package/examples/rails-k8s-with-worker.test.ts +11 -0
  430. package/examples/rails-k8s-with-worker.ts +13 -13
  431. package/examples/referencing-other-vars.test.ts +11 -0
  432. package/examples/referencing-other-vars.ts +83 -0
  433. package/examples/wait-for-other-deploy.test.ts +11 -0
  434. package/examples/wait-for-other-deploy.ts +6 -5
  435. package/examples/workspace-api-www-turbo-cache.test.ts +11 -0
  436. package/examples/workspace-api-www-turbo-cache.ts +52 -0
  437. package/examples/workspace-api-www.test.ts +11 -0
  438. package/examples/workspace-api-www.ts +46 -0
  439. package/package.json +23 -26
  440. package/scripts/generate-examples-test.ts +84 -0
  441. package/scripts/generate-gitlab-ci-types.ts +2 -2
  442. package/scripts/tsconfig.json +7 -0
  443. package/src/bash/BashExpression.ts +78 -0
  444. package/src/bash/bashEscape.ts +164 -0
  445. package/src/bash/bashExpressionPerPipelineType.ts +16 -0
  446. package/src/bash/bashYaml.ts +80 -0
  447. package/src/bash/getInjectVarsScript.ts +21 -0
  448. package/src/bash/index.ts +2 -0
  449. package/src/build/artifacts/createBuildJobArtifact.ts +63 -0
  450. package/src/build/base/__tests__/createArtifactsConfig.test.ts +3 -3
  451. package/src/build/base/constants.ts +1 -1
  452. package/src/build/base/createAppBuildJob.ts +40 -24
  453. package/src/build/base/createArtifactsConfig.ts +2 -2
  454. package/src/build/base/createBuildJobDefinition.ts +37 -0
  455. package/src/build/base/index.ts +40 -8
  456. package/src/build/base/writeBuildInfo.ts +3 -3
  457. package/src/build/base/writeDotEnv.ts +25 -6
  458. package/src/build/cache/createJobCache.ts +83 -0
  459. package/src/build/cache/getAllCacheConfigsFromConfig.ts +29 -0
  460. package/src/build/cache/transformLegacyJobCache.ts +14 -0
  461. package/src/build/custom/__tests__/testJob.test.ts +10 -13
  462. package/src/build/custom/buildJob.ts +11 -37
  463. package/src/build/custom/index.ts +4 -2
  464. package/src/build/custom/testJob.ts +24 -21
  465. package/src/build/docker.ts +110 -49
  466. package/src/build/index.ts +45 -11
  467. package/src/build/node/buildJob.ts +68 -69
  468. package/src/build/node/cache.ts +28 -34
  469. package/src/build/node/constants.ts +2 -2
  470. package/src/build/node/index.ts +13 -4
  471. package/src/build/node/meteor.ts +19 -24
  472. package/src/build/node/testJob.ts +44 -25
  473. package/src/build/node/yarn.ts +22 -15
  474. package/src/build/rails/build.ts +15 -9
  475. package/src/build/rails/index.ts +4 -2
  476. package/src/build/rails/test.ts +41 -12
  477. package/src/build/sbom.ts +21 -11
  478. package/src/build/types.ts +198 -47
  479. package/src/catladder-gitlab.ts +7 -56
  480. package/src/config/__tests__/__snapshots__/getAllEnvs.test.ts.snap +31 -0
  481. package/src/config/__tests__/__snapshots__/getAllEnvsInAllComponents.test.ts.snap +15 -0
  482. package/src/config/__tests__/getAllEnvs.test.ts +71 -0
  483. package/src/config/__tests__/getAllEnvsInAllComponents.test.ts +63 -0
  484. package/src/config/configruedEnvs.ts +6 -6
  485. package/src/config/readConfig.ts +15 -22
  486. package/src/constants.ts +5 -2
  487. package/src/context/createAllComponentsContext.ts +31 -0
  488. package/src/context/createComponentContext.ts +148 -0
  489. package/src/context/createWorkspaceContext.ts +56 -0
  490. package/src/context/getBuildInfoVariables.ts +36 -0
  491. package/src/context/getEnvConfig.ts +25 -5
  492. package/src/context/getEnvType.ts +1 -1
  493. package/src/context/getEnvironment.ts +8 -24
  494. package/src/context/getEnvironmentContext.ts +25 -29
  495. package/src/context/getEnvironmentVariables.ts +101 -83
  496. package/src/context/getLabels.ts +8 -5
  497. package/src/context/getReviewSlug.ts +27 -0
  498. package/src/context/index.ts +1 -65
  499. package/src/context/transformJobOnlyVars.ts +6 -3
  500. package/src/context/utils/envVars.ts +5 -4
  501. package/src/deploy/base/deploy.ts +63 -47
  502. package/src/deploy/base/index.ts +11 -6
  503. package/src/deploy/base/rollback.ts +11 -16
  504. package/src/deploy/base/stop.ts +11 -15
  505. package/src/deploy/base/variables.ts +1 -1
  506. package/src/deploy/cloudRun/artifactsRegistry.ts +32 -28
  507. package/src/deploy/cloudRun/cleanup.ts +5 -5
  508. package/src/deploy/cloudRun/cloudRunRevisions.ts +9 -11
  509. package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +71 -153
  510. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +65 -26
  511. package/src/deploy/cloudRun/createJobs/common.ts +7 -7
  512. package/src/deploy/cloudRun/createJobs/constants.ts +1 -0
  513. package/src/deploy/cloudRun/createJobs/execute/onDeploy.ts +102 -0
  514. package/src/deploy/cloudRun/createJobs/execute/schedules.ts +186 -0
  515. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +27 -16
  516. package/src/deploy/cloudRun/createJobs/getCloudRunStopScripts.ts +9 -11
  517. package/src/deploy/cloudRun/createJobs/healthCheck.ts +64 -0
  518. package/src/deploy/cloudRun/createJobs/index.ts +20 -14
  519. package/src/deploy/cloudRun/createJobs/volumes.ts +23 -0
  520. package/src/deploy/cloudRun/index.ts +94 -60
  521. package/src/deploy/cloudRun/utils/cloudRunExecutionUrl.ts +20 -0
  522. package/src/deploy/cloudRun/utils/createArgsString.ts +6 -2
  523. package/src/deploy/cloudRun/utils/database.ts +116 -9
  524. package/src/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.ts +5 -3
  525. package/src/deploy/cloudRun/utils/getJobOrServiceArgs.ts +18 -0
  526. package/src/deploy/cloudRun/utils/getServiceName.ts +2 -2
  527. package/src/deploy/cloudRun/utils/jobName.ts +22 -2
  528. package/src/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.ts +1 -1
  529. package/src/deploy/cloudSql/utils.ts +13 -10
  530. package/src/deploy/custom/deployJob.ts +15 -10
  531. package/src/deploy/custom/index.ts +2 -2
  532. package/src/deploy/dockerTag/deployJob.ts +6 -7
  533. package/src/deploy/dockerTag/index.ts +8 -7
  534. package/src/deploy/index.ts +15 -12
  535. package/src/deploy/kubernetes/additionalSecretKeys.ts +3 -1
  536. package/src/deploy/kubernetes/cloudSql/index.ts +16 -25
  537. package/src/deploy/kubernetes/deployJob.ts +30 -21
  538. package/src/deploy/kubernetes/index.ts +43 -35
  539. package/src/deploy/kubernetes/kubeEnv.ts +12 -10
  540. package/src/deploy/kubernetes/kubeValues.ts +25 -20
  541. package/src/deploy/kubernetes/mongodb.ts +15 -15
  542. package/src/deploy/sbom.ts +20 -10
  543. package/src/deploy/types/base.ts +3 -3
  544. package/src/deploy/types/custom.ts +3 -7
  545. package/src/deploy/types/googleCloudRun.ts +359 -2
  546. package/src/deploy/types/index.ts +9 -2
  547. package/src/deploy/types/kubernetes.ts +1 -36
  548. package/src/deploy/utils.ts +5 -5
  549. package/src/globalScriptFunctions/index.ts +30 -0
  550. package/src/index.ts +4 -1
  551. package/src/packageInfos.ts +14 -0
  552. package/src/pipeline/__tests__/__snapshots__/getPipelineStages.test.ts.snap +69 -0
  553. package/src/pipeline/__tests__/getPipelineStages.test.ts +63 -0
  554. package/src/pipeline/createAllJobs.ts +67 -33
  555. package/src/pipeline/createJobsForComponent.ts +17 -37
  556. package/src/pipeline/createJobsForWorkspace.ts +12 -0
  557. package/src/pipeline/createMainPipeline.ts +118 -0
  558. package/src/pipeline/generatePipelineFiles.ts +100 -0
  559. package/src/pipeline/getPipelineStages.ts +23 -0
  560. package/src/pipeline/gitlab/createGitlabJobs.ts +398 -108
  561. package/src/pipeline/gitlab/createGitlabPipeline.ts +35 -0
  562. package/src/pipeline/gitlab/gitlabReleaseJobs.ts +23 -0
  563. package/src/pipeline/gitlab/sortGitLabJobDefProps.ts +59 -0
  564. package/src/pipeline/index.ts +2 -1
  565. package/src/pipeline/packageManager.ts +42 -18
  566. package/src/pipeline/yarn/yarnUtils.ts +15 -12
  567. package/src/rules/index.ts +41 -18
  568. package/src/runner/index.ts +0 -1
  569. package/src/types/config.ts +62 -23
  570. package/src/types/context.ts +167 -36
  571. package/src/types/environmentContext.ts +18 -13
  572. package/src/types/gitlab-ci-yml.ts +0 -1
  573. package/src/types/gitlab-types.ts +10 -7
  574. package/src/types/index.ts +2 -0
  575. package/src/types/jobDefinition.ts +34 -0
  576. package/src/types/jobs.ts +31 -15
  577. package/src/types/utils.ts +4 -4
  578. package/src/utils/gitlab.ts +20 -3
  579. package/src/utils/index.ts +6 -3
  580. package/src/utils/jsonParse.ts +7 -0
  581. package/src/utils/removeUndefined.ts +4 -0
  582. package/src/utils/writeFiles.ts +52 -0
  583. package/src/variables/VariableValue.ts +6 -0
  584. package/src/variables/VariableValueContainingReferences.ts +89 -0
  585. package/src/variables/__tests__/resolveAllReferences.test.ts +110 -0
  586. package/src/variables/__tests__/resolveAllReferencesOnce.test.ts +64 -0
  587. package/src/variables/__tests__/resolveReferencesOnce.test.ts +117 -0
  588. package/src/variables/__tests__/variableValue.test.ts +73 -0
  589. package/src/variables/resolveAllReferences.ts +46 -0
  590. package/src/variables/resolveAllReferencesOnce.ts +44 -0
  591. package/src/variables/resolveReferencesOnce.ts +29 -0
  592. package/bin/catladder-gitlab-dev.js +0 -3
  593. package/bin/catladder-gitlab.js +0 -3
  594. package/dist/bundles/catladder-gitlab/index.js +0 -34559
  595. package/dist/context/__tests__/resolveReferences.test.js +0 -336
  596. package/dist/context/resolveReferences.d.ts +0 -4
  597. package/dist/context/resolveReferences.js +0 -254
  598. package/dist/deploy/cloudRun/createJobs/variables.d.ts +0 -5
  599. package/dist/deploy/cloudRun/createJobs/variables.js +0 -19
  600. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +0 -84
  601. package/dist/deploy/kubernetes/processSecretsAsFiles.js +0 -31
  602. package/dist/pipeline/commitInfo/getBuildId.d.ts +0 -6
  603. package/dist/pipeline/commitInfo/getCommitInfo.d.ts +0 -2
  604. package/dist/pipeline/createChildPipeline.d.ts +0 -3
  605. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +0 -1839
  606. package/examples/__snapshots__/cloud-run-meteor-with-worker.ts.snap +0 -1807
  607. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +0 -1839
  608. package/examples/__snapshots__/cloud-run-non-public.ts.snap +0 -1839
  609. package/examples/__snapshots__/cloud-run-post-stop-job.ts.snap +0 -1849
  610. package/examples/__snapshots__/cloud-run-service-gen2.ts.snap +0 -1839
  611. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +0 -3647
  612. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +0 -3658
  613. package/examples/__snapshots__/cloud-run-with-worker.ts.snap +0 -1847
  614. package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +0 -1663
  615. package/examples/__snapshots__/custom-build-job.ts.snap +0 -1375
  616. package/examples/__snapshots__/custom-deploy.ts.snap +0 -1625
  617. package/examples/__snapshots__/custom-envs.ts.snap +0 -1127
  618. package/examples/__snapshots__/custom-sbom-java.ts.snap +0 -1383
  619. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +0 -2573
  620. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +0 -2533
  621. package/examples/__snapshots__/kubernetes-with-cloud-sql.ts.snap +0 -2545
  622. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +0 -4660
  623. package/examples/__snapshots__/kubernetes-with-mongodb.ts.snap +0 -2737
  624. package/examples/__snapshots__/meteor-kubernetes.ts.snap +0 -2658
  625. package/examples/__snapshots__/native-app.ts.snap +0 -3007
  626. package/examples/__snapshots__/node-build-with-custom-image.ts.snap +0 -1839
  627. package/examples/__snapshots__/node-build-with-docker-additions.ts.snap +0 -1839
  628. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +0 -4291
  629. package/examples/__snapshots__/wait-for-other-deploy.ts.snap +0 -2049
  630. package/examples/kubernetes-with-cloud-sql-legacy.ts +0 -33
  631. package/scripts/bundle +0 -2
  632. package/src/context/__tests__/resolveReferences.test.ts +0 -143
  633. package/src/context/resolveReferences.ts +0 -70
  634. package/src/deploy/cloudRun/createJobs/variables.ts +0 -21
  635. package/src/deploy/kubernetes/processSecretsAsFiles.ts +0 -34
  636. package/src/pipeline/commitInfo/getBuildId.ts +0 -17
  637. package/src/pipeline/commitInfo/getCommitInfo.ts +0 -15
  638. package/src/pipeline/createChildPipeline.ts +0 -46
  639. /package/dist/{context/__tests__/resolveReferences.test.d.ts โ†’ config/__tests__/getAllEnvs.test.d.ts} +0 -0
@@ -0,0 +1,3265 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot for kubernetes-with-jobs local pipeline YAML 1`] = `
4
+ "image: path/to/docker/jobs-default:the-version
5
+ stages:
6
+ - setup
7
+ - setup dev
8
+ - setup review
9
+ - setup stage
10
+ - setup prod
11
+ - test
12
+ - test dev
13
+ - test review
14
+ - test stage
15
+ - test prod
16
+ - build
17
+ - build dev
18
+ - build review
19
+ - build stage
20
+ - build prod
21
+ - deploy
22
+ - deploy dev
23
+ - deploy review
24
+ - deploy stage
25
+ - deploy prod
26
+ - verify
27
+ - verify dev
28
+ - verify review
29
+ - verify stage
30
+ - verify prod
31
+ - rollback
32
+ - rollback dev
33
+ - rollback review
34
+ - rollback stage
35
+ - rollback prod
36
+ - stop
37
+ - stop dev
38
+ - stop review
39
+ - stop stage
40
+ - stop prod
41
+ - release
42
+ variables:
43
+ FF_USE_FASTZIP: 'true'
44
+ ARTIFACT_COMPRESSION_LEVEL: fast
45
+ CACHE_COMPRESSION_LEVEL: fast
46
+ TRANSFER_METER_FREQUENCY: 5s
47
+ GIT_DEPTH: '1'
48
+ before_script:
49
+ - |-
50
+ function escapeForDotEnv () {
51
+ input="\${1:-$(cat)}"
52
+ input="\${input//$'\\n'/\\\\n}"
53
+ if [[ "$input" == *\\\\n* ]]; then
54
+ if [[ "$input" == *\\"* && "$input" == *\\'* && "$input" == *\\\`* ]]; then
55
+ printf "\\"%s\\"\\n" "$input"
56
+ elif [[ "$input" == *\\"* && "$input" == *\\'* ]]; then
57
+ printf "\`%s\`\\n" "$input"
58
+ elif [[ "$input" == *\\"* ]]; then
59
+ printf "'%s'\\n" "$input"
60
+ else
61
+ printf "\\"%s\\"\\n" "$input"
62
+ fi
63
+ else
64
+ printf "%s\\n" "$input"
65
+ fi
66
+ }
67
+ - |-
68
+ function collapseable_section_start () {
69
+ local section_title="\${1}"
70
+ local section_description="\${2:-$section_title}"
71
+ echo -e "section_start:\`date +%s\`:\${section_title}[collapsed=true]\\r\\e[0K\${section_description}"
72
+ }
73
+ - |-
74
+ function collapseable_section_end () {
75
+ local section_title="\${1}"
76
+ echo -e "section_end:\`date +%s\`:\${section_title}\\r\\e[0K"
77
+ }
78
+ api ๐Ÿ›ก audit:
79
+ stage: test
80
+ image: path/to/docker/jobs-default:the-version
81
+ variables:
82
+ KUBERNETES_CPU_REQUEST: '0.45'
83
+ KUBERNETES_MEMORY_REQUEST: 1Gi
84
+ KUBERNETES_MEMORY_LIMIT: 4Gi
85
+ script:
86
+ - collapseable_section_start "injectvars" "Injecting variables"
87
+ - export APP_PATH="api"
88
+ - collapseable_section_end "injectvars"
89
+ - cd api
90
+ - yarn npm audit --environment production
91
+ rules:
92
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
93
+ - if: $CI_MERGE_REQUEST_ID
94
+ needs: []
95
+ retry: &a1
96
+ max: 2
97
+ when:
98
+ - runner_system_failure
99
+ - stuck_or_timeout_failure
100
+ interruptible: true
101
+ allow_failure: true
102
+ api ๐Ÿ‘ฎ lint:
103
+ stage: test
104
+ image: path/to/docker/jobs-default:the-version
105
+ variables:
106
+ KUBERNETES_CPU_REQUEST: '0.45'
107
+ KUBERNETES_MEMORY_REQUEST: 1Gi
108
+ KUBERNETES_MEMORY_LIMIT: 4Gi
109
+ script:
110
+ - collapseable_section_start "injectvars" "Injecting variables"
111
+ - export APP_PATH="api"
112
+ - collapseable_section_end "injectvars"
113
+ - collapseable_section_start "nodeinstall" "Ensure node version"
114
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
115
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
116
+ - collapseable_section_end "nodeinstall"
117
+ - cd api
118
+ - collapseable_section_start "nodeinstall" "Ensure node version"
119
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
120
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
121
+ - collapseable_section_end "nodeinstall"
122
+ - collapseable_section_start "yarninstall" "Yarn install"
123
+ - yarn install --immutable
124
+ - collapseable_section_end "yarninstall"
125
+ - yarn lint
126
+ cache:
127
+ - key: api-yarn
128
+ policy: pull-push
129
+ paths:
130
+ - api/.yarn
131
+ - key: api-node-modules
132
+ policy: pull-push
133
+ paths:
134
+ - api/node_modules
135
+ rules:
136
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
137
+ - if: $CI_MERGE_REQUEST_ID
138
+ needs: []
139
+ retry: *a1
140
+ interruptible: true
141
+ api ๐Ÿงช test:
142
+ stage: test
143
+ image: path/to/docker/jobs-testing-chrome:the-version
144
+ variables:
145
+ KUBERNETES_CPU_REQUEST: '0.45'
146
+ KUBERNETES_MEMORY_REQUEST: 1Gi
147
+ KUBERNETES_MEMORY_LIMIT: 4Gi
148
+ script:
149
+ - collapseable_section_start "injectvars" "Injecting variables"
150
+ - export APP_PATH="api"
151
+ - collapseable_section_end "injectvars"
152
+ - collapseable_section_start "nodeinstall" "Ensure node version"
153
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
154
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
155
+ - collapseable_section_end "nodeinstall"
156
+ - cd api
157
+ - collapseable_section_start "nodeinstall" "Ensure node version"
158
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
159
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
160
+ - collapseable_section_end "nodeinstall"
161
+ - collapseable_section_start "yarninstall" "Yarn install"
162
+ - yarn install --immutable
163
+ - collapseable_section_end "yarninstall"
164
+ - yarn test
165
+ cache:
166
+ - key: api-yarn
167
+ policy: pull-push
168
+ paths:
169
+ - api/.yarn
170
+ - key: api-node-modules
171
+ policy: pull-push
172
+ paths:
173
+ - api/node_modules
174
+ rules:
175
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
176
+ - if: $CI_MERGE_REQUEST_ID
177
+ needs: []
178
+ retry: *a1
179
+ interruptible: true
180
+ 'api ๐Ÿ”จ app | dev ':
181
+ stage: build
182
+ image: path/to/docker/jobs-default:the-version
183
+ variables:
184
+ KUBERNETES_CPU_REQUEST: '0.45'
185
+ KUBERNETES_MEMORY_REQUEST: 1Gi
186
+ KUBERNETES_MEMORY_LIMIT: 4Gi
187
+ script:
188
+ - collapseable_section_start "injectvars" "Injecting variables"
189
+ - export ENV_SHORT="dev"
190
+ - export APP_DIR="api"
191
+ - export ENV_TYPE="dev"
192
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
193
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
194
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
195
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
196
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
197
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
198
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
199
+ - export KUBE_NAMESPACE="pan-test-app-dev"
200
+ - export KUBE_APP_NAME="api"
201
+ - export KUBE_APP_NAME_PREFIX=""
202
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
203
+ - collapseable_section_end "injectvars"
204
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
205
+ - collapseable_section_start "nodeinstall" "Ensure node version"
206
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
207
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
208
+ - collapseable_section_end "nodeinstall"
209
+ - cd api
210
+ - collapseable_section_start "nodeinstall" "Ensure node version"
211
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
212
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
213
+ - collapseable_section_end "nodeinstall"
214
+ - collapseable_section_start "yarninstall" "Yarn install"
215
+ - yarn install --immutable
216
+ - collapseable_section_end "yarninstall"
217
+ - yarn build
218
+ cache:
219
+ - key: api-yarn
220
+ policy: pull-push
221
+ paths:
222
+ - api/.yarn
223
+ - key: api-node-modules
224
+ policy: pull-push
225
+ paths:
226
+ - api/node_modules
227
+ artifacts:
228
+ paths:
229
+ - api/__build_info.json
230
+ - api/.next
231
+ - api/dist
232
+ expire_in: 1 day
233
+ when: always
234
+ reports: {}
235
+ rules:
236
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
237
+ needs: []
238
+ retry: *a1
239
+ interruptible: true
240
+ 'api ๐Ÿ”จ docker | dev ':
241
+ stage: build
242
+ image: path/to/docker/docker-build:the-version
243
+ services:
244
+ - name: docker:24.0.6-dind
245
+ command:
246
+ - --tls=false
247
+ - --registry-mirror=https://mirror.gcr.io
248
+ variables:
249
+ DOCKER_HOST: tcp://docker:2375
250
+ DOCKER_TLS_CERTDIR: ''
251
+ DOCKER_DRIVER: overlay2
252
+ DOCKER_BUILDKIT: '1'
253
+ KUBERNETES_CPU_REQUEST: '0.45'
254
+ KUBERNETES_MEMORY_REQUEST: 1Gi
255
+ KUBERNETES_MEMORY_LIMIT: 2Gi
256
+ script:
257
+ - collapseable_section_start "injectvars" "Injecting variables"
258
+ - export APP_DIR="api"
259
+ - export DOCKER_BUILD_CONTEXT="."
260
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
261
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
262
+ - export DOCKER_IMAGE_NAME="dev/api"
263
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
264
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
265
+ - |-
266
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
267
+ RUN yarn plugin import workspace-tools
268
+ RUN yarn workspaces focus --production && yarn rebuild"
269
+ - |-
270
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
271
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
272
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
273
+ COPY --chown=node:node .yarn /app/.yarn"
274
+ - collapseable_section_end "injectvars"
275
+ - ensureNodeDockerfile
276
+ - collapseable_section_start "docker-login" "Docker Login"
277
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
278
+ - collapseable_section_end "docker-login"
279
+ - collapseable_section_start "docker-build" "Docker build"
280
+ - 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
281
+ - collapseable_section_end "docker-build"
282
+ - collapseable_section_start "docker-push" "Docker push and tag"
283
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
284
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
285
+ - docker push $DOCKER_CACHE_IMAGE
286
+ - collapseable_section_end "docker-push"
287
+ cache:
288
+ - key: api-yarn
289
+ policy: pull
290
+ paths:
291
+ - api/.yarn
292
+ rules:
293
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
294
+ needs:
295
+ - 'api ๐Ÿ”จ app | dev '
296
+ retry: *a1
297
+ interruptible: true
298
+ 'api ๐Ÿงพ sbom | dev ':
299
+ stage: build
300
+ image:
301
+ name: aquasec/trivy:0.58.2
302
+ entrypoint:
303
+ - ''
304
+ variables: {}
305
+ script:
306
+ - collapseable_section_start "injectvars" "Injecting variables"
307
+ - collapseable_section_end "injectvars"
308
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
309
+ artifacts:
310
+ paths:
311
+ - __sbom.json
312
+ rules:
313
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
314
+ needs: []
315
+ retry: *a1
316
+ interruptible: true
317
+ allow_failure: true
318
+ 'api ๐Ÿš€ Deploy | dev ':
319
+ stage: deploy dev
320
+ image: path/to/docker/kubernetes:the-version
321
+ variables:
322
+ KUBERNETES_CPU_REQUEST: '0.22'
323
+ KUBERNETES_MEMORY_REQUEST: 200Mi
324
+ KUBERNETES_MEMORY_LIMIT: 400Mi
325
+ script:
326
+ - collapseable_section_start "injectvars" "Injecting variables"
327
+ - export ENV_SHORT="dev"
328
+ - export APP_DIR="api"
329
+ - export ENV_TYPE="dev"
330
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
331
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
332
+ - 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")"
333
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
334
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
335
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
336
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
337
+ - export KUBE_NAMESPACE="pan-test-app-dev"
338
+ - export KUBE_APP_NAME="api"
339
+ - export KUBE_APP_NAME_PREFIX=""
340
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
341
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
342
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
343
+ - export DOCKER_IMAGE_NAME="dev/api"
344
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
345
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
346
+ - export RELEASE_NAME="pan-test-app-dev-api"
347
+ - export HELM_EXPERIMENTAL_OCI="1"
348
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
349
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
350
+ - export HELM_ARGS=""
351
+ - export COMPONENT_NAME="api"
352
+ - collapseable_section_end "injectvars"
353
+ - kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
354
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
355
+ - kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"
356
+ - kubectl config use-context "kube-pan-test-app-dev-api"
357
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
358
+ - |
359
+ cat > __all_values.yml <<EOF
360
+ env:
361
+ secret: {}
362
+ public:
363
+ ENV_SHORT: |-
364
+ dev
365
+ APP_DIR: |-
366
+ api
367
+ ENV_TYPE: |-
368
+ dev
369
+ BUILD_INFO_BUILD_ID: |-
370
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
371
+ BUILD_INFO_BUILD_TIME: |-
372
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
373
+ BUILD_INFO_CURRENT_VERSION: |-
374
+ $(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/^/ /')
375
+ HOSTNAME: |-
376
+ api.dev.test-app.pan.panter.cloud
377
+ ROOT_URL: |-
378
+ https://api.dev.test-app.pan.panter.cloud
379
+ HOSTNAME_INTERNAL: |-
380
+ api.dev.test-app.pan.panter.cloud
381
+ ROOT_URL_INTERNAL: |-
382
+ https://api.dev.test-app.pan.panter.cloud
383
+ KUBE_NAMESPACE: |-
384
+ pan-test-app-dev
385
+ KUBE_APP_NAME: |-
386
+ api
387
+ KUBE_APP_NAME_PREFIX: ""
388
+ _ALL_ENV_VAR_KEYS: |-
389
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
390
+ application:
391
+ host: |-
392
+ api.dev.test-app.pan.panter.cloud
393
+ command: |-
394
+ yarn start
395
+ livenessProbe:
396
+ httpGet:
397
+ path: |-
398
+ __health
399
+ readinessProbe:
400
+ httpGet:
401
+ path: |-
402
+ __health
403
+ startupProbe:
404
+ httpGet:
405
+ path: |-
406
+ __health
407
+ jobs:
408
+ migration:
409
+ command: |-
410
+ yarn migrate
411
+ cronjobs:
412
+ send-emails:
413
+ command: |-
414
+ yarn send emails
415
+ schedule: |-
416
+ 0 * * * *
417
+
418
+ EOF
419
+ - collapseable_section_end "writeallvalues"
420
+ - kubernetesCreateSecret
421
+ - kubernetesDeploy
422
+ - echo 'Uploading SBOM to Dependency Track'
423
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
424
+ - echo deployment successful ๐Ÿ˜ป
425
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
426
+ environment:
427
+ name: dev/api
428
+ url: $CL_GITLAB_ENVIRONMENT_URL
429
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | dev '
430
+ auto_stop_in: 4 weeks
431
+ artifacts:
432
+ reports:
433
+ dotenv: gitlab_environment.env
434
+ rules:
435
+ - when: on_success
436
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
437
+ needs:
438
+ - job: api ๐Ÿ‘ฎ lint
439
+ artifacts: false
440
+ - job: 'api ๐Ÿ”จ app | dev '
441
+ artifacts: false
442
+ - job: 'api ๐Ÿ”จ docker | dev '
443
+ artifacts: false
444
+ - job: api ๐Ÿงช test
445
+ artifacts: false
446
+ - job: 'api ๐Ÿงพ sbom | dev '
447
+ artifacts: true
448
+ - job: api ๐Ÿ›ก audit
449
+ artifacts: false
450
+ retry: *a1
451
+ interruptible: true
452
+ allow_failure: false
453
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | dev ':
454
+ stage: stop dev
455
+ image: path/to/docker/kubernetes:the-version
456
+ variables:
457
+ KUBERNETES_CPU_REQUEST: '0.22'
458
+ KUBERNETES_MEMORY_REQUEST: 200Mi
459
+ KUBERNETES_MEMORY_LIMIT: 400Mi
460
+ GIT_STRATEGY: none
461
+ script:
462
+ - collapseable_section_start "injectvars" "Injecting variables"
463
+ - export ENV_SHORT="dev"
464
+ - export APP_DIR="api"
465
+ - export ENV_TYPE="dev"
466
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
467
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
468
+ - 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")"
469
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
470
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
471
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
472
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
473
+ - export KUBE_NAMESPACE="pan-test-app-dev"
474
+ - export KUBE_APP_NAME="api"
475
+ - export KUBE_APP_NAME_PREFIX=""
476
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
477
+ - export RELEASE_NAME="pan-test-app-dev-api"
478
+ - export HELM_EXPERIMENTAL_OCI="1"
479
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
480
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
481
+ - export HELM_ARGS=""
482
+ - export COMPONENT_NAME="api"
483
+ - collapseable_section_end "injectvars"
484
+ - kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
485
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
486
+ - kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"
487
+ - kubectl config use-context "kube-pan-test-app-dev-api"
488
+ - kubernetesDelete
489
+ - echo 'Disabling component in Dependency Track'
490
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
491
+ environment:
492
+ name: dev/api
493
+ action: stop
494
+ rules:
495
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
496
+ when: on_success
497
+ - when: manual
498
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
499
+ needs: []
500
+ retry: *a1
501
+ interruptible: true
502
+ allow_failure: true
503
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | dev ':
504
+ stage: rollback dev
505
+ image: path/to/docker/kubernetes:the-version
506
+ variables:
507
+ KUBERNETES_CPU_REQUEST: '0.22'
508
+ KUBERNETES_MEMORY_REQUEST: 200Mi
509
+ KUBERNETES_MEMORY_LIMIT: 400Mi
510
+ GIT_STRATEGY: none
511
+ script:
512
+ - collapseable_section_start "injectvars" "Injecting variables"
513
+ - export ENV_SHORT="dev"
514
+ - export APP_DIR="api"
515
+ - export ENV_TYPE="dev"
516
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
517
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
518
+ - 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")"
519
+ - export HOSTNAME="api.dev.test-app.pan.panter.cloud"
520
+ - export ROOT_URL="https://api.dev.test-app.pan.panter.cloud"
521
+ - export HOSTNAME_INTERNAL="api.dev.test-app.pan.panter.cloud"
522
+ - export ROOT_URL_INTERNAL="https://api.dev.test-app.pan.panter.cloud"
523
+ - export KUBE_NAMESPACE="pan-test-app-dev"
524
+ - export KUBE_APP_NAME="api"
525
+ - export KUBE_APP_NAME_PREFIX=""
526
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
527
+ - export RELEASE_NAME="pan-test-app-dev-api"
528
+ - export HELM_EXPERIMENTAL_OCI="1"
529
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
530
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
531
+ - export HELM_ARGS=""
532
+ - export COMPONENT_NAME="api"
533
+ - collapseable_section_end "injectvars"
534
+ - kubectl config set-cluster "kube-pan-test-app-dev-api" --server="$CL_dev_api_KUBE_URL" --certificate-authority <(echo $CL_dev_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
535
+ - kubectl config set-credentials "kube-pan-test-app-dev-api" --token="$CL_dev_api_KUBE_TOKEN"
536
+ - kubectl config set-context "kube-pan-test-app-dev-api" --cluster="kube-pan-test-app-dev-api" --user="kube-pan-test-app-dev-api" --namespace="pan-test-app-dev"
537
+ - kubectl config use-context "kube-pan-test-app-dev-api"
538
+ - kubernetesRollback
539
+ environment:
540
+ name: dev/api
541
+ action: access
542
+ rules:
543
+ - when: manual
544
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
545
+ needs: []
546
+ retry: *a1
547
+ interruptible: true
548
+ allow_failure: true
549
+ 'api ๐Ÿ”จ app | review ':
550
+ stage: build
551
+ image: path/to/docker/jobs-default:the-version
552
+ variables:
553
+ KUBERNETES_CPU_REQUEST: '0.45'
554
+ KUBERNETES_MEMORY_REQUEST: 1Gi
555
+ KUBERNETES_MEMORY_LIMIT: 4Gi
556
+ script:
557
+ - collapseable_section_start "injectvars" "Injecting variables"
558
+ - export ENV_SHORT="review"
559
+ - export APP_DIR="api"
560
+ - export ENV_TYPE="review"
561
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
562
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
563
+ - 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")"
564
+ - export HOSTNAME="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
565
+ - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
566
+ - export HOSTNAME_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
567
+ - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
568
+ - export KUBE_NAMESPACE="pan-test-app-review"
569
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
570
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
571
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
572
+ - collapseable_section_end "injectvars"
573
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
574
+ - collapseable_section_start "nodeinstall" "Ensure node version"
575
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
576
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
577
+ - collapseable_section_end "nodeinstall"
578
+ - cd api
579
+ - collapseable_section_start "nodeinstall" "Ensure node version"
580
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
581
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
582
+ - collapseable_section_end "nodeinstall"
583
+ - collapseable_section_start "yarninstall" "Yarn install"
584
+ - yarn install --immutable
585
+ - collapseable_section_end "yarninstall"
586
+ - yarn build
587
+ cache:
588
+ - key: api-yarn
589
+ policy: pull-push
590
+ paths:
591
+ - api/.yarn
592
+ - key: api-node-modules
593
+ policy: pull-push
594
+ paths:
595
+ - api/node_modules
596
+ artifacts:
597
+ paths:
598
+ - api/__build_info.json
599
+ - api/.next
600
+ - api/dist
601
+ expire_in: 1 day
602
+ when: always
603
+ reports: {}
604
+ rules:
605
+ - if: $CI_MERGE_REQUEST_ID
606
+ needs: []
607
+ retry: *a1
608
+ interruptible: true
609
+ 'api ๐Ÿ”จ docker | review ':
610
+ stage: build
611
+ image: path/to/docker/docker-build:the-version
612
+ services:
613
+ - name: docker:24.0.6-dind
614
+ command:
615
+ - --tls=false
616
+ - --registry-mirror=https://mirror.gcr.io
617
+ variables:
618
+ DOCKER_HOST: tcp://docker:2375
619
+ DOCKER_TLS_CERTDIR: ''
620
+ DOCKER_DRIVER: overlay2
621
+ DOCKER_BUILDKIT: '1'
622
+ KUBERNETES_CPU_REQUEST: '0.45'
623
+ KUBERNETES_MEMORY_REQUEST: 1Gi
624
+ KUBERNETES_MEMORY_LIMIT: 2Gi
625
+ script:
626
+ - collapseable_section_start "injectvars" "Injecting variables"
627
+ - export APP_DIR="api"
628
+ - export DOCKER_BUILD_CONTEXT="."
629
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
630
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
631
+ - export DOCKER_IMAGE_NAME="review/api"
632
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
633
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
634
+ - |-
635
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
636
+ RUN yarn plugin import workspace-tools
637
+ RUN yarn workspaces focus --production && yarn rebuild"
638
+ - |-
639
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
640
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
641
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
642
+ COPY --chown=node:node .yarn /app/.yarn"
643
+ - collapseable_section_end "injectvars"
644
+ - ensureNodeDockerfile
645
+ - collapseable_section_start "docker-login" "Docker Login"
646
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
647
+ - collapseable_section_end "docker-login"
648
+ - collapseable_section_start "docker-build" "Docker build"
649
+ - 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
650
+ - collapseable_section_end "docker-build"
651
+ - collapseable_section_start "docker-push" "Docker push and tag"
652
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
653
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
654
+ - docker push $DOCKER_CACHE_IMAGE
655
+ - collapseable_section_end "docker-push"
656
+ cache:
657
+ - key: api-yarn
658
+ policy: pull
659
+ paths:
660
+ - api/.yarn
661
+ rules:
662
+ - if: $CI_MERGE_REQUEST_ID
663
+ needs:
664
+ - 'api ๐Ÿ”จ app | review '
665
+ retry: *a1
666
+ interruptible: true
667
+ 'api ๐Ÿงพ sbom | review ':
668
+ stage: build
669
+ image:
670
+ name: aquasec/trivy:0.58.2
671
+ entrypoint:
672
+ - ''
673
+ variables: {}
674
+ script:
675
+ - collapseable_section_start "injectvars" "Injecting variables"
676
+ - collapseable_section_end "injectvars"
677
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
678
+ artifacts:
679
+ paths:
680
+ - __sbom.json
681
+ rules:
682
+ - if: $CI_MERGE_REQUEST_ID
683
+ needs: []
684
+ retry: *a1
685
+ interruptible: true
686
+ allow_failure: true
687
+ 'api ๐Ÿš€ Deploy | review ':
688
+ stage: deploy review
689
+ image: path/to/docker/kubernetes:the-version
690
+ variables:
691
+ KUBERNETES_CPU_REQUEST: '0.22'
692
+ KUBERNETES_MEMORY_REQUEST: 200Mi
693
+ KUBERNETES_MEMORY_LIMIT: 400Mi
694
+ script:
695
+ - collapseable_section_start "injectvars" "Injecting variables"
696
+ - export ENV_SHORT="review"
697
+ - export APP_DIR="api"
698
+ - export ENV_TYPE="review"
699
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
700
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
701
+ - 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")"
702
+ - export HOSTNAME="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
703
+ - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
704
+ - export HOSTNAME_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
705
+ - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
706
+ - export KUBE_NAMESPACE="pan-test-app-review"
707
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
708
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
709
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
710
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
711
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
712
+ - export DOCKER_IMAGE_NAME="review/api"
713
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
714
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
715
+ - export RELEASE_NAME="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"
716
+ - export HELM_EXPERIMENTAL_OCI="1"
717
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
718
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
719
+ - export HELM_ARGS=""
720
+ - export COMPONENT_NAME="api"
721
+ - collapseable_section_end "injectvars"
722
+ - kubectl config set-cluster "kube-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" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
723
+ - kubectl config set-credentials "kube-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" --token="$CL_review_api_KUBE_TOKEN"
724
+ - kubectl config set-context "kube-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" --cluster="kube-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" --user="kube-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" --namespace="pan-test-app-review"
725
+ - kubectl config use-context "kube-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"
726
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
727
+ - |
728
+ cat > __all_values.yml <<EOF
729
+ env:
730
+ secret: {}
731
+ public:
732
+ ENV_SHORT: |-
733
+ review
734
+ APP_DIR: |-
735
+ api
736
+ ENV_TYPE: |-
737
+ review
738
+ BUILD_INFO_BUILD_ID: |-
739
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
740
+ BUILD_INFO_BUILD_TIME: |-
741
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
742
+ BUILD_INFO_CURRENT_VERSION: |-
743
+ $(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/^/ /')
744
+ HOSTNAME: |-
745
+ $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
746
+ ROOT_URL: |-
747
+ $(printf %s "https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
748
+ HOSTNAME_INTERNAL: |-
749
+ $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
750
+ ROOT_URL_INTERNAL: |-
751
+ $(printf %s "https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
752
+ KUBE_NAMESPACE: |-
753
+ pan-test-app-review
754
+ KUBE_APP_NAME: |-
755
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api" | sed '1!s/^/ /')
756
+ KUBE_APP_NAME_PREFIX: |-
757
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | sed '1!s/^/ /')
758
+ _ALL_ENV_VAR_KEYS: |-
759
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
760
+ application:
761
+ host: |-
762
+ $(printf %s "api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
763
+ command: |-
764
+ yarn start
765
+ livenessProbe:
766
+ httpGet:
767
+ path: |-
768
+ __health
769
+ readinessProbe:
770
+ httpGet:
771
+ path: |-
772
+ __health
773
+ startupProbe:
774
+ httpGet:
775
+ path: |-
776
+ __health
777
+ jobs:
778
+ migration:
779
+ command: |-
780
+ yarn migrate
781
+ cronjobs: {}
782
+
783
+ EOF
784
+ - collapseable_section_end "writeallvalues"
785
+ - kubernetesCreateSecret
786
+ - kubernetesDeploy
787
+ - echo 'Uploading SBOM to Dependency Track'
788
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
789
+ - echo deployment successful ๐Ÿ˜ป
790
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
791
+ environment:
792
+ name: review/$CI_COMMIT_REF_NAME/api
793
+ url: $CL_GITLAB_ENVIRONMENT_URL
794
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | review '
795
+ auto_stop_in: 1 week
796
+ artifacts:
797
+ reports:
798
+ dotenv: gitlab_environment.env
799
+ rules:
800
+ - when: on_success
801
+ if: $CI_MERGE_REQUEST_ID
802
+ needs:
803
+ - job: api ๐Ÿ‘ฎ lint
804
+ artifacts: false
805
+ - job: 'api ๐Ÿ”จ app | review '
806
+ artifacts: false
807
+ - job: 'api ๐Ÿ”จ docker | review '
808
+ artifacts: false
809
+ - job: api ๐Ÿงช test
810
+ artifacts: false
811
+ - job: 'api ๐Ÿงพ sbom | review '
812
+ artifacts: true
813
+ - job: api ๐Ÿ›ก audit
814
+ artifacts: false
815
+ retry: *a1
816
+ interruptible: true
817
+ allow_failure: false
818
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | review ':
819
+ stage: stop review
820
+ image: path/to/docker/kubernetes:the-version
821
+ variables:
822
+ KUBERNETES_CPU_REQUEST: '0.22'
823
+ KUBERNETES_MEMORY_REQUEST: 200Mi
824
+ KUBERNETES_MEMORY_LIMIT: 400Mi
825
+ GIT_STRATEGY: none
826
+ script:
827
+ - collapseable_section_start "injectvars" "Injecting variables"
828
+ - export ENV_SHORT="review"
829
+ - export APP_DIR="api"
830
+ - export ENV_TYPE="review"
831
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
832
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
833
+ - 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")"
834
+ - export HOSTNAME="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
835
+ - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
836
+ - export HOSTNAME_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
837
+ - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
838
+ - export KUBE_NAMESPACE="pan-test-app-review"
839
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
840
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
841
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
842
+ - export RELEASE_NAME="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"
843
+ - export HELM_EXPERIMENTAL_OCI="1"
844
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
845
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
846
+ - export HELM_ARGS=""
847
+ - export COMPONENT_NAME="api"
848
+ - collapseable_section_end "injectvars"
849
+ - kubectl config set-cluster "kube-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" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
850
+ - kubectl config set-credentials "kube-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" --token="$CL_review_api_KUBE_TOKEN"
851
+ - kubectl config set-context "kube-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" --cluster="kube-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" --user="kube-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" --namespace="pan-test-app-review"
852
+ - kubectl config use-context "kube-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"
853
+ - kubernetesDelete
854
+ - echo 'Disabling component in Dependency Track'
855
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
856
+ environment:
857
+ name: review/$CI_COMMIT_REF_NAME/api
858
+ action: stop
859
+ rules:
860
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
861
+ when: on_success
862
+ - when: manual
863
+ if: $CI_MERGE_REQUEST_ID
864
+ needs: []
865
+ retry: *a1
866
+ interruptible: true
867
+ allow_failure: true
868
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | review ':
869
+ stage: rollback review
870
+ image: path/to/docker/kubernetes:the-version
871
+ variables:
872
+ KUBERNETES_CPU_REQUEST: '0.22'
873
+ KUBERNETES_MEMORY_REQUEST: 200Mi
874
+ KUBERNETES_MEMORY_LIMIT: 400Mi
875
+ GIT_STRATEGY: none
876
+ script:
877
+ - collapseable_section_start "injectvars" "Injecting variables"
878
+ - export ENV_SHORT="review"
879
+ - export APP_DIR="api"
880
+ - export ENV_TYPE="review"
881
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
882
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
883
+ - 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")"
884
+ - export HOSTNAME="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
885
+ - export ROOT_URL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
886
+ - export HOSTNAME_INTERNAL="api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
887
+ - export ROOT_URL_INTERNAL="https://api.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
888
+ - export KUBE_NAMESPACE="pan-test-app-review"
889
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-api"
890
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
891
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
892
+ - export RELEASE_NAME="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"
893
+ - export HELM_EXPERIMENTAL_OCI="1"
894
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
895
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
896
+ - export HELM_ARGS=""
897
+ - export COMPONENT_NAME="api"
898
+ - collapseable_section_end "injectvars"
899
+ - kubectl config set-cluster "kube-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" --server="$CL_review_api_KUBE_URL" --certificate-authority <(echo $CL_review_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
900
+ - kubectl config set-credentials "kube-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" --token="$CL_review_api_KUBE_TOKEN"
901
+ - kubectl config set-context "kube-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" --cluster="kube-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" --user="kube-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" --namespace="pan-test-app-review"
902
+ - kubectl config use-context "kube-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"
903
+ - kubernetesRollback
904
+ environment:
905
+ name: review/$CI_COMMIT_REF_NAME/api
906
+ action: access
907
+ rules:
908
+ - when: manual
909
+ if: $CI_MERGE_REQUEST_ID
910
+ needs: []
911
+ retry: *a1
912
+ interruptible: true
913
+ allow_failure: true
914
+ 'api ๐Ÿ”จ app | stage ':
915
+ stage: build
916
+ image: path/to/docker/jobs-default:the-version
917
+ variables:
918
+ KUBERNETES_CPU_REQUEST: '0.45'
919
+ KUBERNETES_MEMORY_REQUEST: 1Gi
920
+ KUBERNETES_MEMORY_LIMIT: 4Gi
921
+ script:
922
+ - collapseable_section_start "injectvars" "Injecting variables"
923
+ - export ENV_SHORT="stage"
924
+ - export APP_DIR="api"
925
+ - export ENV_TYPE="stage"
926
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
927
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
928
+ - 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")"
929
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
930
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
931
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
932
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
933
+ - export KUBE_NAMESPACE="pan-test-app-stage"
934
+ - export KUBE_APP_NAME="api"
935
+ - export KUBE_APP_NAME_PREFIX=""
936
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
937
+ - collapseable_section_end "injectvars"
938
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
939
+ - collapseable_section_start "nodeinstall" "Ensure node version"
940
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
941
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
942
+ - collapseable_section_end "nodeinstall"
943
+ - cd api
944
+ - collapseable_section_start "nodeinstall" "Ensure node version"
945
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
946
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
947
+ - collapseable_section_end "nodeinstall"
948
+ - collapseable_section_start "yarninstall" "Yarn install"
949
+ - yarn install --immutable
950
+ - collapseable_section_end "yarninstall"
951
+ - yarn build
952
+ cache:
953
+ - key: api-yarn
954
+ policy: pull-push
955
+ paths:
956
+ - api/.yarn
957
+ - key: api-node-modules
958
+ policy: pull-push
959
+ paths:
960
+ - api/node_modules
961
+ artifacts:
962
+ paths:
963
+ - api/__build_info.json
964
+ - api/.next
965
+ - api/dist
966
+ expire_in: 1 day
967
+ when: always
968
+ reports: {}
969
+ rules:
970
+ - if: $CI_COMMIT_TAG
971
+ needs: []
972
+ retry: *a1
973
+ interruptible: true
974
+ 'api ๐Ÿ”จ docker | stage ':
975
+ stage: build
976
+ image: path/to/docker/docker-build:the-version
977
+ services:
978
+ - name: docker:24.0.6-dind
979
+ command:
980
+ - --tls=false
981
+ - --registry-mirror=https://mirror.gcr.io
982
+ variables:
983
+ DOCKER_HOST: tcp://docker:2375
984
+ DOCKER_TLS_CERTDIR: ''
985
+ DOCKER_DRIVER: overlay2
986
+ DOCKER_BUILDKIT: '1'
987
+ KUBERNETES_CPU_REQUEST: '0.45'
988
+ KUBERNETES_MEMORY_REQUEST: 1Gi
989
+ KUBERNETES_MEMORY_LIMIT: 2Gi
990
+ script:
991
+ - collapseable_section_start "injectvars" "Injecting variables"
992
+ - export APP_DIR="api"
993
+ - export DOCKER_BUILD_CONTEXT="."
994
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
995
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
996
+ - export DOCKER_IMAGE_NAME="stage/api"
997
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
998
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
999
+ - |-
1000
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1001
+ RUN yarn plugin import workspace-tools
1002
+ RUN yarn workspaces focus --production && yarn rebuild"
1003
+ - |-
1004
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1005
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1006
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1007
+ COPY --chown=node:node .yarn /app/.yarn"
1008
+ - collapseable_section_end "injectvars"
1009
+ - ensureNodeDockerfile
1010
+ - collapseable_section_start "docker-login" "Docker Login"
1011
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1012
+ - collapseable_section_end "docker-login"
1013
+ - collapseable_section_start "docker-build" "Docker build"
1014
+ - 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
1015
+ - collapseable_section_end "docker-build"
1016
+ - collapseable_section_start "docker-push" "Docker push and tag"
1017
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1018
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1019
+ - docker push $DOCKER_CACHE_IMAGE
1020
+ - collapseable_section_end "docker-push"
1021
+ cache:
1022
+ - key: api-yarn
1023
+ policy: pull
1024
+ paths:
1025
+ - api/.yarn
1026
+ rules:
1027
+ - if: $CI_COMMIT_TAG
1028
+ needs:
1029
+ - 'api ๐Ÿ”จ app | stage '
1030
+ retry: *a1
1031
+ interruptible: true
1032
+ 'api ๐Ÿงพ sbom | stage ':
1033
+ stage: build
1034
+ image:
1035
+ name: aquasec/trivy:0.58.2
1036
+ entrypoint:
1037
+ - ''
1038
+ variables: {}
1039
+ script:
1040
+ - collapseable_section_start "injectvars" "Injecting variables"
1041
+ - collapseable_section_end "injectvars"
1042
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1043
+ artifacts:
1044
+ paths:
1045
+ - __sbom.json
1046
+ rules:
1047
+ - if: $CI_COMMIT_TAG
1048
+ needs: []
1049
+ retry: *a1
1050
+ interruptible: true
1051
+ allow_failure: true
1052
+ 'api ๐Ÿš€ Deploy | stage ':
1053
+ stage: deploy stage
1054
+ image: path/to/docker/kubernetes:the-version
1055
+ variables:
1056
+ KUBERNETES_CPU_REQUEST: '0.22'
1057
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1058
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1059
+ script:
1060
+ - collapseable_section_start "injectvars" "Injecting variables"
1061
+ - export ENV_SHORT="stage"
1062
+ - export APP_DIR="api"
1063
+ - export ENV_TYPE="stage"
1064
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1065
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1066
+ - 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")"
1067
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
1068
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1069
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
1070
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1071
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1072
+ - export KUBE_APP_NAME="api"
1073
+ - export KUBE_APP_NAME_PREFIX=""
1074
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
1075
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1076
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1077
+ - export DOCKER_IMAGE_NAME="stage/api"
1078
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1079
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1080
+ - export RELEASE_NAME="pan-test-app-stage-api"
1081
+ - export HELM_EXPERIMENTAL_OCI="1"
1082
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1083
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1084
+ - export HELM_ARGS=""
1085
+ - export COMPONENT_NAME="api"
1086
+ - collapseable_section_end "injectvars"
1087
+ - kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1088
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1089
+ - kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"
1090
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1091
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
1092
+ - |
1093
+ cat > __all_values.yml <<EOF
1094
+ env:
1095
+ secret: {}
1096
+ public:
1097
+ ENV_SHORT: |-
1098
+ stage
1099
+ APP_DIR: |-
1100
+ api
1101
+ ENV_TYPE: |-
1102
+ stage
1103
+ BUILD_INFO_BUILD_ID: |-
1104
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1105
+ BUILD_INFO_BUILD_TIME: |-
1106
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1107
+ BUILD_INFO_CURRENT_VERSION: |-
1108
+ $(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/^/ /')
1109
+ HOSTNAME: |-
1110
+ api.stage.test-app.pan.panter.cloud
1111
+ ROOT_URL: |-
1112
+ https://api.stage.test-app.pan.panter.cloud
1113
+ HOSTNAME_INTERNAL: |-
1114
+ api.stage.test-app.pan.panter.cloud
1115
+ ROOT_URL_INTERNAL: |-
1116
+ https://api.stage.test-app.pan.panter.cloud
1117
+ KUBE_NAMESPACE: |-
1118
+ pan-test-app-stage
1119
+ KUBE_APP_NAME: |-
1120
+ api
1121
+ KUBE_APP_NAME_PREFIX: ""
1122
+ _ALL_ENV_VAR_KEYS: |-
1123
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
1124
+ application:
1125
+ host: |-
1126
+ api.stage.test-app.pan.panter.cloud
1127
+ command: |-
1128
+ yarn start
1129
+ livenessProbe:
1130
+ httpGet:
1131
+ path: |-
1132
+ __health
1133
+ readinessProbe:
1134
+ httpGet:
1135
+ path: |-
1136
+ __health
1137
+ startupProbe:
1138
+ httpGet:
1139
+ path: |-
1140
+ __health
1141
+ jobs:
1142
+ migration:
1143
+ command: |-
1144
+ yarn migrate
1145
+ cronjobs:
1146
+ send-emails:
1147
+ command: |-
1148
+ yarn send emails
1149
+ schedule: |-
1150
+ 0 * * * *
1151
+
1152
+ EOF
1153
+ - collapseable_section_end "writeallvalues"
1154
+ - kubernetesCreateSecret
1155
+ - kubernetesDeploy
1156
+ - echo 'Uploading SBOM to Dependency Track'
1157
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
1158
+ - echo deployment successful ๐Ÿ˜ป
1159
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1160
+ environment:
1161
+ name: stage/api
1162
+ url: $CL_GITLAB_ENVIRONMENT_URL
1163
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | stage '
1164
+ artifacts:
1165
+ reports:
1166
+ dotenv: gitlab_environment.env
1167
+ rules:
1168
+ - when: on_success
1169
+ if: $CI_COMMIT_TAG
1170
+ needs:
1171
+ - job: 'api ๐Ÿ”จ app | stage '
1172
+ artifacts: false
1173
+ - job: 'api ๐Ÿ”จ docker | stage '
1174
+ artifacts: false
1175
+ - job: 'api ๐Ÿงพ sbom | stage '
1176
+ artifacts: true
1177
+ retry: *a1
1178
+ interruptible: true
1179
+ allow_failure: false
1180
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | stage ':
1181
+ stage: stop stage
1182
+ image: path/to/docker/kubernetes:the-version
1183
+ variables:
1184
+ KUBERNETES_CPU_REQUEST: '0.22'
1185
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1186
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1187
+ GIT_STRATEGY: none
1188
+ script:
1189
+ - collapseable_section_start "injectvars" "Injecting variables"
1190
+ - export ENV_SHORT="stage"
1191
+ - export APP_DIR="api"
1192
+ - export ENV_TYPE="stage"
1193
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1194
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1195
+ - 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")"
1196
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
1197
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1198
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
1199
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1200
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1201
+ - export KUBE_APP_NAME="api"
1202
+ - export KUBE_APP_NAME_PREFIX=""
1203
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
1204
+ - export RELEASE_NAME="pan-test-app-stage-api"
1205
+ - export HELM_EXPERIMENTAL_OCI="1"
1206
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1207
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1208
+ - export HELM_ARGS=""
1209
+ - export COMPONENT_NAME="api"
1210
+ - collapseable_section_end "injectvars"
1211
+ - kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1212
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1213
+ - kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"
1214
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1215
+ - kubernetesDelete
1216
+ - echo 'Disabling component in Dependency Track'
1217
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
1218
+ environment:
1219
+ name: stage/api
1220
+ action: stop
1221
+ rules:
1222
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1223
+ when: on_success
1224
+ - when: manual
1225
+ if: $CI_COMMIT_TAG
1226
+ needs: []
1227
+ retry: *a1
1228
+ interruptible: true
1229
+ allow_failure: true
1230
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | stage ':
1231
+ stage: rollback stage
1232
+ image: path/to/docker/kubernetes:the-version
1233
+ variables:
1234
+ KUBERNETES_CPU_REQUEST: '0.22'
1235
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1236
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1237
+ GIT_STRATEGY: none
1238
+ script:
1239
+ - collapseable_section_start "injectvars" "Injecting variables"
1240
+ - export ENV_SHORT="stage"
1241
+ - export APP_DIR="api"
1242
+ - export ENV_TYPE="stage"
1243
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1244
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1245
+ - 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")"
1246
+ - export HOSTNAME="api.stage.test-app.pan.panter.cloud"
1247
+ - export ROOT_URL="https://api.stage.test-app.pan.panter.cloud"
1248
+ - export HOSTNAME_INTERNAL="api.stage.test-app.pan.panter.cloud"
1249
+ - export ROOT_URL_INTERNAL="https://api.stage.test-app.pan.panter.cloud"
1250
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1251
+ - export KUBE_APP_NAME="api"
1252
+ - export KUBE_APP_NAME_PREFIX=""
1253
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
1254
+ - export RELEASE_NAME="pan-test-app-stage-api"
1255
+ - export HELM_EXPERIMENTAL_OCI="1"
1256
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1257
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1258
+ - export HELM_ARGS=""
1259
+ - export COMPONENT_NAME="api"
1260
+ - collapseable_section_end "injectvars"
1261
+ - kubectl config set-cluster "kube-pan-test-app-stage-api" --server="$CL_stage_api_KUBE_URL" --certificate-authority <(echo $CL_stage_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1262
+ - kubectl config set-credentials "kube-pan-test-app-stage-api" --token="$CL_stage_api_KUBE_TOKEN"
1263
+ - kubectl config set-context "kube-pan-test-app-stage-api" --cluster="kube-pan-test-app-stage-api" --user="kube-pan-test-app-stage-api" --namespace="pan-test-app-stage"
1264
+ - kubectl config use-context "kube-pan-test-app-stage-api"
1265
+ - kubernetesRollback
1266
+ environment:
1267
+ name: stage/api
1268
+ action: access
1269
+ rules:
1270
+ - when: manual
1271
+ if: $CI_COMMIT_TAG
1272
+ needs: []
1273
+ retry: *a1
1274
+ interruptible: true
1275
+ allow_failure: true
1276
+ 'api ๐Ÿ”จ app | prod ':
1277
+ stage: build
1278
+ image: path/to/docker/jobs-default:the-version
1279
+ variables:
1280
+ KUBERNETES_CPU_REQUEST: '0.45'
1281
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1282
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1283
+ script:
1284
+ - collapseable_section_start "injectvars" "Injecting variables"
1285
+ - export ENV_SHORT="prod"
1286
+ - export APP_DIR="api"
1287
+ - export ENV_TYPE="prod"
1288
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1289
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1290
+ - 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")"
1291
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1292
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1293
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1294
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1295
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1296
+ - export KUBE_APP_NAME="api"
1297
+ - export KUBE_APP_NAME_PREFIX=""
1298
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
1299
+ - collapseable_section_end "injectvars"
1300
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > api/__build_info.json
1301
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1302
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1303
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1304
+ - collapseable_section_end "nodeinstall"
1305
+ - cd api
1306
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1307
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1308
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1309
+ - collapseable_section_end "nodeinstall"
1310
+ - collapseable_section_start "yarninstall" "Yarn install"
1311
+ - yarn install --immutable
1312
+ - collapseable_section_end "yarninstall"
1313
+ - yarn build
1314
+ cache:
1315
+ - key: api-yarn
1316
+ policy: pull-push
1317
+ paths:
1318
+ - api/.yarn
1319
+ - key: api-node-modules
1320
+ policy: pull-push
1321
+ paths:
1322
+ - api/node_modules
1323
+ artifacts:
1324
+ paths:
1325
+ - api/__build_info.json
1326
+ - api/.next
1327
+ - api/dist
1328
+ expire_in: 1 day
1329
+ when: always
1330
+ reports: {}
1331
+ rules:
1332
+ - if: $CI_COMMIT_TAG
1333
+ needs: []
1334
+ retry: *a1
1335
+ interruptible: true
1336
+ 'api ๐Ÿ”จ docker | prod ':
1337
+ stage: build
1338
+ image: path/to/docker/docker-build:the-version
1339
+ services:
1340
+ - name: docker:24.0.6-dind
1341
+ command:
1342
+ - --tls=false
1343
+ - --registry-mirror=https://mirror.gcr.io
1344
+ variables:
1345
+ DOCKER_HOST: tcp://docker:2375
1346
+ DOCKER_TLS_CERTDIR: ''
1347
+ DOCKER_DRIVER: overlay2
1348
+ DOCKER_BUILDKIT: '1'
1349
+ KUBERNETES_CPU_REQUEST: '0.45'
1350
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1351
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1352
+ script:
1353
+ - collapseable_section_start "injectvars" "Injecting variables"
1354
+ - export APP_DIR="api"
1355
+ - export DOCKER_BUILD_CONTEXT="."
1356
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1357
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1358
+ - export DOCKER_IMAGE_NAME="prod/api"
1359
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1360
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1361
+ - |-
1362
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1363
+ RUN yarn plugin import workspace-tools
1364
+ RUN yarn workspaces focus --production && yarn rebuild"
1365
+ - |-
1366
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node api/package.json /app/api/package.json
1367
+ COPY --chown=node:node api/yarn.lock /app/api/yarn.lock
1368
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1369
+ COPY --chown=node:node .yarn /app/.yarn"
1370
+ - collapseable_section_end "injectvars"
1371
+ - ensureNodeDockerfile
1372
+ - collapseable_section_start "docker-login" "Docker Login"
1373
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1374
+ - collapseable_section_end "docker-login"
1375
+ - collapseable_section_start "docker-build" "Docker build"
1376
+ - 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
1377
+ - collapseable_section_end "docker-build"
1378
+ - collapseable_section_start "docker-push" "Docker push and tag"
1379
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1380
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1381
+ - docker push $DOCKER_CACHE_IMAGE
1382
+ - collapseable_section_end "docker-push"
1383
+ cache:
1384
+ - key: api-yarn
1385
+ policy: pull
1386
+ paths:
1387
+ - api/.yarn
1388
+ rules:
1389
+ - if: $CI_COMMIT_TAG
1390
+ needs:
1391
+ - 'api ๐Ÿ”จ app | prod '
1392
+ retry: *a1
1393
+ interruptible: true
1394
+ 'api ๐Ÿงพ sbom | prod ':
1395
+ stage: build
1396
+ image:
1397
+ name: aquasec/trivy:0.58.2
1398
+ entrypoint:
1399
+ - ''
1400
+ variables: {}
1401
+ script:
1402
+ - collapseable_section_start "injectvars" "Injecting variables"
1403
+ - collapseable_section_end "injectvars"
1404
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" api
1405
+ artifacts:
1406
+ paths:
1407
+ - __sbom.json
1408
+ rules:
1409
+ - if: $CI_COMMIT_TAG
1410
+ needs: []
1411
+ retry: *a1
1412
+ interruptible: true
1413
+ allow_failure: true
1414
+ 'api ๐Ÿš€ Deploy | prod ':
1415
+ stage: deploy prod
1416
+ image: path/to/docker/kubernetes:the-version
1417
+ variables:
1418
+ KUBERNETES_CPU_REQUEST: '0.22'
1419
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1420
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1421
+ script:
1422
+ - collapseable_section_start "injectvars" "Injecting variables"
1423
+ - export ENV_SHORT="prod"
1424
+ - export APP_DIR="api"
1425
+ - export ENV_TYPE="prod"
1426
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1427
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1428
+ - 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")"
1429
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1430
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1431
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1432
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1433
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1434
+ - export KUBE_APP_NAME="api"
1435
+ - export KUBE_APP_NAME_PREFIX=""
1436
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
1437
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1438
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/api"
1439
+ - export DOCKER_IMAGE_NAME="prod/api"
1440
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1441
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1442
+ - export RELEASE_NAME="pan-test-app-prod-api"
1443
+ - export HELM_EXPERIMENTAL_OCI="1"
1444
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1445
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1446
+ - export HELM_ARGS=""
1447
+ - export COMPONENT_NAME="api"
1448
+ - collapseable_section_end "injectvars"
1449
+ - kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1450
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1451
+ - kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"
1452
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1453
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
1454
+ - |
1455
+ cat > __all_values.yml <<EOF
1456
+ env:
1457
+ secret: {}
1458
+ public:
1459
+ ENV_SHORT: |-
1460
+ prod
1461
+ APP_DIR: |-
1462
+ api
1463
+ ENV_TYPE: |-
1464
+ prod
1465
+ BUILD_INFO_BUILD_ID: |-
1466
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1467
+ BUILD_INFO_BUILD_TIME: |-
1468
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1469
+ BUILD_INFO_CURRENT_VERSION: |-
1470
+ $(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/^/ /')
1471
+ HOSTNAME: |-
1472
+ api.prod.test-app.pan.panter.cloud
1473
+ ROOT_URL: |-
1474
+ https://api.prod.test-app.pan.panter.cloud
1475
+ HOSTNAME_INTERNAL: |-
1476
+ api.prod.test-app.pan.panter.cloud
1477
+ ROOT_URL_INTERNAL: |-
1478
+ https://api.prod.test-app.pan.panter.cloud
1479
+ KUBE_NAMESPACE: |-
1480
+ pan-test-app-prod
1481
+ KUBE_APP_NAME: |-
1482
+ api
1483
+ KUBE_APP_NAME_PREFIX: ""
1484
+ _ALL_ENV_VAR_KEYS: |-
1485
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
1486
+ application:
1487
+ host: |-
1488
+ api.prod.test-app.pan.panter.cloud
1489
+ command: |-
1490
+ yarn start
1491
+ livenessProbe:
1492
+ httpGet:
1493
+ path: |-
1494
+ __health
1495
+ readinessProbe:
1496
+ httpGet:
1497
+ path: |-
1498
+ __health
1499
+ startupProbe:
1500
+ httpGet:
1501
+ path: |-
1502
+ __health
1503
+ jobs:
1504
+ migration:
1505
+ command: |-
1506
+ yarn migrate
1507
+ cronjobs:
1508
+ send-emails:
1509
+ command: |-
1510
+ yarn send emails
1511
+ schedule: |-
1512
+ 0 * * * *
1513
+
1514
+ EOF
1515
+ - collapseable_section_end "writeallvalues"
1516
+ - kubernetesCreateSecret
1517
+ - kubernetesDeploy
1518
+ - echo 'Uploading SBOM to Dependency Track'
1519
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/api" "$ROOT_URL" "__sbom.json" vex.json || true
1520
+ - echo deployment successful ๐Ÿ˜ป
1521
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1522
+ environment:
1523
+ name: prod/api
1524
+ url: $CL_GITLAB_ENVIRONMENT_URL
1525
+ on_stop: 'api ๐Ÿ›‘ Stop โš ๏ธ | prod '
1526
+ artifacts:
1527
+ reports:
1528
+ dotenv: gitlab_environment.env
1529
+ rules:
1530
+ - when: manual
1531
+ if: $CI_COMMIT_TAG
1532
+ needs:
1533
+ - job: 'api ๐Ÿ”จ app | prod '
1534
+ artifacts: false
1535
+ - job: 'api ๐Ÿ”จ docker | prod '
1536
+ artifacts: false
1537
+ - job: 'api ๐Ÿงพ sbom | prod '
1538
+ artifacts: true
1539
+ retry: *a1
1540
+ interruptible: true
1541
+ allow_failure: true
1542
+ 'api ๐Ÿ›‘ Stop โš ๏ธ | prod ':
1543
+ stage: stop prod
1544
+ image: path/to/docker/kubernetes:the-version
1545
+ variables:
1546
+ KUBERNETES_CPU_REQUEST: '0.22'
1547
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1548
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1549
+ GIT_STRATEGY: none
1550
+ script:
1551
+ - collapseable_section_start "injectvars" "Injecting variables"
1552
+ - export ENV_SHORT="prod"
1553
+ - export APP_DIR="api"
1554
+ - export ENV_TYPE="prod"
1555
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1556
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1557
+ - 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")"
1558
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1559
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1560
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1561
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1562
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1563
+ - export KUBE_APP_NAME="api"
1564
+ - export KUBE_APP_NAME_PREFIX=""
1565
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
1566
+ - export RELEASE_NAME="pan-test-app-prod-api"
1567
+ - export HELM_EXPERIMENTAL_OCI="1"
1568
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1569
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1570
+ - export HELM_ARGS=""
1571
+ - export COMPONENT_NAME="api"
1572
+ - collapseable_section_end "injectvars"
1573
+ - kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1574
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1575
+ - kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"
1576
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1577
+ - kubernetesDelete
1578
+ - echo 'Disabling component in Dependency Track'
1579
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/api" "$CI_ENVIRONMENT_URL" || true
1580
+ environment:
1581
+ name: prod/api
1582
+ action: stop
1583
+ rules:
1584
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1585
+ when: on_success
1586
+ - when: manual
1587
+ if: $CI_COMMIT_TAG
1588
+ needs: []
1589
+ retry: *a1
1590
+ interruptible: true
1591
+ allow_failure: true
1592
+ 'api โ†ฉ๏ธ Rollback โš ๏ธ | prod ':
1593
+ stage: rollback prod
1594
+ image: path/to/docker/kubernetes:the-version
1595
+ variables:
1596
+ KUBERNETES_CPU_REQUEST: '0.22'
1597
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1598
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1599
+ GIT_STRATEGY: none
1600
+ script:
1601
+ - collapseable_section_start "injectvars" "Injecting variables"
1602
+ - export ENV_SHORT="prod"
1603
+ - export APP_DIR="api"
1604
+ - export ENV_TYPE="prod"
1605
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1606
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1607
+ - 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")"
1608
+ - export HOSTNAME="api.prod.test-app.pan.panter.cloud"
1609
+ - export ROOT_URL="https://api.prod.test-app.pan.panter.cloud"
1610
+ - export HOSTNAME_INTERNAL="api.prod.test-app.pan.panter.cloud"
1611
+ - export ROOT_URL_INTERNAL="https://api.prod.test-app.pan.panter.cloud"
1612
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1613
+ - export KUBE_APP_NAME="api"
1614
+ - export KUBE_APP_NAME_PREFIX=""
1615
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
1616
+ - export RELEASE_NAME="pan-test-app-prod-api"
1617
+ - export HELM_EXPERIMENTAL_OCI="1"
1618
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-api"
1619
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1620
+ - export HELM_ARGS=""
1621
+ - export COMPONENT_NAME="api"
1622
+ - collapseable_section_end "injectvars"
1623
+ - kubectl config set-cluster "kube-pan-test-app-prod-api" --server="$CL_prod_api_KUBE_URL" --certificate-authority <(echo $CL_prod_api_KUBE_CA_PEM | base64 -d) --embed-certs=true
1624
+ - kubectl config set-credentials "kube-pan-test-app-prod-api" --token="$CL_prod_api_KUBE_TOKEN"
1625
+ - kubectl config set-context "kube-pan-test-app-prod-api" --cluster="kube-pan-test-app-prod-api" --user="kube-pan-test-app-prod-api" --namespace="pan-test-app-prod"
1626
+ - kubectl config use-context "kube-pan-test-app-prod-api"
1627
+ - kubernetesRollback
1628
+ environment:
1629
+ name: prod/api
1630
+ action: access
1631
+ rules:
1632
+ - when: manual
1633
+ if: $CI_COMMIT_TAG
1634
+ needs: []
1635
+ retry: *a1
1636
+ interruptible: true
1637
+ allow_failure: true
1638
+ www ๐Ÿ›ก audit:
1639
+ stage: test
1640
+ image: path/to/docker/jobs-default:the-version
1641
+ variables:
1642
+ KUBERNETES_CPU_REQUEST: '0.45'
1643
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1644
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1645
+ script:
1646
+ - collapseable_section_start "injectvars" "Injecting variables"
1647
+ - export APP_PATH="www"
1648
+ - collapseable_section_end "injectvars"
1649
+ - cd www
1650
+ - yarn npm audit --environment production
1651
+ rules:
1652
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
1653
+ - if: $CI_MERGE_REQUEST_ID
1654
+ needs: []
1655
+ retry: *a1
1656
+ interruptible: true
1657
+ allow_failure: true
1658
+ www ๐Ÿ‘ฎ lint:
1659
+ stage: test
1660
+ image: path/to/docker/jobs-default:the-version
1661
+ variables:
1662
+ KUBERNETES_CPU_REQUEST: '0.45'
1663
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1664
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1665
+ script:
1666
+ - collapseable_section_start "injectvars" "Injecting variables"
1667
+ - export APP_PATH="www"
1668
+ - collapseable_section_end "injectvars"
1669
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1670
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1671
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1672
+ - collapseable_section_end "nodeinstall"
1673
+ - cd www
1674
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1675
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1676
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1677
+ - collapseable_section_end "nodeinstall"
1678
+ - collapseable_section_start "yarninstall" "Yarn install"
1679
+ - yarn install --immutable
1680
+ - collapseable_section_end "yarninstall"
1681
+ - yarn lint
1682
+ cache:
1683
+ - key: www-yarn
1684
+ policy: pull-push
1685
+ paths:
1686
+ - www/.yarn
1687
+ - key: www-node-modules
1688
+ policy: pull-push
1689
+ paths:
1690
+ - www/node_modules
1691
+ rules:
1692
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
1693
+ - if: $CI_MERGE_REQUEST_ID
1694
+ needs: []
1695
+ retry: *a1
1696
+ interruptible: true
1697
+ www ๐Ÿงช test:
1698
+ stage: test
1699
+ image: path/to/docker/jobs-testing-chrome:the-version
1700
+ variables:
1701
+ KUBERNETES_CPU_REQUEST: '0.45'
1702
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1703
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1704
+ script:
1705
+ - collapseable_section_start "injectvars" "Injecting variables"
1706
+ - export APP_PATH="www"
1707
+ - collapseable_section_end "injectvars"
1708
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1709
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1710
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1711
+ - collapseable_section_end "nodeinstall"
1712
+ - cd www
1713
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1714
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1715
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1716
+ - collapseable_section_end "nodeinstall"
1717
+ - collapseable_section_start "yarninstall" "Yarn install"
1718
+ - yarn install --immutable
1719
+ - collapseable_section_end "yarninstall"
1720
+ - yarn test
1721
+ cache:
1722
+ - key: www-yarn
1723
+ policy: pull-push
1724
+ paths:
1725
+ - www/.yarn
1726
+ - key: www-node-modules
1727
+ policy: pull-push
1728
+ paths:
1729
+ - www/node_modules
1730
+ rules:
1731
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
1732
+ - if: $CI_MERGE_REQUEST_ID
1733
+ needs: []
1734
+ retry: *a1
1735
+ interruptible: true
1736
+ 'www ๐Ÿ”จ app | dev ':
1737
+ stage: build
1738
+ image: path/to/docker/jobs-default:the-version
1739
+ variables:
1740
+ KUBERNETES_CPU_REQUEST: '0.45'
1741
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1742
+ KUBERNETES_MEMORY_LIMIT: 4Gi
1743
+ script:
1744
+ - collapseable_section_start "injectvars" "Injecting variables"
1745
+ - export ENV_SHORT="dev"
1746
+ - export APP_DIR="www"
1747
+ - export ENV_TYPE="dev"
1748
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1749
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1750
+ - 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")"
1751
+ - export HOSTNAME="www.dev.test-app.pan.panter.cloud"
1752
+ - export ROOT_URL="https://www.dev.test-app.pan.panter.cloud"
1753
+ - export HOSTNAME_INTERNAL="www.dev.test-app.pan.panter.cloud"
1754
+ - export ROOT_URL_INTERNAL="https://www.dev.test-app.pan.panter.cloud"
1755
+ - export KUBE_NAMESPACE="pan-test-app-dev"
1756
+ - export KUBE_APP_NAME="www"
1757
+ - export KUBE_APP_NAME_PREFIX=""
1758
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
1759
+ - collapseable_section_end "injectvars"
1760
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
1761
+ - |-
1762
+ cat <<EOF > www/.env
1763
+ ENV_SHORT=dev
1764
+ APP_DIR=www
1765
+ ENV_TYPE=dev
1766
+ HOSTNAME=www.dev.test-app.pan.panter.cloud
1767
+ ROOT_URL=https://www.dev.test-app.pan.panter.cloud
1768
+ HOSTNAME_INTERNAL=www.dev.test-app.pan.panter.cloud
1769
+ ROOT_URL_INTERNAL=https://www.dev.test-app.pan.panter.cloud
1770
+ KUBE_NAMESPACE=pan-test-app-dev
1771
+ KUBE_APP_NAME=www
1772
+ KUBE_APP_NAME_PREFIX=
1773
+ _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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
1774
+ EOF
1775
+ - collapseable_section_end "write-dotenv-www"
1776
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
1777
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1778
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1779
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1780
+ - collapseable_section_end "nodeinstall"
1781
+ - cd www
1782
+ - collapseable_section_start "nodeinstall" "Ensure node version"
1783
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
1784
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
1785
+ - collapseable_section_end "nodeinstall"
1786
+ - collapseable_section_start "yarninstall" "Yarn install"
1787
+ - yarn install --immutable
1788
+ - collapseable_section_end "yarninstall"
1789
+ - yarn build
1790
+ cache:
1791
+ - key: www-yarn
1792
+ policy: pull-push
1793
+ paths:
1794
+ - www/.yarn
1795
+ - key: www-node-modules
1796
+ policy: pull-push
1797
+ paths:
1798
+ - www/node_modules
1799
+ artifacts:
1800
+ paths:
1801
+ - www/__build_info.json
1802
+ - www/.next
1803
+ - www/dist
1804
+ exclude:
1805
+ - www/.env
1806
+ expire_in: 1 day
1807
+ when: always
1808
+ reports: {}
1809
+ rules:
1810
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
1811
+ needs: []
1812
+ retry: *a1
1813
+ interruptible: true
1814
+ 'www ๐Ÿ”จ docker | dev ':
1815
+ stage: build
1816
+ image: path/to/docker/docker-build:the-version
1817
+ services:
1818
+ - name: docker:24.0.6-dind
1819
+ command:
1820
+ - --tls=false
1821
+ - --registry-mirror=https://mirror.gcr.io
1822
+ variables:
1823
+ DOCKER_HOST: tcp://docker:2375
1824
+ DOCKER_TLS_CERTDIR: ''
1825
+ DOCKER_DRIVER: overlay2
1826
+ DOCKER_BUILDKIT: '1'
1827
+ KUBERNETES_CPU_REQUEST: '0.45'
1828
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1829
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1830
+ script:
1831
+ - collapseable_section_start "injectvars" "Injecting variables"
1832
+ - export APP_DIR="www"
1833
+ - export DOCKER_BUILD_CONTEXT="."
1834
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1835
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
1836
+ - export DOCKER_IMAGE_NAME="dev/www"
1837
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1838
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1839
+ - |-
1840
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
1841
+ RUN yarn plugin import workspace-tools
1842
+ RUN yarn workspaces focus --production && yarn rebuild"
1843
+ - |-
1844
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
1845
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
1846
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
1847
+ COPY --chown=node:node .yarn /app/.yarn"
1848
+ - collapseable_section_end "injectvars"
1849
+ - ensureNodeDockerfile
1850
+ - collapseable_section_start "docker-login" "Docker Login"
1851
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1852
+ - collapseable_section_end "docker-login"
1853
+ - collapseable_section_start "docker-build" "Docker build"
1854
+ - 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
1855
+ - collapseable_section_end "docker-build"
1856
+ - collapseable_section_start "docker-push" "Docker push and tag"
1857
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1858
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1859
+ - docker push $DOCKER_CACHE_IMAGE
1860
+ - collapseable_section_end "docker-push"
1861
+ cache:
1862
+ - key: www-yarn
1863
+ policy: pull
1864
+ paths:
1865
+ - www/.yarn
1866
+ rules:
1867
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
1868
+ needs:
1869
+ - 'www ๐Ÿ”จ app | dev '
1870
+ retry: *a1
1871
+ interruptible: true
1872
+ 'www ๐Ÿงพ sbom | dev ':
1873
+ stage: build
1874
+ image:
1875
+ name: aquasec/trivy:0.58.2
1876
+ entrypoint:
1877
+ - ''
1878
+ variables: {}
1879
+ script:
1880
+ - collapseable_section_start "injectvars" "Injecting variables"
1881
+ - collapseable_section_end "injectvars"
1882
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
1883
+ artifacts:
1884
+ paths:
1885
+ - __sbom.json
1886
+ rules:
1887
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
1888
+ needs: []
1889
+ retry: *a1
1890
+ interruptible: true
1891
+ allow_failure: true
1892
+ 'www ๐Ÿš€ Deploy | dev ':
1893
+ stage: deploy dev
1894
+ image: path/to/docker/kubernetes:the-version
1895
+ variables:
1896
+ KUBERNETES_CPU_REQUEST: '0.22'
1897
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1898
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1899
+ script:
1900
+ - collapseable_section_start "injectvars" "Injecting variables"
1901
+ - export ENV_SHORT="dev"
1902
+ - export APP_DIR="www"
1903
+ - export ENV_TYPE="dev"
1904
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1905
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1906
+ - 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")"
1907
+ - export HOSTNAME="www.dev.test-app.pan.panter.cloud"
1908
+ - export ROOT_URL="https://www.dev.test-app.pan.panter.cloud"
1909
+ - export HOSTNAME_INTERNAL="www.dev.test-app.pan.panter.cloud"
1910
+ - export ROOT_URL_INTERNAL="https://www.dev.test-app.pan.panter.cloud"
1911
+ - export KUBE_NAMESPACE="pan-test-app-dev"
1912
+ - export KUBE_APP_NAME="www"
1913
+ - export KUBE_APP_NAME_PREFIX=""
1914
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
1915
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1916
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
1917
+ - export DOCKER_IMAGE_NAME="dev/www"
1918
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1919
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1920
+ - export RELEASE_NAME="pan-test-app-dev-www"
1921
+ - export HELM_EXPERIMENTAL_OCI="1"
1922
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
1923
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1924
+ - export HELM_ARGS=""
1925
+ - export COMPONENT_NAME="www"
1926
+ - collapseable_section_end "injectvars"
1927
+ - kubectl config set-cluster "kube-pan-test-app-dev-www" --server="$CL_dev_www_KUBE_URL" --certificate-authority <(echo $CL_dev_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
1928
+ - kubectl config set-credentials "kube-pan-test-app-dev-www" --token="$CL_dev_www_KUBE_TOKEN"
1929
+ - kubectl config set-context "kube-pan-test-app-dev-www" --cluster="kube-pan-test-app-dev-www" --user="kube-pan-test-app-dev-www" --namespace="pan-test-app-dev"
1930
+ - kubectl config use-context "kube-pan-test-app-dev-www"
1931
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
1932
+ - |
1933
+ cat > __all_values.yml <<EOF
1934
+ env:
1935
+ secret: {}
1936
+ public:
1937
+ ENV_SHORT: |-
1938
+ dev
1939
+ APP_DIR: |-
1940
+ www
1941
+ ENV_TYPE: |-
1942
+ dev
1943
+ BUILD_INFO_BUILD_ID: |-
1944
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1945
+ BUILD_INFO_BUILD_TIME: |-
1946
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1947
+ BUILD_INFO_CURRENT_VERSION: |-
1948
+ $(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/^/ /')
1949
+ HOSTNAME: |-
1950
+ www.dev.test-app.pan.panter.cloud
1951
+ ROOT_URL: |-
1952
+ https://www.dev.test-app.pan.panter.cloud
1953
+ HOSTNAME_INTERNAL: |-
1954
+ www.dev.test-app.pan.panter.cloud
1955
+ ROOT_URL_INTERNAL: |-
1956
+ https://www.dev.test-app.pan.panter.cloud
1957
+ KUBE_NAMESPACE: |-
1958
+ pan-test-app-dev
1959
+ KUBE_APP_NAME: |-
1960
+ www
1961
+ KUBE_APP_NAME_PREFIX: ""
1962
+ _ALL_ENV_VAR_KEYS: |-
1963
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
1964
+ application:
1965
+ host: |-
1966
+ www.dev.test-app.pan.panter.cloud
1967
+ command: |-
1968
+ yarn start
1969
+ livenessProbe:
1970
+ httpGet:
1971
+ path: |-
1972
+ __health
1973
+ readinessProbe:
1974
+ httpGet:
1975
+ path: |-
1976
+ __health
1977
+ startupProbe:
1978
+ httpGet:
1979
+ path: |-
1980
+ __health
1981
+
1982
+ EOF
1983
+ - collapseable_section_end "writeallvalues"
1984
+ - kubernetesCreateSecret
1985
+ - kubernetesDeploy
1986
+ - echo 'Uploading SBOM to Dependency Track'
1987
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
1988
+ - echo deployment successful ๐Ÿ˜ป
1989
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1990
+ environment:
1991
+ name: dev/www
1992
+ url: $CL_GITLAB_ENVIRONMENT_URL
1993
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | dev '
1994
+ auto_stop_in: 4 weeks
1995
+ artifacts:
1996
+ reports:
1997
+ dotenv: gitlab_environment.env
1998
+ rules:
1999
+ - when: on_success
2000
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
2001
+ needs:
2002
+ - job: www ๐Ÿ‘ฎ lint
2003
+ artifacts: false
2004
+ - job: 'www ๐Ÿ”จ app | dev '
2005
+ artifacts: false
2006
+ - job: 'www ๐Ÿ”จ docker | dev '
2007
+ artifacts: false
2008
+ - job: www ๐Ÿงช test
2009
+ artifacts: false
2010
+ - job: 'www ๐Ÿงพ sbom | dev '
2011
+ artifacts: true
2012
+ - job: www ๐Ÿ›ก audit
2013
+ artifacts: false
2014
+ retry: *a1
2015
+ interruptible: true
2016
+ allow_failure: false
2017
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | dev ':
2018
+ stage: stop dev
2019
+ image: path/to/docker/kubernetes:the-version
2020
+ variables:
2021
+ KUBERNETES_CPU_REQUEST: '0.22'
2022
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2023
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2024
+ GIT_STRATEGY: none
2025
+ script:
2026
+ - collapseable_section_start "injectvars" "Injecting variables"
2027
+ - export ENV_SHORT="dev"
2028
+ - export APP_DIR="www"
2029
+ - export ENV_TYPE="dev"
2030
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2031
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2032
+ - 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")"
2033
+ - export HOSTNAME="www.dev.test-app.pan.panter.cloud"
2034
+ - export ROOT_URL="https://www.dev.test-app.pan.panter.cloud"
2035
+ - export HOSTNAME_INTERNAL="www.dev.test-app.pan.panter.cloud"
2036
+ - export ROOT_URL_INTERNAL="https://www.dev.test-app.pan.panter.cloud"
2037
+ - export KUBE_NAMESPACE="pan-test-app-dev"
2038
+ - export KUBE_APP_NAME="www"
2039
+ - export KUBE_APP_NAME_PREFIX=""
2040
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2041
+ - export RELEASE_NAME="pan-test-app-dev-www"
2042
+ - export HELM_EXPERIMENTAL_OCI="1"
2043
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
2044
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
2045
+ - export HELM_ARGS=""
2046
+ - export COMPONENT_NAME="www"
2047
+ - collapseable_section_end "injectvars"
2048
+ - kubectl config set-cluster "kube-pan-test-app-dev-www" --server="$CL_dev_www_KUBE_URL" --certificate-authority <(echo $CL_dev_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
2049
+ - kubectl config set-credentials "kube-pan-test-app-dev-www" --token="$CL_dev_www_KUBE_TOKEN"
2050
+ - kubectl config set-context "kube-pan-test-app-dev-www" --cluster="kube-pan-test-app-dev-www" --user="kube-pan-test-app-dev-www" --namespace="pan-test-app-dev"
2051
+ - kubectl config use-context "kube-pan-test-app-dev-www"
2052
+ - kubernetesDelete
2053
+ - echo 'Disabling component in Dependency Track'
2054
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
2055
+ environment:
2056
+ name: dev/www
2057
+ action: stop
2058
+ rules:
2059
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2060
+ when: on_success
2061
+ - when: manual
2062
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
2063
+ needs: []
2064
+ retry: *a1
2065
+ interruptible: true
2066
+ allow_failure: true
2067
+ 'www โ†ฉ๏ธ Rollback โš ๏ธ | dev ':
2068
+ stage: rollback dev
2069
+ image: path/to/docker/kubernetes:the-version
2070
+ variables:
2071
+ KUBERNETES_CPU_REQUEST: '0.22'
2072
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2073
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2074
+ GIT_STRATEGY: none
2075
+ script:
2076
+ - collapseable_section_start "injectvars" "Injecting variables"
2077
+ - export ENV_SHORT="dev"
2078
+ - export APP_DIR="www"
2079
+ - export ENV_TYPE="dev"
2080
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2081
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2082
+ - 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")"
2083
+ - export HOSTNAME="www.dev.test-app.pan.panter.cloud"
2084
+ - export ROOT_URL="https://www.dev.test-app.pan.panter.cloud"
2085
+ - export HOSTNAME_INTERNAL="www.dev.test-app.pan.panter.cloud"
2086
+ - export ROOT_URL_INTERNAL="https://www.dev.test-app.pan.panter.cloud"
2087
+ - export KUBE_NAMESPACE="pan-test-app-dev"
2088
+ - export KUBE_APP_NAME="www"
2089
+ - export KUBE_APP_NAME_PREFIX=""
2090
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2091
+ - export RELEASE_NAME="pan-test-app-dev-www"
2092
+ - export HELM_EXPERIMENTAL_OCI="1"
2093
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
2094
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
2095
+ - export HELM_ARGS=""
2096
+ - export COMPONENT_NAME="www"
2097
+ - collapseable_section_end "injectvars"
2098
+ - kubectl config set-cluster "kube-pan-test-app-dev-www" --server="$CL_dev_www_KUBE_URL" --certificate-authority <(echo $CL_dev_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
2099
+ - kubectl config set-credentials "kube-pan-test-app-dev-www" --token="$CL_dev_www_KUBE_TOKEN"
2100
+ - kubectl config set-context "kube-pan-test-app-dev-www" --cluster="kube-pan-test-app-dev-www" --user="kube-pan-test-app-dev-www" --namespace="pan-test-app-dev"
2101
+ - kubectl config use-context "kube-pan-test-app-dev-www"
2102
+ - kubernetesRollback
2103
+ environment:
2104
+ name: dev/www
2105
+ action: access
2106
+ rules:
2107
+ - when: manual
2108
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
2109
+ needs: []
2110
+ retry: *a1
2111
+ interruptible: true
2112
+ allow_failure: true
2113
+ 'www ๐Ÿ”จ app | review ':
2114
+ stage: build
2115
+ image: path/to/docker/jobs-default:the-version
2116
+ variables:
2117
+ KUBERNETES_CPU_REQUEST: '0.45'
2118
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2119
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2120
+ script:
2121
+ - collapseable_section_start "injectvars" "Injecting variables"
2122
+ - export ENV_SHORT="review"
2123
+ - export APP_DIR="www"
2124
+ - export ENV_TYPE="review"
2125
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2126
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2127
+ - 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")"
2128
+ - export HOSTNAME="www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2129
+ - export ROOT_URL="https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2130
+ - export HOSTNAME_INTERNAL="www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2131
+ - export ROOT_URL_INTERNAL="https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2132
+ - export KUBE_NAMESPACE="pan-test-app-review"
2133
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www"
2134
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
2135
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2136
+ - collapseable_section_end "injectvars"
2137
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
2138
+ - |-
2139
+ cat <<EOF > www/.env
2140
+ ENV_SHORT=review
2141
+ APP_DIR=www
2142
+ ENV_TYPE=review
2143
+ HOSTNAME=$(printf %s "www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | escapeForDotEnv)
2144
+ ROOT_URL=$(printf %s "https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | escapeForDotEnv)
2145
+ HOSTNAME_INTERNAL=$(printf %s "www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | escapeForDotEnv)
2146
+ ROOT_URL_INTERNAL=$(printf %s "https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | escapeForDotEnv)
2147
+ KUBE_NAMESPACE=pan-test-app-review
2148
+ KUBE_APP_NAME=$(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www" | escapeForDotEnv)
2149
+ KUBE_APP_NAME_PREFIX=$(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | escapeForDotEnv)
2150
+ _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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
2151
+ EOF
2152
+ - collapseable_section_end "write-dotenv-www"
2153
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
2154
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2155
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2156
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2157
+ - collapseable_section_end "nodeinstall"
2158
+ - cd www
2159
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2160
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2161
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2162
+ - collapseable_section_end "nodeinstall"
2163
+ - collapseable_section_start "yarninstall" "Yarn install"
2164
+ - yarn install --immutable
2165
+ - collapseable_section_end "yarninstall"
2166
+ - yarn build
2167
+ cache:
2168
+ - key: www-yarn
2169
+ policy: pull-push
2170
+ paths:
2171
+ - www/.yarn
2172
+ - key: www-node-modules
2173
+ policy: pull-push
2174
+ paths:
2175
+ - www/node_modules
2176
+ artifacts:
2177
+ paths:
2178
+ - www/__build_info.json
2179
+ - www/.next
2180
+ - www/dist
2181
+ exclude:
2182
+ - www/.env
2183
+ expire_in: 1 day
2184
+ when: always
2185
+ reports: {}
2186
+ rules:
2187
+ - if: $CI_MERGE_REQUEST_ID
2188
+ needs: []
2189
+ retry: *a1
2190
+ interruptible: true
2191
+ 'www ๐Ÿ”จ docker | review ':
2192
+ stage: build
2193
+ image: path/to/docker/docker-build:the-version
2194
+ services:
2195
+ - name: docker:24.0.6-dind
2196
+ command:
2197
+ - --tls=false
2198
+ - --registry-mirror=https://mirror.gcr.io
2199
+ variables:
2200
+ DOCKER_HOST: tcp://docker:2375
2201
+ DOCKER_TLS_CERTDIR: ''
2202
+ DOCKER_DRIVER: overlay2
2203
+ DOCKER_BUILDKIT: '1'
2204
+ KUBERNETES_CPU_REQUEST: '0.45'
2205
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2206
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2207
+ script:
2208
+ - collapseable_section_start "injectvars" "Injecting variables"
2209
+ - export APP_DIR="www"
2210
+ - export DOCKER_BUILD_CONTEXT="."
2211
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
2212
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
2213
+ - export DOCKER_IMAGE_NAME="review/www"
2214
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
2215
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2216
+ - |-
2217
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2218
+ RUN yarn plugin import workspace-tools
2219
+ RUN yarn workspaces focus --production && yarn rebuild"
2220
+ - |-
2221
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
2222
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
2223
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2224
+ COPY --chown=node:node .yarn /app/.yarn"
2225
+ - collapseable_section_end "injectvars"
2226
+ - ensureNodeDockerfile
2227
+ - collapseable_section_start "docker-login" "Docker Login"
2228
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
2229
+ - collapseable_section_end "docker-login"
2230
+ - collapseable_section_start "docker-build" "Docker build"
2231
+ - 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
2232
+ - collapseable_section_end "docker-build"
2233
+ - collapseable_section_start "docker-push" "Docker push and tag"
2234
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2235
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2236
+ - docker push $DOCKER_CACHE_IMAGE
2237
+ - collapseable_section_end "docker-push"
2238
+ cache:
2239
+ - key: www-yarn
2240
+ policy: pull
2241
+ paths:
2242
+ - www/.yarn
2243
+ rules:
2244
+ - if: $CI_MERGE_REQUEST_ID
2245
+ needs:
2246
+ - 'www ๐Ÿ”จ app | review '
2247
+ retry: *a1
2248
+ interruptible: true
2249
+ 'www ๐Ÿงพ sbom | review ':
2250
+ stage: build
2251
+ image:
2252
+ name: aquasec/trivy:0.58.2
2253
+ entrypoint:
2254
+ - ''
2255
+ variables: {}
2256
+ script:
2257
+ - collapseable_section_start "injectvars" "Injecting variables"
2258
+ - collapseable_section_end "injectvars"
2259
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
2260
+ artifacts:
2261
+ paths:
2262
+ - __sbom.json
2263
+ rules:
2264
+ - if: $CI_MERGE_REQUEST_ID
2265
+ needs: []
2266
+ retry: *a1
2267
+ interruptible: true
2268
+ allow_failure: true
2269
+ 'www ๐Ÿš€ Deploy | review ':
2270
+ stage: deploy review
2271
+ image: path/to/docker/kubernetes:the-version
2272
+ variables:
2273
+ KUBERNETES_CPU_REQUEST: '0.22'
2274
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2275
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2276
+ script:
2277
+ - collapseable_section_start "injectvars" "Injecting variables"
2278
+ - export ENV_SHORT="review"
2279
+ - export APP_DIR="www"
2280
+ - export ENV_TYPE="review"
2281
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2282
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2283
+ - 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")"
2284
+ - export HOSTNAME="www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2285
+ - export ROOT_URL="https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2286
+ - export HOSTNAME_INTERNAL="www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2287
+ - export ROOT_URL_INTERNAL="https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2288
+ - export KUBE_NAMESPACE="pan-test-app-review"
2289
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www"
2290
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
2291
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2292
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
2293
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
2294
+ - export DOCKER_IMAGE_NAME="review/www"
2295
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
2296
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2297
+ - export RELEASE_NAME="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"
2298
+ - export HELM_EXPERIMENTAL_OCI="1"
2299
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
2300
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
2301
+ - export HELM_ARGS=""
2302
+ - export COMPONENT_NAME="www"
2303
+ - collapseable_section_end "injectvars"
2304
+ - kubectl config set-cluster "kube-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" --server="$CL_review_www_KUBE_URL" --certificate-authority <(echo $CL_review_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
2305
+ - kubectl config set-credentials "kube-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" --token="$CL_review_www_KUBE_TOKEN"
2306
+ - kubectl config set-context "kube-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" --cluster="kube-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" --user="kube-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" --namespace="pan-test-app-review"
2307
+ - kubectl config use-context "kube-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"
2308
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
2309
+ - |
2310
+ cat > __all_values.yml <<EOF
2311
+ env:
2312
+ secret: {}
2313
+ public:
2314
+ ENV_SHORT: |-
2315
+ review
2316
+ APP_DIR: |-
2317
+ www
2318
+ ENV_TYPE: |-
2319
+ review
2320
+ BUILD_INFO_BUILD_ID: |-
2321
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2322
+ BUILD_INFO_BUILD_TIME: |-
2323
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2324
+ BUILD_INFO_CURRENT_VERSION: |-
2325
+ $(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/^/ /')
2326
+ HOSTNAME: |-
2327
+ $(printf %s "www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
2328
+ ROOT_URL: |-
2329
+ $(printf %s "https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
2330
+ HOSTNAME_INTERNAL: |-
2331
+ $(printf %s "www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
2332
+ ROOT_URL_INTERNAL: |-
2333
+ $(printf %s "https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
2334
+ KUBE_NAMESPACE: |-
2335
+ pan-test-app-review
2336
+ KUBE_APP_NAME: |-
2337
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www" | sed '1!s/^/ /')
2338
+ KUBE_APP_NAME_PREFIX: |-
2339
+ $(printf %s "$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-" | sed '1!s/^/ /')
2340
+ _ALL_ENV_VAR_KEYS: |-
2341
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
2342
+ application:
2343
+ host: |-
2344
+ $(printf %s "www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud" | sed '1!s/^/ /')
2345
+ command: |-
2346
+ yarn start
2347
+ livenessProbe:
2348
+ httpGet:
2349
+ path: |-
2350
+ __health
2351
+ readinessProbe:
2352
+ httpGet:
2353
+ path: |-
2354
+ __health
2355
+ startupProbe:
2356
+ httpGet:
2357
+ path: |-
2358
+ __health
2359
+
2360
+ EOF
2361
+ - collapseable_section_end "writeallvalues"
2362
+ - kubernetesCreateSecret
2363
+ - kubernetesDeploy
2364
+ - echo 'Uploading SBOM to Dependency Track'
2365
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
2366
+ - echo deployment successful ๐Ÿ˜ป
2367
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
2368
+ environment:
2369
+ name: review/$CI_COMMIT_REF_NAME/www
2370
+ url: $CL_GITLAB_ENVIRONMENT_URL
2371
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | review '
2372
+ auto_stop_in: 1 week
2373
+ artifacts:
2374
+ reports:
2375
+ dotenv: gitlab_environment.env
2376
+ rules:
2377
+ - when: on_success
2378
+ if: $CI_MERGE_REQUEST_ID
2379
+ needs:
2380
+ - job: www ๐Ÿ‘ฎ lint
2381
+ artifacts: false
2382
+ - job: 'www ๐Ÿ”จ app | review '
2383
+ artifacts: false
2384
+ - job: 'www ๐Ÿ”จ docker | review '
2385
+ artifacts: false
2386
+ - job: www ๐Ÿงช test
2387
+ artifacts: false
2388
+ - job: 'www ๐Ÿงพ sbom | review '
2389
+ artifacts: true
2390
+ - job: www ๐Ÿ›ก audit
2391
+ artifacts: false
2392
+ retry: *a1
2393
+ interruptible: true
2394
+ allow_failure: false
2395
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | review ':
2396
+ stage: stop review
2397
+ image: path/to/docker/kubernetes:the-version
2398
+ variables:
2399
+ KUBERNETES_CPU_REQUEST: '0.22'
2400
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2401
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2402
+ GIT_STRATEGY: none
2403
+ script:
2404
+ - collapseable_section_start "injectvars" "Injecting variables"
2405
+ - export ENV_SHORT="review"
2406
+ - export APP_DIR="www"
2407
+ - export ENV_TYPE="review"
2408
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2409
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2410
+ - 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")"
2411
+ - export HOSTNAME="www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2412
+ - export ROOT_URL="https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2413
+ - export HOSTNAME_INTERNAL="www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2414
+ - export ROOT_URL_INTERNAL="https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2415
+ - export KUBE_NAMESPACE="pan-test-app-review"
2416
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www"
2417
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
2418
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2419
+ - export RELEASE_NAME="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"
2420
+ - export HELM_EXPERIMENTAL_OCI="1"
2421
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
2422
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
2423
+ - export HELM_ARGS=""
2424
+ - export COMPONENT_NAME="www"
2425
+ - collapseable_section_end "injectvars"
2426
+ - kubectl config set-cluster "kube-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" --server="$CL_review_www_KUBE_URL" --certificate-authority <(echo $CL_review_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
2427
+ - kubectl config set-credentials "kube-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" --token="$CL_review_www_KUBE_TOKEN"
2428
+ - kubectl config set-context "kube-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" --cluster="kube-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" --user="kube-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" --namespace="pan-test-app-review"
2429
+ - kubectl config use-context "kube-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"
2430
+ - kubernetesDelete
2431
+ - echo 'Disabling component in Dependency Track'
2432
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
2433
+ environment:
2434
+ name: review/$CI_COMMIT_REF_NAME/www
2435
+ action: stop
2436
+ rules:
2437
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2438
+ when: on_success
2439
+ - when: manual
2440
+ if: $CI_MERGE_REQUEST_ID
2441
+ needs: []
2442
+ retry: *a1
2443
+ interruptible: true
2444
+ allow_failure: true
2445
+ 'www โ†ฉ๏ธ Rollback โš ๏ธ | review ':
2446
+ stage: rollback review
2447
+ image: path/to/docker/kubernetes:the-version
2448
+ variables:
2449
+ KUBERNETES_CPU_REQUEST: '0.22'
2450
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2451
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2452
+ GIT_STRATEGY: none
2453
+ script:
2454
+ - collapseable_section_start "injectvars" "Injecting variables"
2455
+ - export ENV_SHORT="review"
2456
+ - export APP_DIR="www"
2457
+ - export ENV_TYPE="review"
2458
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2459
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2460
+ - 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")"
2461
+ - export HOSTNAME="www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2462
+ - export ROOT_URL="https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2463
+ - export HOSTNAME_INTERNAL="www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2464
+ - export ROOT_URL_INTERNAL="https://www.$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; }).review.test-app.pan.panter.cloud"
2465
+ - export KUBE_NAMESPACE="pan-test-app-review"
2466
+ - export KUBE_APP_NAME="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-www"
2467
+ - export KUBE_APP_NAME_PREFIX="$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-"
2468
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2469
+ - export RELEASE_NAME="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"
2470
+ - export HELM_EXPERIMENTAL_OCI="1"
2471
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
2472
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
2473
+ - export HELM_ARGS=""
2474
+ - export COMPONENT_NAME="www"
2475
+ - collapseable_section_end "injectvars"
2476
+ - kubectl config set-cluster "kube-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" --server="$CL_review_www_KUBE_URL" --certificate-authority <(echo $CL_review_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
2477
+ - kubectl config set-credentials "kube-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" --token="$CL_review_www_KUBE_TOKEN"
2478
+ - kubectl config set-context "kube-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" --cluster="kube-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" --user="kube-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" --namespace="pan-test-app-review"
2479
+ - kubectl config use-context "kube-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"
2480
+ - kubernetesRollback
2481
+ environment:
2482
+ name: review/$CI_COMMIT_REF_NAME/www
2483
+ action: access
2484
+ rules:
2485
+ - when: manual
2486
+ if: $CI_MERGE_REQUEST_ID
2487
+ needs: []
2488
+ retry: *a1
2489
+ interruptible: true
2490
+ allow_failure: true
2491
+ 'www ๐Ÿ”จ app | stage ':
2492
+ stage: build
2493
+ image: path/to/docker/jobs-default:the-version
2494
+ variables:
2495
+ KUBERNETES_CPU_REQUEST: '0.45'
2496
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2497
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2498
+ script:
2499
+ - collapseable_section_start "injectvars" "Injecting variables"
2500
+ - export ENV_SHORT="stage"
2501
+ - export APP_DIR="www"
2502
+ - export ENV_TYPE="stage"
2503
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2504
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2505
+ - 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")"
2506
+ - export HOSTNAME="www.stage.test-app.pan.panter.cloud"
2507
+ - export ROOT_URL="https://www.stage.test-app.pan.panter.cloud"
2508
+ - export HOSTNAME_INTERNAL="www.stage.test-app.pan.panter.cloud"
2509
+ - export ROOT_URL_INTERNAL="https://www.stage.test-app.pan.panter.cloud"
2510
+ - export KUBE_NAMESPACE="pan-test-app-stage"
2511
+ - export KUBE_APP_NAME="www"
2512
+ - export KUBE_APP_NAME_PREFIX=""
2513
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2514
+ - collapseable_section_end "injectvars"
2515
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
2516
+ - |-
2517
+ cat <<EOF > www/.env
2518
+ ENV_SHORT=stage
2519
+ APP_DIR=www
2520
+ ENV_TYPE=stage
2521
+ HOSTNAME=www.stage.test-app.pan.panter.cloud
2522
+ ROOT_URL=https://www.stage.test-app.pan.panter.cloud
2523
+ HOSTNAME_INTERNAL=www.stage.test-app.pan.panter.cloud
2524
+ ROOT_URL_INTERNAL=https://www.stage.test-app.pan.panter.cloud
2525
+ KUBE_NAMESPACE=pan-test-app-stage
2526
+ KUBE_APP_NAME=www
2527
+ KUBE_APP_NAME_PREFIX=
2528
+ _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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
2529
+ EOF
2530
+ - collapseable_section_end "write-dotenv-www"
2531
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
2532
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2533
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2534
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2535
+ - collapseable_section_end "nodeinstall"
2536
+ - cd www
2537
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2538
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2539
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2540
+ - collapseable_section_end "nodeinstall"
2541
+ - collapseable_section_start "yarninstall" "Yarn install"
2542
+ - yarn install --immutable
2543
+ - collapseable_section_end "yarninstall"
2544
+ - yarn build
2545
+ cache:
2546
+ - key: www-yarn
2547
+ policy: pull-push
2548
+ paths:
2549
+ - www/.yarn
2550
+ - key: www-node-modules
2551
+ policy: pull-push
2552
+ paths:
2553
+ - www/node_modules
2554
+ artifacts:
2555
+ paths:
2556
+ - www/__build_info.json
2557
+ - www/.next
2558
+ - www/dist
2559
+ exclude:
2560
+ - www/.env
2561
+ expire_in: 1 day
2562
+ when: always
2563
+ reports: {}
2564
+ rules:
2565
+ - if: $CI_COMMIT_TAG
2566
+ needs: []
2567
+ retry: *a1
2568
+ interruptible: true
2569
+ 'www ๐Ÿ”จ docker | stage ':
2570
+ stage: build
2571
+ image: path/to/docker/docker-build:the-version
2572
+ services:
2573
+ - name: docker:24.0.6-dind
2574
+ command:
2575
+ - --tls=false
2576
+ - --registry-mirror=https://mirror.gcr.io
2577
+ variables:
2578
+ DOCKER_HOST: tcp://docker:2375
2579
+ DOCKER_TLS_CERTDIR: ''
2580
+ DOCKER_DRIVER: overlay2
2581
+ DOCKER_BUILDKIT: '1'
2582
+ KUBERNETES_CPU_REQUEST: '0.45'
2583
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2584
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2585
+ script:
2586
+ - collapseable_section_start "injectvars" "Injecting variables"
2587
+ - export APP_DIR="www"
2588
+ - export DOCKER_BUILD_CONTEXT="."
2589
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
2590
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
2591
+ - export DOCKER_IMAGE_NAME="stage/www"
2592
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
2593
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2594
+ - |-
2595
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2596
+ RUN yarn plugin import workspace-tools
2597
+ RUN yarn workspaces focus --production && yarn rebuild"
2598
+ - |-
2599
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
2600
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
2601
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2602
+ COPY --chown=node:node .yarn /app/.yarn"
2603
+ - collapseable_section_end "injectvars"
2604
+ - ensureNodeDockerfile
2605
+ - collapseable_section_start "docker-login" "Docker Login"
2606
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
2607
+ - collapseable_section_end "docker-login"
2608
+ - collapseable_section_start "docker-build" "Docker build"
2609
+ - 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
2610
+ - collapseable_section_end "docker-build"
2611
+ - collapseable_section_start "docker-push" "Docker push and tag"
2612
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2613
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2614
+ - docker push $DOCKER_CACHE_IMAGE
2615
+ - collapseable_section_end "docker-push"
2616
+ cache:
2617
+ - key: www-yarn
2618
+ policy: pull
2619
+ paths:
2620
+ - www/.yarn
2621
+ rules:
2622
+ - if: $CI_COMMIT_TAG
2623
+ needs:
2624
+ - 'www ๐Ÿ”จ app | stage '
2625
+ retry: *a1
2626
+ interruptible: true
2627
+ 'www ๐Ÿงพ sbom | stage ':
2628
+ stage: build
2629
+ image:
2630
+ name: aquasec/trivy:0.58.2
2631
+ entrypoint:
2632
+ - ''
2633
+ variables: {}
2634
+ script:
2635
+ - collapseable_section_start "injectvars" "Injecting variables"
2636
+ - collapseable_section_end "injectvars"
2637
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
2638
+ artifacts:
2639
+ paths:
2640
+ - __sbom.json
2641
+ rules:
2642
+ - if: $CI_COMMIT_TAG
2643
+ needs: []
2644
+ retry: *a1
2645
+ interruptible: true
2646
+ allow_failure: true
2647
+ 'www ๐Ÿš€ Deploy | stage ':
2648
+ stage: deploy stage
2649
+ image: path/to/docker/kubernetes:the-version
2650
+ variables:
2651
+ KUBERNETES_CPU_REQUEST: '0.22'
2652
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2653
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2654
+ script:
2655
+ - collapseable_section_start "injectvars" "Injecting variables"
2656
+ - export ENV_SHORT="stage"
2657
+ - export APP_DIR="www"
2658
+ - export ENV_TYPE="stage"
2659
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2660
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2661
+ - 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")"
2662
+ - export HOSTNAME="www.stage.test-app.pan.panter.cloud"
2663
+ - export ROOT_URL="https://www.stage.test-app.pan.panter.cloud"
2664
+ - export HOSTNAME_INTERNAL="www.stage.test-app.pan.panter.cloud"
2665
+ - export ROOT_URL_INTERNAL="https://www.stage.test-app.pan.panter.cloud"
2666
+ - export KUBE_NAMESPACE="pan-test-app-stage"
2667
+ - export KUBE_APP_NAME="www"
2668
+ - export KUBE_APP_NAME_PREFIX=""
2669
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2670
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
2671
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
2672
+ - export DOCKER_IMAGE_NAME="stage/www"
2673
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
2674
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2675
+ - export RELEASE_NAME="pan-test-app-stage-www"
2676
+ - export HELM_EXPERIMENTAL_OCI="1"
2677
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
2678
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
2679
+ - export HELM_ARGS=""
2680
+ - export COMPONENT_NAME="www"
2681
+ - collapseable_section_end "injectvars"
2682
+ - kubectl config set-cluster "kube-pan-test-app-stage-www" --server="$CL_stage_www_KUBE_URL" --certificate-authority <(echo $CL_stage_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
2683
+ - kubectl config set-credentials "kube-pan-test-app-stage-www" --token="$CL_stage_www_KUBE_TOKEN"
2684
+ - kubectl config set-context "kube-pan-test-app-stage-www" --cluster="kube-pan-test-app-stage-www" --user="kube-pan-test-app-stage-www" --namespace="pan-test-app-stage"
2685
+ - kubectl config use-context "kube-pan-test-app-stage-www"
2686
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
2687
+ - |
2688
+ cat > __all_values.yml <<EOF
2689
+ env:
2690
+ secret: {}
2691
+ public:
2692
+ ENV_SHORT: |-
2693
+ stage
2694
+ APP_DIR: |-
2695
+ www
2696
+ ENV_TYPE: |-
2697
+ stage
2698
+ BUILD_INFO_BUILD_ID: |-
2699
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
2700
+ BUILD_INFO_BUILD_TIME: |-
2701
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
2702
+ BUILD_INFO_CURRENT_VERSION: |-
2703
+ $(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/^/ /')
2704
+ HOSTNAME: |-
2705
+ www.stage.test-app.pan.panter.cloud
2706
+ ROOT_URL: |-
2707
+ https://www.stage.test-app.pan.panter.cloud
2708
+ HOSTNAME_INTERNAL: |-
2709
+ www.stage.test-app.pan.panter.cloud
2710
+ ROOT_URL_INTERNAL: |-
2711
+ https://www.stage.test-app.pan.panter.cloud
2712
+ KUBE_NAMESPACE: |-
2713
+ pan-test-app-stage
2714
+ KUBE_APP_NAME: |-
2715
+ www
2716
+ KUBE_APP_NAME_PREFIX: ""
2717
+ _ALL_ENV_VAR_KEYS: |-
2718
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
2719
+ application:
2720
+ host: |-
2721
+ www.stage.test-app.pan.panter.cloud
2722
+ command: |-
2723
+ yarn start
2724
+ livenessProbe:
2725
+ httpGet:
2726
+ path: |-
2727
+ __health
2728
+ readinessProbe:
2729
+ httpGet:
2730
+ path: |-
2731
+ __health
2732
+ startupProbe:
2733
+ httpGet:
2734
+ path: |-
2735
+ __health
2736
+
2737
+ EOF
2738
+ - collapseable_section_end "writeallvalues"
2739
+ - kubernetesCreateSecret
2740
+ - kubernetesDeploy
2741
+ - echo 'Uploading SBOM to Dependency Track'
2742
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
2743
+ - echo deployment successful ๐Ÿ˜ป
2744
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
2745
+ environment:
2746
+ name: stage/www
2747
+ url: $CL_GITLAB_ENVIRONMENT_URL
2748
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | stage '
2749
+ artifacts:
2750
+ reports:
2751
+ dotenv: gitlab_environment.env
2752
+ rules:
2753
+ - when: on_success
2754
+ if: $CI_COMMIT_TAG
2755
+ needs:
2756
+ - job: 'www ๐Ÿ”จ app | stage '
2757
+ artifacts: false
2758
+ - job: 'www ๐Ÿ”จ docker | stage '
2759
+ artifacts: false
2760
+ - job: 'www ๐Ÿงพ sbom | stage '
2761
+ artifacts: true
2762
+ retry: *a1
2763
+ interruptible: true
2764
+ allow_failure: false
2765
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | stage ':
2766
+ stage: stop stage
2767
+ image: path/to/docker/kubernetes:the-version
2768
+ variables:
2769
+ KUBERNETES_CPU_REQUEST: '0.22'
2770
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2771
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2772
+ GIT_STRATEGY: none
2773
+ script:
2774
+ - collapseable_section_start "injectvars" "Injecting variables"
2775
+ - export ENV_SHORT="stage"
2776
+ - export APP_DIR="www"
2777
+ - export ENV_TYPE="stage"
2778
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2779
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2780
+ - 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")"
2781
+ - export HOSTNAME="www.stage.test-app.pan.panter.cloud"
2782
+ - export ROOT_URL="https://www.stage.test-app.pan.panter.cloud"
2783
+ - export HOSTNAME_INTERNAL="www.stage.test-app.pan.panter.cloud"
2784
+ - export ROOT_URL_INTERNAL="https://www.stage.test-app.pan.panter.cloud"
2785
+ - export KUBE_NAMESPACE="pan-test-app-stage"
2786
+ - export KUBE_APP_NAME="www"
2787
+ - export KUBE_APP_NAME_PREFIX=""
2788
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2789
+ - export RELEASE_NAME="pan-test-app-stage-www"
2790
+ - export HELM_EXPERIMENTAL_OCI="1"
2791
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
2792
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
2793
+ - export HELM_ARGS=""
2794
+ - export COMPONENT_NAME="www"
2795
+ - collapseable_section_end "injectvars"
2796
+ - kubectl config set-cluster "kube-pan-test-app-stage-www" --server="$CL_stage_www_KUBE_URL" --certificate-authority <(echo $CL_stage_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
2797
+ - kubectl config set-credentials "kube-pan-test-app-stage-www" --token="$CL_stage_www_KUBE_TOKEN"
2798
+ - kubectl config set-context "kube-pan-test-app-stage-www" --cluster="kube-pan-test-app-stage-www" --user="kube-pan-test-app-stage-www" --namespace="pan-test-app-stage"
2799
+ - kubectl config use-context "kube-pan-test-app-stage-www"
2800
+ - kubernetesDelete
2801
+ - echo 'Disabling component in Dependency Track'
2802
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
2803
+ environment:
2804
+ name: stage/www
2805
+ action: stop
2806
+ rules:
2807
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
2808
+ when: on_success
2809
+ - when: manual
2810
+ if: $CI_COMMIT_TAG
2811
+ needs: []
2812
+ retry: *a1
2813
+ interruptible: true
2814
+ allow_failure: true
2815
+ 'www โ†ฉ๏ธ Rollback โš ๏ธ | stage ':
2816
+ stage: rollback stage
2817
+ image: path/to/docker/kubernetes:the-version
2818
+ variables:
2819
+ KUBERNETES_CPU_REQUEST: '0.22'
2820
+ KUBERNETES_MEMORY_REQUEST: 200Mi
2821
+ KUBERNETES_MEMORY_LIMIT: 400Mi
2822
+ GIT_STRATEGY: none
2823
+ script:
2824
+ - collapseable_section_start "injectvars" "Injecting variables"
2825
+ - export ENV_SHORT="stage"
2826
+ - export APP_DIR="www"
2827
+ - export ENV_TYPE="stage"
2828
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2829
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2830
+ - 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")"
2831
+ - export HOSTNAME="www.stage.test-app.pan.panter.cloud"
2832
+ - export ROOT_URL="https://www.stage.test-app.pan.panter.cloud"
2833
+ - export HOSTNAME_INTERNAL="www.stage.test-app.pan.panter.cloud"
2834
+ - export ROOT_URL_INTERNAL="https://www.stage.test-app.pan.panter.cloud"
2835
+ - export KUBE_NAMESPACE="pan-test-app-stage"
2836
+ - export KUBE_APP_NAME="www"
2837
+ - export KUBE_APP_NAME_PREFIX=""
2838
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2839
+ - export RELEASE_NAME="pan-test-app-stage-www"
2840
+ - export HELM_EXPERIMENTAL_OCI="1"
2841
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
2842
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
2843
+ - export HELM_ARGS=""
2844
+ - export COMPONENT_NAME="www"
2845
+ - collapseable_section_end "injectvars"
2846
+ - kubectl config set-cluster "kube-pan-test-app-stage-www" --server="$CL_stage_www_KUBE_URL" --certificate-authority <(echo $CL_stage_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
2847
+ - kubectl config set-credentials "kube-pan-test-app-stage-www" --token="$CL_stage_www_KUBE_TOKEN"
2848
+ - kubectl config set-context "kube-pan-test-app-stage-www" --cluster="kube-pan-test-app-stage-www" --user="kube-pan-test-app-stage-www" --namespace="pan-test-app-stage"
2849
+ - kubectl config use-context "kube-pan-test-app-stage-www"
2850
+ - kubernetesRollback
2851
+ environment:
2852
+ name: stage/www
2853
+ action: access
2854
+ rules:
2855
+ - when: manual
2856
+ if: $CI_COMMIT_TAG
2857
+ needs: []
2858
+ retry: *a1
2859
+ interruptible: true
2860
+ allow_failure: true
2861
+ 'www ๐Ÿ”จ app | prod ':
2862
+ stage: build
2863
+ image: path/to/docker/jobs-default:the-version
2864
+ variables:
2865
+ KUBERNETES_CPU_REQUEST: '0.45'
2866
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2867
+ KUBERNETES_MEMORY_LIMIT: 4Gi
2868
+ script:
2869
+ - collapseable_section_start "injectvars" "Injecting variables"
2870
+ - export ENV_SHORT="prod"
2871
+ - export APP_DIR="www"
2872
+ - export ENV_TYPE="prod"
2873
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
2874
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
2875
+ - 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")"
2876
+ - export HOSTNAME="www.prod.test-app.pan.panter.cloud"
2877
+ - export ROOT_URL="https://www.prod.test-app.pan.panter.cloud"
2878
+ - export HOSTNAME_INTERNAL="www.prod.test-app.pan.panter.cloud"
2879
+ - export ROOT_URL_INTERNAL="https://www.prod.test-app.pan.panter.cloud"
2880
+ - export KUBE_NAMESPACE="pan-test-app-prod"
2881
+ - export KUBE_APP_NAME="www"
2882
+ - export KUBE_APP_NAME_PREFIX=""
2883
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
2884
+ - collapseable_section_end "injectvars"
2885
+ - collapseable_section_start "write-dotenv-www" "write dot env for www"
2886
+ - |-
2887
+ cat <<EOF > www/.env
2888
+ ENV_SHORT=prod
2889
+ APP_DIR=www
2890
+ ENV_TYPE=prod
2891
+ HOSTNAME=www.prod.test-app.pan.panter.cloud
2892
+ ROOT_URL=https://www.prod.test-app.pan.panter.cloud
2893
+ HOSTNAME_INTERNAL=www.prod.test-app.pan.panter.cloud
2894
+ ROOT_URL_INTERNAL=https://www.prod.test-app.pan.panter.cloud
2895
+ KUBE_NAMESPACE=pan-test-app-prod
2896
+ KUBE_APP_NAME=www
2897
+ KUBE_APP_NAME_PREFIX=
2898
+ _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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
2899
+ EOF
2900
+ - collapseable_section_end "write-dotenv-www"
2901
+ - echo '{"id":"$(git describe --tags 2>/dev/null || git rev-parse HEAD)","time":"$CI_JOB_STARTED_AT"}' > www/__build_info.json
2902
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2903
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2904
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2905
+ - collapseable_section_end "nodeinstall"
2906
+ - cd www
2907
+ - collapseable_section_start "nodeinstall" "Ensure node version"
2908
+ - if [ -f ~/.nvm/nvm.sh ]; then source ~/.nvm/nvm.sh; fi
2909
+ - if command -v nvm &> /dev/null && [ -f ./.nvmrc ]; then nvm install; fi
2910
+ - collapseable_section_end "nodeinstall"
2911
+ - collapseable_section_start "yarninstall" "Yarn install"
2912
+ - yarn install --immutable
2913
+ - collapseable_section_end "yarninstall"
2914
+ - yarn build
2915
+ cache:
2916
+ - key: www-yarn
2917
+ policy: pull-push
2918
+ paths:
2919
+ - www/.yarn
2920
+ - key: www-node-modules
2921
+ policy: pull-push
2922
+ paths:
2923
+ - www/node_modules
2924
+ artifacts:
2925
+ paths:
2926
+ - www/__build_info.json
2927
+ - www/.next
2928
+ - www/dist
2929
+ exclude:
2930
+ - www/.env
2931
+ expire_in: 1 day
2932
+ when: always
2933
+ reports: {}
2934
+ rules:
2935
+ - if: $CI_COMMIT_TAG
2936
+ needs: []
2937
+ retry: *a1
2938
+ interruptible: true
2939
+ 'www ๐Ÿ”จ docker | prod ':
2940
+ stage: build
2941
+ image: path/to/docker/docker-build:the-version
2942
+ services:
2943
+ - name: docker:24.0.6-dind
2944
+ command:
2945
+ - --tls=false
2946
+ - --registry-mirror=https://mirror.gcr.io
2947
+ variables:
2948
+ DOCKER_HOST: tcp://docker:2375
2949
+ DOCKER_TLS_CERTDIR: ''
2950
+ DOCKER_DRIVER: overlay2
2951
+ DOCKER_BUILDKIT: '1'
2952
+ KUBERNETES_CPU_REQUEST: '0.45'
2953
+ KUBERNETES_MEMORY_REQUEST: 1Gi
2954
+ KUBERNETES_MEMORY_LIMIT: 2Gi
2955
+ script:
2956
+ - collapseable_section_start "injectvars" "Injecting variables"
2957
+ - export APP_DIR="www"
2958
+ - export DOCKER_BUILD_CONTEXT="."
2959
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
2960
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
2961
+ - export DOCKER_IMAGE_NAME="prod/www"
2962
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
2963
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
2964
+ - |-
2965
+ export DOCKER_COPY_AND_INSTALL_APP="COPY --chown=node:node $APP_DIR .
2966
+ RUN yarn plugin import workspace-tools
2967
+ RUN yarn workspaces focus --production && yarn rebuild"
2968
+ - |-
2969
+ export DOCKER_COPY_WORKSPACE_FILES="COPY --chown=node:node www/package.json /app/www/package.json
2970
+ COPY --chown=node:node www/yarn.lock /app/www/yarn.lock
2971
+ COPY --chown=node:node .yarnrc.yml /app/.yarnrc.yml
2972
+ COPY --chown=node:node .yarn /app/.yarn"
2973
+ - collapseable_section_end "injectvars"
2974
+ - ensureNodeDockerfile
2975
+ - collapseable_section_start "docker-login" "Docker Login"
2976
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
2977
+ - collapseable_section_end "docker-login"
2978
+ - collapseable_section_start "docker-build" "Docker build"
2979
+ - 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
2980
+ - collapseable_section_end "docker-build"
2981
+ - collapseable_section_start "docker-push" "Docker push and tag"
2982
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
2983
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
2984
+ - docker push $DOCKER_CACHE_IMAGE
2985
+ - collapseable_section_end "docker-push"
2986
+ cache:
2987
+ - key: www-yarn
2988
+ policy: pull
2989
+ paths:
2990
+ - www/.yarn
2991
+ rules:
2992
+ - if: $CI_COMMIT_TAG
2993
+ needs:
2994
+ - 'www ๐Ÿ”จ app | prod '
2995
+ retry: *a1
2996
+ interruptible: true
2997
+ 'www ๐Ÿงพ sbom | prod ':
2998
+ stage: build
2999
+ image:
3000
+ name: aquasec/trivy:0.58.2
3001
+ entrypoint:
3002
+ - ''
3003
+ variables: {}
3004
+ script:
3005
+ - collapseable_section_start "injectvars" "Injecting variables"
3006
+ - collapseable_section_end "injectvars"
3007
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" www
3008
+ artifacts:
3009
+ paths:
3010
+ - __sbom.json
3011
+ rules:
3012
+ - if: $CI_COMMIT_TAG
3013
+ needs: []
3014
+ retry: *a1
3015
+ interruptible: true
3016
+ allow_failure: true
3017
+ 'www ๐Ÿš€ Deploy | prod ':
3018
+ stage: deploy prod
3019
+ image: path/to/docker/kubernetes:the-version
3020
+ variables:
3021
+ KUBERNETES_CPU_REQUEST: '0.22'
3022
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3023
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3024
+ script:
3025
+ - collapseable_section_start "injectvars" "Injecting variables"
3026
+ - export ENV_SHORT="prod"
3027
+ - export APP_DIR="www"
3028
+ - export ENV_TYPE="prod"
3029
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3030
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3031
+ - 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")"
3032
+ - export HOSTNAME="www.prod.test-app.pan.panter.cloud"
3033
+ - export ROOT_URL="https://www.prod.test-app.pan.panter.cloud"
3034
+ - export HOSTNAME_INTERNAL="www.prod.test-app.pan.panter.cloud"
3035
+ - export ROOT_URL_INTERNAL="https://www.prod.test-app.pan.panter.cloud"
3036
+ - export KUBE_NAMESPACE="pan-test-app-prod"
3037
+ - export KUBE_APP_NAME="www"
3038
+ - export KUBE_APP_NAME_PREFIX=""
3039
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
3040
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
3041
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/www"
3042
+ - export DOCKER_IMAGE_NAME="prod/www"
3043
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
3044
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
3045
+ - export RELEASE_NAME="pan-test-app-prod-www"
3046
+ - export HELM_EXPERIMENTAL_OCI="1"
3047
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
3048
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3049
+ - export HELM_ARGS=""
3050
+ - export COMPONENT_NAME="www"
3051
+ - collapseable_section_end "injectvars"
3052
+ - kubectl config set-cluster "kube-pan-test-app-prod-www" --server="$CL_prod_www_KUBE_URL" --certificate-authority <(echo $CL_prod_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
3053
+ - kubectl config set-credentials "kube-pan-test-app-prod-www" --token="$CL_prod_www_KUBE_TOKEN"
3054
+ - kubectl config set-context "kube-pan-test-app-prod-www" --cluster="kube-pan-test-app-prod-www" --user="kube-pan-test-app-prod-www" --namespace="pan-test-app-prod"
3055
+ - kubectl config use-context "kube-pan-test-app-prod-www"
3056
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
3057
+ - |
3058
+ cat > __all_values.yml <<EOF
3059
+ env:
3060
+ secret: {}
3061
+ public:
3062
+ ENV_SHORT: |-
3063
+ prod
3064
+ APP_DIR: |-
3065
+ www
3066
+ ENV_TYPE: |-
3067
+ prod
3068
+ BUILD_INFO_BUILD_ID: |-
3069
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
3070
+ BUILD_INFO_BUILD_TIME: |-
3071
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
3072
+ BUILD_INFO_CURRENT_VERSION: |-
3073
+ $(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/^/ /')
3074
+ HOSTNAME: |-
3075
+ www.prod.test-app.pan.panter.cloud
3076
+ ROOT_URL: |-
3077
+ https://www.prod.test-app.pan.panter.cloud
3078
+ HOSTNAME_INTERNAL: |-
3079
+ www.prod.test-app.pan.panter.cloud
3080
+ ROOT_URL_INTERNAL: |-
3081
+ https://www.prod.test-app.pan.panter.cloud
3082
+ KUBE_NAMESPACE: |-
3083
+ pan-test-app-prod
3084
+ KUBE_APP_NAME: |-
3085
+ www
3086
+ KUBE_APP_NAME_PREFIX: ""
3087
+ _ALL_ENV_VAR_KEYS: |-
3088
+ ["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","KUBE_NAMESPACE","KUBE_APP_NAME","KUBE_APP_NAME_PREFIX"]
3089
+ application:
3090
+ host: |-
3091
+ www.prod.test-app.pan.panter.cloud
3092
+ command: |-
3093
+ yarn start
3094
+ livenessProbe:
3095
+ httpGet:
3096
+ path: |-
3097
+ __health
3098
+ readinessProbe:
3099
+ httpGet:
3100
+ path: |-
3101
+ __health
3102
+ startupProbe:
3103
+ httpGet:
3104
+ path: |-
3105
+ __health
3106
+
3107
+ EOF
3108
+ - collapseable_section_end "writeallvalues"
3109
+ - kubernetesCreateSecret
3110
+ - kubernetesDeploy
3111
+ - echo 'Uploading SBOM to Dependency Track'
3112
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/www" "$ROOT_URL" "__sbom.json" vex.json || true
3113
+ - echo deployment successful ๐Ÿ˜ป
3114
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
3115
+ environment:
3116
+ name: prod/www
3117
+ url: $CL_GITLAB_ENVIRONMENT_URL
3118
+ on_stop: 'www ๐Ÿ›‘ Stop โš ๏ธ | prod '
3119
+ artifacts:
3120
+ reports:
3121
+ dotenv: gitlab_environment.env
3122
+ rules:
3123
+ - when: manual
3124
+ if: $CI_COMMIT_TAG
3125
+ needs:
3126
+ - job: 'www ๐Ÿ”จ app | prod '
3127
+ artifacts: false
3128
+ - job: 'www ๐Ÿ”จ docker | prod '
3129
+ artifacts: false
3130
+ - job: 'www ๐Ÿงพ sbom | prod '
3131
+ artifacts: true
3132
+ retry: *a1
3133
+ interruptible: true
3134
+ allow_failure: true
3135
+ 'www ๐Ÿ›‘ Stop โš ๏ธ | prod ':
3136
+ stage: stop prod
3137
+ image: path/to/docker/kubernetes:the-version
3138
+ variables:
3139
+ KUBERNETES_CPU_REQUEST: '0.22'
3140
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3141
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3142
+ GIT_STRATEGY: none
3143
+ script:
3144
+ - collapseable_section_start "injectvars" "Injecting variables"
3145
+ - export ENV_SHORT="prod"
3146
+ - export APP_DIR="www"
3147
+ - export ENV_TYPE="prod"
3148
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3149
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3150
+ - 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")"
3151
+ - export HOSTNAME="www.prod.test-app.pan.panter.cloud"
3152
+ - export ROOT_URL="https://www.prod.test-app.pan.panter.cloud"
3153
+ - export HOSTNAME_INTERNAL="www.prod.test-app.pan.panter.cloud"
3154
+ - export ROOT_URL_INTERNAL="https://www.prod.test-app.pan.panter.cloud"
3155
+ - export KUBE_NAMESPACE="pan-test-app-prod"
3156
+ - export KUBE_APP_NAME="www"
3157
+ - export KUBE_APP_NAME_PREFIX=""
3158
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
3159
+ - export RELEASE_NAME="pan-test-app-prod-www"
3160
+ - export HELM_EXPERIMENTAL_OCI="1"
3161
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
3162
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3163
+ - export HELM_ARGS=""
3164
+ - export COMPONENT_NAME="www"
3165
+ - collapseable_section_end "injectvars"
3166
+ - kubectl config set-cluster "kube-pan-test-app-prod-www" --server="$CL_prod_www_KUBE_URL" --certificate-authority <(echo $CL_prod_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
3167
+ - kubectl config set-credentials "kube-pan-test-app-prod-www" --token="$CL_prod_www_KUBE_TOKEN"
3168
+ - kubectl config set-context "kube-pan-test-app-prod-www" --cluster="kube-pan-test-app-prod-www" --user="kube-pan-test-app-prod-www" --namespace="pan-test-app-prod"
3169
+ - kubectl config use-context "kube-pan-test-app-prod-www"
3170
+ - kubernetesDelete
3171
+ - echo 'Disabling component in Dependency Track'
3172
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/www" "$CI_ENVIRONMENT_URL" || true
3173
+ environment:
3174
+ name: prod/www
3175
+ action: stop
3176
+ rules:
3177
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
3178
+ when: on_success
3179
+ - when: manual
3180
+ if: $CI_COMMIT_TAG
3181
+ needs: []
3182
+ retry: *a1
3183
+ interruptible: true
3184
+ allow_failure: true
3185
+ 'www โ†ฉ๏ธ Rollback โš ๏ธ | prod ':
3186
+ stage: rollback prod
3187
+ image: path/to/docker/kubernetes:the-version
3188
+ variables:
3189
+ KUBERNETES_CPU_REQUEST: '0.22'
3190
+ KUBERNETES_MEMORY_REQUEST: 200Mi
3191
+ KUBERNETES_MEMORY_LIMIT: 400Mi
3192
+ GIT_STRATEGY: none
3193
+ script:
3194
+ - collapseable_section_start "injectvars" "Injecting variables"
3195
+ - export ENV_SHORT="prod"
3196
+ - export APP_DIR="www"
3197
+ - export ENV_TYPE="prod"
3198
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
3199
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
3200
+ - 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")"
3201
+ - export HOSTNAME="www.prod.test-app.pan.panter.cloud"
3202
+ - export ROOT_URL="https://www.prod.test-app.pan.panter.cloud"
3203
+ - export HOSTNAME_INTERNAL="www.prod.test-app.pan.panter.cloud"
3204
+ - export ROOT_URL_INTERNAL="https://www.prod.test-app.pan.panter.cloud"
3205
+ - export KUBE_NAMESPACE="pan-test-app-prod"
3206
+ - export KUBE_APP_NAME="www"
3207
+ - export KUBE_APP_NAME_PREFIX=""
3208
+ - 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\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\"]"
3209
+ - export RELEASE_NAME="pan-test-app-prod-www"
3210
+ - export HELM_EXPERIMENTAL_OCI="1"
3211
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-www"
3212
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
3213
+ - export HELM_ARGS=""
3214
+ - export COMPONENT_NAME="www"
3215
+ - collapseable_section_end "injectvars"
3216
+ - kubectl config set-cluster "kube-pan-test-app-prod-www" --server="$CL_prod_www_KUBE_URL" --certificate-authority <(echo $CL_prod_www_KUBE_CA_PEM | base64 -d) --embed-certs=true
3217
+ - kubectl config set-credentials "kube-pan-test-app-prod-www" --token="$CL_prod_www_KUBE_TOKEN"
3218
+ - kubectl config set-context "kube-pan-test-app-prod-www" --cluster="kube-pan-test-app-prod-www" --user="kube-pan-test-app-prod-www" --namespace="pan-test-app-prod"
3219
+ - kubectl config use-context "kube-pan-test-app-prod-www"
3220
+ - kubernetesRollback
3221
+ environment:
3222
+ name: prod/www
3223
+ action: access
3224
+ rules:
3225
+ - when: manual
3226
+ if: $CI_COMMIT_TAG
3227
+ needs: []
3228
+ retry: *a1
3229
+ interruptible: true
3230
+ allow_failure: true
3231
+ create release:
3232
+ stage: release
3233
+ image: path/to/docker/semantic-release:the-version
3234
+ script:
3235
+ - semanticRelease
3236
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
3237
+ rules:
3238
+ - &a2
3239
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
3240
+ when: never
3241
+ - &a3
3242
+ if: $CI_PIPELINE_SOURCE == "schedule"
3243
+ when: never
3244
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
3245
+ when: on_success
3246
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3247
+ when: manual
3248
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
3249
+ when: manual
3250
+ โš ๏ธ force create release:
3251
+ stage: release
3252
+ image: path/to/docker/semantic-release:the-version
3253
+ script:
3254
+ - semanticRelease
3255
+ - echo '๐Ÿ‘‰ The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
3256
+ rules:
3257
+ - *a2
3258
+ - *a3
3259
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
3260
+ when: manual
3261
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
3262
+ when: manual
3263
+ needs: []
3264
+ "
3265
+ `;