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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (639) hide show
  1. package/README.md +15 -1
  2. package/dist/bash/BashExpression.d.ts +36 -0
  3. package/dist/bash/BashExpression.js +114 -0
  4. package/dist/bash/bashEscape.d.ts +37 -0
  5. package/dist/bash/bashEscape.js +119 -0
  6. package/dist/bash/bashExpressionPerPipelineType.d.ts +6 -0
  7. package/dist/bash/bashExpressionPerPipelineType.js +11 -0
  8. package/dist/bash/bashYaml.d.ts +10 -0
  9. package/dist/bash/bashYaml.js +69 -0
  10. package/dist/bash/getInjectVarsScript.d.ts +2 -0
  11. package/dist/bash/getInjectVarsScript.js +47 -0
  12. package/dist/bash/index.d.ts +2 -0
  13. package/dist/bash/index.js +26 -0
  14. package/dist/build/artifacts/createBuildJobArtifact.d.ts +3 -0
  15. package/dist/build/artifacts/createBuildJobArtifact.js +97 -0
  16. package/dist/build/base/__tests__/createArtifactsConfig.test.js +3 -1
  17. package/dist/build/base/constants.js +4 -2
  18. package/dist/build/base/createAppBuildJob.d.ts +5 -3
  19. package/dist/build/base/createAppBuildJob.js +18 -15
  20. package/dist/build/base/createArtifactsConfig.d.ts +1 -1
  21. package/dist/build/base/createArtifactsConfig.js +3 -1
  22. package/dist/build/base/createBuildJobDefinition.d.ts +6 -0
  23. package/dist/build/base/createBuildJobDefinition.js +58 -0
  24. package/dist/build/base/index.d.ts +6 -4
  25. package/dist/build/base/index.js +17 -6
  26. package/dist/build/base/writeBuildInfo.d.ts +2 -2
  27. package/dist/build/base/writeBuildInfo.js +4 -3
  28. package/dist/build/base/writeDotEnv.d.ts +3 -2
  29. package/dist/build/base/writeDotEnv.js +30 -6
  30. package/dist/build/cache/createJobCache.d.ts +7 -0
  31. package/dist/build/cache/createJobCache.js +115 -0
  32. package/dist/build/cache/getAllCacheConfigsFromConfig.d.ts +3 -0
  33. package/dist/build/cache/getAllCacheConfigsFromConfig.js +64 -0
  34. package/dist/build/cache/transformLegacyJobCache.d.ts +3 -0
  35. package/dist/build/cache/transformLegacyJobCache.js +29 -0
  36. package/dist/build/custom/__tests__/testJob.test.js +15 -16
  37. package/dist/build/custom/buildJob.d.ts +2 -2
  38. package/dist/build/custom/buildJob.js +8 -66
  39. package/dist/build/custom/index.d.ts +2 -2
  40. package/dist/build/custom/index.js +3 -1
  41. package/dist/build/custom/testJob.d.ts +4 -4
  42. package/dist/build/custom/testJob.js +25 -20
  43. package/dist/build/docker.d.ts +37 -46
  44. package/dist/build/docker.js +65 -34
  45. package/dist/build/index.d.ts +14 -7
  46. package/dist/build/index.js +44 -17
  47. package/dist/build/node/buildJob.d.ts +8 -2
  48. package/dist/build/node/buildJob.js +39 -52
  49. package/dist/build/node/cache.d.ts +4 -5
  50. package/dist/build/node/cache.js +18 -24
  51. package/dist/build/node/constants.js +5 -3
  52. package/dist/build/node/index.d.ts +4 -4
  53. package/dist/build/node/index.js +3 -1
  54. package/dist/build/node/meteor.d.ts +2 -2
  55. package/dist/build/node/meteor.js +10 -12
  56. package/dist/build/node/testJob.d.ts +3 -2
  57. package/dist/build/node/testJob.js +29 -19
  58. package/dist/build/node/yarn.d.ts +4 -3
  59. package/dist/build/node/yarn.js +11 -12
  60. package/dist/build/rails/build.d.ts +2 -2
  61. package/dist/build/rails/build.js +13 -6
  62. package/dist/build/rails/index.d.ts +2 -2
  63. package/dist/build/rails/index.js +3 -1
  64. package/dist/build/rails/test.d.ts +2 -2
  65. package/dist/build/rails/test.js +30 -11
  66. package/dist/build/sbom.d.ts +2 -2
  67. package/dist/build/sbom.js +13 -7
  68. package/dist/build/types.d.ts +160 -47
  69. package/dist/build/types.js +10 -2
  70. package/dist/catladder-gitlab.js +129 -49
  71. package/dist/config/__tests__/configruedEnvs.test.js +3 -1
  72. package/dist/config/__tests__/getAllEnvs.test.js +79 -0
  73. package/dist/config/__tests__/getAllEnvsInAllComponents.test.d.ts +1 -0
  74. package/dist/config/__tests__/getAllEnvsInAllComponents.test.js +73 -0
  75. package/dist/config/configruedEnvs.js +3 -1
  76. package/dist/config/index.js +13 -7
  77. package/dist/config/readConfig.d.ts +2 -2
  78. package/dist/config/readConfig.js +191 -40
  79. package/dist/constants.js +5 -3
  80. package/dist/context/createAllComponentsContext.d.ts +12 -0
  81. package/dist/{pipeline/commitInfo/getCommitInfo.js → context/createAllComponentsContext.js} +35 -19
  82. package/dist/context/createComponentContext.d.ts +11 -0
  83. package/dist/context/createComponentContext.js +262 -0
  84. package/dist/context/createWorkspaceContext.d.ts +16 -0
  85. package/dist/context/createWorkspaceContext.js +173 -0
  86. package/dist/context/getBuildInfoVariables.d.ts +6 -0
  87. package/dist/context/getBuildInfoVariables.js +55 -0
  88. package/dist/context/getEnvConfig.js +21 -4
  89. package/dist/context/getEnvType.js +3 -1
  90. package/dist/context/getEnvironment.d.ts +3 -3
  91. package/dist/context/getEnvironment.js +11 -12
  92. package/dist/context/getEnvironmentContext.d.ts +7 -3
  93. package/dist/context/getEnvironmentContext.js +21 -11
  94. package/dist/context/getEnvironmentVariables.d.ts +22 -5
  95. package/dist/context/getEnvironmentVariables.js +79 -53
  96. package/dist/context/getLabels.d.ts +2 -2
  97. package/dist/context/getLabels.js +9 -7
  98. package/dist/context/getReviewSlug.d.ts +4 -0
  99. package/dist/context/getReviewSlug.js +21 -0
  100. package/dist/context/index.d.ts +2 -4
  101. package/dist/context/index.js +15 -162
  102. package/dist/context/transformJobOnlyVars.d.ts +5 -2
  103. package/dist/context/transformJobOnlyVars.js +4 -2
  104. package/dist/context/utils/envVars.d.ts +1 -1
  105. package/dist/context/utils/envVars.js +5 -2
  106. package/dist/defaults/index.js +3 -1
  107. package/dist/deploy/base/deploy.d.ts +3 -3
  108. package/dist/deploy/base/deploy.js +37 -21
  109. package/dist/deploy/base/index.d.ts +3 -5
  110. package/dist/deploy/base/index.js +3 -1
  111. package/dist/deploy/base/rollback.d.ts +3 -3
  112. package/dist/deploy/base/rollback.js +13 -9
  113. package/dist/deploy/base/stop.d.ts +3 -3
  114. package/dist/deploy/base/stop.js +16 -11
  115. package/dist/deploy/base/types.d.ts +1 -1
  116. package/dist/deploy/base/types.js +3 -1
  117. package/dist/deploy/base/variables.js +4 -2
  118. package/dist/deploy/cloudRun/artifactsRegistry.d.ts +8 -11
  119. package/dist/deploy/cloudRun/artifactsRegistry.js +15 -14
  120. package/dist/deploy/cloudRun/cleanup.d.ts +2 -2
  121. package/dist/deploy/cloudRun/cleanup.js +3 -1
  122. package/dist/deploy/cloudRun/cloudRunRevisions.d.ts +2 -2
  123. package/dist/deploy/cloudRun/cloudRunRevisions.js +7 -6
  124. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.d.ts +8 -6
  125. package/dist/deploy/cloudRun/createJobs/cloudRunJobs.js +57 -106
  126. package/dist/deploy/cloudRun/createJobs/cloudRunServices.d.ts +3 -3
  127. package/dist/deploy/cloudRun/createJobs/cloudRunServices.js +79 -15
  128. package/dist/deploy/cloudRun/createJobs/common.d.ts +7 -7
  129. package/dist/deploy/cloudRun/createJobs/common.js +6 -3
  130. package/dist/deploy/cloudRun/createJobs/constants.d.ts +1 -0
  131. package/dist/deploy/cloudRun/createJobs/constants.js +7 -0
  132. package/dist/deploy/cloudRun/createJobs/execute/onDeploy.d.ts +3 -0
  133. package/dist/deploy/cloudRun/createJobs/execute/onDeploy.js +115 -0
  134. package/dist/deploy/cloudRun/createJobs/execute/schedules.d.ts +3 -0
  135. package/dist/deploy/cloudRun/createJobs/execute/schedules.js +173 -0
  136. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.d.ts +2 -2
  137. package/dist/deploy/cloudRun/createJobs/getCloudRunDeployScripts.js +13 -5
  138. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.d.ts +2 -2
  139. package/dist/deploy/cloudRun/createJobs/getCloudRunStopScripts.js +7 -3
  140. package/dist/deploy/cloudRun/createJobs/healthCheck.d.ts +5 -0
  141. package/dist/deploy/cloudRun/createJobs/healthCheck.js +82 -0
  142. package/dist/deploy/cloudRun/createJobs/index.d.ts +2 -2
  143. package/dist/deploy/cloudRun/createJobs/index.js +26 -12
  144. package/dist/deploy/cloudRun/createJobs/volumes.d.ts +3 -0
  145. package/dist/deploy/cloudRun/createJobs/volumes.js +58 -0
  146. package/dist/deploy/cloudRun/index.d.ts +2 -2
  147. package/dist/deploy/cloudRun/index.js +25 -13
  148. package/dist/deploy/cloudRun/utils/cloudRunExecutionUrl.d.ts +10 -0
  149. package/dist/deploy/cloudRun/utils/cloudRunExecutionUrl.js +16 -0
  150. package/dist/deploy/cloudRun/utils/createArgsString.d.ts +2 -2
  151. package/dist/deploy/cloudRun/utils/createArgsString.js +3 -1
  152. package/dist/deploy/cloudRun/utils/database.d.ts +25 -4
  153. package/dist/deploy/cloudRun/utils/database.js +49 -15
  154. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.d.ts +2 -2
  155. package/dist/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.js +3 -1
  156. package/dist/deploy/cloudRun/utils/getJobOrServiceArgs.d.ts +2 -0
  157. package/dist/deploy/cloudRun/utils/getJobOrServiceArgs.js +12 -0
  158. package/dist/deploy/cloudRun/utils/getServiceName.d.ts +2 -2
  159. package/dist/deploy/cloudRun/utils/getServiceName.js +3 -1
  160. package/dist/deploy/cloudRun/utils/jobName.d.ts +6 -1
  161. package/dist/deploy/cloudRun/utils/jobName.js +18 -4
  162. package/dist/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.js +3 -1
  163. package/dist/deploy/cloudSql/utils.d.ts +2 -1
  164. package/dist/deploy/cloudSql/utils.js +7 -2
  165. package/dist/deploy/custom/deployJob.d.ts +2 -2
  166. package/dist/deploy/custom/deployJob.js +10 -9
  167. package/dist/deploy/custom/index.d.ts +2 -2
  168. package/dist/deploy/custom/index.js +3 -1
  169. package/dist/deploy/dockerTag/deployJob.d.ts +2 -2
  170. package/dist/deploy/dockerTag/deployJob.js +6 -6
  171. package/dist/deploy/dockerTag/index.d.ts +2 -2
  172. package/dist/deploy/dockerTag/index.js +3 -1
  173. package/dist/deploy/index.d.ts +10 -9
  174. package/dist/deploy/index.js +13 -7
  175. package/dist/deploy/kubernetes/additionalSecretKeys.d.ts +3 -1
  176. package/dist/deploy/kubernetes/additionalSecretKeys.js +3 -1
  177. package/dist/deploy/kubernetes/cloudSql/index.d.ts +6 -5
  178. package/dist/deploy/kubernetes/cloudSql/index.js +14 -21
  179. package/dist/deploy/kubernetes/deployJob.d.ts +2 -2
  180. package/dist/deploy/kubernetes/deployJob.js +23 -22
  181. package/dist/deploy/kubernetes/index.d.ts +2 -2
  182. package/dist/deploy/kubernetes/index.js +52 -15
  183. package/dist/deploy/kubernetes/kubeEnv.d.ts +5 -4
  184. package/dist/deploy/kubernetes/kubeEnv.js +9 -5
  185. package/dist/deploy/kubernetes/kubeValues.d.ts +5 -6
  186. package/dist/deploy/kubernetes/kubeValues.js +17 -19
  187. package/dist/deploy/kubernetes/mongodb.d.ts +2 -2
  188. package/dist/deploy/kubernetes/mongodb.js +14 -12
  189. package/dist/deploy/sbom.d.ts +4 -4
  190. package/dist/deploy/sbom.js +8 -4
  191. package/dist/deploy/types/base.d.ts +5 -5
  192. package/dist/deploy/types/base.js +3 -1
  193. package/dist/deploy/types/custom.d.ts +3 -7
  194. package/dist/deploy/types/custom.js +3 -1
  195. package/dist/deploy/types/dockerTag.d.ts +1 -1
  196. package/dist/deploy/types/dockerTag.js +3 -1
  197. package/dist/deploy/types/googleCloudRun.d.ts +291 -16
  198. package/dist/deploy/types/googleCloudRun.js +28 -1
  199. package/dist/deploy/types/index.d.ts +8 -7
  200. package/dist/deploy/types/index.js +21 -10
  201. package/dist/deploy/types/kubernetes.d.ts +21 -54
  202. package/dist/deploy/types/kubernetes.js +3 -1
  203. package/dist/deploy/utils.d.ts +2 -2
  204. package/dist/deploy/utils.js +5 -2
  205. package/dist/globalScriptFunctions/index.d.ts +14 -0
  206. package/dist/globalScriptFunctions/index.js +37 -0
  207. package/dist/index.d.ts +5 -2
  208. package/dist/index.js +18 -9
  209. package/dist/packageInfos.d.ts +4 -0
  210. package/dist/packageInfos.js +20 -0
  211. package/dist/pipeline/__tests__/getPipelineStages.test.d.ts +1 -0
  212. package/dist/pipeline/__tests__/getPipelineStages.test.js +73 -0
  213. package/dist/pipeline/createAllJobs.d.ts +16 -6
  214. package/dist/pipeline/createAllJobs.js +99 -27
  215. package/dist/pipeline/createJobsForComponent.d.ts +2 -2
  216. package/dist/pipeline/createJobsForComponent.js +9 -149
  217. package/dist/pipeline/createJobsForWorkspace.d.ts +3 -0
  218. package/dist/pipeline/createJobsForWorkspace.js +12 -0
  219. package/dist/pipeline/createMainPipeline.d.ts +3 -0
  220. package/dist/pipeline/createMainPipeline.js +283 -0
  221. package/dist/pipeline/generatePipelineFiles.d.ts +7 -0
  222. package/dist/pipeline/generatePipelineFiles.js +305 -0
  223. package/dist/pipeline/getPipelineStages.d.ts +7 -0
  224. package/dist/pipeline/getPipelineStages.js +56 -0
  225. package/dist/pipeline/gitlab/createGitlabJobs.d.ts +11 -14
  226. package/dist/pipeline/gitlab/createGitlabJobs.js +264 -74
  227. package/dist/pipeline/gitlab/createGitlabPipeline.d.ts +9 -0
  228. package/dist/pipeline/gitlab/createGitlabPipeline.js +77 -0
  229. package/dist/pipeline/gitlab/gitlabReleaseJobs.d.ts +33 -0
  230. package/dist/pipeline/gitlab/gitlabReleaseJobs.js +25 -0
  231. package/dist/pipeline/gitlab/sortGitLabJobDefProps.d.ts +7 -0
  232. package/dist/pipeline/gitlab/sortGitLabJobDefProps.js +27 -0
  233. package/dist/pipeline/index.d.ts +3 -2
  234. package/dist/pipeline/index.js +16 -9
  235. package/dist/pipeline/packageManager.d.ts +4 -2
  236. package/dist/pipeline/packageManager.js +56 -19
  237. package/dist/pipeline/yarn/yarnUtils.d.ts +2 -2
  238. package/dist/pipeline/yarn/yarnUtils.js +18 -15
  239. package/dist/rules/index.d.ts +10 -3
  240. package/dist/rules/index.js +35 -17
  241. package/dist/runner/index.d.ts +1 -1
  242. package/dist/runner/index.js +3 -1
  243. package/dist/tsconfig.tsbuildinfo +1 -1
  244. package/dist/types/config.d.ts +54 -36
  245. package/dist/types/config.js +5 -2
  246. package/dist/types/context.d.ts +123 -38
  247. package/dist/types/context.js +12 -1
  248. package/dist/types/environmentContext.d.ts +15 -12
  249. package/dist/types/environmentContext.js +3 -1
  250. package/dist/types/gitlab-ci-yml.d.ts +30 -30
  251. package/dist/types/gitlab-ci-yml.js +3 -2
  252. package/dist/types/gitlab-types.d.ts +8 -8
  253. package/dist/types/gitlab-types.js +3 -1
  254. package/dist/types/index.d.ts +3 -1
  255. package/dist/types/index.js +16 -8
  256. package/dist/types/jobDefinition.d.ts +11 -0
  257. package/dist/types/jobDefinition.js +5 -0
  258. package/dist/types/jobs.d.ts +30 -15
  259. package/dist/types/jobs.js +3 -1
  260. package/dist/types/pipeline.d.ts +3 -3
  261. package/dist/types/pipeline.js +3 -1
  262. package/dist/types/utils.d.ts +1 -1
  263. package/dist/types/utils.js +3 -1
  264. package/dist/utils/gitlab.js +7 -2
  265. package/dist/utils/index.d.ts +2 -1
  266. package/dist/utils/index.js +10 -3
  267. package/dist/utils/jsonParse.d.ts +1 -0
  268. package/dist/utils/jsonParse.js +14 -0
  269. package/dist/utils/removeUndefined.d.ts +1 -0
  270. package/dist/utils/removeUndefined.js +36 -0
  271. package/dist/utils/writeFiles.d.ts +11 -0
  272. package/dist/{pipeline/commitInfo/getBuildId.js → utils/writeFiles.js} +39 -22
  273. package/dist/variables/VariableValue.d.ts +3 -0
  274. package/dist/variables/VariableValue.js +5 -0
  275. package/dist/variables/VariableValueContainingReferences.d.ts +24 -0
  276. package/dist/variables/VariableValueContainingReferences.js +97 -0
  277. package/dist/variables/__tests__/resolveAllReferences.test.d.ts +1 -0
  278. package/dist/variables/__tests__/resolveAllReferences.test.js +218 -0
  279. package/dist/variables/__tests__/resolveAllReferencesOnce.test.d.ts +1 -0
  280. package/dist/variables/__tests__/resolveAllReferencesOnce.test.js +171 -0
  281. package/dist/variables/__tests__/resolveReferencesOnce.test.d.ts +1 -0
  282. package/dist/variables/__tests__/resolveReferencesOnce.test.js +199 -0
  283. package/dist/variables/__tests__/variableValue.test.d.ts +1 -0
  284. package/dist/variables/__tests__/variableValue.test.js +36 -0
  285. package/dist/variables/resolveAllReferences.d.ts +3 -0
  286. package/dist/{pipeline/createChildPipeline.js → variables/resolveAllReferences.js} +44 -48
  287. package/dist/variables/resolveAllReferencesOnce.d.ts +5 -0
  288. package/dist/variables/resolveAllReferencesOnce.js +191 -0
  289. package/dist/variables/resolveReferencesOnce.d.ts +8 -0
  290. package/dist/variables/resolveReferencesOnce.js +22 -0
  291. package/examples/.test-gen-ignore +1 -0
  292. package/examples/__snapshots__/cloud-run-health-check-defaults.test.ts.snap +1394 -0
  293. package/examples/__snapshots__/cloud-run-health-check-only-startup.test.ts.snap +1394 -0
  294. package/examples/__snapshots__/cloud-run-health-check.test.ts.snap +1394 -0
  295. package/examples/__snapshots__/cloud-run-http2.test.ts.snap +1394 -0
  296. package/examples/__snapshots__/cloud-run-llama.test.ts.snap +624 -0
  297. package/examples/__snapshots__/cloud-run-memory-limit.test.ts.snap +1394 -0
  298. package/examples/__snapshots__/cloud-run-meteor-with-worker.test.ts.snap +1394 -0
  299. package/examples/__snapshots__/cloud-run-nextjs.test.ts.snap +1410 -0
  300. package/examples/__snapshots__/cloud-run-no-cpu-throttling.test.ts.snap +1394 -0
  301. package/examples/__snapshots__/cloud-run-no-service.test.ts.snap +1502 -0
  302. package/examples/__snapshots__/cloud-run-non-public.test.ts.snap +1394 -0
  303. package/examples/__snapshots__/cloud-run-post-stop-job.test.ts.snap +1412 -0
  304. package/examples/__snapshots__/cloud-run-service-custom-vpc-connector.test.ts.snap +1462 -0
  305. package/examples/__snapshots__/cloud-run-service-custom-vpc.test.ts.snap +1462 -0
  306. package/examples/__snapshots__/cloud-run-service-gen2.test.ts.snap +1394 -0
  307. package/examples/__snapshots__/cloud-run-service-increase-timout.test.ts.snap +1394 -0
  308. package/examples/__snapshots__/cloud-run-service-with-volumes.test.ts.snap +1466 -0
  309. package/examples/__snapshots__/cloud-run-storybook.test.ts.snap +1284 -0
  310. package/examples/__snapshots__/cloud-run-with-gpu.test.ts.snap +1394 -0
  311. package/examples/__snapshots__/cloud-run-with-ngnix.test.ts.snap +1394 -0
  312. package/examples/__snapshots__/cloud-run-with-sql-legacy-jobs.test.ts.snap +1709 -0
  313. package/examples/__snapshots__/cloud-run-with-sql-multiple-dbs.test.ts.snap +4515 -0
  314. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.test.ts.snap +2950 -0
  315. package/examples/__snapshots__/cloud-run-with-sql.test.ts.snap +1772 -0
  316. package/examples/__snapshots__/cloud-run-with-worker.test.ts.snap +1402 -0
  317. package/examples/__snapshots__/custom-build-job-with-tests.test.ts.snap +1261 -0
  318. package/examples/__snapshots__/custom-build-job.test.ts.snap +1156 -0
  319. package/examples/__snapshots__/custom-deploy.test.ts.snap +1059 -0
  320. package/examples/__snapshots__/custom-envs.test.ts.snap +786 -0
  321. package/examples/__snapshots__/custom-sbom-java.test.ts.snap +1152 -0
  322. package/examples/__snapshots__/custom-verify-job.test.ts.snap +1606 -0
  323. package/examples/__snapshots__/git-submodule.test.ts.snap +1395 -0
  324. package/examples/__snapshots__/kubernetes-application-customization.test.ts.snap +1713 -0
  325. package/examples/__snapshots__/kubernetes-with-cloud-sql.test.ts.snap +1733 -0
  326. package/examples/__snapshots__/kubernetes-with-jobs.test.ts.snap +3265 -0
  327. package/examples/__snapshots__/kubernetes-with-mongodb.test.ts.snap +1837 -0
  328. package/examples/__snapshots__/local-dot-env.test.ts.snap +1318 -0
  329. package/examples/__snapshots__/meteor-kubernetes.test.ts.snap +1790 -0
  330. package/examples/__snapshots__/multiline-var.test.ts.snap +5585 -0
  331. package/examples/__snapshots__/native-app.test.ts.snap +2210 -0
  332. package/examples/__snapshots__/node-build-with-custom-image.test.ts.snap +1394 -0
  333. package/examples/__snapshots__/node-build-with-docker-additions.test.ts.snap +1402 -0
  334. package/examples/__snapshots__/override-secrets.test.ts.snap +1419 -0
  335. package/examples/__snapshots__/rails-k8s-with-worker-dockerfile.test.ts.snap +1464 -0
  336. package/examples/__snapshots__/rails-k8s-with-worker.test.ts.snap +1444 -0
  337. package/examples/__snapshots__/referencing-other-vars.test.ts.snap +4645 -0
  338. package/examples/__snapshots__/wait-for-other-deploy.test.ts.snap +1424 -0
  339. package/examples/__snapshots__/workspace-api-www-turbo-cache.test.ts.snap +2298 -0
  340. package/examples/__snapshots__/workspace-api-www.test.ts.snap +2290 -0
  341. package/examples/__utils__/helpers.ts +9 -12
  342. package/examples/cloud-run-health-check-defaults.test.ts +11 -0
  343. package/examples/cloud-run-health-check-defaults.ts +28 -0
  344. package/examples/cloud-run-health-check-only-startup.test.ts +11 -0
  345. package/examples/cloud-run-health-check-only-startup.ts +38 -0
  346. package/examples/cloud-run-health-check.test.ts +11 -0
  347. package/examples/cloud-run-health-check.ts +45 -0
  348. package/examples/cloud-run-http2.test.ts +11 -0
  349. package/examples/cloud-run-http2.ts +29 -0
  350. package/examples/cloud-run-llama.test.ts +11 -0
  351. package/examples/cloud-run-llama.ts +40 -0
  352. package/examples/cloud-run-memory-limit.test.ts +11 -0
  353. package/examples/cloud-run-memory-limit.ts +12 -7
  354. package/examples/cloud-run-meteor-with-worker.test.ts +11 -0
  355. package/examples/cloud-run-meteor-with-worker.ts +13 -7
  356. package/examples/cloud-run-nextjs.test.ts +11 -0
  357. package/examples/cloud-run-nextjs.ts +28 -0
  358. package/examples/cloud-run-no-cpu-throttling.test.ts +11 -0
  359. package/examples/cloud-run-no-cpu-throttling.ts +8 -6
  360. package/examples/cloud-run-no-service.test.ts +11 -0
  361. package/examples/cloud-run-no-service.ts +39 -0
  362. package/examples/cloud-run-non-public.test.ts +11 -0
  363. package/examples/cloud-run-non-public.ts +7 -6
  364. package/examples/cloud-run-post-stop-job.test.ts +11 -0
  365. package/examples/cloud-run-post-stop-job.ts +15 -6
  366. package/examples/cloud-run-service-custom-vpc-connector.test.ts +11 -0
  367. package/examples/cloud-run-service-custom-vpc-connector.ts +37 -0
  368. package/examples/cloud-run-service-custom-vpc.test.ts +11 -0
  369. package/examples/cloud-run-service-custom-vpc.ts +39 -0
  370. package/examples/cloud-run-service-gen2.test.ts +11 -0
  371. package/examples/cloud-run-service-gen2.ts +8 -6
  372. package/examples/cloud-run-service-increase-timout.test.ts +11 -0
  373. package/examples/cloud-run-service-increase-timout.ts +29 -0
  374. package/examples/cloud-run-service-with-volumes.test.ts +11 -0
  375. package/examples/cloud-run-service-with-volumes.ts +64 -0
  376. package/examples/cloud-run-storybook.test.ts +11 -0
  377. package/examples/cloud-run-storybook.ts +33 -0
  378. package/examples/cloud-run-with-gpu.test.ts +11 -0
  379. package/examples/cloud-run-with-gpu.ts +30 -0
  380. package/examples/cloud-run-with-ngnix.test.ts +11 -0
  381. package/examples/cloud-run-with-ngnix.ts +29 -0
  382. package/examples/cloud-run-with-sql-legacy-jobs.test.ts +11 -0
  383. package/examples/cloud-run-with-sql-legacy-jobs.ts +49 -0
  384. package/examples/cloud-run-with-sql-multiple-dbs.test.ts +11 -0
  385. package/examples/cloud-run-with-sql-multiple-dbs.ts +87 -0
  386. package/examples/cloud-run-with-sql-reuse-db.test.ts +11 -0
  387. package/examples/cloud-run-with-sql-reuse-db.ts +7 -6
  388. package/examples/cloud-run-with-sql.test.ts +11 -0
  389. package/examples/cloud-run-with-sql.ts +45 -24
  390. package/examples/cloud-run-with-worker.test.ts +11 -0
  391. package/examples/cloud-run-with-worker.ts +8 -6
  392. package/examples/custom-build-job-with-tests.test.ts +11 -0
  393. package/examples/custom-build-job-with-tests.ts +7 -6
  394. package/examples/custom-build-job.test.ts +11 -0
  395. package/examples/custom-build-job.ts +7 -6
  396. package/examples/custom-deploy.test.ts +11 -0
  397. package/examples/custom-deploy.ts +22 -14
  398. package/examples/custom-envs.test.ts +11 -0
  399. package/examples/custom-envs.ts +7 -6
  400. package/examples/custom-sbom-java.test.ts +11 -0
  401. package/examples/custom-sbom-java.ts +12 -8
  402. package/examples/custom-verify-job.test.ts +11 -0
  403. package/examples/custom-verify-job.ts +65 -0
  404. package/examples/git-submodule.test.ts +11 -0
  405. package/examples/git-submodule.ts +30 -0
  406. package/examples/kubernetes-application-customization.test.ts +11 -0
  407. package/examples/kubernetes-application-customization.ts +9 -6
  408. package/examples/kubernetes-with-cloud-sql.test.ts +11 -0
  409. package/examples/kubernetes-with-cloud-sql.ts +9 -6
  410. package/examples/kubernetes-with-jobs.test.ts +11 -0
  411. package/examples/kubernetes-with-jobs.ts +9 -6
  412. package/examples/kubernetes-with-mongodb.test.ts +11 -0
  413. package/examples/kubernetes-with-mongodb.ts +9 -6
  414. package/examples/local-dot-env.test.ts +11 -0
  415. package/examples/local-dot-env.ts +27 -0
  416. package/examples/meteor-kubernetes.test.ts +11 -0
  417. package/examples/meteor-kubernetes.ts +6 -7
  418. package/examples/multiline-var.test.ts +11 -0
  419. package/examples/multiline-var.ts +107 -0
  420. package/examples/native-app.test.ts +11 -0
  421. package/examples/native-app.ts +24 -19
  422. package/examples/node-build-with-custom-image.test.ts +11 -0
  423. package/examples/node-build-with-custom-image.ts +7 -6
  424. package/examples/node-build-with-docker-additions.test.ts +11 -0
  425. package/examples/node-build-with-docker-additions.ts +7 -6
  426. package/examples/override-secrets.test.ts +11 -0
  427. package/examples/override-secrets.ts +44 -0
  428. package/examples/rails-k8s-with-worker-dockerfile.test.ts +33 -0
  429. package/examples/rails-k8s-with-worker.test.ts +11 -0
  430. package/examples/rails-k8s-with-worker.ts +13 -13
  431. package/examples/referencing-other-vars.test.ts +11 -0
  432. package/examples/referencing-other-vars.ts +83 -0
  433. package/examples/wait-for-other-deploy.test.ts +11 -0
  434. package/examples/wait-for-other-deploy.ts +6 -5
  435. package/examples/workspace-api-www-turbo-cache.test.ts +11 -0
  436. package/examples/workspace-api-www-turbo-cache.ts +52 -0
  437. package/examples/workspace-api-www.test.ts +11 -0
  438. package/examples/workspace-api-www.ts +46 -0
  439. package/package.json +23 -26
  440. package/scripts/generate-examples-test.ts +84 -0
  441. package/scripts/generate-gitlab-ci-types.ts +2 -2
  442. package/scripts/tsconfig.json +7 -0
  443. package/src/bash/BashExpression.ts +78 -0
  444. package/src/bash/bashEscape.ts +164 -0
  445. package/src/bash/bashExpressionPerPipelineType.ts +16 -0
  446. package/src/bash/bashYaml.ts +80 -0
  447. package/src/bash/getInjectVarsScript.ts +21 -0
  448. package/src/bash/index.ts +2 -0
  449. package/src/build/artifacts/createBuildJobArtifact.ts +63 -0
  450. package/src/build/base/__tests__/createArtifactsConfig.test.ts +3 -3
  451. package/src/build/base/constants.ts +1 -1
  452. package/src/build/base/createAppBuildJob.ts +40 -24
  453. package/src/build/base/createArtifactsConfig.ts +2 -2
  454. package/src/build/base/createBuildJobDefinition.ts +37 -0
  455. package/src/build/base/index.ts +40 -8
  456. package/src/build/base/writeBuildInfo.ts +3 -3
  457. package/src/build/base/writeDotEnv.ts +25 -6
  458. package/src/build/cache/createJobCache.ts +83 -0
  459. package/src/build/cache/getAllCacheConfigsFromConfig.ts +29 -0
  460. package/src/build/cache/transformLegacyJobCache.ts +14 -0
  461. package/src/build/custom/__tests__/testJob.test.ts +10 -13
  462. package/src/build/custom/buildJob.ts +11 -37
  463. package/src/build/custom/index.ts +4 -2
  464. package/src/build/custom/testJob.ts +24 -21
  465. package/src/build/docker.ts +110 -49
  466. package/src/build/index.ts +45 -11
  467. package/src/build/node/buildJob.ts +68 -69
  468. package/src/build/node/cache.ts +28 -34
  469. package/src/build/node/constants.ts +2 -2
  470. package/src/build/node/index.ts +13 -4
  471. package/src/build/node/meteor.ts +19 -24
  472. package/src/build/node/testJob.ts +44 -25
  473. package/src/build/node/yarn.ts +22 -15
  474. package/src/build/rails/build.ts +15 -9
  475. package/src/build/rails/index.ts +4 -2
  476. package/src/build/rails/test.ts +41 -12
  477. package/src/build/sbom.ts +21 -11
  478. package/src/build/types.ts +198 -47
  479. package/src/catladder-gitlab.ts +7 -56
  480. package/src/config/__tests__/__snapshots__/getAllEnvs.test.ts.snap +31 -0
  481. package/src/config/__tests__/__snapshots__/getAllEnvsInAllComponents.test.ts.snap +15 -0
  482. package/src/config/__tests__/getAllEnvs.test.ts +71 -0
  483. package/src/config/__tests__/getAllEnvsInAllComponents.test.ts +63 -0
  484. package/src/config/configruedEnvs.ts +6 -6
  485. package/src/config/readConfig.ts +15 -22
  486. package/src/constants.ts +5 -2
  487. package/src/context/createAllComponentsContext.ts +31 -0
  488. package/src/context/createComponentContext.ts +148 -0
  489. package/src/context/createWorkspaceContext.ts +56 -0
  490. package/src/context/getBuildInfoVariables.ts +36 -0
  491. package/src/context/getEnvConfig.ts +25 -5
  492. package/src/context/getEnvType.ts +1 -1
  493. package/src/context/getEnvironment.ts +8 -24
  494. package/src/context/getEnvironmentContext.ts +25 -29
  495. package/src/context/getEnvironmentVariables.ts +101 -83
  496. package/src/context/getLabels.ts +8 -5
  497. package/src/context/getReviewSlug.ts +27 -0
  498. package/src/context/index.ts +1 -65
  499. package/src/context/transformJobOnlyVars.ts +6 -3
  500. package/src/context/utils/envVars.ts +5 -4
  501. package/src/deploy/base/deploy.ts +63 -47
  502. package/src/deploy/base/index.ts +11 -6
  503. package/src/deploy/base/rollback.ts +11 -16
  504. package/src/deploy/base/stop.ts +11 -15
  505. package/src/deploy/base/variables.ts +1 -1
  506. package/src/deploy/cloudRun/artifactsRegistry.ts +32 -28
  507. package/src/deploy/cloudRun/cleanup.ts +5 -5
  508. package/src/deploy/cloudRun/cloudRunRevisions.ts +9 -11
  509. package/src/deploy/cloudRun/createJobs/cloudRunJobs.ts +71 -153
  510. package/src/deploy/cloudRun/createJobs/cloudRunServices.ts +65 -26
  511. package/src/deploy/cloudRun/createJobs/common.ts +7 -7
  512. package/src/deploy/cloudRun/createJobs/constants.ts +1 -0
  513. package/src/deploy/cloudRun/createJobs/execute/onDeploy.ts +102 -0
  514. package/src/deploy/cloudRun/createJobs/execute/schedules.ts +186 -0
  515. package/src/deploy/cloudRun/createJobs/getCloudRunDeployScripts.ts +27 -16
  516. package/src/deploy/cloudRun/createJobs/getCloudRunStopScripts.ts +9 -11
  517. package/src/deploy/cloudRun/createJobs/healthCheck.ts +64 -0
  518. package/src/deploy/cloudRun/createJobs/index.ts +20 -14
  519. package/src/deploy/cloudRun/createJobs/volumes.ts +23 -0
  520. package/src/deploy/cloudRun/index.ts +94 -60
  521. package/src/deploy/cloudRun/utils/cloudRunExecutionUrl.ts +20 -0
  522. package/src/deploy/cloudRun/utils/createArgsString.ts +6 -2
  523. package/src/deploy/cloudRun/utils/database.ts +116 -9
  524. package/src/deploy/cloudRun/utils/gcloudServiceAccountLoginCommands.ts +5 -3
  525. package/src/deploy/cloudRun/utils/getJobOrServiceArgs.ts +18 -0
  526. package/src/deploy/cloudRun/utils/getServiceName.ts +2 -2
  527. package/src/deploy/cloudRun/utils/jobName.ts +22 -2
  528. package/src/deploy/cloudRun/utils/removeFirstLinesFromCommandOutput.ts +1 -1
  529. package/src/deploy/cloudSql/utils.ts +13 -10
  530. package/src/deploy/custom/deployJob.ts +15 -10
  531. package/src/deploy/custom/index.ts +2 -2
  532. package/src/deploy/dockerTag/deployJob.ts +6 -7
  533. package/src/deploy/dockerTag/index.ts +8 -7
  534. package/src/deploy/index.ts +15 -12
  535. package/src/deploy/kubernetes/additionalSecretKeys.ts +3 -1
  536. package/src/deploy/kubernetes/cloudSql/index.ts +16 -25
  537. package/src/deploy/kubernetes/deployJob.ts +30 -21
  538. package/src/deploy/kubernetes/index.ts +43 -35
  539. package/src/deploy/kubernetes/kubeEnv.ts +12 -10
  540. package/src/deploy/kubernetes/kubeValues.ts +25 -20
  541. package/src/deploy/kubernetes/mongodb.ts +15 -15
  542. package/src/deploy/sbom.ts +20 -10
  543. package/src/deploy/types/base.ts +3 -3
  544. package/src/deploy/types/custom.ts +3 -7
  545. package/src/deploy/types/googleCloudRun.ts +359 -2
  546. package/src/deploy/types/index.ts +9 -2
  547. package/src/deploy/types/kubernetes.ts +1 -36
  548. package/src/deploy/utils.ts +5 -5
  549. package/src/globalScriptFunctions/index.ts +30 -0
  550. package/src/index.ts +4 -1
  551. package/src/packageInfos.ts +14 -0
  552. package/src/pipeline/__tests__/__snapshots__/getPipelineStages.test.ts.snap +69 -0
  553. package/src/pipeline/__tests__/getPipelineStages.test.ts +63 -0
  554. package/src/pipeline/createAllJobs.ts +67 -33
  555. package/src/pipeline/createJobsForComponent.ts +17 -37
  556. package/src/pipeline/createJobsForWorkspace.ts +12 -0
  557. package/src/pipeline/createMainPipeline.ts +118 -0
  558. package/src/pipeline/generatePipelineFiles.ts +100 -0
  559. package/src/pipeline/getPipelineStages.ts +23 -0
  560. package/src/pipeline/gitlab/createGitlabJobs.ts +398 -108
  561. package/src/pipeline/gitlab/createGitlabPipeline.ts +35 -0
  562. package/src/pipeline/gitlab/gitlabReleaseJobs.ts +23 -0
  563. package/src/pipeline/gitlab/sortGitLabJobDefProps.ts +59 -0
  564. package/src/pipeline/index.ts +2 -1
  565. package/src/pipeline/packageManager.ts +42 -18
  566. package/src/pipeline/yarn/yarnUtils.ts +15 -12
  567. package/src/rules/index.ts +41 -18
  568. package/src/runner/index.ts +0 -1
  569. package/src/types/config.ts +62 -23
  570. package/src/types/context.ts +167 -36
  571. package/src/types/environmentContext.ts +18 -13
  572. package/src/types/gitlab-ci-yml.ts +0 -1
  573. package/src/types/gitlab-types.ts +10 -7
  574. package/src/types/index.ts +2 -0
  575. package/src/types/jobDefinition.ts +34 -0
  576. package/src/types/jobs.ts +31 -15
  577. package/src/types/utils.ts +4 -4
  578. package/src/utils/gitlab.ts +20 -3
  579. package/src/utils/index.ts +6 -3
  580. package/src/utils/jsonParse.ts +7 -0
  581. package/src/utils/removeUndefined.ts +4 -0
  582. package/src/utils/writeFiles.ts +52 -0
  583. package/src/variables/VariableValue.ts +6 -0
  584. package/src/variables/VariableValueContainingReferences.ts +89 -0
  585. package/src/variables/__tests__/resolveAllReferences.test.ts +110 -0
  586. package/src/variables/__tests__/resolveAllReferencesOnce.test.ts +64 -0
  587. package/src/variables/__tests__/resolveReferencesOnce.test.ts +117 -0
  588. package/src/variables/__tests__/variableValue.test.ts +73 -0
  589. package/src/variables/resolveAllReferences.ts +46 -0
  590. package/src/variables/resolveAllReferencesOnce.ts +44 -0
  591. package/src/variables/resolveReferencesOnce.ts +29 -0
  592. package/bin/catladder-gitlab-dev.js +0 -3
  593. package/bin/catladder-gitlab.js +0 -3
  594. package/dist/bundles/catladder-gitlab/index.js +0 -34559
  595. package/dist/context/__tests__/resolveReferences.test.js +0 -336
  596. package/dist/context/resolveReferences.d.ts +0 -4
  597. package/dist/context/resolveReferences.js +0 -254
  598. package/dist/deploy/cloudRun/createJobs/variables.d.ts +0 -5
  599. package/dist/deploy/cloudRun/createJobs/variables.js +0 -19
  600. package/dist/deploy/kubernetes/processSecretsAsFiles.d.ts +0 -84
  601. package/dist/deploy/kubernetes/processSecretsAsFiles.js +0 -31
  602. package/dist/pipeline/commitInfo/getBuildId.d.ts +0 -6
  603. package/dist/pipeline/commitInfo/getCommitInfo.d.ts +0 -2
  604. package/dist/pipeline/createChildPipeline.d.ts +0 -3
  605. package/examples/__snapshots__/cloud-run-memory-limit.ts.snap +0 -1839
  606. package/examples/__snapshots__/cloud-run-meteor-with-worker.ts.snap +0 -1807
  607. package/examples/__snapshots__/cloud-run-no-cpu-throttling.ts.snap +0 -1839
  608. package/examples/__snapshots__/cloud-run-non-public.ts.snap +0 -1839
  609. package/examples/__snapshots__/cloud-run-post-stop-job.ts.snap +0 -1849
  610. package/examples/__snapshots__/cloud-run-service-gen2.ts.snap +0 -1839
  611. package/examples/__snapshots__/cloud-run-with-sql-reuse-db.ts.snap +0 -3647
  612. package/examples/__snapshots__/cloud-run-with-sql.ts.snap +0 -3658
  613. package/examples/__snapshots__/cloud-run-with-worker.ts.snap +0 -1847
  614. package/examples/__snapshots__/custom-build-job-with-tests.ts.snap +0 -1663
  615. package/examples/__snapshots__/custom-build-job.ts.snap +0 -1375
  616. package/examples/__snapshots__/custom-deploy.ts.snap +0 -1625
  617. package/examples/__snapshots__/custom-envs.ts.snap +0 -1127
  618. package/examples/__snapshots__/custom-sbom-java.ts.snap +0 -1383
  619. package/examples/__snapshots__/kubernetes-application-customization.ts.snap +0 -2573
  620. package/examples/__snapshots__/kubernetes-with-cloud-sql-legacy.ts.snap +0 -2533
  621. package/examples/__snapshots__/kubernetes-with-cloud-sql.ts.snap +0 -2545
  622. package/examples/__snapshots__/kubernetes-with-jobs.ts.snap +0 -4660
  623. package/examples/__snapshots__/kubernetes-with-mongodb.ts.snap +0 -2737
  624. package/examples/__snapshots__/meteor-kubernetes.ts.snap +0 -2658
  625. package/examples/__snapshots__/native-app.ts.snap +0 -3007
  626. package/examples/__snapshots__/node-build-with-custom-image.ts.snap +0 -1839
  627. package/examples/__snapshots__/node-build-with-docker-additions.ts.snap +0 -1839
  628. package/examples/__snapshots__/rails-k8s-with-worker.ts.snap +0 -4291
  629. package/examples/__snapshots__/wait-for-other-deploy.ts.snap +0 -2049
  630. package/examples/kubernetes-with-cloud-sql-legacy.ts +0 -33
  631. package/scripts/bundle +0 -2
  632. package/src/context/__tests__/resolveReferences.test.ts +0 -143
  633. package/src/context/resolveReferences.ts +0 -70
  634. package/src/deploy/cloudRun/createJobs/variables.ts +0 -21
  635. package/src/deploy/kubernetes/processSecretsAsFiles.ts +0 -34
  636. package/src/pipeline/commitInfo/getBuildId.ts +0 -17
  637. package/src/pipeline/commitInfo/getCommitInfo.ts +0 -15
  638. package/src/pipeline/createChildPipeline.ts +0 -46
  639. /package/dist/{context/__tests__/resolveReferences.test.d.ts → config/__tests__/getAllEnvs.test.d.ts} +0 -0
