Jenkins 复制工件无法找到 folder/multiProjectPipeline/branchWithSlash

Jenkins Copy Artifact unable to find folder/multiProjectPipeline/branchWithSlash

我在 Windows Server 2016 上安装了 Jenkins LTS 2.60.2 并使用了这些插件:

有关我的设置的更多详细信息,请参阅 ,但总而言之,我有这些项目:

前端和后端 git repos,都有一个分支叫 master 和一个叫 release/2017.2.

想法是在每次成功构建后自动调用 configure 管道,传递 git 分支名称。自动触发 configure 管道工作。

什么不起作用,我需要你的帮助来修复,是 configure 管道中从 multibranchPipeline/specificBranch.[=16 复制工件的步骤=]

如果 BRANCH_NAME 参数(或上游管道)是 master 则它可以工作。如果 BRANCH_NAME 是:release/2017.2 我得到这个错误:

ERROR: Unable to find project for artifact copy: playground/frontend/release%2f2017.2 This may be due to incorrect project name or permission settings; see help for project name in job configuration. Finished: FAILURE

配置管道如下所示:

node {
  stage('Prepare') {
      def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2f")
      step([$class: 'CopyArtifact', projectName: "${projectname}", selector: [$class: 'StatusBuildSelector', stable: false]])
  }
  stage('Archive') {
      archiveArtifacts '**'
  }
}

如您所见,我已经将 / 替换为 %2f(这是必需的)。

如果我不使用 "playground" 文件夹(我所有的管道都按原样,不在文件夹项目中),它就可以工作。如果我使用该文件夹并使用 master 分支,它就可以工作。如果我使用文件夹和像 2017.2 这样的分支名称,它就不起作用。我究竟做错了什么?你能帮忙让它工作吗?好吧,如果它是一个错误(我在 https://issues.jenkins-ci.org 中搜索并发现了一些错误,其中类似的文件夹设置不起作用,但它们已被修复......所以我真的很想知道......)在复制工件中插件,请提交错误并在此处分享 link,以便我们都可以监控其进度...

谢谢。

我创建了一个 sample project 来尝试重新创建您所看到的内容,并且我能够以某种方式做到这一点,除了我遇到问题的构建是 master而不是 release/2017.2。最终,我意识到我在 frontend 项目中错误地执行了 build job,并且它给了我和你一样的错误,因为我还没有完成 frontend/master 的成功构建] 分支(我已经完成了 release/2017.2 分支的成功构建,因为我最初没有触发 configure 构建,所以一旦我将它配置为触发 configure 构建)。

有效的方法是将 frontend Jenkinsfile 中的 build job 更改为:

build job: 'playground/configure', parameters: [[$class: 'StringParameterValue', name: 'BRANCH_NAME', value: env.BRANCH_NAME]], quietPeriod: 2, wait: false

添加 quietPeriod 在完成上一个作业之间提供几秒钟的安静时间(我不确定这是否重要,但看起来它可能是一个很好的故障保险,以尝试并确保有足够的时间来完成构建),但重要的部分是 wait: false,它指示 Jenkins 此构建不应等待触发的构建完成。更改后,frontend/master 分支成功完成,它触发的 configure 构建也成功完成。

希望这对您有所帮助。我能够正确构建 masterrelease/2017.2 分支,因此我认为项目名称中的 / 没有任何内在问题。您可以在引用的回购协议中看到我的简单 Jenkinsfiles,并且我使用了与您在问题中发布的相同的管道脚本。

我终于找到问题了。由于编码不正确,configure 管道无法找到带有斜杠的分支。

所以,在我的问题中,在 configure 管道中:

这个(将 / 替换为 %2f)是错误的并生成 error:

def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2f")

这是对斜杠进行编码的正确方法,有效:

def projectname = "playground/frontend/" +  URLEncoder.encode("${BRANCH_NAME}", "UTF-8").replace("+", "%20")

感谢:http://www.pipegrep.se/copy-artifacts-from-jenkins-pipeline-jobs.html

UPDATE:实际上,我进行了更深入的调查,并在 step 之前添加了 echo "${projectname}",以及之前的固定项目名称,我注意到区别是 %2f 小写.

大写,像这样:%2F 有效:

def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2F")

所以,固定的 configure 管道看起来像这样(我保留了我的替换功能,这对我的情况来说已经足够了):

node {
  stage('Prepare') {
      def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2F")
      step([$class: 'CopyArtifact', projectName: "${projectname}", selector: [$class: 'StatusBuildSelector', stable: false]])
  }
  stage('Archive') {
      archiveArtifacts '**'
  }
}