在Jenkins输出/导入工作

有可能在两个不同的詹金斯之间交换工作吗?我正在寻找一种输出/输入工作的方法。

360479 次浏览

有一个名为作业导入插件的插件可能就是你要找的。我用过。它确实存在从不允许匿名访问的服务器导入项目的问题。

< p >完整性: 如果你对两者都有命令行访问权限,你可以对移动,复制和重命名詹金斯乔布斯执行Khez已经提到的过程

Jenkins有一个相当不错的wiki,尽管对于CI软件新手来说很难阅读……

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

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

更新2020.03.10

JenkinsCI的景观已经改变了很多…我已经使用DSL的工作一段时间了。 我们有一个SEED Job,它生成其余的Job 这可以帮助我们在需要的时候为Jenkins服务器重新创建或移动:) 您还可以为这些文件设置版本,以获得更好的可维护性!< / p >

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

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

所以你可以

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

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

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

创建工作

要创建一个新作业,将config.xml加上查询参数name=JOBNAME传给这个URL。你需要发送一个Content-Type: application/xml头文件。如果创建成功,你会得到200状态代码,如果创建失败,你会得到4xx/5xx代码。config.xml是Jenkins用来在文件系统中存储项目的格式,所以你可以在Jenkins主目录中看到它们的例子,或者从/job/JOBNAME/config.xml中检索现有作业的XML配置。

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

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

属于jenkins用户和jenkins组,拥有644个权限。将文件复制到这里和从这里复制到这里应该可以工作。我没有尝试直接更改它,但已经从这个地方备份了配置,以防项目需要再次设置。

多亏了Larry Cai的回答,我成功地创建了一个脚本来备份我所有的Jenkins作业。我创建了一个每周运行这个的作业。如果有人发现它有用,这里是:

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

简单的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);
}

这并不适用于现有的作业,但是有詹金斯工作建设者

这允许我们将作业定义保存在yaml文件和git repo中,这是非常可移植的。

一行程序:

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

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

< a href = " https://wiki.jenkins。io/display/JENKINS/Job+Import+Plugin" rel="nofollow noreferrer">Job Import Plugin . io/display/JENKINS/Job+Import+Plugin" rel="nofollow noreferrer">Job Import Plugin . io是这里从另一个Jenkins实例导入作业的简单方法。只需要提供源Jenkins实例的URL。Remote Jenkins URL可以接受以下任何类型的URL:

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

  • http://$JENKINS/job/$JOBNAME -得到一个单一的工作

  • http://$JENKINS/view/$VIEWNAME -获取特定视图中的所有作业

对于我们这些在Windows世界中可能有或没有Bash可用的人来说,这里是我的PowerShell Katu拉里·蔡的方法。希望它能帮助到别人。

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

下载插件名非常简单

< a href = " https://wiki.jenkins。io/display/JENKINS/Job+Import+Plugin" rel="nofollow noreferrer">Job Import Plugin . io/display/JENKINS/Job+Import+Plugin" rel="nofollow noreferrer">Job Import Plugin . io

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

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

然后在新的jenkins中只要reload configuration在全局设置(管理员访问是必需的)应该就足够了,如果不是,那么你将需要重新启动jenkins工具。

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

编辑:

  • 如果你可能也可以排除modules文件夹,如果管道以及共享库文件夹,如workspace@libs

作为web用户,您可以通过转到作业配置历史记录导出XML。

我现在无法访问Jenkins正在运行的机器,我想把它作为备份导出。

至于以web用户身份导入xml,我还是想知道。

在web浏览器中访问:

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

只需将文件保存到磁盘即可。

如果你已经导出了config.xml,那么使用它来导入:

curl -k -X POST 'https:///<user>:<token>@<jenkins_url>/createItem?name=<job_name>' --header "Content-Type: application/xml" -d @config.xml

我通过HTTPS连接,并使用-k禁用证书验证。

  • 是如何在Jenkins上生成用户api令牌。
  • 如果单击Jenkins实例右下角的同名链接,就可以看到Jenkins REST API的详细信息。

2021年和出口&进口过程很痛苦!!

如果您有shell访问两个jenkins实例:旧的和新的,按照这些步骤执行成功的工作迁移:

穿着你的旧内裤

  • 在你的旧Jenkins里找到Jenkins家。通常/var/lib/jenkins。如果你正在使用bitnami: / opt / bitnami这样/ jenkins .
  • 在Jenkins家中,进入工作文件夹
  • 您应该看到带有作业名称的文件夹。在这些文件夹中,您只需要config.xml
  • 备份所有需要的作业。只有文件夹和它的config.xml。还有很多其他文件不是必需的。

在你的新詹金斯:

  • 找到詹金斯家
  • 将作业(以前的备份)复制到jobs文件夹
  • 确保这些新文件夹的用户为“jenkin "作为所有者。如果不使用此:chown jenkins:jenkins /var/lib/jenkins -R
  • 重启詹金斯
  • 解析:选D

根据赞成票和评论的数量,我可以考虑创建一个新插件的可能性:)