
Serpent Team

Andrew Hanna

Ein Delta-Deployment schickt nur die Metadaten, die sich zwischen zwei Git-Referenzen
geaendert haben, statt des ganzen Projekts. Du berechnest es, indem du Commits
vergleichst, aus dem Diff eine package.xml erzeugst und dieses Manifest
deployst. In einem Punkt ist das schneller und risikoaermer als ein vollstaendiges
Deployment, in einem anderen fragiler: Ein Teilpaket kann an Abhaengigkeiten
scheitern, die ein vollstaendiges Paket beilaeufig miterfuellt hat.
Ein Delta-Deployment ist ein Metadaten-Deployment, dessen Manifest aus einem Git-Diff stammt und nicht aus deinem gesamten Quellbaum. Drei bewegliche Teile:
package.xml mit nur hinzugefuegten
und geaenderten Komponenten, dazu eine destructiveChanges.xml mit
Loeschungen und Umbenennungen.
Nichts davon gehoert einem DevOps-Anbieter. Jedes Werkzeug mit Delta-Deployments, Serpent eingeschlossen, fuehrt eine Variante derselben drei Schritte aus.
Der uebliche Open-Source-Weg ist sfdx-git-delta, das Plugin, das der Salesforce Developers Blog fuer unpackaged Sources durchgespielt hat. Wichtig: Es ist ein inoffizielles, von der Community gepflegtes Plugin. Behandle es als Abhaengigkeit, die dir gehoert.
sf sgd source delta --from origin/main --to HEAD --output-dir .
--generate-delta, wenn die geaenderten Quelldateien mit
herauskopiert werden sollen. Nur verwenden, wenn --to HEAD ist.
package.xml schlaegt fehl, also sollte deine Pipeline den Schritt
ueberspringen statt zu brechen.
sf project deploy start -x package/package.xml --post-destructive-changes
destructiveChanges/destructiveChanges.xml
Das ist der Teil, den Tutorials auslassen. Ein vollstaendiges Deployment traegt jede Komponente, also loesen sich implizite Abhaengigkeiten stillschweigend auf. Ein Delta traegt eine Teilmenge, und jede zuvor unsichtbare Abhaengigkeit wird zum Fehler.
Fuege ein Feld im Delta hinzu: Der Zugriff darauf liegt im Profil, einer eigenen Datei. Hat sich diese Datei nicht geaendert, ist sie nicht im Delta, und das Feld landet im Ziel, ohne dass es jemand sieht. Die Retrieve-Seite verschaerft das: Salesforce liefert nur Sicherheitseinstellungen fuer die im Retrieve genannten Metadatentypen, wobei Benutzerberechtigungen, IP-Bereiche und Anmeldezeiten immer dabei sind. Deploye Profile bewusst, statt den Diff entscheiden zu lassen.
Einen Auswahllistenwert zu entfernen beruehrt Datensatztypen und Uebersetzungen, die ihn referenzieren. sfdx-hardis hat Delta mit Abhaengigkeiten genau dafuer gebaut, denn der Fehler zeigt sich oft gar nicht im Delta-Deployment. Er zeigt sich im naechsten vollstaendigen Deployment, Wochen spaeter, in einer anderen Pipeline.
Deployst du eine geaenderte Klasse unter RunSpecifiedTests, muss ihre
Testklasse im Ziel liegen und in der Testliste stehen. Ein Delta mit der Klasse, aber
ohne den Test, ist ein Abdeckungsfehler, der auf die Produktion wartet.
Das Loeschen eines Flows ueber destructiveChanges.xml ist eine
dokumentierte Plattformluecke. Der Umweg ist, ihn zuerst zu deaktivieren, indem du
eine FlowDefinition mit activeVersionNumber auf null
deployst.
Benutzerdefinierte Labels, Workflows und Matching Rules packen viele Mitglieder in eine Datei. Eine Zeilenaenderung markiert die ganze Datei als geaendert, und ihr erzwungenes Einschliessen braucht die vollstaendige Git-Historie, keinen Shallow Clone.
Git sieht eine Umbenennung als Loeschen plus Hinzufuegen. In falscher Reihenfolge deployt, loeschst du eine noch referenzierte Komponente oder erzeugst ein Duplikat. Genau dafuer gibt es die post-destruktive Reihenfolge.
Ein brauchbarer Standard, und der, den sfdx-hardis mitbringt: Delta fuer Feature-Branches, die in einen gemeinsamen Branch mergen, und vollstaendige Deployments zwischen gemeinsamen Umgebungen. Die Begruendung: Je weiter oben in der Pipeline, desto wahrscheinlicher ist das Ziel von der Versionskontrolle abgedriftet, und ein Delta setzt voraus, dass die Versionskontrolle die Wahrheit ist.
Geh vollstaendig, wenn eines davon zutrifft:
Behalte eine manuelle Uebersteuerung. sfdx-hardis nutzt eine
NO_DELTA-Markierung im Commit-Titel, ein gutes Muster fuer jedes
Werkzeug: Wer weiss, dass eine Aenderung riskant ist, muss ein vollstaendiges
Deployment erzwingen koennen, ohne Pipeline-Konfiguration anzufassen.
Genau diesen letzten Schritt lassen Teams fallen, und genau er faengt die Auswahllisten-und-Uebersetzungen-Klasse von Fehlern, bevor ein Release auf dem Spiel steht. Weitere Playbooks zur Salesforce-Auslieferung stehen in unserer SF Guides-Bibliothek.
Sind Delta-Deployments sicherer als vollstaendige?
Sie sind schneller und beruehren weniger, was den Wirkungsradius senkt. Sicherer sind sie nicht von sich aus, denn ein Teilpaket kann eine Abhaengigkeit verfehlen, die ein vollstaendiges Paket mitgetragen haette.
Brauche ich sfdx-git-delta fuer Delta-Deployments?
Nein. Es ist der verbreitetste Open-Source-Weg, inoffiziell und von der Community gepflegt. Die meisten kommerziellen Salesforce-DevOps-Plattformen berechnen das Delta fuer dich.
Warum ist mein Delta-Paket in CI leer, lokal aber nicht?
Fast immer ein Shallow Clone. Dein CI-Checkout braucht genug Git-Historie, um den Referenz-Commit zu erreichen.
Wie loesche ich Metadaten in einem Delta-Deployment?
Ueber destructiveChanges.xml, angewendet nach dem additiven Paket. Flows
sind die Ausnahme: Deaktiviere sie zuerst per FlowDefinition-Aenderung.
Sollten Profile Teil des Deltas sein?
Deploye sie bewusst, statt den Diff entscheiden zu lassen. Profildateien tragen nur Einstellungen fuer die im Retrieve enthaltenen Metadatentypen, ein diffgetriebenes Profil ist also selten das gemeinte.
Unverbindlich.