Trabajos de exportación / importación en Jenkins

268

¿Es posible intercambiar trabajos entre 2 Jenkins diferentes? Estoy buscando una forma de exportar / importar trabajos.

Damluar
fuente
2
No es una respuesta directa a su pregunta, sino una buena práctica: intente escribir la configuración de su trabajo con Jenkins Pipeline DSL y hágalo parte de los repositorios de sus proyectos. Así, los trabajos son fácilmente transportables de un servidor Jenkins a otro. Ver github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs
Algunos consejos en stackoverflow.com/questions/38585734/… también
Ben Creasy

Respuestas:

154

Jenkins tiene una wiki bastante buena, aunque difícil de leer cuando eres nuevo en el software de CI ...

Ofrecen una solución simple para mover trabajos entre servidores

El truco probablemente fue la necesidad de volver a cargar la configuración desde la página de configuración de Jenkins.

Actualización 2020.03.10

El panorama de JenkinsCI ha cambiado mucho ... He estado usando Job DSL por un tiempo. Tenemos un trabajo SEED que genera el resto de los trabajos.

Esto nos ayuda a recrear o movernos para el servidor Jenkins siempre que sea necesario :) ¡También podría versionar esos archivos para una mayor capacidad de mantenimiento!

Khez
fuente
22
¿Entonces necesita acceso al sistema donde está instalado jenkins? Entonces esta no es una respuesta para usuarios normales.
Wouter Schut
Confirmado, debe volver a cargar Jenkins después de aplicar lo que dice el documento.
Miguel Ortiz
180

Probablemente usar la línea de comando jenkins es otra opción, consulte https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: crea un nuevo trabajo leyendo stdin como un archivo XML de configuración.
  • get-job: vuelca el XML de definición de trabajo en stdout

Entonces puedes hacer

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

Funciona bien para mí y estoy acostumbrado a almacenar dentro de mi sistema de control de versiones

Larry Cai
fuente
3
Para que esto funcione, Java en su antiguo servidor, nuevo servidor y máquina local debe ser de la misma versión. De lo contrario, surgen problemas extraños de transmisión / versión. Sus puertos jnlp también deben estar abiertos.
MaratC
La ruta completa al cliente CLI es JENKINS_HOME / war / WEB-INF / jenkins-cli.jar donde JENKINS_HOME es la ubicación de JENKINS_HOME
Rob Kielty
1
Este método tiene problemas con símbolos de desnudos desnudos en el XML, como cuando tiene & en el código Groovy.
Rob Kielty
los símbolos sin codificar en el XML exportado pueden aparecer en el código Groovy que respalda los parámetros de Active Choice Plugin (uno-choice); presentará solución si puedo.
Rob Kielty
1
@information_interchange exactamente como se propone en mi respuesta a continuación.
MaratC
151

Una frase:

$ curl -s http://OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http://NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-

Con autenticación:

$ 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 @-

Con Crumb, si CSRF está activo ( ver detalles aquí ):

Obtener migajas con:

$ 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)')

Aplicar miga con -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
fuente
1
Necesita tokens de autenticación para funcionar, ¡pero es un gran trabajo!
Viroide
77
curl -s http: // <USER>: <API_TOEKN> @ OLD_JENKINS / job / JOBNAME / config.xml | curl -X POST 'http: // <USER>: <API_TOEKN> @ NEW_JENKINS / createItem? name = JOBNAME' --encabezado "Content-Type: application / xml" -d @ - <br/> Obtenga la clave API de usuario de : JENKIS_URL / user / <USER> / configure > API Token> Mostrar API Token
Suhas Gaikwad
1
Solo una contribución adicional en esto. Al POSTAR en el servidor de destino, es probable que obtenga un código de error HTTP 403 Problema al acceder / createItem. Motivo: No se incluyó una miga válida en la solicitud. Deberá generar un token de protección CSRF para el servidor Jenkins de destino. Siga los consejos de @Kenorb de este hilo: stackoverflow.com/questions/38137760/…
Mig82
2
Ni siquiera necesita usar comandos curl, ya que puede ir al http://OLD_JENKINS/job/JOBNAME/config.xmlenlace en su navegador para tomar el config.xmlarchivo.
entpnerd
1
Necesita en --data-binarylugar de -den el curlcomando, ya que -dpodría dañar el espacio en blanco en sus scripts.
Gabor Csardi
24

Hay un complemento llamado Job Import Plugin que puede ser lo que estás buscando. Lo he usado Tiene problemas con la importación de proyectos desde un servidor que no permite el acceso anónimo.

Para completar: si tiene acceso de línea de comando a ambos, puede realizar el procedimiento ya mencionado por Khez para mover, copiar y renombrar trabajos de Jenkins .

