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