
Serpent Team

Andrew Hanna

Reponse courte : un pipeline CI/CD 2GP cree une version de package a chaque merge, installe cette version dans une scratch org neuve, execute les tests contre elle et ne promeut que ce qui passe. Le pipeline lui-meme tient en cinq commandes. Ce qui casse vraiment les builds 2GP des mois plus tard, ce n'est pas le pipeline, ce sont les decisions d'ancestry et de namespace prises la premiere semaine.
Cinq etapes, dans cet ordre :
La distinction qui compte : deployer des metadonnees prouve que cela compile dans une org que vous controlez. Installer une version de package prouve que cela fonctionne dans une org que vous ne controlez pas.
La forme du pipeline est identique. Les consequences d'une mauvaise promotion, non : une version unlocked regrettee se remplace, une version manage promue devient une API publique pour toujours.
sf package version create --package MyPackage --code-coverage
--installation-key-bypass --wait 60. Recuperez l'identifiant 04t comme sortie de pipeline.
sf org create scratch --definition-file config/project-scratch-def.json
--duration-days 1 --wait 10.
sf package install --package 04tXXXX --wait 20, puis
sf apex run test --test-level RunLocalTests --code-coverage --wait 30.
sf package version promote --package [email protected].
Tout ce qui precede l'etape 5 tourne sur chaque pull request. L'etape 5 tourne sur une seule branche, derriere une validation humaine.
L'ancestry ne concerne que le managed 2GP, et c'est la que les pipelines automatises derapent en silence. Salesforce exige que l'ancetre indique soit le numero de version promue le plus eleve du package, et seules les versions promues a l'etat managed-released peuvent servir d'ancetre (Salesforce Developers). Trois regles a coder dans votre pipeline :
"ancestorVersion": "HIGHEST" dans
sfdx-project.json fixe automatiquement l'ancetre a la version promue la
plus elevee, exactement ce dont la CI a besoin. Les alternatives sont un
major.minor.patch explicite ou un ancestorId.
--skip-ancestor-check, mais les packages ne
se mettent a jour que le long de la lignee : tout abonne reste sur une version
abandonnee perd son chemin de mise a niveau.
Les versions patch ont leur propre regle : un patch ne peut pas etre l'ancetre direct d'une version non patch.
sfdx-project.json et declarez
explicitement les dependances entre packages, avec leurs versions.
sf package convert et migration des abonnes installes.
RunLocalTests avant la promotion.
Vous pouvez assembler tout cela avec la CLI Salesforce plus GitHub Actions, Azure Pipelines ou CumulusCI. Serpent vous donne le meme pipeline sans le YAML : workflows natifs 1GP, 2GP et managed package, resolution des dependances entre packages et gestion des versions chez les abonnes sur tous les plans, avec pooling de scratch orgs prechauffees sur Scale. D'autres guides de build et de release sont dans SF Guides.
Peut-on automatiser entierement la creation de packages 2GP ?
Oui. Creation de version, installation, tests et promotion sont tous des commandes CLI, donc le cycle complet tourne sans intervention. Gardez malgre tout la promotion derriere une validation humaine.
Qu'est-ce que l'ancestry en 2GP ?
La filiation declaree entre versions de package manage. Elle definit le chemin de mise a niveau des abonnes, car les packages ne se mettent a jour que le long de cette lignee.
Les packages unlocked ont-ils besoin d'un namespace ?
Non. Ils peuvent s'en passer, d'ou leur interet pour un parc d'orgs interne. Le managed 2GP exige un namespace enregistre et lie a votre Dev Hub.
Pourquoi ma creation de version echoue-t-elle sur l'ancestry ?
Le plus souvent parce que l'ancetre indique n'est pas une version promue en managed-released, ou parce qu'une version patch a ete definie comme ancetre d'une version non patch.
La CI doit-elle promouvoir chaque build vert ?
Non. La promotion est irreversible en pratique et fixe l'ancetre suivant : elle appartient a une branche de release derriere une validation, pas a chaque merge.
Sans engagement.