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.

damluar
fonte
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
Alguns conselhos sobre a stackoverflow.com/questions/38585734/... bem
Ben Creasy

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!

Khez
fonte
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

Larry Cai
fonte
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 @-
MaratC
fonte
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 .

jwernerny
fonte
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.

user1050755
fonte
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.

Jimmont
fonte
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

GaneSH Malkar
fonte
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
Katu
fonte
5

Em um navegador da web, visite:

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

Apenas salve o arquivo no seu disco.

Gayan Weerakutti
fonte
resposta incompleta :(
Pradeep Singh
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
Karthick
fonte
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"
Justin Morgan
fonte
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

Guardião
fonte
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);
}
Jitendra Chandani
fonte
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.

parafusos
fonte
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

xxxvodnikxxx
fonte
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

Dixon Joseph Dalmeida
fonte
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.

SwimBikeRun
fonte