13.6. Migrer les tâches de build

Il arrive que vous ayez à déplacer ou copier des tâches de build Jenkins d'une instance Jenkins à une autre sans copier toute la configuration de Jenkins. Par exemple, vous pourriez migrer vos tâches de build vers une instance Jenkins sur une machine flambant neuve, avec une configuration système différente de celle de la machine initiale. Ou vous pourriez être en train de restaurer une vieille archive de tâche de build.

Comme nous l'avons vu, Jenkins stocke toutes les données nécessaires pour un projet au sein d'un sous-répertoire du répertoire jobs dans votre répertoire racine de Jenkins. Ce sous-répertoire est aisé à identifier — il a le même nom que votre projet. D'ailleurs, cela explique pourquoi vos noms de projets ne doivent pas contenir d'espaces, spécialement si Jenkins tourne sous Unix ou Linux — cela rend la maintenance et les tâches d'administrtions bien plus aisées si les noms de projet sont également des fichiers Unix correctement nommés.

Vous pouvez copier ou déplacer des tâches de build entre instances de projets assez simplement en copiant ou déplaçant les répertoires des tâches de build dans la nouvelle instance Jenkins. Le répertoire de la tâche du projet est autonome — il contient tant la configuration complète du projet que son historique des builds. Il est également possible de copier des répertoires de tâches de build dans une instance Jenkins en cours de fonctionnement. Toutefois, si vous effacez également ces répertoires du serveur originel, vous devriez en premier stopper ce dernier. Vous n'avez même pas besoin de redémarrer la nouvelle instance Jenkins pour voir le résultat de votre import, allez simplement à l'écran "Administrer Jenkins" et cliquez sur "Recharger la configuration à partir du disque". Cela chargera les nouvelles tâches de build et les rendra immédiatement visible sur le tableau de bord Jenkins.

Il y a quelques précautions à prendre toutefois. Si vous migrez vos tâches vers une installation toute fraîche de Jenkins, souvenez vous d'installer ou de migrer les plugins de votre précédent serveur. Les plugins se trouvent dans le répertoire plugins , il suffit donc de simplement copier tout le contenu de ce répertoire dans le répertoire correspondant à votre nouvelle instance.

Bien sûr, vous pourriez être en train de migrer les tâches de build vers une nouvelle instance présicément parce que la configuration des plugins est problématique. Certains plugins peuvent parfois être un peu bogués, et vous pourriez vouloir une installation propre avec des plugins bien précis. Dans ce cas, vous pourriez avoir à retravailler certaines configurations de projets une fois ceux-ci importés.

L'explication de cela est simple. Quand vous utilisez un plugin dans un projet, le fichier config.xml du projet est mis à jour avec des champs de configuration spécifiques au plugin. Si, pour quelques raisons que ce soit, vous devez migrer des projets vers une installation Jenkins sans ces plugins, Jenkins ne comprendra pas les parties correspondantes de la configuration de ces projets. La même chose peut également arriver si les versions des plugins sont très différentes et que le format des données de configuration a changé.

Si vous migrez des tâches vers une instance Jenkins avec une configuration différente, il est également intéressant de garder un oeil sur les logs systèmes. Les configurations de plugin invalides sont généralement visibles via des alertes ou des exceptions. Bien que non fatal, ces messages d'erreurs indiquent souvent que le plugin ne fonctionnera pas comme attendu, voir pas du tout.

Jenkins offre des fonctionnalités utiles pour vous aider à migrer les configurations de vos projets. Si Jenkins trouve des données qu'il considère invalides, il vous le fera savoir. Sur l'écran "Administrer Jenkins", vous aurez des messages comme celui dans Figure 13.15, “Jenkins vous informe si vos données ne sont pas compatibles avec la version actuelle” .

Jenkins vous informe si vos données ne sont pas compatibles avec la version actuelle

Figure 13.15. Jenkins vous informe si vos données ne sont pas compatibles avec la version actuelle


Plusieurs options s'offrent alors à vous. Vous pouvez laisser la configuration en l'état, par exemple si vous souhaitez revenir à une version précédente de votre instance Jenkins. Vous pouvez aussi laisser Jenkins ignorer les champs qu'il ne peut lire. Si vous retenez cette option, Jenkins affichera un écran avec plus de détails sur l'erreur et il pourra même, si vous le souhaitez, vous aider à nettoyer votre fichier de configuration (voir Figure 13.16, “Gestion de configuration périmée” ).

