【问题标题】:Jenkins pipeline, how can I copy artifact from previous build to current build?Jenkins管道,如何将工件从以前的构建复制到当前构建?
【发布时间】:2019-02-21 15:11:45
【问题描述】:

在 Jenkins Pipeline 中,如何将工件从以前的构建复制到当前构建? 即使之前的构建失败,我也想这样做。

【问题讨论】:

    标签: jenkins jenkins-pipeline


    【解决方案1】:

    Stuart Rowe 还向我推荐了Pipeline Authoring Sig Gitter channel 上的那个我看的Copy Artifact Plugin,还给了我一些示例Jenkins Pipeline syntax to use

    根据他给出的建议,我想出了这个更完整的 Pipeline 示例 它将先前构建中的工件复制到当前构建中, 之前的构建是成功还是失败。

    pipeline {
        agent any;
    
        stages {
            stage("Zeroth stage") {
                steps {
                    script {
                        if (currentBuild.previousBuild) {
                            try {
                                copyArtifacts(projectName: currentBuild.projectName,
                                              selector: specific("${currentBuild.previousBuild.number}"))
                                def previousFile = readFile(file: "usefulfile.txt")
                                echo("The current build is ${currentBuild.number}")
                                echo("The previous build artifact was: ${previousFile}")
                            } catch(err) {
                                // ignore error
                            }
                        }
                    }
                }
            }
    
            stage("First stage") {
                steps {
                    echo("Hello")
                    writeFile(file: "usefulfile.txt", text: "This file ${env.BUILD_NUMBER} is useful, need to archive it.")
                    archiveArtifacts(artifacts: 'usefulfile.txt')
                }
            }
    
            stage("Error") {
                steps {
                    error("Failed")
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      假设你想要一个来自之前构建的文件,你甚至可以在调用 mvn 之前使用 curl 将文件放置在工作区中。

      stage('Copy csv') {
                  steps {
                         sh "mkdir -p ${env.WORKSPACE}/dump"
                          sh "curl http://<jenkins-url>:<port>/job/<job-folder>/job/<job-name>/job/<release>/lastSuccessfulBuild/artifact/dump/sample.csv/*view*/ -o ${env.WORKSPACE}/dump/sample.csv"
                  }
              }    
      

      谢谢, 阿什什

      【讨论】:

      • 如果您的 jenkins 需要身份验证,您可以按照this question 中的说明在 url 上传递凭据
      【解决方案3】:

      【讨论】:

      • 是的,可以使用 Copy Artifact 插件,但是如何使用呢?所有示例都指向从其他 Jenkins 作业复制工件,而不是从同一 Jenkins 作业的先前版本中复制。另外,如何在 Pipeline 脚本中做到这一点?不是通过 Freestyle 作业中的菜单配置?
      • stage('Copy') { copyArtifacts filter: '**/*.json', projectName: 'pipeline-test', selector: lastSuccessful(), target: 'dest' } 项目名称可以是任何工作。甚至同样获得之前构建的神器
      • 从控制器到代理遍历网络时,copyArtifact 插件的 io 性能非常糟糕。您将使用 sh/curl 获得更快的吞吐量,尤其是对于较大的工件文件和更快的网络链接。 Ashish 的第一个答案应该被接受。
      猜你喜欢
      • 2017-07-28
      • 2020-02-19
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多