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