
Serpent Team

Andrew Hanna

Kurze Antwort: Eine 2GP CI/CD-Pipeline erzeugt bei jedem Merge eine Paketversion, installiert diese Version in eine frische Scratch Org, laesst die Tests dagegen laufen und promotet nur, was besteht. Die Pipeline selbst sind fuenf Befehle. Was 2GP-Builds Monate spaeter wirklich bricht, ist nicht die Pipeline, sondern die Ancestry- und Namespace-Entscheidungen aus Woche eins.
Fuenf Stufen, in dieser Reihenfolge:
Der entscheidende Unterschied: Metadaten zu deployen beweist, dass sie in einer Org kompilieren, die Ihnen gehoert. Eine Paketversion zu installieren beweist, dass sie in einer Org funktioniert, die Ihnen nicht gehoert.
Die Form der Pipeline ist identisch. Die Folgen einer falschen Promotion nicht: eine bereute Unlocked-Version ersetzt man, eine promotete Managed-Version ist dauerhaft oeffentliche 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 laeuft bei jedem Pull Request. Schritt 5 laeuft 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 Vorgaenger die hoechste promotete Versionsnummer des Pakets ist, und nur zu managed-released promotete Versionen duerfen als Vorgaenger gelten (Salesforce Developers). Drei Regeln fuer Ihre Pipeline:
"ancestorVersion": "HIGHEST" in sfdx-project.json setzt
den Vorgaenger automatisch auf die hoechste promotete Version, genau was CI braucht.
Alternativen sind ein explizites major.minor.patch oder eine
ancestorId.
--skip-ancestor-check laesst 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 Vorgaenger einer Nicht-Patch-Version sein.
sfdx-project.json und deklarieren Sie
Abhaengigkeiten zwischen Paketen explizit, mit Versionen.
sf package convert samt Migration installierter Subscriber.
RunLocalTests vor der Promotion.
All das laesst 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, Aufloesung paketuebergreifender Abhaengigkeiten und Versionsverwaltung ueber Subscriber-Orgs in jedem Plan, mit vorgewaermtem Scratch-Org-Pooling in Scale. Weitere Build- und Release-Guides finden Sie in den SF Guides.
Laesst sich die 2GP-Paketerstellung vollstaendig automatisieren?
Ja. Versionserstellung, Installation, Tests und Promotion sind CLI-Befehle, der ganze Zyklus laeuft 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-Bestaenden. Managed 2GP verlangt einen registrierten, mit dem Dev Hub verknuepften Namespace.
Warum scheitert meine Versionserstellung an der Ancestry?
Meist weil der genannte Vorgaenger keine promotete, managed-released Version ist, oder weil eine Patch-Version als Vorgaenger einer Nicht-Patch-Version gesetzt wurde.
Soll die CI jeden gruenen Build promoten?
Nein. Promotion ist praktisch unumkehrbar und setzt den naechsten Vorgaenger, gehoert also auf einen Release-Branch hinter eine Freigabe, nicht in jeden Merge.
Unverbindlich.