是否可以在两个不同的詹金斯家族之间交换工作?我正在寻找一种导出/导入作业的方法。
是否可以在两个不同的詹金斯家族之间交换工作?我正在寻找一种导出/导入作业的方法。
Answers:
Jenkins有一个相当不错的Wiki,尽管您不熟悉CI软件也很难阅读...
他们为在服务器之间移动作业提供了一个简单的解决方案
诀窍可能是需要从Jenkins配置页面重新加载配置。
更新2020.03.10
JenkinsCI的格局已经发生了很大变化……我已经使用Job DSL一段时间了。我们有一个SEED作业,可以生成其余的作业。
这可以帮助我们在需要时为Jenkins服务器重新创建或移动:)您还可以对这些文件进行版本控制,以实现更高的可维护性!
可能使用jenkins命令行是另一种选择,请参阅https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI
所以你可以做
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
它对我来说很好用,我习惯于存储在我的版本控制系统中
单线:
$ 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 @-
http://OLD_JENKINS/job/JOBNAME/config.xml
浏览器中的链接即可获取config.xml
文件。
--data-binary
而不是-d
在curl
命令中,因为这-d
可能会弄乱脚本中的空白。
您可能正在寻找一个名为Job Import Plugin的插件。我用过了 从不允许匿名访问的服务器导入项目时确实存在问题。
出于完整性考虑:如果您具有命令行访问权,则可以执行Khez提到的“ 移动,复制和重命名Jenkins Jobs”过程。
Job Import插件是从另一个Jenkins实例导入作业的简便方法。只需要提供源Jenkins实例的URL。远程Jenkins URL可以采用以下任何一种URL:
http://$JENKINS
-在远程实例上获取所有作业
http://$JENKINS/job/$JOBNAME
-一份工作
http://$JENKINS/view/$VIEWNAME
-在特定视图中获得所有工作
多亏了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
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
对于Windows世界中可能没有Bash的那些人,这里是我的PowerShell端口Katu和Larry 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"
简单的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);
}
直接访问机器的最简单方法是将作业文件夹从第一个jenkins复制到另一个文件夹(您可以排除工作空间- workspace
文件夹),因为整个作业配置都存储在磁盘上的xml文件中。
然后在新詹金斯 reload configuration
在全局设置中(需要管理员访问权限)就足够了,如果还不够,那么您将需要重新启动Jenkins工具。
另一种方法是使用本文上面提到的插件。
编辑:-如果您可能还可以排除modules
文件夹
手动导入作业:替代方式
将作业上传到Git(版本控制)基本上上传作业的config.xml。
如果是Linux服务器:
cd /var/lib/jenkins/jobs/<Job name>
Download the config.xml from Git
重新启动詹金斯