Empregos de exportação / importação em Jenkins


268

É possível trocar empregos entre dois Jenkins diferentes? Estou procurando uma maneira de exportar / importar trabalhos.


2
Não é uma resposta direta à sua pergunta, mas algumas práticas recomendadas: tente escrever sua configuração de trabalho com o Jenkins Pipeline DSL e faça parte dos repositórios dos seus projetos. Assim, os trabalhos são facilmente portáteis de um servidor Jenkins para o outro. Veja github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs

Respostas:


154

Jenkins tem um wiki bastante bom, embora difícil de ler quando você é novo no software CI ...

Eles oferecem uma solução simples para mover tarefas entre servidores

O truque provavelmente foi a necessidade de recarregar a configuração da página de configuração do Jenkins.

Atualização 2020.03.10

O cenário do JenkinsCI mudou muito ... Estou usando o Job DSL há algum tempo. Temos um trabalho do SEED que gera o restante dos trabalhos.

Isso nos ajuda a recriar ou migrar para o servidor Jenkins sempre que necessário :) Você também pode criar uma versão desses arquivos para manter ainda mais a capacidade de manutenção!


22
Então você precisa acessar o sistema em que o jenkins está instalado? Portanto, essa não é uma resposta para usuários normais.
Wouter Schut

Confirmado, você precisa recarregar o Jenkins depois de aplicar o que o documento diz.
Miguel Ortiz

180

Provavelmente, usar a linha de comando jenkins é outra opção, consulte https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job: cria um novo trabalho lendo stdin como um arquivo XML de configuração.
  • get-job: despeja o XML de definição de tarefa em stdout

Então você pode fazer

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 bem para mim e estou acostumado a armazenar dentro do meu sistema de controle de versão


3
Para que isso funcione, o java no servidor antigo, no novo servidor e na máquina local precisa ter a mesma versão. Caso contrário, surgem problemas estranhos de fluxo / versão. Suas portas jnlp também precisam estar abertas.
MaratC

O caminho completo para o cliente CLI é JENKINS_HOME / war / WEB-INF / jenkins-cli.jar em que JENKINS_HOME está no local de JENKINS_HOME
Rob Kielty

1
Esse método tem problemas com e comercial vazio no XML, como quando você possui & no código Groovy.
Rob Kielty 30/05

e comercial não codificado no XML exportado pode ocorrer no código Groovy que respalda os parâmetros do Active Choice Plugin (não-escolha); apresentará solução, se eu puder.
Rob Kielty

1
@information_interchange exatamente como proposto na minha resposta abaixo.
MaratC

151

Uma linha:

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

Com autenticação:

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

Com o Crumb, se o CSRF estiver ativo ( veja detalhes aqui ):

Faça migalhas com:

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

Aplique a migalha com -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 @-

1
Precisa de tokens de autenticação para funcionar, mas o aço é um excelente trabalho!
Viroide 11/01

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 "Tipo de conteúdo: application / xml" -d @ - <br/> Obtenha a chave da API do usuário de : JENKIS_URL / user / <USER> / configure > token da API> Mostrar token da API
Suhas Gaikwad

1
Apenas uma contribuição adicional sobre isso. Ao fazer o POST no servidor de destino, é provável que você obtenha um código de erro HTTP 403 Problema ao acessar / createItem. Motivo: nenhuma migalha válida foi incluída na solicitação. Você precisará gerar um token de proteção CSRF para o servidor Jenkins de destino. Siga o conselho de @Kenorb a partir deste tópico: stackoverflow.com/questions/38137760/…
Mig82

2
Nem precisa usar os comandos curl, pois você pode simplesmente acessar o http://OLD_JENKINS/job/JOBNAME/config.xmllink no seu navegador para pegar o config.xmlarquivo.
entpnerd

1
Você precisa, em --data-binaryvez de -dno curlcomando, porque -dpode atrapalhar o espaço em branco em seus scripts.
Gabor Csardi 8/11

24

Existe um plugin chamado Job Import Plugin que pode ser o que você está procurando. Eu usei isso. Ele tem problemas com a importação de projetos de um servidor que não permite acesso anônimo.

