In diesem Tutorial zeige ich, wie man beim GOP neue Stages in dem Helm Chart Beispiel der Petclinic hinzufügt. Was der GOP ist und wie man ihn benutzt, kann man auf der GOP Seite nachlesen
TL;DR
- Im Repo de Petclinic:
- neue values-<stage>.yaml im Ordner k8s anlegen.
- Im Jenkinsfile neue Stage hinzufügen
- Im Repo Argocd unter /projects/example-apps.yml
- neue destination und
- neuen Namespace hinzufügen
- Im Repo example-apps unter /argocd eine Application in der petclinic-helm.yaml hinzufügen
Der GOP läßt einfach per Shell Script aus der Dokumentation lokal ausführen.
bash <(curl -s \
https://raw.githubusercontent.com/cloudogu/gitops-playground/main/scripts/init-cluster.sh) \
&& docker run --rm -t --pull=always -u $(id -u) \
-v ~/.config/k3d/kubeconfig-gitops-playground.yaml:/home/.kube/config \
--net=host \
ghcr.io/cloudogu/gitops-playground --yes --argocd --ingress-nginx --base-url=http://localhost
Dann wird als Beispiel Applikation die Petclinic von Spring ausgerollt. Einmal als Beispiel mit Helm Chart und einmal als Beispiel mit Kubernetes Manifesten. Das ganze jeweils in 2 Stages, „Production“ und „Staging“.
Step by Step
petclinic-helm anpassen
Im Repository für die petclinic-helm als erstes eine neue Datei für eine neue Stage hinzufügen. In dieser Ordnerstruktur

die values-staging.yaml als Vorlage nehmen und bspw. eine values-qs-yaml anlegen.
Den Inhalt anpassen
service:
port: 80
ingress:
hosts:
- host: qs.petclinic-helm.petclinic.localhost
paths: ['/']
Neuen host- Namen wählen, den wird dann Kubernetes für uns erstellen.
Als nächstes in diesem Repository das Jenkinsfile anpassen.
In der Stage „Deploy“ wird eine Konfiguration für den gitOps Prozess erstellt, die gitopsConfig Variable Dort wird im Bereich Stages die neue Stage hinzugefügt.
Vorher
stages: [
staging: [
namespace: 'example-apps-staging',
deployDirectly: true ],
production: [
namespace: 'example-apps-production',
deployDirectly: false ]
]
Nachher
stages: [
staging: [
namespace: 'example-apps-staging',
deployDirectly: true ],
qs: [
namespace: 'example-apps-qs',
deployDirectly: true ],
production: [
namespace: 'example-apps-production',
deployDirectly: false ]
]
Damit wird der Jenkins beim Bauen alles weitere für das Deployment erstellen.
ArgoCD konfigurieren
Damit die Anwendung auch automatisch per GitOps deployt wird, muss nur noch ArgoCD angepasst werden.
Zum einen benötigen ArgoCD ein neues Ziel zum deployen, denn die neue Stage soll in einem eigenen -neu erstelltem – Namespace laufen und zum anderen benötigt ArgoCD für die neue Stage eine neue Application.
Schritt 1, neues Ziel hinzufügen
Im Repository argocd unter argocd/projects die vorhandene example-apps.yaml anpassen. Dort ist die Petclinic konfiguriert für ArgoCD.

Den Bereich destinations erweitern
Vorher
destinations:
- namespace: example-apps-production
server: https://kubernetes.default.svc
- namespace: example-apps-staging
server: https://kubernetes.default.svc
Nachher
destinations:
- namespace: example-apps-production
server: https://kubernetes.default.svc
- namespace: example-apps-staging
server: https://kubernetes.default.svc
- namespace: example-apps-qs
server: https://kubernetes.default.svc
Und in der gleichen Datei die SourceNamespaces erweitern.
sourceNamespaces:
- 'example-apps-staging'
- 'example-apps-production'
- 'example-apps-qs'
Nun im Repository der example-apps noch die neue Application für die neue Stage für ArgoCD hinzufügen.

Die Source Datei ist unter /argocd und dort die petclinic-helm.yaml
Dort sind bereits 2 Application vorhanden für die beiden vorhandenen Stages „Production“ und „Staging“.
Vorher
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: petclinic-helm
namespace: example-apps-staging
spec:
destination:
namespace: example-apps-staging
server: https://kubernetes.default.svc
project: example-apps
source:
path: apps/spring-petclinic-helm/staging
repoURL: http://scmm-scm-manager.default.svc.cluster.local/scm/repo/argocd/example-apps
targetRevision: main
directory:
recurse: true
syncPolicy:
automated:
prune: true
selfHeal: true
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: petclinic-helm
namespace: example-apps-production
spec:
destination:
namespace: example-apps-production
server: https://kubernetes.default.svc
project: example-apps
source:
path: apps/spring-petclinic-helm/production
repoURL: http://scmm-scm-manager.default.svc.cluster.local/scm/repo/argocd/example-apps
targetRevision: main
directory:
recurse: true
syncPolicy:
automated:
prune: true
selfHeal: true
Einfach die neue Stage darunter einfügen per Copy&Paste und leichten Anpassungen.
---
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: petclinic-helm
namespace: example-apps-qs
spec:
destination:
namespace: example-apps-qs
server: https://kubernetes.default.svc
project: example-apps
source:
path: apps/spring-petclinic-helm/qs
repoURL: http://scmm-scm-manager.default.svc.cluster.local/scm/repo/argocd/example-apps
targetRevision: main
directory:
recurse: true
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Der neue Namespace muss (derzeit noch) per Hand anelegt werden.
example-apps-qs# Create a new namespace named example-apps-qs
kubectl create namespace example-apps-qs
Nur noch Warten
Alle drei Repositories committen und pushen und warten bis der Jenkins gebaut hat.

In ArgoCD wird dann die Example App neu gesynct

In ArgoCD sieht man auch die Änderung

Und auch die App

Neue Stage ist online
