Afin d’uniformiser les pratiques de packaging, je propose de discuter de la gestion d’erreur dans les scripts avec set -e
et trap
.
Tout d’abord, petit état des lieux de la situation.
L’objectif est d’empêcher le script de continuer si il a rencontré une erreur pouvant potentiellement compromettre le bon fonctionnement du package.
Or, par défaut, le mécanisme des sorties de commandes étant ce qu’il est, une erreur au milieu du script n’empêchera pas le script de se terminer correctement si la dernière commande n’échoue pas. (Puisque c’est la dernière commande du script qui transmettra son code de sortie.)
C’est là qu’entrent en jeu set -e
et trap
, tout deux permettent de repérer une commande qui aurait échouée durant l’exécution du script, ce qui permet de stopper son exécution avant son terme.
Quelles différences en set -e
et trap
?
Toutes deux sont des commandes interne de bash (Mais ce n’est pas un problème dans notre cas d’usage). Ce qui implique que leur man se trouvera sur man bash
-
set -e
provoque un arrêt immédiat du script si une commande renvoi un code de sortie différent de 0. Je ne connais pas son code de sortie, mais j’imagine que c’est celui de la dernière commande.
set -e ne permet aucune autre action, il agit immédiatement.
Il est très simple à mettre en place, puisque qu’un simpleset -e
en début de script suffit à l’activer. Il peux être désactivé avecset +e
-
trap
capture les codes de sortie de toutes les commandes du scripts et peux exécuter une commande si certains codes de sorties sont capturés.
Dans notre cas d’usage, trap sera configuré pour déclencher un exit si une commande renvoi un code de sortie différent de 0.
trap
peux exécuter une autre commande que exit, et en particulier il peux exécuter une fonction afin de s’assurer de quitter proprement le script.
trap est plus plus délicat à mettre en place que set -e, puisqu’il doit d’abord être activé avectrap fonction ERR
, et que fonction doit être une fonction déclarée en amont. C’est cette fonction qui devra se terminer par exit.
Un peu de documentation sur trap, adapté à notre usage.
La question à présent est, doit-on préférer l’usage de set -e
ou de trap
. set -e
est plus simple et donc plus fiable, mais trap
permet d’autres actions avant de quitter. Tel qu’afficher un message d’erreur ou nettoyer des fichiers résiduels.
Par exemple, un cas d’usage de trap sur le package jenkins.
Ici trap permet d’arrêter l’exécution de tail en arrière plan, qui est démarré ici. Sans ça, si le script quitte durant la boucle de démarrage, tail continue son exécution en arrière plan et l’installation ne se termine jamais.