詹金斯的进出口工作


267

是否可以在两个不同的詹金斯家族之间交换工作?我正在寻找一种导出/导入作业的方法。


2
不是直接回答您问题的方法,而是一些最佳实践:尝试使用Jenkins Pipeline DSL编写您的工作配置,并将其作为项目存储库的一部分。这样,作业可以轻松地从一台Jenkins服务器移植到另一台服务器。参见github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
Michael Lihs,2016年

Answers:


154

Jenkins有一个相当不错的Wiki,尽管您不熟悉CI软件也很难阅读...

他们为在服务器之间移动作业提供了一个简单的解决方案

诀窍可能是需要从Jenkins配置页面重新加载配置。

更新2020.03.10

JenkinsCI的格局已经发生了很大变化……我已经使用Job DSL一段时间了。我们有一个SEED作业,可以生成其余的作业。

这可以帮助我们在需要时为Jenkins服务器重新创建或移动:)您还可以对这些文件进行版本控制,以实现更高的可维护性!


22
因此,您需要访问安装了jenkins的系统?因此,这不是普通用户的答案。
Wouter Schut 2015年

确认,您需要在应用文档所述内容后重新加载Jenkins。
米格尔·奥尔蒂斯

180

可能使用jenkins命令行是另一种选择,请参阅https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI

  • create-job:通过读取stdin作为配置XML文件来创建新作业。
  • get-job:将作业定义XML转储到stdout

所以你可以做

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

它对我来说很好用,我习惯于存储在我的版本控制系统中


3
为此,旧服务器,新服务器和本地计算机上的Java必须具有相同的版本。否则,会出现奇怪的流/版本问题。您的jnlp端口也需要打开。
MaratC

CLI客户端的完整路径是JENKINS_HOME / war / WEB-INF / jenkins-cli.jar,其中JENKINS_HOME是JENKINS_HOME的位置
Rob Kielty

1
此方法在XML中带有裸露的“&”号时会遇到问题,例如在具有&Groovy代码时。
罗伯·基尔蒂

Groovy代码中可能会出现导出的XML中未编码的“&”号,该代码支持Active Choice插件(uno-choice)参数;如果可以的话,将提出解决方案。
罗伯·基尔蒂

1
@information_interchange完全与我在下面的答案中建议的一样。
MaratC

151

单线:

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

带有身份验证:

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

使用Crumb时,如果CSRF处于活动状态(请参阅此处的详细信息):

捏碎:

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

用以下方法涂抹面包屑-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
需要身份验证令牌才能工作,但要做好!
Viroide

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“ Content-Type:application / xml” -d @-<br/>从以下位置获取用户API密钥:JENKIS_URL / user / <USER> / configure > API令牌>显示API令牌
Suhas Gaikwad

1
仅此一项。在发布到目标服务器时,您可能会收到错误代码HTTP 403访问/ createItem时出现问题。原因:请求中未包含有效的面包屑。您需要为目标Jenkins服务器生成CSRF保护令牌。从这个线程按照@Kenorb的建议:stackoverflow.com/questions/38137760/...
Mig82

2
甚至不需要使用curl命令,因为您只需转到http://OLD_JENKINS/job/JOBNAME/config.xml浏览器中的链接即可获取config.xml文件。
entpnerd

1
您需要--data-binary而不是-dcurl命令中,因为这-d可能会弄乱脚本中的空白。
加博尔·萨尔迪


14

转到您的Jenkins服务器的首页,单击页面底部的REST API:

建立工作

要创建新作业,请config.xml使用查询参数张贴到该URL name=JOBNAME。您需要发送Content-Type: application/xml标题。200如果创建成功,则将获得状态代码;如果创建4xx/5xx失败,则将获得状态代码。config.xml是Jenkins用于将项目存储在文件系统中的格式,因此您可以在Jenkins主目录中或通过从中检索现有作业的XML配置来查看它们的示例/job/JOBNAME/config.xml


13

在我的Jenkins实例(1.548版)中,配置文件位于:

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

由jenkins用户和jenkins组拥有644权限。从此处复制文件应该可以。我没有尝试直接更改它,但是从该位置备份了配置,以防需要再次设置项目。


1
在WindowsC:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
萨沙债券

8

Job Import插件是从另一个Jenkins实例导入作业的简便方法。只需要提供源Jenkins实例的URL。远程Jenkins URL可以采用以下任何一种URL:

  • http://$JENKINS -在远程实例上获取所有作业

  • http://$JENKINS/job/$JOBNAME -一份工作

  • http://$JENKINS/view/$VIEWNAME -在特定视图中获得所有工作


6

多亏了Larry Cai的回答,我设法创建了一个脚本来备份我所有的詹金斯工作。我创建了一个每周运行一次的工作。如果有人发现它有用,这里是:

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

Jenkins将作业导出到目录

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

导入工作

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

对于Windows世界中可能没有Bash的那些人,这里是我的PowerShell端口KatuLarry Cai的方法。希望它可以帮助某人。

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

下载插件名称非常简单

作业导入插件

输入您的Remote Jenkins服务器的URL,它将自动导入作业


1
这可能对某些人有用,但对我而言不行。仅当新的Jenkins实例可以直接访问旧的Jenkins实例时,此方法才有效。我的是在两个不同的网络上。
贾斯汀·多姆尼兹

1

简单的PHP脚本为我工作。

出口:

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

进口:

<?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

直接访问机器的最简单方法是将作业文件夹从第一个jenkins复制到另一个文件夹(您可以排除工作空间- workspace文件夹),因为整个作业配置都存储在磁盘上的xml文件中。

然后在新詹金斯 reload configuration在全局设置中(需要管理员访问权限)就足够了,如果还不够,那么您将需要重新启动Jenkins工具。

另一种方法是使用本文上面提到的插件。

编辑:-如果您可能还可以排除modules文件夹


0

手动导入作业:替代方式

将作业上传到Git(版本控制)基本上上传作业的config.xml。

如果是Linux服务器:

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

重新启动詹金斯


0

作为Web用户,可以通过转到作业配置历史记录,然后导出XML进行导出。

我处于无法访问Jenkins正在运行的计算机并想导出为备份计算机的情况。

至于作为Web用户导入xml,我仍然想知道。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.