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

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