Emplois Export / Import à Jenkins

268

Est-il possible d'échanger des emplois entre 2 Jenkins différents? Je cherche un moyen d'exporter / importer des emplois.

damluar
la source
2
Pas directement une réponse à votre question mais quelques bonnes pratiques: essayez d'écrire votre configuration de travail avec le Jenkins Pipeline DSL et de l'intégrer dans les référentiels de vos projets. Comme ça, les tâches sont facilement portables d'un serveur Jenkins à l'autre. Voir github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs
Quelques conseils sur stackoverflow.com/questions/38585734/… ainsi
Ben Creasy

Réponses:

154

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é!

Khez
la source
22
Vous avez donc besoin d'accéder au système sur lequel jenkins est installé? Ce n'est donc pas une réponse pour les utilisateurs normaux.
Wouter Schut
Confirmé, vous devez recharger Jenkins après avoir appliqué ce que dit le document.
Miguel Ortiz
180

Utiliser probablement la ligne de commande jenkins est une autre option, voir https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: crée un nouveau travail en lisant stdin en tant que fichier XML de configuration.
  • get-job: vide la définition de travail XML vers stdout

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

Larry Cai
la source
3
Pour que cela fonctionne, java sur votre ancien serveur, votre nouveau serveur et votre machine locale doit être de la même version. Sinon, d'étranges problèmes de flux / version surviennent. Vos ports jnlp doivent également être ouverts.
MaratC
Le chemin complet vers le client CLI est JENKINS_HOME / war / WEB-INF / jenkins-cli.jar où JENKINS_HOME est l'emplacement de JENKINS_HOME
Rob Kielty
1
Cette méthode a des problèmes avec les esperluettes nues nues dans le XML, comme lorsque vous avez du code & dans Groovy.
Rob Kielty
les esperluettes non encodées dans le XML exporté peuvent se produire dans du code Groovy qui soutient les paramètres du plug-in Active Choice (non-choix); présentera une solution si je peux.
Rob Kielty
1
@information_interchange exactement comme proposé dans ma réponse ci-dessous.
MaratC
151

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 @-
MaratC
la source
1
Besoin de jetons d'authentification pour fonctionner, mais acier excellent travail!
Viroide
7
curl -s http: // <USER>: <API_TOEKN> @ OLD_JENKINS / job / JOBNAME / config.xml | curl -X POST 'http: // <USER>: <API_TOEKN> @ NEW_JENKINS / createItem? name = JOBNAME' --header "Content-Type: application / xml" -d @ - <br/> Récupère la clé API utilisateur de : JENKIS_URL / user / <USER> / configure > Jeton API> Afficher le jeton API
Suhas Gaikwad
1
Juste une contribution supplémentaire à ce sujet. Lors du POST sur le serveur cible, vous obtiendrez probablement un code d'erreur HTTP 403 Problème d'accès / createItem. Motif: aucune miette valide n'a été incluse dans la demande. Vous devrez générer un jeton de protection CSRF pour le serveur Jenkins cible. Suivez les conseils de @Kenorb à partir de ce fil: stackoverflow.com/questions/38137760/…
Mig82
2
Vous n'avez même pas besoin d'utiliser les commandes curl car vous pouvez simplement aller sur le http://OLD_JENKINS/job/JOBNAME/config.xmllien de votre navigateur pour récupérer le config.xmlfichier.
entpnerd
1
Vous en avez besoin --data-binaryau lieu de -ddans la curlcommande, car cela -dpourrait gâcher les espaces dans vos scripts.
Gabor Csardi
24

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 .

jwernerny
la source
Je ne crois pas qu'il déplace actuellement autre chose que la configuration.
jwernerny
14

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.xmlsur cette URL avec le paramètre de requête name=JOBNAME. Vous devez envoyer un en- Content-Type: application/xmltête. Vous obtiendrez un 200code d'état si la création réussit ou un 4xx/5xxcode en cas d'échec. config.xmlest 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.

user1050755
la source
13

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é.

Jimmont
la source
1
dans WindowsC:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Sasha Bond
8

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

GaneSH Malkar
la source
6

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
Katu
la source
5

Dans un navigateur Web, visitez:

http://[jenkinshost]/job/[jobname]/config.xml

Enregistrez simplement le fichier sur votre disque.

Gayan Weerakutti
la source
réponse incomplète :(
Pradeep Singh
4

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
karthick
la source
2

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"
Justin Morgan
la source
2

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

Gardien
la source
1
Cela pourrait fonctionner pour certains, mais pas pour moi. Cela ne fonctionne que si la nouvelle instance Jenkins a un accès direct à l'ancienne instance Jenkins. Les miens étaient sur deux réseaux différents.
Justin Domnitz
1

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);
}
Jitendra Chandani
la source
1

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.

pcrews
la source
1

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 - workspacedossier), 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 configurationdans 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 modulesdossiers

xxxvodnikxxx
la source
0

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

Dixon Joseph Dalmeida
la source
0

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.

SwimBikeRun
la source