
Serpent Team

Andrew Hanna

Kort antwoord: een 2GP CI/CD-pipeline maakt bij elke merge een packageversie, installeert die versie in een verse scratch org, draait de tests ertegen en promoveert alleen wat slaagt. De pipeline zelf is vijf commando's. Wat 2GP-builds maanden later sloopt is niet de pipeline, maar de ancestry- en namespace-keuzes uit week een.
Vijf fasen, in deze volgorde:
Het onderscheid dat telt: deployen van metadata bewijst dat het compileert in een org die jij beheert. Een packageversie installeren bewijst dat het werkt in een org die jij niet beheert.
De vorm van de pipeline is voor beide gelijk. De gevolgen van een verkeerde promote niet: een unlocked versie waar je spijt van hebt vervang je, een gepromoveerde managed versie is voorgoed publieke API.
sf package version create --package MyPackage --code-coverage
--installation-key-bypass --wait 60. Leg het resulterende 04t-id vast als pipeline-output.
sf org create scratch --definition-file config/project-scratch-def.json
--duration-days 1 --wait 10.
sf package install --package 04tXXXX --wait 20, daarna
sf apex run test --test-level RunLocalTests --code-coverage --wait 30.
sf package version promote --package [email protected].
Alles voor stap 5 draait op elke pull request. Stap 5 draait op precies een branch, achter een menselijke goedkeuring.
Ancestry geldt alleen voor managed 2GP, en daar gaan geautomatiseerde pipelines stilletjes de mist in. Salesforce vereist dat de ancestor die je opgeeft het hoogste gepromoveerde versienummer van dat pakket is, en alleen versies die naar managed-released zijn gepromoveerd kunnen als ancestor gelden (Salesforce Developers). Drie regels om in je pipeline vast te leggen:
"ancestorVersion": "HIGHEST" in
sfdx-project.json zet de ancestor automatisch op de hoogste
gepromoveerde versie, precies wat CI nodig heeft. De alternatieven zijn een
expliciete major.minor.patch of een ancestorId.
--skip-ancestor-check, maar pakketten
upgraden alleen langs de ancestry-lijn, dus elke abonnee op een verlaten versie
verliest zijn upgradepad.
Patchversies hebben een eigen regel: een patch kan niet de directe ancestor van een niet-patchversie zijn.
sfdx-project.json en declareer afhankelijkheden
tussen pakketten expliciet, met versies.
sf package convert en migreert bestaande abonnees mee.
RunLocalTests voor de promote.
Je kunt dit allemaal zelf bouwen met de Salesforce CLI plus GitHub Actions, Azure Pipelines of CumulusCI. Serpent geeft je dezelfde pipeline zonder de YAML: native 1GP-, 2GP- en managed-package-workflows, dependency-resolutie tussen pakketten en versiebeheer over abonnee-orgs op elk plan, met voorverwarmde scratch org pooling op Scale. Meer build- en releasegidsen staan in SF Guides.
Kun je het aanmaken van 2GP-pakketten volledig automatiseren?
Ja. Versie aanmaken, installeren, testen en promoveren zijn allemaal CLI-commando's, dus de hele cyclus draait onbemand. Houd promoveren toch achter een menselijke goedkeuring.
Wat is package ancestry in 2GP?
De gedeclareerde afstamming tussen managed packageversies. Die bepaalt het upgradepad voor abonnees, want pakketten upgraden alleen langs die lijn.
Hebben unlocked packages een namespace nodig?
Nee. Unlocked packages kunnen zonder, en daarom passen ze bij interne orgs. Managed 2GP vereist een geregistreerde namespace gekoppeld aan je Dev Hub.
Waarom faalt mijn package version create op ancestry?
Meestal omdat de genoemde ancestor geen gepromoveerde, managed-released versie is, of omdat een patchversie als ancestor van een niet-patchversie is gezet.
Moet CI elke groene build promoveren?
Nee. Promoveren is in de praktijk onomkeerbaar en zet de volgende ancestor, dus het hoort op een releasebranch achter een goedkeuring, niet bij elke merge.
Vrijblijvend.