
Andrew Hanna

Andrew Hanna

Kurze Antwort: Eine 2GP CI/CD-Pipeline erzeugt bei jedem Merge eine Paketversion, installiert diese Version in eine frische Scratch Org, lässt die Tests dagegen laufen und promotet nur, was besteht. Die Pipeline selbst sind fünf Befehle. Was 2GP-Builds Monate später wirklich bricht, ist nicht die Pipeline, sondern die Ancestry- und Namespace-Entscheidungen aus Woche eins.
Fünf Stufen, in dieser Reihenfolge:
Der entscheidende Unterschied: Metadaten zu deployen beweist, dass sie in einer Org kompilieren, die Ihnen gehört. Eine Paketversion zu installieren beweist, dass sie in einer Org funktioniert, die Ihnen nicht gehört.
Die Form der Pipeline ist identisch. Die Folgen einer falschen Promotion nicht: eine bereute Unlocked-Version ersetzt man, eine promotete Managed-Version ist dauerhaft öffentliche API.
sf package version create --package MyPackage --code-coverage
--installation-key-bypass --wait 60. Die entstehende 04t-Id als Pipeline-Output sichern.
sf org create scratch --definition-file config/project-scratch-def.json
--duration-days 1 --wait 10.
sf package install --package 04tXXXX --wait 20, danach
sf apex run test --test-level RunLocalTests --code-coverage --wait 30.
sf package version promote --package [email protected].
Alles vor Schritt 5 läuft bei jedem Pull Request. Schritt 5 läuft auf genau einem Branch, hinter einer menschlichen Freigabe.
Ancestry betrifft nur Managed 2GP, und genau dort laufen automatisierte Pipelines still aus dem Ruder. Salesforce verlangt, dass der angegebene Vorgänger die höchste promotete Versionsnummer des Pakets ist, und nur zu managed-released promotete Versionen dürfen als Vorgänger gelten (Salesforce Developers). Drei Regeln für Ihre Pipeline:
"ancestorVersion": "HIGHEST" in sfdx-project.json setzt
den Vorgänger automatisch auf die höchste promotete Version, genau was CI braucht.
Alternativen sind ein explizites major.minor.patch oder eine
ancestorId.
--skip-ancestor-check lässt sich die lineare Versionierung brechen,
aber Pakete aktualisieren nur entlang der Ancestry-Linie: Subscriber auf einer
aufgegebenen Version verlieren ihren Upgradepfad.
Patch-Versionen haben eine eigene Regel: Ein Patch kann nicht direkter Vorgänger einer Nicht-Patch-Version sein.
sfdx-project.json und deklarieren Sie
Abhängigkeiten zwischen Paketen explizit, mit Versionen.
sf package convert samt Migration installierter Subscriber.
RunLocalTests vor der Promotion.
All das lässt sich aus Salesforce CLI plus GitHub Actions, Azure Pipelines oder CumulusCI zusammensetzen. Serpent liefert dieselbe Pipeline ohne YAML: native 1GP-, 2GP- und Managed-Package-Workflows, Auflösung paketübergreifender Abhängigkeiten und Versionsverwaltung über Subscriber-Orgs in jedem Plan, mit vorgewärmtem Scratch-Org-Pooling in Scale. Weitere Build- und Release-Guides finden Sie in den SF Guides.
Lässt sich die 2GP-Paketerstellung vollständig automatisieren?
Ja. Versionserstellung, Installation, Tests und Promotion sind CLI-Befehle, der ganze Zyklus läuft unbeaufsichtigt. Lassen Sie die Promotion trotzdem hinter einer menschlichen Freigabe.
Was ist Package Ancestry in 2GP?
Die deklarierte Abstammung zwischen Managed-Paketversionen. Sie definiert den Upgradepfad der Subscriber, denn Pakete aktualisieren nur entlang dieser Linie.
Brauchen Unlocked Packages einen Namespace?
Nein. Sie kommen ohne aus, deshalb passen sie zu internen Org-Beständen. Managed 2GP verlangt einen registrierten, mit dem Dev Hub verknüpften Namespace.
Warum scheitert meine Versionserstellung an der Ancestry?
Meist weil der genannte Vorgänger keine promotete, managed-released Version ist, oder weil eine Patch-Version als Vorgänger einer Nicht-Patch-Version gesetzt wurde.
Soll die CI jeden grünen Build promoten?
Nein. Promotion ist praktisch unumkehrbar und setzt den nächsten Vorgänger, gehört also auf einen Release-Branch hinter eine Freigabe, nicht in jeden Merge.
Unverbindlich.