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
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!
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.
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.
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.
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.
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
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
#! /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-ItemTypeDirectory-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-ItemTypeDirectory-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-Level9-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"
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);
}
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
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!
fuente
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
Funciona bien para mí y estoy acostumbrado a almacenar dentro de mi sistema de control de versiones
fuente
Una frase:
Con autenticación:
Con Crumb, si CSRF está activo ( ver detalles aquí ):
Obtener migajas con:
Aplicar miga con
-H CRUMB
:fuente
http://OLD_JENKINS/job/JOBNAME/config.xml
enlace en su navegador para tomar elconfig.xml
archivo.--data-binary
lugar de-d
en elcurl
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 .
fuente
Vaya a la página principal de su servidor Jenkins, haga clic en REST API en la parte inferior de la página:
Para crear un nuevo trabajo, publique
config.xml
en esta URL con el parámetro de consultaname=JOBNAME
. Necesitas enviar unContent-Type: application/xml
encabezado. Obtendrá el200
código de estado si la creación es exitosa, o el4xx/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
.fuente
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.
fuente
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 remotahttp://$JENKINS/job/$JOBNAME
- conseguir un solo trabajohttp://$JENKINS/view/$VIEWNAME
- obtener todos los trabajos en una vista particularfuente
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á:
fuente
En una visita al navegador web:
Simplemente guarde el archivo en su disco.
fuente
Jenkins exporta trabajos a un directorio
Importar trabajos
fuente
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.
fuente
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
fuente
El script PHP simple funcionó para mí.
Exportar:
Importar:
fuente
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.
fuente
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
carpetasfuente
Importar trabajos manualmente: forma alternativa
Cargue los trabajos en Git (Control de versiones) Básicamente cargue config.xml del trabajo.
Si servidores Linux:
Reiniciar el Jenkins
fuente
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.
fuente