首页 文章

詹金斯的出口/进口工作

提问于
浏览
230

是否有可能在两个不同的詹金斯之间交换工作?我正在寻找出口/进口工作的方法 .

15 回答

  • 119

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

    然后在新的jenkins中只需在全局设置中重新加载配置(需要管理员访问权限) .

    另一种方法可以是使用上面提到的插件 .

  • 7

    单行:

    $ 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处于活动状态(see details here

    得到面包屑:

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

  • 12

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

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

    由jenkins用户和jenkins组拥有644权限 . 将文件复制到此处以及从此处复制文件应该可行 . 我没有尝试直接更改它,但已经从这个位置备份配置,以防项目需要再次设置 .

  • 4

    简单的PHP脚本为我工作 .

    Export:

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

    Job Import plugin 是从另一个Jenkins实例导入作业的简便方法 . 只需要提供源Jenkins实例的URL . Remote Jenkins URL可以采用以下任何类型的URL:

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

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

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

  • 1

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

    创造工作

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

  • 1

    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
    
  • 23

    Jenkins有一个相当不错的wiki,虽然你刚接触CI软件时很难阅读...

    他们为moving jobs between servers提供了一个简单的解决方案

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

  • 0

    感谢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
    
  • 1

    只需下载插件名称即可

    Job Import Plugin

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

  • 140

    有一个名为Job Import Plugin的插件,可能就是你要找的东西 . 我用过它 . 它确实存在从不允许匿名访问的服务器导入项目的问题 .

    完整性:如果您对两者都有命令行访问权限,则可以执行Khez为Moving, Copying and Renaming Jenkins Jobs提到的过程 .

  • 0

    这不适用于现有的工作,但有Jenkins job builder .

    这允许人们在yaml文件和git repo中保留作业定义,这非常便携 .

  • 0

    手动导入作业:替代方式

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

    如果Linux服务器:

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

    重启詹金斯

  • 6

    可能使用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
    

    它适用于我,我习惯存储在我的版本控制系统内

  • 8

    对于我们这些在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"
    

相关问题