在jenkins出口/import工作

是否有可能在两个不同的Jenkins之间交换工作? 我正在寻找一种出口/import作业的方式。

jenkins有一个相当不错的wiki,虽然很难读懂,当你是新的CI软件…

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

诀窍可能是需要从Jenkinsconfiguration页面重新加载configuration。

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

  • create-job:通过将stdin读取为configurationXML文件来创build新的作业。
  • 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 

它对我来说工作正常,我习惯在我的版本控制系统里面存储

单线:

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


authentication

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

有一个名为Job Import Plugin的插件 ,可能是你正在寻找的。 我用过了。 从不允许匿名访问的服务器导入项目时会遇到问题。

完整性:如果您有两个命令行访问权限,您可以执行Khez提到的移动,复制和重命名Jenkins作业的过程 。

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

创build工作

要创build新作业, config.xml发布到此查询参数name=JOBNAME URL。 你需要发送一个Content-Type: application/xml头。 如果创build成功,您将获得200状态码,如果失败,您将获得4xx/5xx码。 config.xml是Jenkins用于将项目存储在文件系统中的格式,因此您可以在Jenkins主目录中查看它们的示例,或者从/job/JOBNAME/config.xml检索现有作业的XMLconfiguration。

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

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

由jenkins用户和jenkins组拥有644权限。 复制文件和从这里应该工作。 我还没有尝试过直接改变它,但是如果项目需要重新设置的话,已经从这个地方备份了configuration。

作业导入插件是在这里从另一个Jenkins实例导入作业的简单方法。 只需要提供源Jenkins实例的URL即可。 远程Jenkins URL可以使用以下任何types的URL:

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

  • http://$JENKINS/job/$JOBNAME – 获取单个作业

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

感谢Larry Cai的回答,我设法创build了一个脚本来备份我所有的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 

Jenkins将作业导出到一个目录

  #! /bin/bash SAVEIFS=$IFS IFS=$(echo -en "\n\b") declare -ij=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 

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

import:

 <?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的工作build设者 。

这允许保持作业定义在yaml文件和一个非常便携的git仓库中。

对于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" 

只需下载插件名称就很容易了

作业导入插件

input您的远程Jenkins服务器的URL,它将自动导入作业