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

时间:2017-07-28 15:36:09

标签: jenkins jenkins-pipeline jenkins-2

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

  • 文件夹插件(6.1.0)
  • Copy Artifact插件(1.38.1)
  • 管道插件(2.5)+所有相关管道子插件
  • 各种其他依赖插件......

有关我的设置的详细信息,请参阅Pipeline to use artifacts from 2 projects associated by the same git branch name,但总结一下,我有这些项目:

  • playground(使用Folders插件创建的文件夹,用于对以下所有项目进行分组)
  • 前端(multibranch pipeline)
  • backend(multibranch pipeline)
  • configure(带有名为BRANCH_NAME的参数的管道)

前端和后端 git repos ,都有一个名为 master 的分支和一个名为 release / 2017.2 的分支。

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

什么不起作用,我需要你的帮助才能修复, configure 管道中的步骤是从multibranchPipeline / specificBranch复制工件。

如果BRANCH_NAME参数(或上游管道)是 master ,则可以正常工作。如果BRANCH_NAME是:发布/ 2017.2 ,我收到此错误:

  

错误:无法找到工件副本的项目:   playground / frontend / release%2f2017.2这可能是因为项目不正确   名称或权限设置;在工作中查看项目名称的帮助   组态。完成:失败

配置管道如下所示:

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替换/(需要它)。

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

谢谢。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

更新:实际上,我进一步调查并在echo "${projectname}"之前添加step,使用之前和已修复的项目名称,我注意到差异为{{ 1}} 小写

大写,如下所示:%2f有效:

%2F

因此,修复的 configure 管道看起来像这样(我保留了我的替换功能,这对我来说已经足够了):

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

答案 1 :(得分:0)

我创建了一个sample project来尝试重新创建你所看到的内容,而且我能够以一种时尚的方式这样做,除了我遇到麻烦的构建版本是master而不是release/2017.2。最后,我意识到我在build job项目中错误地执行了frontend,并且它给了我与您相同的错误,因为我还没有完成{{{}的成功构建1}} branch(我已经完成了frontend/master分支的成功构建,因为我最初没有触发release/2017.2构建,所以它没有给我同样的错误一旦我配置它以触发configure构建)。

configure build job中的frontend更改为此内容有效:

Jenkinsfile

添加build job: 'playground/configure', parameters: [[$class: 'StringParameterValue', name: 'BRANCH_NAME', value: env.BRANCH_NAME]], quietPeriod: 2, wait: false会在完成上一份工作之间留出几秒钟的安静时间(我不确定这是否至关重要,但似乎它可能是一个很好的故障保护,对于尝试并确保有足够的时间来完成构建),但重要的部分是quietPeriod,它指示Jenkins这个构建不应该等待触发的构建完成。更改后,wait: false分支成功完成,并且触发的frontend/master版本也成功完成。

希望这会有所帮助。我能够让我的configuremaster分支机构正确构建,因此我不相信项目名称中release/2017.2存在任何内在问题。您可以在引用的repo中看到我的简单/,并且我使用了与您在问题中发布的相同的管道脚本。