¿Es posible intercambiar trabajos entre 2 Jenkins diferentes? Estoy buscando una forma de exportar / importar trabajos.
¿Es posible intercambiar trabajos entre 2 Jenkins diferentes? Estoy buscando una forma de exportar / importar trabajos.
Respuestas:
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!
Probablemente usar la línea de comando jenkins es otra opción, consulte https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
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
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 @-
http://OLD_JENKINS/job/JOBNAME/config.xml
enlace en su navegador para tomar el config.xml
archivo.
--data-binary
lugar de -d
en el curl
comando, ya que -d
podría dañar el espacio en blanco en sus scripts.
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 .
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.xml
en esta URL con el parámetro de consulta name=JOBNAME
. Necesitas enviar un Content-Type: application/xml
encabezado. Obtendrá el 200
código de estado si la creación es exitosa, o el 4xx/5xx
código si falla. config.xml
es 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
.
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.
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
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
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
En una visita al navegador web:
http://[jenkinshost]/job/[jobname]/config.xml
Simplemente guarde el archivo en su disco.
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
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"
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
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);
}
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.
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 - workspace
carpeta), porque toda la configuración del trabajo se almacena en el archivo xml del disco.
Luego, en el nuevo jenkins, solo reload configuration
en 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 modules
carpetas
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
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.