
Andrew Hanna

Andrew Hanna

On supprime des métadonnées Salesforce avec un manifeste
destructiveChanges.xml déployé aux côtés d'un package.xml,
en choisissant si les suppressions s'exécutent avant ou après la partie additive du
déploiement. Le danger n'est pas la syntaxe. C'est qu'une suppression réussie n'est
pas annulable par un rollback de déploiement, et que les composants les plus
susceptibles de casser sont ceux que personne n'a dans le contrôle de source.
Un
manifeste destructiveChanges
utilise le même format que package.xml, avec une différence majeure:
les jokers ne sont pas pris en charge. Chaque composant à supprimer
doit être nommé.
Une entrée minimale ressemble à
<types><members>Account.Legacy_Score__c</members><name>CustomField</name></types>.
Deux règles qui piègent à la première tentative:
package.xml doit toujours être présent, dans le même répertoire.
Pour un déploiement 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 déploiement,
--post-destructive-changes après.
Par défaut, choisissez post-destructive. Le paquet additif arrive d'abord, donc tout ce qui référence encore le composant condamné peut être réorienté dans le même déploiement avant sa disparition.
Choisissez pré-destructive quand l'ancien et le nouveau entrent en collision. Les cas les plus nets:
Inverser l'ordre produit les deux échecs classiques: une suppression qui échoue parce qu'un élément référence encore le composant, ou un ajout qui échoue parce que le nom est pris.
Autant être direct. Supprimer un champ supprime ses données. Les composants supprimés vont à la corbeille sauf si le déploiement active purgeOnDelete, qui les rend immédiatement éligibles à la suppression. Les champs de récapitulation contournent la corbeille quel que soit ce réglage.
Et rollbackOnError, obligatoire pour les déploiements en production,
annule les changements d'un déploiement échoué. Ce n'est pas un bouton
d'annulation pour une suppression réussie. S'il faut récupérer les données après une
purge réussie, vous êtes dans une conversation de restauration, pas de déploiement.
Il existe aussi une catégorie de casse qui n'apparaît jamais dans votre dépôt: rapports, vues de liste et tableaux de bord référençant le champ. C'est de la configuration construite par un utilisateur métier, rarement dans Git, et le déploiement ne vous en avertira pas.
checkOnly, ou --dry-run depuis la CLI, valide et exécute
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. Mélangée à vingt autres changements, en cas de problème vous n'isolez pas vite la cause, et le rollback emporte les bons changements.
La même 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 référence l'ancien nom. D'autres playbooks de livraison sont dans notre bibliothèque SF Guides.
Puis-je utiliser un joker dans destructiveChanges.xml?
Non. Les jokers ne sont pas pris en charge. Chaque composant à supprimer doit être nommé explicitement.
Ai-je encore besoin d'un package.xml si je ne fais que supprimer?
Oui. Il doit se trouver dans le même répertoire, porter la version d'API et ne lister aucun composant.
Puis-je récupérer un champ supprimé par un déploiement?
Il va à la corbeille sauf si purgeOnDelete était actif, et les champs de
récapitulation contournent la corbeille dans tous les cas. Considérez l'export de
données comme le vrai plan de reprise.
Pourquoi mon déploiement destructif a-t-il réussi sans rien supprimer?
Les tentatives de suppression se poursuivent quand un composant listé est absent de la cible: un mauvais nom d'API donne donc un déploiement vert et aucun changement. Comparez la cible avant et après.
Quand supprimer avant le déploiement plutôt qu'après?
Quand ancien et nouveau composants entrent en conflit: réutilisation d'un nom d'API, recréation d'un champ avec un autre type, ou retrait d'une règle qui bloquerait le reste du déploiement.
Sans engagement.