Para completar: se você tiver acesso à linha de comando para ambos, poderá executar o procedimento já mencionado por Khez para mover, copiar e renomear trabalhos Jenkins .


Não acredito que atualmente mova outra coisa senão a configuração.
jwernerny

14

Vá para a página inicial do servidor Jenkins, clique na API REST na parte inferior da página:

Criar trabalho

Para criar um novo trabalho, poste config.xmlneste URL com o parâmetro de consulta name=JOBNAME. Você precisa enviar um Content-Type: application/xmlcabeçalho. Você receberá 200código de status se a criação for bem-sucedida ou 4xx/5xxcódigo se falhar. config.xmlé o formato que o Jenkins usa para armazenar o projeto no sistema de arquivos, para que você possa ver exemplos deles no diretório inicial do Jenkins ou recuperando a configuração XML dos trabalhos existentes /job/JOBNAME/config.xml.


13

Na minha instância do Jenkins (versão 1.548), o arquivo de configuração está em:

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

Propriedade do usuário jenkins e grupo jenkins com 644 permissões. Copiar o arquivo para e daqui deve funcionar. Não tentei alterá-lo diretamente, mas fiz o backup da configuração a partir deste local, caso o projeto precise ser configurado novamente.


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

8

O plug - in Job Import é a maneira mais fácil de importar trabalhos de outra instância do Jenkins. Só é necessário fornecer o URL da instância de Jenkins de origem. A URL remota do Jenkins pode ter qualquer um dos seguintes tipos de URL:

  • http://$JENKINS - obter todos os trabalhos na instância remota

  • http://$JENKINS/job/$JOBNAME - conseguir um emprego único

  • http://$JENKINS/view/$VIEWNAME - obtenha todos os trabalhos em uma exibição específica


6

Graças à resposta de Larry Cai, consegui criar um script para fazer backup de todos os meus trabalhos de Jenkins. Eu criei um trabalho que executa isso toda semana. Caso alguém ache útil, aqui 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


4

Trabalhos de exportação de Jenkins para um diretório

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

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

2

Para aqueles de nós no mundo Windows que podem ou não ter o Bash disponível, aqui está minha abordagem do PowerShell sobre a abordagem de Katu e Larry Cai . Espero que ajude alguém.

##### 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"

2

É muito fácil apenas baixar o nome do plugin

Job Import Plugin

Digite o URL do servidor Remote Jenkins e ele importará os trabalhos automaticamente


1
Isso pode funcionar para alguns, mas não para mim. Isso funciona apenas se a nova instância do Jenkins tiver acesso direto à antiga instância do Jenkins. Os meus estavam em duas redes diferentes.
Justin Domnitz

1

O script php simples funcionou para mim.

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

1

Isso não funciona para trabalhos existentes, no entanto, existe o construtor de trabalhos Jenkins .

Isso permite manter definições de trabalho em arquivos yaml e em um repositório git, que é muito portátil.


1

A maneira mais fácil, com acesso direto à máquina, é copiar a pasta da tarefa dos primeiros jenkins para outra (você pode excluir áreas de trabalho - workspacepasta), porque toda a configuração da tarefa é armazenada no arquivo xml no disco.

Então, nos novos Jenkins, apenas reload configuration nas configurações globais (é necessário acesso de administrador), se não for o suficiente, será necessário reiniciar a ferramenta Jenkins.

Outra maneira pode ser usar os plugins mencionados acima neste post.

edit: - caso você provavelmente também possa excluir modulespastas


0

Importando trabalhos manualmente: maneira alternativa

Carregar os trabalhos no Git (controle de versão) Carregue basicamente o config.xml do trabalho.

Se servidores Linux:

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

Reinicie o Jenkins


0

Como usuário da web, você pode exportar acessando o Job Config History e exportando XML.

Estou na situação de não ter acesso à máquina em que Jenkins está sendo executado e queria exportar como backup.

Quanto à importação do xml como usuário da web, eu ainda gostaria de saber.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.