Gestion de configuration périmée

Figure 13.16. Gestion de configuration périmée


Cet écran donne plus de détails sur le projet contenant les données périmées ainsi que le message d'erreur obtenu. Cela offre plusieurs possibilités. Si vous êtes sûr de ne plus avoir besoin du plugin ayant originellement créé ces données, vous pouvez supprimer les champs fautifs en toute sécurité en cliquant sur le bouton "Discard Unreadable Data". Il est aussi possible que ces données appartiennent à un plugin qui n'a pas encore été installé sur cette instance Jenkins. Dans ce cas, installez le plugin et tout devrait aller bien. Enfin, vous pouvez toujours choisir de laisser les données redondantes et de vivre avec le message d'erreur, au moins jusqu'à ce que vous soyez sûr de ne plus avoir à migrer ces données vers l'ancien serveur.

Cependant, Jenkins ne détecte pas toujours toutes les erreurs et inconsistences. Il est toujours utile de garder un oeil sur les fichiers de log lorsque que vous migrez vos tâches de build. Par exemple, ce qui suit est un exemple réel d'un fichier de log Jenkins montrant ce qu'il peut arriver pendant une migration :

Mar 16, 2010 2:05:06 PM
			hudson.util.CopyOnWriteList$ConverterImpl unmarshal
			WARNING: Failed to resolve class com.thoughtworks.xstream.mapper.CannotResolveClassException:
			hudson.plugins.cigame.GamePublisher :
			hudson.plugins.cigame.GamePublisher
			at
			com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:68)
			at
			com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)
			at
			com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:71)
			at
			com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:38)

Cette erreur nous informe que Jenkins ne peut trouver une classe appelée hudson.plugins.cigame.GamePublisher . En fait, l'installation cible n'a pas le plugin "CI Game". Et dans ce cas (comme cela arrive parfois), aucun message d'alerte n'est apparu sur la page "Administrer Jenkins". Par conséquent, Jenkins n'a pas été capable de corriger le fichier de configuration par lui même.

La solution la plus simple, dans ce cas, serait d'installer le plugin "CI Game". Mais que faire si on ne veut pas installer ce plugin? Nous pourrions laisser les fichiers de configuration en l'état, mais cela pourrait cacher des erreurs plus importantes ultérieurement. Il serait mieux de les nettoyer.

Dans ce cas, il faut inspecter et modifier les fichiers de configuration du projet à la main. Sur cette machine Unix, j'ai juste utilisé grep pour trouver tous les fichiers de configuration contenant "cigame" :

			$
			cd $JENKINS_HOME/jobs
			$
			grep cigame */config.xml
			project-a/config.xml: <hudson.plugins.cigame.GamePublisher/>
			project-b/config.xml: <hudson.plugins.cigame.GamePublisher/>
			project-c/config.xml: <hudson.plugins.cigame.GamePublisher/>
		

Dans ces fichiers config.xml , j'ai trouvé une référence au plugin CI Game dans la section <publishers> , là où se trouve généralement les configurations des plugins réalisant des rapports :

<maven2-moduleset>
			...
			<publishers>
			<hudson.plugins.cigame.GamePublisher/>
			<hudson.plugins.claim.ClaimPublisher/>
			</publishers>
			...
			</maven2-moduleset>

Pour résoudre le problème, il suffit de supprimer la ligne incriminée:

<maven2-moduleset>
			...
			<publishers>
			<hudson.plugins.claim.ClaimPublisher/>
			</publishers>

			...
			</maven2-moduleset>

L'emplacement précis des données de configuration du plugin varie en fonction du plugin, mais en général les fichiers config.xml sont relativement lisibles. Les mettre à jour manuellement n'est pas trop compliqué.

Au final, migrer des tâches de build entre des instances Jenkins n'est pas si dur. Vous avez juste besoin de connaitre quelques astuces pour les cas particuliers, et, si vous savez où regarder, Jenkins fournit de beaux outils pour rendre le processus aisé.