Eine neue Umgebung für jede Pull-Anfrage
Gemeinsame Inszenierung verlangsamt alle. Vorschaumöglichkeiten beheben das, wenn man die Kosten kontrolliert.
Gemeinsame Inszenierung verlangsamt alle. Vorschaumöglichkeiten beheben das, wenn man die Kosten kontrolliert.

Fast jedes Team, mit dem ich gearbeitet habe, hatte eine "Inszenierungs"-Umgebung. Und fast jedes Team hat in Slack das gleiche Gespräch geführt: "Wer hat in die Inszenierung eingesetzt? Meine Änderungen sind weg". "Können Sie eine Stunde nicht einsetzen, ich teste etwas?" "Die Inszenierung ist wieder kaputt, weiß jemand warum?"
Eine gemeinsame Umgebung für viele Entwickler schafft einen Engpass. Vorschaumöglichkeiten beseitigen diesen Engpass.
Die Idee ist einfach. Wenn eine Pull-Anfrage geöffnet wird, erstellt die Pipeline eine temporäre Kopie der Anwendung nur für diesen Zweig, mit seiner eigenen URL wie pr-142.preview.example.com- Ich weiß . Wenn die Pull-Anfrage zusammengeführt oder geschlossen wird, wird die Umgebung gelöscht.
Auf Kubernetes gibt es einige übliche Möglichkeiten, dies zu bauen:
Ein Namensraum pro Zuganfrage. Der einfachste Ansatz. Die Pipeline erstellt einen Namespace, stellt das Helm-Chart mit dem Bildtag des Zweigs bereit und setzt einen Eingang oder HTTPRoute für den Vorschauhostnamen ein.
Argo CD ApplicationSets mit dem Pull-Request-Generator. Argo CD beobachtet Ihr Repository und erstellt automatisch eine Anwendung für jede offene Pull-Anfrage und entfernt sie, wenn die PR geschlossen wird. Keine benutzerdefinierten Skripte.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: shop-previews
spec:
generators:
- pullRequest:
github:
owner: my-org
repo: shop
requeueAfterSeconds: 120
template:
metadata:
name: 'shop-pr-{{number}}'
spec:
project: previews
source:
repoURL: https://github.com/my-org/shop
targetRevision: '{{head_sha}}'
path: deploy/chart
helm:
parameters:
- name: image.tag
value: '{{head_sha}}'
- name: ingress.host
value: 'pr-{{number}}.preview.example.com'
destination:
server: https://kubernetes.default.svc
namespace: 'shop-pr-{{number}}'
syncPolicy:
automated: { prune: true }
syncOptions: [CreateNamespace=true]
Virtuelle Cluster (vCluster) werden verwendet. Wenn Teams Cluster-Ebene Ressourcen wie CRDs benötigen, bietet ein virtueller Cluster pro Pull-Anfrage vollständige Isolation, ohne jedes Mal für einen echten Cluster zu bezahlen.
Der beste Kommentar ist "Ich habe es durchklickt und es funktioniert", und Vorschaumöglichkeiten machen das möglich, bevor man es zusammenführt.
Die App zu implementieren ist der einfache Teil. Die schwierigen Fragen:
*.preview.example.com und ein Wildcard-Zertifikat (cert-Manager kümmert sich um das) machen neue Hostnamen sofort funktionieren.Vorschaumöglichkeiten können ruhig teuer werden. 50 offene Zugwünsche bedeuten 50 Kopien deiner App.
Was hilft:
Für Teams mit mehr als ein paar Entwicklern, die parallel arbeiten, ja. Die Bewertungen werden besser, die Tests kommen früher und die "Wer brach die Inszenierung" -Nachrichten verschwinden. Beginnen Sie mit einem Namespace pro PR, fügen Sie Daten hinzu und bereinigen Sie richtig, und wachsen Sie von dort aus.
Ich sage: Jeder Veränderung seine eigene Welt. Es ist billiger als die Zeit, die dein Team verliert, um auf die Inszenierung zu warten.
Desly