
Serpent Team

Andrew Hanna

On supprime des metadonnees Salesforce avec un manifeste
destructiveChanges.xml deploye aux cotes d'un package.xml,
en choisissant si les suppressions s'executent avant ou apres la partie additive du
deploiement. Le danger n'est pas la syntaxe. C'est qu'une suppression reussie n'est
pas annulable par un rollback de deploiement, et que les composants les plus
susceptibles de casser sont ceux que personne n'a dans le controle de source.
Un
manifeste destructiveChanges
utilise le meme format que package.xml, avec une difference majeure:
les jokers ne sont pas pris en charge. Chaque composant a supprimer
doit etre nomme.
Une entree minimale ressemble a
<types><members>Account.Legacy_Score__c</members><name>CustomField</name></types>.
Deux regles qui piegent a la premiere tentative:
package.xml doit toujours etre present, dans le meme repertoire.
Pour un deploiement de suppression seule, il porte la version d'API et ne liste
aucun composant.
La CLI Salesforce offre les deux, via
deux manifestes distincts: --pre-destructive-changes supprime avant le deploiement,
--post-destructive-changes apres.
Par defaut, choisissez post-destructive. Le paquet additif arrive d'abord, donc tout ce qui reference encore le composant condamne peut etre reoriente dans le meme deploiement avant sa disparition.
Choisissez pre-destructive quand l'ancien et le nouveau entrent en collision. Les cas les plus nets:
Inverser l'ordre produit les deux echecs classiques: une suppression qui echoue parce qu'un element reference encore le composant, ou un ajout qui echoue parce que le nom est pris.
Autant etre direct. Supprimer un champ supprime ses donnees. Les composants supprimes vont a la corbeille sauf si le deploiement active purgeOnDelete, qui les rend immediatement eligibles a la suppression. Les champs de recapitulation contournent la corbeille quel que soit ce reglage.
Et rollbackOnError, obligatoire pour les deploiements en production,
annule les changements d'un deploiement echoue. Ce n'est pas un bouton
d'annulation pour une suppression reussie. S'il faut recuperer les donnees apres une
purge reussie, vous etes dans une conversation de restauration, pas de deploiement.
Il existe aussi une categorie de casse qui n'apparait jamais dans votre depot: rapports, vues de liste et tableaux de bord referencant le champ. C'est de la configuration construite par un utilisateur metier, rarement dans Git, et le deploiement ne vous en avertira pas.
checkOnly, ou --dry-run depuis la CLI, valide et execute
les tests sans rien enregistrer.
Le motif sur n'est pas un meilleur manifeste. C'est de scinder la suppression en deux versions.
Livrer une suppression seule compte. Melangee a vingt autres changements, en cas de probleme vous n'isolez pas vite la cause, et le rollback emporte les bons changements.
La meme discipline vaut pour les renommages, que Git enregistre comme une suppression plus un ajout. Traitez chaque renommage comme une deprecation sur deux versions, sauf si vous pouvez prouver que rien ne reference l'ancien nom. D'autres playbooks de livraison sont dans notre bibliotheque SF Guides.
Puis-je utiliser un joker dans destructiveChanges.xml?
Non. Les jokers ne sont pas pris en charge. Chaque composant a supprimer doit etre nomme explicitement.
Ai-je encore besoin d'un package.xml si je ne fais que supprimer?
Oui. Il doit se trouver dans le meme repertoire, porter la version d'API et ne lister aucun composant.
Puis-je recuperer un champ supprime par un deploiement?
Il va a la corbeille sauf si purgeOnDelete etait actif, et les champs de
recapitulation contournent la corbeille dans tous les cas. Considerez l'export de
donnees comme le vrai plan de reprise.
Pourquoi mon deploiement destructif a-t-il reussi sans rien supprimer?
Les tentatives de suppression se poursuivent quand un composant liste est absent de la cible: un mauvais nom d'API donne donc un deploiement vert et aucun changement. Comparez la cible avant et apres.
Quand supprimer avant le deploiement plutot qu'apres?
Quand ancien et nouveau composants entrent en conflit: reutilisation d'un nom d'API, recreation d'un champ avec un autre type, ou retrait d'une regle qui bloquerait le reste du deploiement.
Sans engagement.