É possível trocar empregos entre dois Jenkins diferentes? Estou procurando uma maneira de exportar / importar trabalhos.
É possível trocar empregos entre dois Jenkins diferentes? Estou procurando uma maneira de exportar / importar trabalhos.
Respostas:
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!
Provavelmente, usar a linha de comando jenkins é outra opção, consulte https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
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
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 @-
http://OLD_JENKINS/job/JOBNAME/config.xml
link no seu navegador para pegar o config.xml
arquivo.
--data-binary
vez de -d
no curl
comando, porque -d
pode atrapalhar o espaço em branco em seus scripts.
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 .
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.xml
neste URL com o parâmetro de consulta name=JOBNAME
. Você precisa enviar um Content-Type: application/xml
cabeçalho. Você receberá 200
código de status se a criação for bem-sucedida ou 4xx/5xx
có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
.
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.
C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
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
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
Em um navegador da web, visite:
http://[jenkinshost]/job/[jobname]/config.xml
Apenas salve o arquivo no seu disco.
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
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"
É muito fácil apenas baixar o nome do plugin
Digite o URL do servidor Remote Jenkins e ele importará os trabalhos automaticamente
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);
}
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.
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 - workspace
pasta), 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 modules
pastas
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
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.