
Andrew Hanna

Andrew Hanna

Réponse courte : un pipeline CI/CD 2GP crée une version de package à chaque merge, installe cette version dans une scratch org neuve, exécute les tests contre elle et ne promeut que ce qui passe. Le pipeline lui-même tient en cinq commandes. Ce qui casse vraiment les builds 2GP des mois plus tard, ce n'est pas le pipeline, ce sont les décisions d'ancestry et de namespace prises la première semaine.
Cinq étapes, dans cet ordre :
La distinction qui compte : déployer des métadonnées prouve que cela compile dans une org que vous contrôlez. Installer une version de package prouve que cela fonctionne dans une org que vous ne contrôlez pas.
La forme du pipeline est identique. Les conséquences d'une mauvaise promotion, non : une version unlocked regrettée se remplace, une version managé promue devient une API publique pour toujours.
sf package version create --package MyPackage --code-coverage
--installation-key-bypass --wait 60. Récupérez 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 précède l'étape 5 tourne sur chaque pull request. L'étape 5 tourne sur une seule branche, derrière une validation humaine.
L'ancestry ne concerne que le managed 2GP, et c'est là que les pipelines automatisés dérapent en silence. Salesforce exige que l'ancêtre indiqué soit le numéro de version promue le plus élevé du package, et seules les versions promues à l'état managed-released peuvent servir d'ancêtre (Salesforce Developers). Trois règles à coder dans votre pipeline :
"ancestorVersion": "HIGHEST" dans
sfdx-project.json fixe automatiquement l'ancêtre à la version promue la
plus élevée, 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 à jour que le long de la lignée : tout abonné reste sur une version
abandonnée perd son chemin de mise à niveau.
Les versions patch ont leur propre règle : un patch ne peut pas être l'ancêtre direct d'une version non patch.
sfdx-project.json et déclarez
explicitement les dépendances entre packages, avec leurs versions.
sf package convert et migration des abonnés installés.
RunLocalTests avant la promotion.
Vous pouvez assembler tout cela avec la CLI Salesforce plus GitHub Actions, Azure Pipelines ou CumulusCI. Serpent vous donne le même pipeline sans le YAML : workflows natifs 1GP, 2GP et managed package, résolution des dépendances entre packages et gestion des versions chez les abonnés sur tous les plans, avec pooling de scratch orgs préchauffées sur Scale. D'autres guides de build et de release sont dans SF Guides.
Peut-on automatiser entièrement la création de packages 2GP ?
Oui. Création de version, installation, tests et promotion sont tous des commandes CLI, donc le cycle complet tourne sans intervention. Gardez malgré tout la promotion derrière une validation humaine.
Qu'est-ce que l'ancestry en 2GP ?
La filiation déclarée entre versions de package managé. Elle définit le chemin de mise à niveau des abonnés, car les packages ne se mettent à jour que le long de cette lignée.
Les packages unlocked ont-ils besoin d'un namespace ?
Non. Ils peuvent s'en passer, d'où leur intérêt pour un parc d'orgs interne. Le managed 2GP exige un namespace enregistré et lié à votre Dev Hub.
Pourquoi ma création de version échoue-t-elle sur l'ancestry ?
Le plus souvent parce que l'ancêtre indiqué n'est pas une version promue en managed-released, ou parce qu'une version patch a été définie comme ancêtre d'une version non patch.
La CI doit-elle promouvoir chaque build vert ?
Non. La promotion est irréversible en pratique et fixe l'ancêtre suivant : elle appartient à une branche de release derrière une validation, pas à chaque merge.
Sans engagement.