【问题标题】:Export/import jobs in JenkinsJenkins 中的导出/导入作业
【发布时间】:2012-01-15 11:46:11
【问题描述】:

是否可以在 2 个不同的 Jenkins 之间交换工作?我正在寻找一种导出/导入作业的方法。

【问题讨论】:

  • 不是直接回答您的问题,而是一些最佳实践:尝试使用 Jenkins Pipeline DSL 编写您的工作配置,并将其作为项目存储库的一部分。像这样,这些工作很容易从一个 Jenkins 服务器移植到另一个。见github.com/jenkinsci/pipeline-plugin/blob/master/TUTORIAL.md
  • 还可以使用建议“Thinbackup”插件(不仅适用于作业,而且所有其他配置都可以与历史记录一起迁移。

标签: jenkins


【解决方案1】:

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

然后在新的 jenkins 中只需在全局设置中 reload configuration(需要管理员访问权限)就足够了,如果没有,则需要重新启动 Jenkins 工具。

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

编辑:

  • 如果您还可以排除 modules 文件夹,如果是管道以及共享库文件夹,例如 workspace@libs

【讨论】:

    【解决方案2】:

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

    如果您对两个 jenkins 实例都有 shell 访问权限:旧的和新的,请按照以下步骤执行成功的作业迁移:

    在你的旧詹金斯

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

    在你的新詹金斯:

    • 找到詹金斯的家
    • 将您的作业(以前的备份)复制到作业文件夹
    • 确保这些新文件夹的所有者是用户“jenkins”。如果不使用这个:chown jenkins:jenkins /var/lib/jenkins -R
    • 重启詹金斯
    • 使用你的工作:D

    根据赞成票或 cmets 的数量,我认为有可能创建一个新插件 :)

    【讨论】:

      【解决方案3】:

      如果你已经导出了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 禁用证书验证。

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

      【讨论】:

        【解决方案4】:

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

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

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

        2020.03.10 更新

        JenkinsCI 环境发生了很大变化……我使用Job DSL 已经有一段时间了。 我们有一个 SEED Job 来生成其余的作业。

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

        【讨论】:

        • 所以你需要访问安装 jenkins 的系统吗?所以这不是普通用户的答案。
        • 确认,应用文档内容后需要重新加载Jenkins。
        【解决方案5】:

        在网络浏览器中访问:

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

        只需将文件保存到您的磁盘。

        【讨论】:

        • 不完整的答案 :(
        • 这似乎重复了 MaratC 的旧答案,但前提是您熟悉 curl 等。
        【解决方案6】:

        单行:

        $ 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应用碎屑:

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

        【讨论】:

        • 需要身份验证令牌才能工作,但钢铁做得很好!
        • curl -s http://:@OLD_JENKINS/job/JOBNAME/config.xml | curl -X POST 'http://:@NEW_JENKINS/createItem?name=JOBNAME' --header "Content-Type: application/xml" -d @-
          获取用户 API 密钥: JENKIS_URL/user/<USER>/configure > API 令牌 > 显示 API 令牌
        • 对此仅作了额外的贡献。 POST 到目标服务器时,您可能会收到错误代码 HTTP 403 访问 /createItem 时出现问题。原因:请求中没有包含有效的碎屑。您需要为目标 Jenkins 服务器生成 CSRF 保护令牌。遵循此线程中@Kenorb 的建议:stackoverflow.com/questions/38137760/…
        • 甚至不需要使用 curl 命令,因为您只需转到浏览器中的http://OLD_JENKINS/job/JOBNAME/config.xml 链接即可获取config.xml 文件。
        • 您需要在curl 命令中使用--data-binary 而不是-d,因为-d 可能会弄乱脚本中的空白。
        【解决方案7】:

        作为网络用户,您可以通过转到作业配置历史记录,然后导出 XML 来导出。

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

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

        【讨论】:

          【解决方案8】:

          手动导入作业:替代方式

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

          如果是 Linux 服务器:

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

          重启 Jenkins

          【讨论】:

            【解决方案9】:

            下载插件名很简单

            Job Import Plugin

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

            【讨论】:

            • 这可能适用于某些人,但不适用于我。这仅在新的 Jenkins 实例可以直接访问旧的 Jenkins 实例时才有效。我的在两个不同的网络上。
            【解决方案10】:

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

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

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

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

            【讨论】:

              【解决方案11】:

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

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

              【讨论】:

                【解决方案12】:

                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
                

                【讨论】:

                  【解决方案13】:

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

                  创建工作

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

                  【讨论】:

                    【解决方案14】:

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

                    这允许将作业定义保存在 yaml 文件和非常便携的 git 存储库中。

                    【讨论】:

                      【解决方案15】:

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

                      【讨论】:

                        【解决方案16】:

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

                        【讨论】:

                          【解决方案17】:

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

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

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

                          【讨论】:

                          • 在 Windows 中 C:\Users\{admin-user}\.jenkins\jobs\-the-project-name-\config.xml
                          • 在 Windows 上使用 Jenkins 2.263.1 C:\Users\{admin-user}\AppData\Local\Jenkins\.jenkins\jobs\{project-name}\config.xml
                          【解决方案18】:

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

                          • create-job:通过将标准输入读取为配置 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
                          

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

                          【讨论】:

                          • 为此,您的旧服务器、新服务器和本地计算机上的 java 需要具有相同的版本。否则,会出现奇怪的流/版本问题。你的 jnlp 端口也需要打开。
                          • CLI 客户端的完整路径是 JENKINS_HOME/war/WEB-INF/jenkins-cli.jar,其中 JENKINS_HOME 是 JENKINS_HOME 的位置
                          • 此方法在 XML 中的裸 & 符号存在问题,例如当您在 Groovy 代码中有 & 时。
                          • 导出的 XML 中未编码的 & 符号可能出现在支持 Active Choice Plugin (uno-choice) 参数的 Groovy 代码中;如果可以的话,我会提出解决方案。
                          • @information_interchange 完全按照我在下面的回答中提出的建议。
                          【解决方案19】:

                          有一个名为Job Import Plugin 的插件可能是您正在寻找的。我已经用过了。从不允许匿名访问的服务器导入项目确实存在问题。

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

                          【讨论】:

                          • 我不相信它目前除了配置之外不会移动任何东西。
                          猜你喜欢
                          • 2014-07-22
                          • 1970-01-01
                          • 2016-11-29
                          • 2020-06-20
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多