From f385d22b56cc2491dbe2b688d6f95f47afa9f6da Mon Sep 17 00:00:00 2001 From: Markus Pesch Date: Fri, 4 Sep 2026 12:16:54 +0200 Subject: [PATCH] feat(deployment)!: move `replicaCount` to `deployment.replicas` The top-level `replicaCount` value only ever set the replica count of the Gitea Deployment, but was declared next to chart-wide settings. Moving it into the `deployment` dict completes the consolidation already done for `affinity`, `dnsConfig`, `nodeSelector`, `priorityClassName`, `resources`, `schedulerName`, `strategy`, `tolerations` and `topologySpreadConstraints`. The key was renamed from `replicaCount` to `replicas` at the same time. Every other key inside the `deployment` dict mirrors the name of the corresponding Kubernetes field, so `deployment.replicas` maps one to one onto `spec.replicas` and removes the need to remember a chart-specific alias. A deprecation check fails the release when the removed top-level value is still set. Silently ignoring it would be severe here: the release would scale back down to a single replica without any warning, and the HA guards in the PVC and config templates, which key off the replica count, would no longer apply. BREAKING CHANGE: `replicaCount` no longer exists. Use `deployment.replicas` instead. Installations that still set `replicaCount` will fail unless `checkDeprecation` is set to `false`. Co-authored-by: Copilot --- README.md | 2 +- docs/ha-setup.md | 4 ++-- templates/gitea/deployment.yaml | 2 +- templates/gitea/deprecation.yaml | 5 +++++ templates/gitea/persistentVolumeClaim.yaml | 2 +- templates/gitea/secret_config.yaml | 2 +- unittests/helm/deployment/HA.yaml | 12 ++++++++---- unittests/helm/deployment/deprecations.yaml | 7 +++++++ values.yaml | 6 +++--- 9 files changed, 29 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 76a87c4..e5338c3 100644 --- a/README.md +++ b/README.md @@ -1007,6 +1007,7 @@ To comply with the Gitea helm chart definition of the digest parameter, a "custo | `deployment.gitea.resources` | Compute Resources required by Gitea container. Cannot be updated. | `nil` | | `deployment.nodeSelector` | NodeSelector for the deployment | `{}` | | `deployment.priorityClassName` | priorityClassName for the deployment | `""` | +| `deployment.replicas` | Number of replicas for the Gitea deployment. | `1` | | `deployment.resources` | Resources is the total amount of CPU and Memory resources required by all containers in the pod. | `{}` | | `deployment.schedulerName` | Use an alternate scheduler, e.g. "stork" | `""` | | `deployment.strategy.type` | Deployment strategy used to replace old pods, either `RollingUpdate` or `Recreate`. | `RollingUpdate` | @@ -1058,7 +1059,6 @@ To comply with the Gitea helm chart definition of the digest parameter, a "custo | `ingress.hosts[0].paths[0].path` | Default Ingress path | `/` | | `ingress.tls` | Ingress tls settings | `[]` | | `namespace` | An explicit namespace to deploy Gitea into. Defaults to the release namespace if not specified | `""` | -| `replicaCount` | number of replicas for the deployment | `1` | ### Network diff --git a/docs/ha-setup.md b/docs/ha-setup.md index 99b87e6..fec1b08 100644 --- a/docs/ha-setup.md +++ b/docs/ha-setup.md @@ -14,7 +14,7 @@ They might cost a bit more than using a self-hosted k8s variant but are usually Also they can be centrally managed and are not linked to the Gitea helm chart or namespace. Please consider using external services before you start with your Gitea HA setup, it will make your life (and the life of the Gitea maintainers) easier. -This helm chart tries to help as much as possible to simplify and assert the provisioning of a HA-ready Gitea instance by implementing smart conditionals if `replicaCount` is set to a value > 1. +This helm chart tries to help as much as possible to simplify and assert the provisioning of a HA-ready Gitea instance by implementing smart conditionals if `deployment.replicas` is set to a value > 1. Nevertheless, we cannot guarantee for every possible combination of Gitea settings to work together perfectly in a HA setup. As a general advice, we recommend to have a test environment aside on which to test possible changes/upgrades before applying these to a production installation. @@ -175,4 +175,4 @@ gitea: - Currently Cron jobs are run on all replicas as no leader election is implemented. See [https://github.com/go-gitea/gitea/issues/13791](https://github.com/go-gitea/gitea/issues/13791) for a discussion and possible solution. -- Running with multiple replicas slows down Gitea a bit, i.e. page loading time increases. \ No newline at end of file +- Running with multiple replicas slows down Gitea a bit, i.e. page loading time increases. \ No newline at end of file diff --git a/templates/gitea/deployment.yaml b/templates/gitea/deployment.yaml index 9d4b576..b7e9d84 100644 --- a/templates/gitea/deployment.yaml +++ b/templates/gitea/deployment.yaml @@ -14,7 +14,7 @@ metadata: {{- toYaml .Values.deployment.labels | nindent 4 }} {{- end }} spec: - replicas: {{ .Values.replicaCount }} + replicas: {{ .Values.deployment.replicas }} strategy: type: {{ .Values.deployment.strategy.type }} {{- if eq .Values.deployment.strategy.type "RollingUpdate" }} diff --git a/templates/gitea/deprecation.yaml b/templates/gitea/deprecation.yaml index c79152c..d725556 100644 --- a/templates/gitea/deprecation.yaml +++ b/templates/gitea/deprecation.yaml @@ -70,6 +70,11 @@ {{- fail "`resources` does no longer exist. Please refer to the changelog and configure `deployment.gitea.resources` instead." -}} {{- end -}} + {{/* REPLICA COUNT */}} + {{- if .Values.replicaCount -}} + {{- fail "`replicaCount` does no longer exist. Please refer to the changelog and configure `deployment.replicas` instead." -}} + {{- end -}} + {{/* SCHEDULER NAME */}} {{- if .Values.schedulerName -}} {{- fail "`schedulerName` does no longer exist. Please refer to the changelog and configure `deployment.schedulerName` instead." -}} diff --git a/templates/gitea/persistentVolumeClaim.yaml b/templates/gitea/persistentVolumeClaim.yaml index 036e3a3..c13cb3e 100644 --- a/templates/gitea/persistentVolumeClaim.yaml +++ b/templates/gitea/persistentVolumeClaim.yaml @@ -10,7 +10,7 @@ metadata: {{ .Values.persistence.labels | toYaml | indent 4}} spec: accessModes: - {{- if gt (.Values.replicaCount | int) 1 }} + {{- if gt (.Values.deployment.replicas | int) 1 }} - ReadWriteMany {{- else }} {{- .Values.persistence.accessModes | toYaml | nindent 4 }} diff --git a/templates/gitea/secret_config.yaml b/templates/gitea/secret_config.yaml index 4fd6279..c518f1b 100644 --- a/templates/gitea/secret_config.yaml +++ b/templates/gitea/secret_config.yaml @@ -28,7 +28,7 @@ stringData: {{- end }} {{- /* multiple replicas assertions */ -}} - {{- if gt (.Values.replicaCount | int) 1 -}} + {{- if gt (.Values.deployment.replicas | int) 1 -}} {{- if .Values.gitea.config.cron -}} {{- if .Values.gitea.config.cron.GIT_GC_REPOS -}} {{- if eq .Values.gitea.config.cron.GIT_GC_REPOS.ENABLED true -}} diff --git a/unittests/helm/deployment/HA.yaml b/unittests/helm/deployment/HA.yaml index eed4f73..0ade7a5 100644 --- a/unittests/helm/deployment/HA.yaml +++ b/unittests/helm/deployment/HA.yaml @@ -14,7 +14,8 @@ tests: - it: fails with multiple replicas and "GIT_GC_REPOS" enabled template: templates/gitea/secret_config.yaml set: - replicaCount: 2 + deployment: + replicas: 2 persistence: accessModes: - ReadWriteMany @@ -29,14 +30,16 @@ tests: - it: fails with multiple replicas and RWX file system not set template: templates/gitea/secret_config.yaml set: - replicaCount: 2 + deployment: + replicas: 2 asserts: - failedTemplate: errorMessage: "When using multiple replicas, a RWX file system is required and persistence.accessModes[0] must be set to ReadWriteMany." - it: fails with multiple replicas and bleve issue indexer template: templates/gitea/secret_config.yaml set: - replicaCount: 2 + deployment: + replicas: 2 persistence: accessModes: - ReadWriteMany @@ -50,7 +53,8 @@ tests: - it: fails with multiple replicas and bleve repo indexer template: templates/gitea/secret_config.yaml set: - replicaCount: 2 + deployment: + replicas: 2 persistence: accessModes: - ReadWriteMany diff --git a/unittests/helm/deployment/deprecations.yaml b/unittests/helm/deployment/deprecations.yaml index c39df63..d993f05 100644 --- a/unittests/helm/deployment/deprecations.yaml +++ b/unittests/helm/deployment/deprecations.yaml @@ -60,6 +60,12 @@ tests: asserts: - failedTemplate: errorMessage: "`resources` does no longer exist. Please refer to the changelog and configure `deployment.gitea.resources` instead." + - it: fails when the removed `replicaCount` value is set + set: + replicaCount: 2 + asserts: + - failedTemplate: + errorMessage: "`replicaCount` does no longer exist. Please refer to the changelog and configure `deployment.replicas` instead." - it: fails when the removed `schedulerName` value is set set: schedulerName: stork @@ -104,6 +110,7 @@ tests: nodeSelector: foo: bar priorityClassName: high-priority + replicaCount: 2 resources: limits: cpu: 100m diff --git a/values.yaml b/values.yaml index af9a9fb..43df9fe 100644 --- a/values.yaml +++ b/values.yaml @@ -90,6 +90,9 @@ deployment: ## @param deployment.priorityClassName priorityClassName for the deployment priorityClassName: "" + ## @param deployment.replicas Number of replicas for the Gitea deployment. + replicas: 1 + ## @param deployment.resources Resources is the total amount of CPU and Memory resources required by all containers in the pod. ## @skip deployment.resources.limits Limits describes the maximum amount of compute resources allowed. ## @skip deployment.resources.requests Requests describes the minimum amount of compute resources required. @@ -245,9 +248,6 @@ ingress: ## @param namespace An explicit namespace to deploy gitea into. Defaults to the release namespace if not specified namespace: "" -## @param replicaCount number of replicas for the deployment -replicaCount: 1 - ## @section Network ## @param clusterDomain Domain of the Cluster. Domain is part of internally issued certificates. clusterDomain: cluster.local