jwernerny
fuente
No creo que actualmente mueva nada más que la configuración.
jwernerny
14

Vaya a la página principal de su servidor Jenkins, haga clic en REST API en la parte inferior de la página:

Crear trabajo

Para crear un nuevo trabajo, publique config.xmlen esta URL con el parámetro de consulta name=JOBNAME. Necesitas enviar un Content-Type: application/xmlencabezado. Obtendrá el 200código de estado si la creación es exitosa, o el 4xx/5xxcódigo si falla. config.xmles el formato que Jenkins usa para almacenar el proyecto en el sistema de archivos, para que pueda ver ejemplos de ellos en el directorio de inicio de Jenkins, o recuperando la configuración XML de los trabajos existentes /job/JOBNAME/config.xml.

usuario1050755
fuente
13

En mi instancia de Jenkins (versión 1.548) el archivo de configuración está en:

/var/lib/jenkins/jobs/-the-project-name-/config.xml

Propiedad del usuario jenkins y del grupo jenkins con 644 permisos. Copiar el archivo ay desde aquí debería funcionar. No he intentado cambiarlo directamente, pero he hecho una copia de seguridad de la configuración desde este punto en caso de que el proyecto deba configurarse nuevamente.

jimmont
fuente
1
en WindowsC:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
Sasha Bond
8

Job Plugin de importación es la manera fácil aquí para importar trabajos desde otra instancia de Jenkins. Solo necesita proporcionar la URL de la instancia de Jenkins de origen. La URL remota de Jenkins puede tomar cualquiera de los siguientes tipos de URL:

  • http://$JENKINS - obtener todos los trabajos en instancia remota

  • http://$JENKINS/job/$JOBNAME - conseguir un solo trabajo

  • http://$JENKINS/view/$VIEWNAME - obtener todos los trabajos en una vista particular

GaneSH Malkar
fuente
6

Gracias a la respuesta de Larry Cai, logré crear un script para respaldar todos mis trabajos de Jenkins. Creé un trabajo que funciona esto todas las semanas. En caso de que alguien lo encuentre útil, aquí está:

#!/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
fuente
5

En una visita al navegador web:

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

Simplemente guarde el archivo en su disco.

Gayan Weerakutti
fuente
respuesta incompleta :(
Pradeep Singh
4

Jenkins exporta trabajos a un directorio

 #! /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

Importar trabajos

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
fuente
2

Para aquellos de nosotros en el mundo de Windows que pueden o no tener Bash disponible, aquí está mi puerto PowerShell del enfoque de Katu y Larry Cai . Espero que ayude a alguien.

##### 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
fuente
2

Es muy fácil solo descarga el nombre del complemento

Plugin de importación de trabajos

Ingrese la URL de su servidor remoto Jenkins e importará los trabajos automáticamente

guardián
fuente
1
Esto podría funcionar para algunos, pero no para mí. Esto solo funciona si la nueva instancia de Jenkins tiene acceso directo a la antigua instancia de Jenkins. Los míos estaban en dos redes diferentes.
Justin Domnitz
1

El script PHP simple funcionó para mí.

Exportar:

// 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);
}

Importar:

<?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
fuente
1

Esto no funciona para trabajos existentes, sin embargo, existe el generador de trabajos Jenkins .

Esto permite mantener definiciones de trabajo en archivos yaml y en un repositorio git que es muy portátil.

tornillos
fuente
1

La forma más fácil, con acceso directo a la máquina, es copiar la carpeta de trabajo del primer jenkins a otro (puede excluir espacios de trabajo - workspacecarpeta), porque toda la configuración del trabajo se almacena en el archivo xml del disco.

Luego, en el nuevo jenkins, solo reload configurationen la configuración global (se requiere acceso de administrador) debería ser suficiente, si no, deberá reiniciar la herramienta Jenkins.

Otra forma puede ser usar los complementos mencionados anteriormente en esta publicación.

editar: - en caso de que probablemente también pueda excluir modulescarpetas

xxxvodnikxxx
fuente
0

Importar trabajos manualmente: forma alternativa

Cargue los trabajos en Git (Control de versiones) Básicamente cargue config.xml del trabajo.

Si servidores Linux:

cd /var/lib/jenkins/jobs/<Job name> 
Download the config.xml from Git

Reiniciar el Jenkins

Dixon Joseph Dalmeida
fuente
0

Como usuario web, puede exportar yendo al Historial de configuración del trabajo y luego exportando XML.

Estoy en la situación de no tener acceso a la máquina en la que Jenkins se está ejecutando y quería exportar como copia de seguridad.

En cuanto a importar el xml como usuario web, todavía me gustaría saberlo.

SwimBikeRun
fuente