Est-il possible d'échanger des emplois entre 2 Jenkins différents? Je cherche un moyen d'exporter / importer des emplois.
Est-il possible d'échanger des emplois entre 2 Jenkins différents? Je cherche un moyen d'exporter / importer des emplois.
Réponses:
Jenkins a un assez bon wiki, bien que difficile à lire lorsque vous êtes nouveau sur le logiciel CI ...
Ils offrent une solution simple pour déplacer des travaux entre les serveurs
L'astuce était probablement la nécessité de recharger la configuration depuis la page de configuration Jenkins.
Mise à jour 2020.03.10
Le paysage JenkinsCI a beaucoup changé ... J'utilise Job DSL depuis un moment maintenant. Nous avons un travail SEED qui génère le reste des emplois.
Cela nous aide à recréer ou à déplacer le serveur Jenkins en cas de besoin :) Vous pouvez également versionner ces fichiers pour encore plus de maintenabilité!
Utiliser probablement la ligne de commande jenkins est une autre option, voir https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
Vous pouvez donc faire
java -jar jenkins-cli.jar -s http://server get-job myjob > myjob.xml
java -jar jenkins-cli.jar -s http://server create-job newmyjob < myjob.xml
Cela fonctionne bien pour moi et je suis habitué à stocker dans mon système de contrôle de version
Un one-liner:
$ curl -s http://OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http://NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-
Avec authentification:
$ curl -s http:///<USER>:<API_TOKEN>@OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http:///<USER>:<API_TOKEN>@NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-
Avec Crumb, si CSRF est actif ( voir les détails ici ):
Obtenez la miette avec:
$ CRUMB_OLD=$(curl -s 'http://<USER>:<API_TOKEN>@OLD_JENKINS/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
$ CRUMB_NEW=$(curl -s 'http://<USER>:<API_TOKEN>@NEW_JENKINS/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)')
Appliquer la mie avec -H CRUMB
:
$ curl -s -H $CRUMB_OLD http:///<USER>:<API_TOKEN>@OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST -H $CRUMB_NEW 'http:///<USER>:<API_TOKEN>@NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-
http://OLD_JENKINS/job/JOBNAME/config.xml
lien de votre navigateur pour récupérer le config.xml
fichier.
--data-binary
au lieu de -d
dans la curl
commande, car cela -d
pourrait gâcher les espaces dans vos scripts.
Il existe un plugin appelé Job Import Plugin qui peut être ce que vous recherchez. Je l'ai utilisé. Il a des problèmes avec l'importation de projets à partir d'un serveur qui n'autorise pas l'accès anonyme.
Pour être complet: Si vous avez accès en ligne de commande aux deux, vous pouvez effectuer la procédure déjà mentionnée par Khez pour le déplacement, la copie et le changement de nom des travaux Jenkins .
Accédez à la page d'accueil de votre serveur Jenkins, cliquez sur l'API REST en bas de la page:
Créer un travail
Pour créer un nouveau travail, publiez config.xml
sur cette URL avec le paramètre de requête name=JOBNAME
. Vous devez envoyer un en- Content-Type: application/xml
tête. Vous obtiendrez un 200
code d'état si la création réussit ou un 4xx/5xx
code en cas d'échec. config.xml
est le format utilisé par Jenkins pour stocker le projet dans le système de fichiers, vous pouvez donc en voir des exemples dans le répertoire de base de Jenkins, ou en récupérant la configuration XML des travaux existants /job/JOBNAME/config.xml
.
Dans mon instance Jenkins (version 1.548), le fichier de configuration est à:
/var/lib/jenkins/jobs/-the-project-name-/config.xml
Propriété de l'utilisateur jenkins et du groupe jenkins avec 644 autorisations. La copie du fichier vers et depuis ici devrait fonctionner. Je n'ai pas essayé de le changer directement, mais j'ai sauvegardé la configuration à partir de cet endroit au cas où le projet devrait être à nouveau configuré.
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Le plugin Job Import est le moyen facile ici d'importer des travaux à partir d'une autre instance Jenkins. Il suffit de fournir l'URL de l'instance Jenkins source. L'URL Jenkins distante peut accepter l'un des types d'URL suivants:
http://$JENKINS
- obtenir tous les travaux sur une instance distante
http://$JENKINS/job/$JOBNAME
- obtenir un seul emploi
http://$JENKINS/view/$VIEWNAME
- obtenir tous les emplois dans une vue particulière
Grâce à la réponse de Larry Cai, j'ai réussi à créer un script pour sauvegarder tous mes travaux Jenkins. J'ai créé un travail qui s'exécute chaque semaine. Si quelqu'un le trouve utile, le voici:
#!/bin/bash
#IFS for jobs with spaces.
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for i in $(java -jar /run/jenkins/war/WEB-INF/jenkins-cli.jar -s http://server:8080/ list-jobs);
do
java -jar /run/jenkins/war/WEB-INF/jenkins-cli.jar -s http://server:8080/ get-job ${i} > ${i}.xml;
done
IFS=$SAVEIFS
mkdir deploy
tar cvfj "jenkins-jobs.tar.bz2" ./*.xml
Dans un navigateur Web, visitez:
http://[jenkinshost]/job/[jobname]/config.xml
Enregistrez simplement le fichier sur votre disque.
Exportation de tâches Jenkins vers un répertoire
#! /bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
declare -i j=0
for i in $(java -jar jenkins-cli.jar -s http://server:8080/jenkins list-jobs --username **** --password ***);
do
let "j++";
echo $j;
if [ $j -gt 283 ] // If you have more jobs do it in chunks as it will terminate in the middle of the process. So Resume your job from where it ends.
then
java -jar jenkins-cli.jar -s http://lxvbmcbma:8080/jenkins get-job --username **** --password **** ${i} > ${i}.xml;
echo "done";
fi
done
Importer des travaux
for f in *.xml;
do
echo "Processing ${f%.*} file.."; //truncate the .xml extention and load the xml file for job creation
java -jar jenkins-cli.jar -s http://server:8080/jenkins create-job ${f%.*} < $f
done
Pour ceux d'entre nous dans le monde Windows qui peuvent ou non avoir Bash disponible, voici mon port PowerShell de Katu et l' approche de Larry Cai . J'espère que cela aide quelqu'un.
##### Config vars #####
$serverUri = 'http://localhost:8080/' # URI of your Jenkins server
$jenkinsCli = 'C:\Program Files (x86)\Jenkins\war\WEB-INF\jenkins-cli.jar' # Path to jenkins-cli.jar on your machine
$destFolder = 'C:\Jenkins Backup\' # Output folder (will be created if it doesn't exist)
$destFile = 'jenkins-jobs.zip' # Output filename (will be overwritten if it exists)
########################
$work = Join-Path ([System.IO.Path]::GetTempPath()) ([System.IO.Path]::GetRandomFileName())
New-Item -ItemType Directory -Force -Path $work | Out-Null # Suppress output noise
echo "Created a temp working folder: $work"
$jobs = (java -jar $jenkinsCli -s $serverUri list-jobs)
echo "Found $($jobs.Length) existing jobs: [$jobs]"
foreach ($j in $jobs)
{
$outfile = Join-Path $work "$j.xml"
java -jar $jenkinsCli -s $serverUri get-job $j | Out-File $outfile
}
echo "Saved $($jobs.Length) jobs to temp XML files"
New-Item -ItemType Directory -Force -Path $destFolder | Out-Null # Suppress output noise
echo "Found (or created) $destFolder folder"
$destPath = Join-Path $destFolder $destFile
Get-ChildItem $work -Filter *.xml |
Write-Zip -Level 9 -OutputPath $destPath -FlattenPaths |
Out-Null # Suppress output noise
echo "Copied $($jobs.Length) jobs to $destPath"
Remove-Item $work -Recurse -Force
echo "Removed temp working folder"
Il est très facile de télécharger simplement le nom du plugin
Plugin d'importation de travaux
Entrez l'URL de votre serveur Jenkins distant et il importera automatiquement les travaux
Un script php simple a fonctionné pour moi.
Exportation:
// add all job codes in the array
$jobs = array("job1", "job2", "job3");
foreach ($jobs as $value)
{
fwrite(STDOUT, $value. " \n") or die("Unable to open file!");
$path = "http://server1:8080/jenkins/job/".$value."/config.xml";
$myfile = fopen($value.".xml", "w");
fwrite($myfile, file_get_contents($path));
fclose($myfile);
}
Importer:
<?php
// add all job codes in the array
$jobs = array("job1", "job2", "job3");
foreach ($arr as $value)
{
fwrite(STDOUT, $value. " \n") or die("Unable to open file!");
$cmd = "java -jar jenkins-cli.jar -s http://server2:8080/jenkins/ create-job ".$value." < ".$value.".xml";
echo exec($cmd);
}
Cela ne fonctionne pas pour les travaux existants, mais il existe un générateur de travaux Jenkins .
Cela permet de conserver les définitions de travail dans des fichiers yaml et dans un dépôt git qui est très portable.
Le moyen le plus simple, avec un accès direct à la machine, est de copier le dossier de travail des premiers jenkins vers un autre (vous pouvez exclure les espaces de travail - workspace
dossier), car la configuration complète de la tâche est stockée dans le fichier xml sur le disque.
Ensuite, dans le nouveau jenkins juste reload configuration
dans les paramètres globaux (un accès administrateur est requis) devrait être suffisant, sinon, vous devrez redémarrer l'outil Jenkins.
Une autre façon peut être d'utiliser les plugins mentionnés ci-dessus.
modifier: - au cas où vous pourriez probablement également exclure des modules
dossiers
Importation manuelle de travaux: autre méthode
Téléchargez les Jobs sur Git (Contrôle de version) Téléchargez essentiellement config.xml du Job.
Si les serveurs Linux:
cd /var/lib/jenkins/jobs/<Job name>
Download the config.xml from Git
Redémarrez le Jenkins
En tant qu'utilisateur Web, vous pouvez exporter en accédant à l'historique de configuration des travaux, puis en exportant XML.
Je suis dans la situation de ne pas avoir accès à la machine sur laquelle Jenkins fonctionne et je voulais exporter en tant que sauvegarde.
Quant à l'importation du xml en tant qu'utilisateur Web, je voudrais quand même savoir.