@@ -0,0 +1,1464 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`matches snapshot with a Dockerfile 1`] = `
4
+ "image: path/to/docker/jobs-default:the-version
5
+ stages:
6
+ - setup
7
+ - setup dev
8
+ - setup review
9
+ - setup stage
10
+ - setup prod
11
+ - test
12
+ - test dev
13
+ - test review
14
+ - test stage
15
+ - test prod
16
+ - build
17
+ - build dev
18
+ - build review
19
+ - build stage
20
+ - build prod
21
+ - deploy
22
+ - deploy dev
23
+ - deploy review
24
+ - deploy stage
25
+ - deploy prod
26
+ - verify
27
+ - verify dev
28
+ - verify review
29
+ - verify stage
30
+ - verify prod
31
+ - rollback
32
+ - rollback dev
33
+ - rollback review
34
+ - rollback stage
35
+ - rollback prod
36
+ - stop
37
+ - stop dev
38
+ - stop review
39
+ - stop stage
40
+ - stop prod
41
+ - release
42
+ variables:
43
+ FF_USE_FASTZIP: 'true'
44
+ ARTIFACT_COMPRESSION_LEVEL: fast
45
+ CACHE_COMPRESSION_LEVEL: fast
46
+ TRANSFER_METER_FREQUENCY: 5s
47
+ GIT_DEPTH: '1'
48
+ before_script:
49
+ - |-
50
+ function escapeForDotEnv () {
51
+ input="\${1:-$(cat)}"
52
+ input="\${input//$'\\n'/\\\\n}"
53
+ if [[ "$input" == *\\\\n* ]]; then
54
+ if [[ "$input" == *\\"* && "$input" == *\\'* && "$input" == *\\\`* ]]; then
55
+ printf "\\"%s\\"\\n" "$input"
56
+ elif [[ "$input" == *\\"* && "$input" == *\\'* ]]; then
57
+ printf "\`%s\`\\n" "$input"
58
+ elif [[ "$input" == *\\"* ]]; then
59
+ printf "'%s'\\n" "$input"
60
+ else
61
+ printf "\\"%s\\"\\n" "$input"
62
+ fi
63
+ else
64
+ printf "%s\\n" "$input"
65
+ fi
66
+ }
67
+ - |-
68
+ function collapseable_section_start () {
69
+ local section_title="\${1}"
70
+ local section_description="\${2:-$section_title}"
71
+ echo -e "section_start:\`date +%s\`:\${section_title}[collapsed=true]\\r\\e[0K\${section_description}"
72
+ }
73
+ - |-
74
+ function collapseable_section_end () {
75
+ local section_title="\${1}"
76
+ echo -e "section_end:\`date +%s\`:\${section_title}\\r\\e[0K"
77
+ }
78
+ app 🛡 audit:
79
+ stage: test
80
+ image: ruby:3.2.1
81
+ variables: {}
82
+ script:
83
+ - collapseable_section_start "injectvars" "Injecting variables"
84
+ - collapseable_section_end "injectvars"
85
+ - cd .temp-with-dockerfile
86
+ - gem install bundler-audit
87
+ - bundle audit check
88
+ rules:
89
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
90
+ - if: $CI_MERGE_REQUEST_ID
91
+ needs: []
92
+ retry: &a1
93
+ max: 2
94
+ when:
95
+ - runner_system_failure
96
+ - stuck_or_timeout_failure
97
+ interruptible: true
98
+ allow_failure: true
99
+ app 👮 lint:
100
+ stage: test
101
+ image: ruby:3.2.1
102
+ variables: {}
103
+ script:
104
+ - collapseable_section_start "injectvars" "Injecting variables"
105
+ - collapseable_section_end "injectvars"
106
+ - cd .temp-with-dockerfile
107
+ - bundle config set path 'tmp/cache'
108
+ - bundle install -j $(nproc)
109
+ - bundle exec rubocop
110
+ cache: &a2
111
+ key:
112
+ files:
113
+ - Gemfile.lock
114
+ prefix: $CI_JOB_IMAGE
115
+ paths:
116
+ - tmp/cache
117
+ rules:
118
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
119
+ - if: $CI_MERGE_REQUEST_ID
120
+ needs: []
121
+ retry: *a1
122
+ interruptible: true
123
+ app đŸ§Ē test:
124
+ stage: test
125
+ image: ruby:3.2.1
126
+ services:
127
+ - name: docker.io/postgres:latest
128
+ alias: database
129
+ variables:
130
+ POSTGRES_HOST_AUTH_METHOD: trust
131
+ variables:
132
+ RAILS_ENV: test
133
+ DATABASE_URL: postgresql://postgres@database
134
+ script:
135
+ - collapseable_section_start "injectvars" "Injecting variables"
136
+ - collapseable_section_end "injectvars"
137
+ - cd .temp-with-dockerfile
138
+ - bundle config set path 'tmp/cache'
139
+ - bundle install -j $(nproc)
140
+ - bundle exec rake db:test:prepare
141
+ - bundle exec rake assets:precompile assets:clean
142
+ - bundle exec rspec
143
+ cache: *a2
144
+ rules:
145
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
146
+ - if: $CI_MERGE_REQUEST_ID
147
+ needs: []
148
+ retry: *a1
149
+ interruptible: true
150
+ 'app 🔨 docker | dev ':
151
+ stage: build
152
+ image: path/to/docker/docker-build:the-version
153
+ services:
154
+ - name: docker:24.0.6-dind
155
+ command:
156
+ - --tls=false
157
+ - --registry-mirror=https://mirror.gcr.io
158
+ variables:
159
+ DOCKER_HOST: tcp://docker:2375
160
+ DOCKER_TLS_CERTDIR: ''
161
+ DOCKER_DRIVER: overlay2
162
+ DOCKER_BUILDKIT: '1'
163
+ KUBERNETES_CPU_REQUEST: '0.45'
164
+ KUBERNETES_MEMORY_REQUEST: 1Gi
165
+ KUBERNETES_MEMORY_LIMIT: 2Gi
166
+ script:
167
+ - collapseable_section_start "injectvars" "Injecting variables"
168
+ - export APP_DIR=".temp-with-dockerfile"
169
+ - export DOCKER_BUILD_CONTEXT="."
170
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
171
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
172
+ - export DOCKER_IMAGE_NAME="dev/app"
173
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
174
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
175
+ - collapseable_section_end "injectvars"
176
+ - collapseable_section_start "docker-login" "Docker Login"
177
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
178
+ - collapseable_section_end "docker-login"
179
+ - collapseable_section_start "docker-build" "Docker build"
180
+ - 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
181
+ - collapseable_section_end "docker-build"
182
+ - collapseable_section_start "docker-push" "Docker push and tag"
183
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
184
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
185
+ - docker push $DOCKER_CACHE_IMAGE
186
+ - collapseable_section_end "docker-push"
187
+ rules:
188
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
189
+ needs: []
190
+ retry: *a1
191
+ interruptible: true
192
+ 'app 🧾 sbom | dev ':
193
+ stage: build
194
+ image:
195
+ name: aquasec/trivy:0.58.2
196
+ entrypoint:
197
+ - ''
198
+ variables: {}
199
+ script:
200
+ - collapseable_section_start "injectvars" "Injecting variables"
201
+ - collapseable_section_end "injectvars"
202
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" .temp-with-dockerfile
203
+ artifacts:
204
+ paths:
205
+ - __sbom.json
206
+ rules:
207
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
208
+ needs: []
209
+ retry: *a1
210
+ interruptible: true
211
+ allow_failure: true
212
+ 'app 🚀 Deploy | dev ':
213
+ stage: deploy dev
214
+ image: path/to/docker/kubernetes:the-version
215
+ variables:
216
+ KUBERNETES_CPU_REQUEST: '0.22'
217
+ KUBERNETES_MEMORY_REQUEST: 200Mi
218
+ KUBERNETES_MEMORY_LIMIT: 400Mi
219
+ script:
220
+ - collapseable_section_start "injectvars" "Injecting variables"
221
+ - export ENV_SHORT="dev"
222
+ - export APP_DIR=".temp-with-dockerfile"
223
+ - export ENV_TYPE="dev"
224
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
225
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
226
+ - 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")"
227
+ - export HOSTNAME="app.dev.test-app.pan.panter.cloud"
228
+ - export ROOT_URL="https://app.dev.test-app.pan.panter.cloud"
229
+ - export HOSTNAME_INTERNAL="app.dev.test-app.pan.panter.cloud"
230
+ - export ROOT_URL_INTERNAL="https://app.dev.test-app.pan.panter.cloud"
231
+ - export KUBE_NAMESPACE="pan-test-app-dev"
232
+ - export KUBE_APP_NAME="app"
233
+ - export KUBE_APP_NAME_PREFIX=""
234
+ - export SECRET_KEY_BASE="$CL_dev_app_SECRET_KEY_BASE"
235
+ - export POSTGRESQL_PASSWORD="$CL_dev_app_POSTGRESQL_PASSWORD"
236
+ - export cloudsqlProxyCredentials="$CL_dev_app_cloudsqlProxyCredentials"
237
+ - export RAILS_ENV="production"
238
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
239
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
240
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
241
+ - export DOCKER_IMAGE_NAME="dev/app"
242
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
243
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
244
+ - export RELEASE_NAME="pan-test-app-dev-app"
245
+ - export HELM_EXPERIMENTAL_OCI="1"
246
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
247
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
248
+ - export HELM_ARGS=""
249
+ - export COMPONENT_NAME="app"
250
+ - collapseable_section_end "injectvars"
251
+ - kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
252
+ - kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"
253
+ - kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"
254
+ - kubectl config use-context "kube-pan-test-app-dev-app"
255
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
256
+ - |
257
+ cat > __all_values.yml <<EOF
258
+ env:
259
+ secret:
260
+ SECRET_KEY_BASE: |-
261
+ $(printf %s "$CL_dev_app_SECRET_KEY_BASE" | sed '1!s/^/ /')
262
+ POSTGRESQL_PASSWORD: |-
263
+ $(printf %s "$CL_dev_app_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
264
+ cloudsqlProxyCredentials: |-
265
+ $(printf %s "$CL_dev_app_cloudsqlProxyCredentials" | sed '1!s/^/ /')
266
+ public:
267
+ ENV_SHORT: |-
268
+ dev
269
+ APP_DIR: |-
270
+ .temp-with-dockerfile
271
+ ENV_TYPE: |-
272
+ dev
273
+ BUILD_INFO_BUILD_ID: |-
274
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
275
+ BUILD_INFO_BUILD_TIME: |-
276
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
277
+ BUILD_INFO_CURRENT_VERSION: |-
278
+ $(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/^/ /')
279
+ HOSTNAME: |-
280
+ app.dev.test-app.pan.panter.cloud
281
+ ROOT_URL: |-
282
+ https://app.dev.test-app.pan.panter.cloud
283
+ HOSTNAME_INTERNAL: |-
284
+ app.dev.test-app.pan.panter.cloud
285
+ ROOT_URL_INTERNAL: |-
286
+ https://app.dev.test-app.pan.panter.cloud
287
+ KUBE_NAMESPACE: |-
288
+ pan-test-app-dev
289
+ KUBE_APP_NAME: |-
290
+ app
291
+ KUBE_APP_NAME_PREFIX: ""
292
+ RAILS_ENV: |-
293
+ production
294
+ _ALL_ENV_VAR_KEYS: |-
295
+ ["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","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
296
+ application:
297
+ host: |-
298
+ app.dev.test-app.pan.panter.cloud
299
+ livenessProbe:
300
+ httpGet:
301
+ path: |-
302
+ __health
303
+ readinessProbe:
304
+ httpGet:
305
+ path: |-
306
+ __health
307
+ startupProbe:
308
+ httpGet:
309
+ path: |-
310
+ __health
311
+ worker:
312
+ enabled: true
313
+ command: |-
314
+ launcher bundle exec rake jobs:work
315
+ livenessProbe: false
316
+ cloudsql:
317
+ enabled: true
318
+ dbUser: |-
319
+ postgres
320
+ instanceConnectionName: |-
321
+ myproject:europe-west6:instance-name
322
+ proxyCredentials: |-
323
+ $CL_dev_app_cloudsqlProxyCredentials
324
+ fullDbName: |-
325
+ pan-test-app-dev-app
326
+ type: |-
327
+ unmanaged
328
+ jobs:
329
+ db-migrate:
330
+ hook: |-
331
+ post-install,post-upgrade
332
+ command: |-
333
+ launcher bundle exec rake db:migrate
334
+
335
+ EOF
336
+ - collapseable_section_end "writeallvalues"
337
+ - kubernetesCreateSecret
338
+ - kubernetesDeploy
339
+ - echo 'Uploading SBOM to Dependency Track'
340
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "$ROOT_URL" "__sbom.json" vex.json || true
341
+ - echo deployment successful đŸ˜ģ
342
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
343
+ environment:
344
+ name: dev/app
345
+ url: $CL_GITLAB_ENVIRONMENT_URL
346
+ on_stop: 'app 🛑 Stop âš ī¸ | dev '
347
+ auto_stop_in: 4 weeks
348
+ artifacts:
349
+ reports:
350
+ dotenv: gitlab_environment.env
351
+ rules:
352
+ - when: on_success
353
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
354
+ needs:
355
+ - job: app 👮 lint
356
+ artifacts: false
357
+ - job: 'app 🔨 docker | dev '
358
+ artifacts: false
359
+ - job: app đŸ§Ē test
360
+ artifacts: false
361
+ - job: 'app 🧾 sbom | dev '
362
+ artifacts: true
363
+ - job: app 🛡 audit
364
+ artifacts: false
365
+ retry: *a1
366
+ interruptible: true
367
+ allow_failure: false
368
+ 'app 🛑 Stop âš ī¸ | dev ':
369
+ stage: stop dev
370
+ image: path/to/docker/kubernetes:the-version
371
+ variables:
372
+ KUBERNETES_CPU_REQUEST: '0.22'
373
+ KUBERNETES_MEMORY_REQUEST: 200Mi
374
+ KUBERNETES_MEMORY_LIMIT: 400Mi
375
+ GIT_STRATEGY: none
376
+ script:
377
+ - collapseable_section_start "injectvars" "Injecting variables"
378
+ - export ENV_SHORT="dev"
379
+ - export APP_DIR=".temp-with-dockerfile"
380
+ - export ENV_TYPE="dev"
381
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
382
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
383
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
384
+ - export HOSTNAME="app.dev.test-app.pan.panter.cloud"
385
+ - export ROOT_URL="https://app.dev.test-app.pan.panter.cloud"
386
+ - export HOSTNAME_INTERNAL="app.dev.test-app.pan.panter.cloud"
387
+ - export ROOT_URL_INTERNAL="https://app.dev.test-app.pan.panter.cloud"
388
+ - export KUBE_NAMESPACE="pan-test-app-dev"
389
+ - export KUBE_APP_NAME="app"
390
+ - export KUBE_APP_NAME_PREFIX=""
391
+ - export SECRET_KEY_BASE="$CL_dev_app_SECRET_KEY_BASE"
392
+ - export POSTGRESQL_PASSWORD="$CL_dev_app_POSTGRESQL_PASSWORD"
393
+ - export cloudsqlProxyCredentials="$CL_dev_app_cloudsqlProxyCredentials"
394
+ - export RAILS_ENV="production"
395
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
396
+ - export RELEASE_NAME="pan-test-app-dev-app"
397
+ - export HELM_EXPERIMENTAL_OCI="1"
398
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
399
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
400
+ - export HELM_ARGS=""
401
+ - export COMPONENT_NAME="app"
402
+ - collapseable_section_end "injectvars"
403
+ - kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
404
+ - kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"
405
+ - kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"
406
+ - kubectl config use-context "kube-pan-test-app-dev-app"
407
+ - kubernetesDelete
408
+ - echo 'Disabling component in Dependency Track'
409
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "$CI_ENVIRONMENT_URL" || true
410
+ environment:
411
+ name: dev/app
412
+ action: stop
413
+ rules:
414
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
415
+ when: on_success
416
+ - when: manual
417
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
418
+ needs: []
419
+ retry: *a1
420
+ interruptible: true
421
+ allow_failure: true
422
+ 'app â†Šī¸ Rollback âš ī¸ | dev ':
423
+ stage: rollback dev
424
+ image: path/to/docker/kubernetes:the-version
425
+ variables:
426
+ KUBERNETES_CPU_REQUEST: '0.22'
427
+ KUBERNETES_MEMORY_REQUEST: 200Mi
428
+ KUBERNETES_MEMORY_LIMIT: 400Mi
429
+ GIT_STRATEGY: none
430
+ script:
431
+ - collapseable_section_start "injectvars" "Injecting variables"
432
+ - export ENV_SHORT="dev"
433
+ - export APP_DIR=".temp-with-dockerfile"
434
+ - export ENV_TYPE="dev"
435
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
436
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
437
+ - 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")"
438
+ - export HOSTNAME="app.dev.test-app.pan.panter.cloud"
439
+ - export ROOT_URL="https://app.dev.test-app.pan.panter.cloud"
440
+ - export HOSTNAME_INTERNAL="app.dev.test-app.pan.panter.cloud"
441
+ - export ROOT_URL_INTERNAL="https://app.dev.test-app.pan.panter.cloud"
442
+ - export KUBE_NAMESPACE="pan-test-app-dev"
443
+ - export KUBE_APP_NAME="app"
444
+ - export KUBE_APP_NAME_PREFIX=""
445
+ - export SECRET_KEY_BASE="$CL_dev_app_SECRET_KEY_BASE"
446
+ - export POSTGRESQL_PASSWORD="$CL_dev_app_POSTGRESQL_PASSWORD"
447
+ - export cloudsqlProxyCredentials="$CL_dev_app_cloudsqlProxyCredentials"
448
+ - export RAILS_ENV="production"
449
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
450
+ - export RELEASE_NAME="pan-test-app-dev-app"
451
+ - export HELM_EXPERIMENTAL_OCI="1"
452
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
453
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
454
+ - export HELM_ARGS=""
455
+ - export COMPONENT_NAME="app"
456
+ - collapseable_section_end "injectvars"
457
+ - kubectl config set-cluster "kube-pan-test-app-dev-app" --server="$CL_dev_app_KUBE_URL" --certificate-authority <(echo $CL_dev_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
458
+ - kubectl config set-credentials "kube-pan-test-app-dev-app" --token="$CL_dev_app_KUBE_TOKEN"
459
+ - kubectl config set-context "kube-pan-test-app-dev-app" --cluster="kube-pan-test-app-dev-app" --user="kube-pan-test-app-dev-app" --namespace="pan-test-app-dev"
460
+ - kubectl config use-context "kube-pan-test-app-dev-app"
461
+ - kubernetesRollback
462
+ environment:
463
+ name: dev/app
464
+ action: access
465
+ rules:
466
+ - when: manual
467
+ if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $CI_COMMIT_MESSAGE !~ /^chore\\(release\\).*/
468
+ needs: []
469
+ retry: *a1
470
+ interruptible: true
471
+ allow_failure: true
472
+ 'app 🔨 docker | review ':
473
+ stage: build
474
+ image: path/to/docker/docker-build:the-version
475
+ services:
476
+ - name: docker:24.0.6-dind
477
+ command:
478
+ - --tls=false
479
+ - --registry-mirror=https://mirror.gcr.io
480
+ variables:
481
+ DOCKER_HOST: tcp://docker:2375
482
+ DOCKER_TLS_CERTDIR: ''
483
+ DOCKER_DRIVER: overlay2
484
+ DOCKER_BUILDKIT: '1'
485
+ KUBERNETES_CPU_REQUEST: '0.45'
486
+ KUBERNETES_MEMORY_REQUEST: 1Gi
487
+ KUBERNETES_MEMORY_LIMIT: 2Gi
488
+ script:
489
+ - collapseable_section_start "injectvars" "Injecting variables"
490
+ - export APP_DIR=".temp-with-dockerfile"
491
+ - export DOCKER_BUILD_CONTEXT="."
492
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
493
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
494
+ - export DOCKER_IMAGE_NAME="review/app"
495
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
496
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
497
+ - collapseable_section_end "injectvars"
498
+ - collapseable_section_start "docker-login" "Docker Login"
499
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
500
+ - collapseable_section_end "docker-login"
501
+ - collapseable_section_start "docker-build" "Docker build"
502
+ - 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
503
+ - collapseable_section_end "docker-build"
504
+ - collapseable_section_start "docker-push" "Docker push and tag"
505
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
506
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
507
+ - docker push $DOCKER_CACHE_IMAGE
508
+ - collapseable_section_end "docker-push"
509
+ rules:
510
+ - if: $CI_MERGE_REQUEST_ID
511
+ needs: []
512
+ retry: *a1
513
+ interruptible: true
514
+ 'app 🧾 sbom | review ':
515
+ stage: build
516
+ image:
517
+ name: aquasec/trivy:0.58.2
518
+ entrypoint:
519
+ - ''
520
+ variables: {}
521
+ script:
522
+ - collapseable_section_start "injectvars" "Injecting variables"
523
+ - collapseable_section_end "injectvars"
524
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" .temp-with-dockerfile
525
+ artifacts:
526
+ paths:
527
+ - __sbom.json
528
+ rules:
529
+ - if: $CI_MERGE_REQUEST_ID
530
+ needs: []
531
+ retry: *a1
532
+ interruptible: true
533
+ allow_failure: true
534
+ 'app 🚀 Deploy | review ':
535
+ stage: deploy review
536
+ image: path/to/docker/kubernetes:the-version
537
+ variables:
538
+ KUBERNETES_CPU_REQUEST: '0.22'
539
+ KUBERNETES_MEMORY_REQUEST: 200Mi
540
+ KUBERNETES_MEMORY_LIMIT: 400Mi
541
+ script:
542
+ - collapseable_section_start "injectvars" "Injecting variables"
543
+ - export ENV_SHORT="review"
544
+ - export APP_DIR=".temp-with-dockerfile"
545
+ - export ENV_TYPE="review"
546
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
547
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
548
+ - 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")"
549
+ - export HOSTNAME="app.$([ -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"
550
+ - export ROOT_URL="https://app.$([ -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"
551
+ - export HOSTNAME_INTERNAL="app.$([ -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"
552
+ - export ROOT_URL_INTERNAL="https://app.$([ -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"
553
+ - export KUBE_NAMESPACE="pan-test-app-review"
554
+ - 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"; })-app"
555
+ - 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"; })-"
556
+ - export SECRET_KEY_BASE="$CL_review_app_SECRET_KEY_BASE"
557
+ - export POSTGRESQL_PASSWORD="$CL_review_app_POSTGRESQL_PASSWORD"
558
+ - export cloudsqlProxyCredentials="$CL_review_app_cloudsqlProxyCredentials"
559
+ - export RAILS_ENV="production"
560
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
561
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
562
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
563
+ - export DOCKER_IMAGE_NAME="review/app"
564
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
565
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
566
+ - 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"; })-app"
567
+ - export HELM_EXPERIMENTAL_OCI="1"
568
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
569
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
570
+ - export HELM_ARGS=""
571
+ - export COMPONENT_NAME="app"
572
+ - collapseable_section_end "injectvars"
573
+ - 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"; })-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
574
+ - 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"; })-app" --token="$CL_review_app_KUBE_TOKEN"
575
+ - 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"; })-app" --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"; })-app" --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"; })-app" --namespace="pan-test-app-review"
576
+ - 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"; })-app"
577
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
578
+ - |
579
+ cat > __all_values.yml <<EOF
580
+ env:
581
+ secret:
582
+ SECRET_KEY_BASE: |-
583
+ $(printf %s "$CL_review_app_SECRET_KEY_BASE" | sed '1!s/^/ /')
584
+ POSTGRESQL_PASSWORD: |-
585
+ $(printf %s "$CL_review_app_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
586
+ cloudsqlProxyCredentials: |-
587
+ $(printf %s "$CL_review_app_cloudsqlProxyCredentials" | sed '1!s/^/ /')
588
+ public:
589
+ ENV_SHORT: |-
590
+ review
591
+ APP_DIR: |-
592
+ .temp-with-dockerfile
593
+ ENV_TYPE: |-
594
+ review
595
+ BUILD_INFO_BUILD_ID: |-
596
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
597
+ BUILD_INFO_BUILD_TIME: |-
598
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
599
+ BUILD_INFO_CURRENT_VERSION: |-
600
+ $(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/^/ /')
601
+ HOSTNAME: |-
602
+ $(printf %s "app.$([ -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/^/ /')
603
+ ROOT_URL: |-
604
+ $(printf %s "https://app.$([ -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/^/ /')
605
+ HOSTNAME_INTERNAL: |-
606
+ $(printf %s "app.$([ -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/^/ /')
607
+ ROOT_URL_INTERNAL: |-
608
+ $(printf %s "https://app.$([ -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/^/ /')
609
+ KUBE_NAMESPACE: |-
610
+ pan-test-app-review
611
+ KUBE_APP_NAME: |-
612
+ $(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"; })-app" | sed '1!s/^/ /')
613
+ KUBE_APP_NAME_PREFIX: |-
614
+ $(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/^/ /')
615
+ RAILS_ENV: |-
616
+ production
617
+ _ALL_ENV_VAR_KEYS: |-
618
+ ["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","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
619
+ application:
620
+ host: |-
621
+ $(printf %s "app.$([ -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/^/ /')
622
+ livenessProbe:
623
+ httpGet:
624
+ path: |-
625
+ __health
626
+ readinessProbe:
627
+ httpGet:
628
+ path: |-
629
+ __health
630
+ startupProbe:
631
+ httpGet:
632
+ path: |-
633
+ __health
634
+ worker:
635
+ enabled: true
636
+ command: |-
637
+ launcher bundle exec rake jobs:work
638
+ livenessProbe: false
639
+ cloudsql:
640
+ enabled: true
641
+ dbUser: |-
642
+ postgres
643
+ instanceConnectionName: |-
644
+ myproject:europe-west6:instance-name
645
+ proxyCredentials: |-
646
+ $CL_review_app_cloudsqlProxyCredentials
647
+ fullDbName: |-
648
+ $(printf %s "pan-test-app-review-$([ -n "$CI_MERGE_REQUEST_IID" ] && echo "mr$CI_MERGE_REQUEST_IID" || { [ -n "$CI_COMMIT_REF_SLUG" ] && echo "$CI_COMMIT_REF_SLUG" || echo "unknown"; })-app" | sed '1!s/^/ /')
649
+ type: |-
650
+ unmanaged
651
+ jobs:
652
+ db-migrate:
653
+ hook: |-
654
+ post-upgrade
655
+ command: |-
656
+ launcher bundle exec rake db:migrate
657
+ db-prepare-seed:
658
+ hook: |-
659
+ post-install
660
+ command: |-
661
+ launcher bundle exec rake db:prepare db:seed
662
+
663
+ EOF
664
+ - collapseable_section_end "writeallvalues"
665
+ - kubernetesCreateSecret
666
+ - kubernetesDeploy
667
+ - echo 'Uploading SBOM to Dependency Track'
668
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "$ROOT_URL" "__sbom.json" vex.json || true
669
+ - echo deployment successful đŸ˜ģ
670
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
671
+ environment:
672
+ name: review/$CI_COMMIT_REF_NAME/app
673
+ url: $CL_GITLAB_ENVIRONMENT_URL
674
+ on_stop: 'app 🛑 Stop âš ī¸ | review '
675
+ auto_stop_in: 1 week
676
+ artifacts:
677
+ reports:
678
+ dotenv: gitlab_environment.env
679
+ rules:
680
+ - when: on_success
681
+ if: $CI_MERGE_REQUEST_ID
682
+ needs:
683
+ - job: app 👮 lint
684
+ artifacts: false
685
+ - job: 'app 🔨 docker | review '
686
+ artifacts: false
687
+ - job: app đŸ§Ē test
688
+ artifacts: false
689
+ - job: 'app 🧾 sbom | review '
690
+ artifacts: true
691
+ - job: app 🛡 audit
692
+ artifacts: false
693
+ retry: *a1
694
+ interruptible: true
695
+ allow_failure: false
696
+ 'app 🛑 Stop âš ī¸ | review ':
697
+ stage: stop review
698
+ image: path/to/docker/kubernetes:the-version
699
+ variables:
700
+ KUBERNETES_CPU_REQUEST: '0.22'
701
+ KUBERNETES_MEMORY_REQUEST: 200Mi
702
+ KUBERNETES_MEMORY_LIMIT: 400Mi
703
+ GIT_STRATEGY: none
704
+ script:
705
+ - collapseable_section_start "injectvars" "Injecting variables"
706
+ - export ENV_SHORT="review"
707
+ - export APP_DIR=".temp-with-dockerfile"
708
+ - export ENV_TYPE="review"
709
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
710
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
711
+ - 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")"
712
+ - export HOSTNAME="app.$([ -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"
713
+ - export ROOT_URL="https://app.$([ -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"
714
+ - export HOSTNAME_INTERNAL="app.$([ -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"
715
+ - export ROOT_URL_INTERNAL="https://app.$([ -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"
716
+ - export KUBE_NAMESPACE="pan-test-app-review"
717
+ - 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"; })-app"
718
+ - 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"; })-"
719
+ - export SECRET_KEY_BASE="$CL_review_app_SECRET_KEY_BASE"
720
+ - export POSTGRESQL_PASSWORD="$CL_review_app_POSTGRESQL_PASSWORD"
721
+ - export cloudsqlProxyCredentials="$CL_review_app_cloudsqlProxyCredentials"
722
+ - export RAILS_ENV="production"
723
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
724
+ - 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"; })-app"
725
+ - export HELM_EXPERIMENTAL_OCI="1"
726
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
727
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
728
+ - export HELM_ARGS=""
729
+ - export COMPONENT_NAME="app"
730
+ - collapseable_section_end "injectvars"
731
+ - 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"; })-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
732
+ - 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"; })-app" --token="$CL_review_app_KUBE_TOKEN"
733
+ - 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"; })-app" --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"; })-app" --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"; })-app" --namespace="pan-test-app-review"
734
+ - 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"; })-app"
735
+ - kubernetesDelete
736
+ - echo 'Disabling component in Dependency Track'
737
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "$CI_ENVIRONMENT_URL" || true
738
+ environment:
739
+ name: review/$CI_COMMIT_REF_NAME/app
740
+ action: stop
741
+ rules:
742
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
743
+ when: on_success
744
+ - when: manual
745
+ if: $CI_MERGE_REQUEST_ID
746
+ needs: []
747
+ retry: *a1
748
+ interruptible: true
749
+ allow_failure: true
750
+ 'app â†Šī¸ Rollback âš ī¸ | review ':
751
+ stage: rollback review
752
+ image: path/to/docker/kubernetes:the-version
753
+ variables:
754
+ KUBERNETES_CPU_REQUEST: '0.22'
755
+ KUBERNETES_MEMORY_REQUEST: 200Mi
756
+ KUBERNETES_MEMORY_LIMIT: 400Mi
757
+ GIT_STRATEGY: none
758
+ script:
759
+ - collapseable_section_start "injectvars" "Injecting variables"
760
+ - export ENV_SHORT="review"
761
+ - export APP_DIR=".temp-with-dockerfile"
762
+ - export ENV_TYPE="review"
763
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
764
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
765
+ - 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")"
766
+ - export HOSTNAME="app.$([ -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"
767
+ - export ROOT_URL="https://app.$([ -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"
768
+ - export HOSTNAME_INTERNAL="app.$([ -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"
769
+ - export ROOT_URL_INTERNAL="https://app.$([ -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"
770
+ - export KUBE_NAMESPACE="pan-test-app-review"
771
+ - 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"; })-app"
772
+ - 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"; })-"
773
+ - export SECRET_KEY_BASE="$CL_review_app_SECRET_KEY_BASE"
774
+ - export POSTGRESQL_PASSWORD="$CL_review_app_POSTGRESQL_PASSWORD"
775
+ - export cloudsqlProxyCredentials="$CL_review_app_cloudsqlProxyCredentials"
776
+ - export RAILS_ENV="production"
777
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
778
+ - 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"; })-app"
779
+ - export HELM_EXPERIMENTAL_OCI="1"
780
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
781
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
782
+ - export HELM_ARGS=""
783
+ - export COMPONENT_NAME="app"
784
+ - collapseable_section_end "injectvars"
785
+ - 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"; })-app" --server="$CL_review_app_KUBE_URL" --certificate-authority <(echo $CL_review_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
786
+ - 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"; })-app" --token="$CL_review_app_KUBE_TOKEN"
787
+ - 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"; })-app" --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"; })-app" --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"; })-app" --namespace="pan-test-app-review"
788
+ - 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"; })-app"
789
+ - kubernetesRollback
790
+ environment:
791
+ name: review/$CI_COMMIT_REF_NAME/app
792
+ action: access
793
+ rules:
794
+ - when: manual
795
+ if: $CI_MERGE_REQUEST_ID
796
+ needs: []
797
+ retry: *a1
798
+ interruptible: true
799
+ allow_failure: true
800
+ 'app 🔨 docker | stage ':
801
+ stage: build
802
+ image: path/to/docker/docker-build:the-version
803
+ services:
804
+ - name: docker:24.0.6-dind
805
+ command:
806
+ - --tls=false
807
+ - --registry-mirror=https://mirror.gcr.io
808
+ variables:
809
+ DOCKER_HOST: tcp://docker:2375
810
+ DOCKER_TLS_CERTDIR: ''
811
+ DOCKER_DRIVER: overlay2
812
+ DOCKER_BUILDKIT: '1'
813
+ KUBERNETES_CPU_REQUEST: '0.45'
814
+ KUBERNETES_MEMORY_REQUEST: 1Gi
815
+ KUBERNETES_MEMORY_LIMIT: 2Gi
816
+ script:
817
+ - collapseable_section_start "injectvars" "Injecting variables"
818
+ - export APP_DIR=".temp-with-dockerfile"
819
+ - export DOCKER_BUILD_CONTEXT="."
820
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
821
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
822
+ - export DOCKER_IMAGE_NAME="stage/app"
823
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
824
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
825
+ - collapseable_section_end "injectvars"
826
+ - collapseable_section_start "docker-login" "Docker Login"
827
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
828
+ - collapseable_section_end "docker-login"
829
+ - collapseable_section_start "docker-build" "Docker build"
830
+ - 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
831
+ - collapseable_section_end "docker-build"
832
+ - collapseable_section_start "docker-push" "Docker push and tag"
833
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
834
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
835
+ - docker push $DOCKER_CACHE_IMAGE
836
+ - collapseable_section_end "docker-push"
837
+ rules:
838
+ - if: $CI_COMMIT_TAG
839
+ needs: []
840
+ retry: *a1
841
+ interruptible: true
842
+ 'app 🧾 sbom | stage ':
843
+ stage: build
844
+ image:
845
+ name: aquasec/trivy:0.58.2
846
+ entrypoint:
847
+ - ''
848
+ variables: {}
849
+ script:
850
+ - collapseable_section_start "injectvars" "Injecting variables"
851
+ - collapseable_section_end "injectvars"
852
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" .temp-with-dockerfile
853
+ artifacts:
854
+ paths:
855
+ - __sbom.json
856
+ rules:
857
+ - if: $CI_COMMIT_TAG
858
+ needs: []
859
+ retry: *a1
860
+ interruptible: true
861
+ allow_failure: true
862
+ 'app 🚀 Deploy | stage ':
863
+ stage: deploy stage
864
+ image: path/to/docker/kubernetes:the-version
865
+ variables:
866
+ KUBERNETES_CPU_REQUEST: '0.22'
867
+ KUBERNETES_MEMORY_REQUEST: 200Mi
868
+ KUBERNETES_MEMORY_LIMIT: 400Mi
869
+ script:
870
+ - collapseable_section_start "injectvars" "Injecting variables"
871
+ - export ENV_SHORT="stage"
872
+ - export APP_DIR=".temp-with-dockerfile"
873
+ - export ENV_TYPE="stage"
874
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
875
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
876
+ - 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")"
877
+ - export HOSTNAME="app.stage.test-app.pan.panter.cloud"
878
+ - export ROOT_URL="https://app.stage.test-app.pan.panter.cloud"
879
+ - export HOSTNAME_INTERNAL="app.stage.test-app.pan.panter.cloud"
880
+ - export ROOT_URL_INTERNAL="https://app.stage.test-app.pan.panter.cloud"
881
+ - export KUBE_NAMESPACE="pan-test-app-stage"
882
+ - export KUBE_APP_NAME="app"
883
+ - export KUBE_APP_NAME_PREFIX=""
884
+ - export SECRET_KEY_BASE="$CL_stage_app_SECRET_KEY_BASE"
885
+ - export POSTGRESQL_PASSWORD="$CL_stage_app_POSTGRESQL_PASSWORD"
886
+ - export cloudsqlProxyCredentials="$CL_stage_app_cloudsqlProxyCredentials"
887
+ - export RAILS_ENV="production"
888
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
889
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
890
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
891
+ - export DOCKER_IMAGE_NAME="stage/app"
892
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
893
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
894
+ - export RELEASE_NAME="pan-test-app-stage-app"
895
+ - export HELM_EXPERIMENTAL_OCI="1"
896
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
897
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
898
+ - export HELM_ARGS=""
899
+ - export COMPONENT_NAME="app"
900
+ - collapseable_section_end "injectvars"
901
+ - kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
902
+ - kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"
903
+ - kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"
904
+ - kubectl config use-context "kube-pan-test-app-stage-app"
905
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
906
+ - |
907
+ cat > __all_values.yml <<EOF
908
+ env:
909
+ secret:
910
+ SECRET_KEY_BASE: |-
911
+ $(printf %s "$CL_stage_app_SECRET_KEY_BASE" | sed '1!s/^/ /')
912
+ POSTGRESQL_PASSWORD: |-
913
+ $(printf %s "$CL_stage_app_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
914
+ cloudsqlProxyCredentials: |-
915
+ $(printf %s "$CL_stage_app_cloudsqlProxyCredentials" | sed '1!s/^/ /')
916
+ public:
917
+ ENV_SHORT: |-
918
+ stage
919
+ APP_DIR: |-
920
+ .temp-with-dockerfile
921
+ ENV_TYPE: |-
922
+ stage
923
+ BUILD_INFO_BUILD_ID: |-
924
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
925
+ BUILD_INFO_BUILD_TIME: |-
926
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
927
+ BUILD_INFO_CURRENT_VERSION: |-
928
+ $(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/^/ /')
929
+ HOSTNAME: |-
930
+ app.stage.test-app.pan.panter.cloud
931
+ ROOT_URL: |-
932
+ https://app.stage.test-app.pan.panter.cloud
933
+ HOSTNAME_INTERNAL: |-
934
+ app.stage.test-app.pan.panter.cloud
935
+ ROOT_URL_INTERNAL: |-
936
+ https://app.stage.test-app.pan.panter.cloud
937
+ KUBE_NAMESPACE: |-
938
+ pan-test-app-stage
939
+ KUBE_APP_NAME: |-
940
+ app
941
+ KUBE_APP_NAME_PREFIX: ""
942
+ RAILS_ENV: |-
943
+ production
944
+ _ALL_ENV_VAR_KEYS: |-
945
+ ["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","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
946
+ application:
947
+ host: |-
948
+ app.stage.test-app.pan.panter.cloud
949
+ livenessProbe:
950
+ httpGet:
951
+ path: |-
952
+ __health
953
+ readinessProbe:
954
+ httpGet:
955
+ path: |-
956
+ __health
957
+ startupProbe:
958
+ httpGet:
959
+ path: |-
960
+ __health
961
+ worker:
962
+ enabled: true
963
+ command: |-
964
+ launcher bundle exec rake jobs:work
965
+ livenessProbe: false
966
+ cloudsql:
967
+ enabled: true
968
+ dbUser: |-
969
+ postgres
970
+ instanceConnectionName: |-
971
+ myproject:europe-west6:instance-name
972
+ proxyCredentials: |-
973
+ $CL_stage_app_cloudsqlProxyCredentials
974
+ fullDbName: |-
975
+ pan-test-app-stage-app
976
+ type: |-
977
+ unmanaged
978
+ jobs:
979
+ db-migrate:
980
+ hook: |-
981
+ post-install,post-upgrade
982
+ command: |-
983
+ launcher bundle exec rake db:migrate
984
+
985
+ EOF
986
+ - collapseable_section_end "writeallvalues"
987
+ - kubernetesCreateSecret
988
+ - kubernetesDeploy
989
+ - echo 'Uploading SBOM to Dependency Track'
990
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "$ROOT_URL" "__sbom.json" vex.json || true
991
+ - echo deployment successful đŸ˜ģ
992
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
993
+ environment:
994
+ name: stage/app
995
+ url: $CL_GITLAB_ENVIRONMENT_URL
996
+ on_stop: 'app 🛑 Stop âš ī¸ | stage '
997
+ artifacts:
998
+ reports:
999
+ dotenv: gitlab_environment.env
1000
+ rules:
1001
+ - when: on_success
1002
+ if: $CI_COMMIT_TAG
1003
+ needs:
1004
+ - job: 'app 🔨 docker | stage '
1005
+ artifacts: false
1006
+ - job: 'app 🧾 sbom | stage '
1007
+ artifacts: true
1008
+ retry: *a1
1009
+ interruptible: true
1010
+ allow_failure: false
1011
+ 'app 🛑 Stop âš ī¸ | stage ':
1012
+ stage: stop stage
1013
+ image: path/to/docker/kubernetes:the-version
1014
+ variables:
1015
+ KUBERNETES_CPU_REQUEST: '0.22'
1016
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1017
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1018
+ GIT_STRATEGY: none
1019
+ script:
1020
+ - collapseable_section_start "injectvars" "Injecting variables"
1021
+ - export ENV_SHORT="stage"
1022
+ - export APP_DIR=".temp-with-dockerfile"
1023
+ - export ENV_TYPE="stage"
1024
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1025
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1026
+ - 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")"
1027
+ - export HOSTNAME="app.stage.test-app.pan.panter.cloud"
1028
+ - export ROOT_URL="https://app.stage.test-app.pan.panter.cloud"
1029
+ - export HOSTNAME_INTERNAL="app.stage.test-app.pan.panter.cloud"
1030
+ - export ROOT_URL_INTERNAL="https://app.stage.test-app.pan.panter.cloud"
1031
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1032
+ - export KUBE_APP_NAME="app"
1033
+ - export KUBE_APP_NAME_PREFIX=""
1034
+ - export SECRET_KEY_BASE="$CL_stage_app_SECRET_KEY_BASE"
1035
+ - export POSTGRESQL_PASSWORD="$CL_stage_app_POSTGRESQL_PASSWORD"
1036
+ - export cloudsqlProxyCredentials="$CL_stage_app_cloudsqlProxyCredentials"
1037
+ - export RAILS_ENV="production"
1038
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
1039
+ - export RELEASE_NAME="pan-test-app-stage-app"
1040
+ - export HELM_EXPERIMENTAL_OCI="1"
1041
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
1042
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1043
+ - export HELM_ARGS=""
1044
+ - export COMPONENT_NAME="app"
1045
+ - collapseable_section_end "injectvars"
1046
+ - kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
1047
+ - kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"
1048
+ - kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"
1049
+ - kubectl config use-context "kube-pan-test-app-stage-app"
1050
+ - kubernetesDelete
1051
+ - echo 'Disabling component in Dependency Track'
1052
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "$CI_ENVIRONMENT_URL" || true
1053
+ environment:
1054
+ name: stage/app
1055
+ action: stop
1056
+ rules:
1057
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1058
+ when: on_success
1059
+ - when: manual
1060
+ if: $CI_COMMIT_TAG
1061
+ needs: []
1062
+ retry: *a1
1063
+ interruptible: true
1064
+ allow_failure: true
1065
+ 'app â†Šī¸ Rollback âš ī¸ | stage ':
1066
+ stage: rollback stage
1067
+ image: path/to/docker/kubernetes:the-version
1068
+ variables:
1069
+ KUBERNETES_CPU_REQUEST: '0.22'
1070
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1071
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1072
+ GIT_STRATEGY: none
1073
+ script:
1074
+ - collapseable_section_start "injectvars" "Injecting variables"
1075
+ - export ENV_SHORT="stage"
1076
+ - export APP_DIR=".temp-with-dockerfile"
1077
+ - export ENV_TYPE="stage"
1078
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1079
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1080
+ - export BUILD_INFO_CURRENT_VERSION="$(tag=$(git ls-remote origin "refs/tags/v*[0-9]" 2>/dev/null | cut -f 2- | sort -V | tail -1 | sed 's/refs\\/tags\\/v//'); [ -z "$tag" ] && echo "0.0.0" || echo "$tag")"
1081
+ - export HOSTNAME="app.stage.test-app.pan.panter.cloud"
1082
+ - export ROOT_URL="https://app.stage.test-app.pan.panter.cloud"
1083
+ - export HOSTNAME_INTERNAL="app.stage.test-app.pan.panter.cloud"
1084
+ - export ROOT_URL_INTERNAL="https://app.stage.test-app.pan.panter.cloud"
1085
+ - export KUBE_NAMESPACE="pan-test-app-stage"
1086
+ - export KUBE_APP_NAME="app"
1087
+ - export KUBE_APP_NAME_PREFIX=""
1088
+ - export SECRET_KEY_BASE="$CL_stage_app_SECRET_KEY_BASE"
1089
+ - export POSTGRESQL_PASSWORD="$CL_stage_app_POSTGRESQL_PASSWORD"
1090
+ - export cloudsqlProxyCredentials="$CL_stage_app_cloudsqlProxyCredentials"
1091
+ - export RAILS_ENV="production"
1092
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
1093
+ - export RELEASE_NAME="pan-test-app-stage-app"
1094
+ - export HELM_EXPERIMENTAL_OCI="1"
1095
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
1096
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1097
+ - export HELM_ARGS=""
1098
+ - export COMPONENT_NAME="app"
1099
+ - collapseable_section_end "injectvars"
1100
+ - kubectl config set-cluster "kube-pan-test-app-stage-app" --server="$CL_stage_app_KUBE_URL" --certificate-authority <(echo $CL_stage_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
1101
+ - kubectl config set-credentials "kube-pan-test-app-stage-app" --token="$CL_stage_app_KUBE_TOKEN"
1102
+ - kubectl config set-context "kube-pan-test-app-stage-app" --cluster="kube-pan-test-app-stage-app" --user="kube-pan-test-app-stage-app" --namespace="pan-test-app-stage"
1103
+ - kubectl config use-context "kube-pan-test-app-stage-app"
1104
+ - kubernetesRollback
1105
+ environment:
1106
+ name: stage/app
1107
+ action: access
1108
+ rules:
1109
+ - when: manual
1110
+ if: $CI_COMMIT_TAG
1111
+ needs: []
1112
+ retry: *a1
1113
+ interruptible: true
1114
+ allow_failure: true
1115
+ 'app 🔨 docker | prod ':
1116
+ stage: build
1117
+ image: path/to/docker/docker-build:the-version
1118
+ services:
1119
+ - name: docker:24.0.6-dind
1120
+ command:
1121
+ - --tls=false
1122
+ - --registry-mirror=https://mirror.gcr.io
1123
+ variables:
1124
+ DOCKER_HOST: tcp://docker:2375
1125
+ DOCKER_TLS_CERTDIR: ''
1126
+ DOCKER_DRIVER: overlay2
1127
+ DOCKER_BUILDKIT: '1'
1128
+ KUBERNETES_CPU_REQUEST: '0.45'
1129
+ KUBERNETES_MEMORY_REQUEST: 1Gi
1130
+ KUBERNETES_MEMORY_LIMIT: 2Gi
1131
+ script:
1132
+ - collapseable_section_start "injectvars" "Injecting variables"
1133
+ - export APP_DIR=".temp-with-dockerfile"
1134
+ - export DOCKER_BUILD_CONTEXT="."
1135
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1136
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
1137
+ - export DOCKER_IMAGE_NAME="prod/app"
1138
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1139
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1140
+ - collapseable_section_end "injectvars"
1141
+ - collapseable_section_start "docker-login" "Docker Login"
1142
+ - docker login --username gitlab-ci-token --password $CI_JOB_TOKEN $CI_REGISTRY
1143
+ - collapseable_section_end "docker-login"
1144
+ - collapseable_section_start "docker-build" "Docker build"
1145
+ - 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
1146
+ - collapseable_section_end "docker-build"
1147
+ - collapseable_section_start "docker-push" "Docker push and tag"
1148
+ - docker push $DOCKER_IMAGE:$DOCKER_IMAGE_TAG
1149
+ - docker tag $DOCKER_IMAGE:$DOCKER_IMAGE_TAG $DOCKER_CACHE_IMAGE
1150
+ - docker push $DOCKER_CACHE_IMAGE
1151
+ - collapseable_section_end "docker-push"
1152
+ rules:
1153
+ - if: $CI_COMMIT_TAG
1154
+ needs: []
1155
+ retry: *a1
1156
+ interruptible: true
1157
+ 'app 🧾 sbom | prod ':
1158
+ stage: build
1159
+ image:
1160
+ name: aquasec/trivy:0.58.2
1161
+ entrypoint:
1162
+ - ''
1163
+ variables: {}
1164
+ script:
1165
+ - collapseable_section_start "injectvars" "Injecting variables"
1166
+ - collapseable_section_end "injectvars"
1167
+ - trivy fs --quiet --format cyclonedx --output "__sbom.json" .temp-with-dockerfile
1168
+ artifacts:
1169
+ paths:
1170
+ - __sbom.json
1171
+ rules:
1172
+ - if: $CI_COMMIT_TAG
1173
+ needs: []
1174
+ retry: *a1
1175
+ interruptible: true
1176
+ allow_failure: true
1177
+ 'app 🚀 Deploy | prod ':
1178
+ stage: deploy prod
1179
+ image: path/to/docker/kubernetes:the-version
1180
+ variables:
1181
+ KUBERNETES_CPU_REQUEST: '0.22'
1182
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1183
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1184
+ script:
1185
+ - collapseable_section_start "injectvars" "Injecting variables"
1186
+ - export ENV_SHORT="prod"
1187
+ - export APP_DIR=".temp-with-dockerfile"
1188
+ - export ENV_TYPE="prod"
1189
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1190
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1191
+ - 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")"
1192
+ - export HOSTNAME="my-fancy-website.com"
1193
+ - export ROOT_URL="https://my-fancy-website.com"
1194
+ - export HOSTNAME_INTERNAL="app.prod.test-app.pan.panter.cloud"
1195
+ - export ROOT_URL_INTERNAL="https://app.prod.test-app.pan.panter.cloud"
1196
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1197
+ - export KUBE_APP_NAME="app"
1198
+ - export KUBE_APP_NAME_PREFIX=""
1199
+ - export SECRET_KEY_BASE="$CL_prod_app_SECRET_KEY_BASE"
1200
+ - export POSTGRESQL_PASSWORD="$CL_prod_app_POSTGRESQL_PASSWORD"
1201
+ - export cloudsqlProxyCredentials="$CL_prod_app_cloudsqlProxyCredentials"
1202
+ - export RAILS_ENV="production"
1203
+ - export _ALL_ENV_VAR_KEYS="[\\"ENV_SHORT\\",\\"APP_DIR\\",\\"ENV_TYPE\\",\\"BUILD_INFO_BUILD_ID\\",\\"BUILD_INFO_BUILD_TIME\\",\\"BUILD_INFO_CURRENT_VERSION\\",\\"HOSTNAME\\",\\"ROOT_URL\\",\\"HOSTNAME_INTERNAL\\",\\"ROOT_URL_INTERNAL\\",\\"KUBE_NAMESPACE\\",\\"KUBE_APP_NAME\\",\\"KUBE_APP_NAME_PREFIX\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
1204
+ - export DOCKER_REGISTRY="$CI_REGISTRY"
1205
+ - export DOCKER_CACHE_IMAGE="$CI_REGISTRY_IMAGE/caches/app"
1206
+ - export DOCKER_IMAGE_NAME="prod/app"
1207
+ - export DOCKER_IMAGE="$CI_REGISTRY_IMAGE/$DOCKER_IMAGE_NAME"
1208
+ - export DOCKER_IMAGE_TAG="$CI_COMMIT_SHA"
1209
+ - export RELEASE_NAME="pan-test-app-prod-app"
1210
+ - export HELM_EXPERIMENTAL_OCI="1"
1211
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
1212
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1213
+ - export HELM_ARGS=""
1214
+ - export COMPONENT_NAME="app"
1215
+ - collapseable_section_end "injectvars"
1216
+ - kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
1217
+ - kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"
1218
+ - kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"
1219
+ - kubectl config use-context "kube-pan-test-app-prod-app"
1220
+ - collapseable_section_start "writeallvalues" "Write __all_values.yml for helm deployment"
1221
+ - |
1222
+ cat > __all_values.yml <<EOF
1223
+ env:
1224
+ secret:
1225
+ SECRET_KEY_BASE: |-
1226
+ $(printf %s "$CL_prod_app_SECRET_KEY_BASE" | sed '1!s/^/ /')
1227
+ POSTGRESQL_PASSWORD: |-
1228
+ $(printf %s "$CL_prod_app_POSTGRESQL_PASSWORD" | sed '1!s/^/ /')
1229
+ cloudsqlProxyCredentials: |-
1230
+ $(printf %s "$CL_prod_app_cloudsqlProxyCredentials" | sed '1!s/^/ /')
1231
+ public:
1232
+ ENV_SHORT: |-
1233
+ prod
1234
+ APP_DIR: |-
1235
+ .temp-with-dockerfile
1236
+ ENV_TYPE: |-
1237
+ prod
1238
+ BUILD_INFO_BUILD_ID: |-
1239
+ $(printf %s "$(git describe --tags 2>/dev/null || git rev-parse HEAD)" | sed '1!s/^/ /')
1240
+ BUILD_INFO_BUILD_TIME: |-
1241
+ $(printf %s "$CI_JOB_STARTED_AT" | sed '1!s/^/ /')
1242
+ BUILD_INFO_CURRENT_VERSION: |-
1243
+ $(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/^/ /')
1244
+ HOSTNAME: |-
1245
+ my-fancy-website.com
1246
+ ROOT_URL: |-
1247
+ https://my-fancy-website.com
1248
+ HOSTNAME_INTERNAL: |-
1249
+ app.prod.test-app.pan.panter.cloud
1250
+ ROOT_URL_INTERNAL: |-
1251
+ https://app.prod.test-app.pan.panter.cloud
1252
+ KUBE_NAMESPACE: |-
1253
+ pan-test-app-prod
1254
+ KUBE_APP_NAME: |-
1255
+ app
1256
+ KUBE_APP_NAME_PREFIX: ""
1257
+ RAILS_ENV: |-
1258
+ production
1259
+ _ALL_ENV_VAR_KEYS: |-
1260
+ ["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","SECRET_KEY_BASE","POSTGRESQL_PASSWORD","cloudsqlProxyCredentials","RAILS_ENV"]
1261
+ application:
1262
+ host: |-
1263
+ my-fancy-website.com
1264
+ livenessProbe:
1265
+ httpGet:
1266
+ path: |-
1267
+ __health
1268
+ readinessProbe:
1269
+ httpGet:
1270
+ path: |-
1271
+ __health
1272
+ startupProbe:
1273
+ httpGet:
1274
+ path: |-
1275
+ __health
1276
+ worker:
1277
+ enabled: true
1278
+ command: |-
1279
+ launcher bundle exec rake jobs:work
1280
+ livenessProbe: false
1281
+ cloudsql:
1282
+ enabled: true
1283
+ dbUser: |-
1284
+ postgres
1285
+ instanceConnectionName: |-
1286
+ myproject:europe-west6:instance-name
1287
+ proxyCredentials: |-
1288
+ $CL_prod_app_cloudsqlProxyCredentials
1289
+ fullDbName: |-
1290
+ pan-test-app-prod-app
1291
+ type: |-
1292
+ unmanaged
1293
+ jobs:
1294
+ db-migrate:
1295
+ hook: |-
1296
+ post-install,post-upgrade
1297
+ command: |-
1298
+ launcher bundle exec rake db:migrate
1299
+
1300
+ EOF
1301
+ - collapseable_section_end "writeallvalues"
1302
+ - kubernetesCreateSecret
1303
+ - kubernetesDeploy
1304
+ - echo 'Uploading SBOM to Dependency Track'
1305
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" upload "pan-test-app/app" "$ROOT_URL" "__sbom.json" vex.json || true
1306
+ - echo deployment successful đŸ˜ģ
1307
+ - echo "CL_GITLAB_ENVIRONMENT_URL=$ROOT_URL" >> gitlab_environment.env
1308
+ environment:
1309
+ name: prod/app
1310
+ url: $CL_GITLAB_ENVIRONMENT_URL
1311
+ on_stop: 'app 🛑 Stop âš ī¸ | prod '
1312
+ artifacts:
1313
+ reports:
1314
+ dotenv: gitlab_environment.env
1315
+ rules:
1316
+ - when: manual
1317
+ if: $CI_COMMIT_TAG
1318
+ needs:
1319
+ - job: 'app 🔨 docker | prod '
1320
+ artifacts: false
1321
+ - job: 'app 🧾 sbom | prod '
1322
+ artifacts: true
1323
+ retry: *a1
1324
+ interruptible: true
1325
+ allow_failure: true
1326
+ 'app 🛑 Stop âš ī¸ | prod ':
1327
+ stage: stop prod
1328
+ image: path/to/docker/kubernetes:the-version
1329
+ variables:
1330
+ KUBERNETES_CPU_REQUEST: '0.22'
1331
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1332
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1333
+ GIT_STRATEGY: none
1334
+ script:
1335
+ - collapseable_section_start "injectvars" "Injecting variables"
1336
+ - export ENV_SHORT="prod"
1337
+ - export APP_DIR=".temp-with-dockerfile"
1338
+ - export ENV_TYPE="prod"
1339
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1340
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1341
+ - 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")"
1342
+ - export HOSTNAME="my-fancy-website.com"
1343
+ - export ROOT_URL="https://my-fancy-website.com"
1344
+ - export HOSTNAME_INTERNAL="app.prod.test-app.pan.panter.cloud"
1345
+ - export ROOT_URL_INTERNAL="https://app.prod.test-app.pan.panter.cloud"
1346
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1347
+ - export KUBE_APP_NAME="app"
1348
+ - export KUBE_APP_NAME_PREFIX=""
1349
+ - export SECRET_KEY_BASE="$CL_prod_app_SECRET_KEY_BASE"
1350
+ - export POSTGRESQL_PASSWORD="$CL_prod_app_POSTGRESQL_PASSWORD"
1351
+ - export cloudsqlProxyCredentials="$CL_prod_app_cloudsqlProxyCredentials"
1352
+ - export RAILS_ENV="production"
1353
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
1354
+ - export RELEASE_NAME="pan-test-app-prod-app"
1355
+ - export HELM_EXPERIMENTAL_OCI="1"
1356
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
1357
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1358
+ - export HELM_ARGS=""
1359
+ - export COMPONENT_NAME="app"
1360
+ - collapseable_section_end "injectvars"
1361
+ - kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
1362
+ - kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"
1363
+ - kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"
1364
+ - kubectl config use-context "kube-pan-test-app-prod-app"
1365
+ - kubernetesDelete
1366
+ - echo 'Disabling component in Dependency Track'
1367
+ - /dtrackuploader https://dep.panter.swiss/ "$DT_KEY_PROD" disable "pan-test-app/app" "$CI_ENVIRONMENT_URL" || true
1368
+ environment:
1369
+ name: prod/app
1370
+ action: stop
1371
+ rules:
1372
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+\\.([0-9]+|x)\\.x$/
1373
+ when: on_success
1374
+ - when: manual
1375
+ if: $CI_COMMIT_TAG
1376
+ needs: []
1377
+ retry: *a1
1378
+ interruptible: true
1379
+ allow_failure: true
1380
+ 'app â†Šī¸ Rollback âš ī¸ | prod ':
1381
+ stage: rollback prod
1382
+ image: path/to/docker/kubernetes:the-version
1383
+ variables:
1384
+ KUBERNETES_CPU_REQUEST: '0.22'
1385
+ KUBERNETES_MEMORY_REQUEST: 200Mi
1386
+ KUBERNETES_MEMORY_LIMIT: 400Mi
1387
+ GIT_STRATEGY: none
1388
+ script:
1389
+ - collapseable_section_start "injectvars" "Injecting variables"
1390
+ - export ENV_SHORT="prod"
1391
+ - export APP_DIR=".temp-with-dockerfile"
1392
+ - export ENV_TYPE="prod"
1393
+ - export BUILD_INFO_BUILD_ID="$(git describe --tags 2>/dev/null || git rev-parse HEAD)"
1394
+ - export BUILD_INFO_BUILD_TIME="$CI_JOB_STARTED_AT"
1395
+ - 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")"
1396
+ - export HOSTNAME="my-fancy-website.com"
1397
+ - export ROOT_URL="https://my-fancy-website.com"
1398
+ - export HOSTNAME_INTERNAL="app.prod.test-app.pan.panter.cloud"
1399
+ - export ROOT_URL_INTERNAL="https://app.prod.test-app.pan.panter.cloud"
1400
+ - export KUBE_NAMESPACE="pan-test-app-prod"
1401
+ - export KUBE_APP_NAME="app"
1402
+ - export KUBE_APP_NAME_PREFIX=""
1403
+ - export SECRET_KEY_BASE="$CL_prod_app_SECRET_KEY_BASE"
1404
+ - export POSTGRESQL_PASSWORD="$CL_prod_app_POSTGRESQL_PASSWORD"
1405
+ - export cloudsqlProxyCredentials="$CL_prod_app_cloudsqlProxyCredentials"
1406
+ - export RAILS_ENV="production"
1407
+ - 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\\",\\"SECRET_KEY_BASE\\",\\"POSTGRESQL_PASSWORD\\",\\"cloudsqlProxyCredentials\\",\\"RAILS_ENV\\"]"
1408
+ - export RELEASE_NAME="pan-test-app-prod-app"
1409
+ - export HELM_EXPERIMENTAL_OCI="1"
1410
+ - export KUBE_DOCKER_IMAGE_PULL_SECRET="gitlab-registry-app"
1411
+ - export HELM_GITLAB_CHART_NAME="/helm-charts/the-panter-chart"
1412
+ - export HELM_ARGS=""
1413
+ - export COMPONENT_NAME="app"
1414
+ - collapseable_section_end "injectvars"
1415
+ - kubectl config set-cluster "kube-pan-test-app-prod-app" --server="$CL_prod_app_KUBE_URL" --certificate-authority <(echo $CL_prod_app_KUBE_CA_PEM | base64 -d) --embed-certs=true
1416
+ - kubectl config set-credentials "kube-pan-test-app-prod-app" --token="$CL_prod_app_KUBE_TOKEN"
1417
+ - kubectl config set-context "kube-pan-test-app-prod-app" --cluster="kube-pan-test-app-prod-app" --user="kube-pan-test-app-prod-app" --namespace="pan-test-app-prod"
1418
+ - kubectl config use-context "kube-pan-test-app-prod-app"
1419
+ - kubernetesRollback
1420
+ environment:
1421
+ name: prod/app
1422
+ action: access
1423
+ rules:
1424
+ - when: manual
1425
+ if: $CI_COMMIT_TAG
1426
+ needs: []
1427
+ retry: *a1
1428
+ interruptible: true
1429
+ allow_failure: true
1430
+ create release:
1431
+ stage: release
1432
+ image: path/to/docker/semantic-release:the-version
1433
+ script:
1434
+ - semanticRelease
1435
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1436
+ rules:
1437
+ - &a3
1438
+ if: $CI_COMMIT_MESSAGE =~ /^chore\\(release\\).*/
1439
+ when: never
1440
+ - &a4
1441
+ if: $CI_PIPELINE_SOURCE == "schedule"
1442
+ when: never
1443
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH && $AUTO_RELEASE == "true"
1444
+ when: on_success
1445
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1446
+ when: manual
1447
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1448
+ when: manual
1449
+ âš ī¸ force create release:
1450
+ stage: release
1451
+ image: path/to/docker/semantic-release:the-version
1452
+ script:
1453
+ - semanticRelease
1454
+ - echo '👉 The project access token might be invald - run \`project-renew-token\` in catladder CLI to fix.'
1455
+ rules:
1456
+ - *a3
1457
+ - *a4
1458
+ - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
1459
+ when: manual
1460
+ - if: $CI_COMMIT_BRANCH =~ /^[0-9]+.([0-9]+|x).x$/
1461
+ when: manual
1462
+ needs: []
1463
+ "
1464
+ `;