@catladder/pipeline 0.0.0-more-collapse-deeb54d7 → 0.0.0-multiple-gitlab-includes-1a40efc0

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