3

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

  • 文件夹插件 (6.1.0)
  • 复制神器插件 (1.38.1)
  • 管道插件(2.5)+所有依赖的管道子插件
  • 各种其他依赖插件...

有关我的设置的更多详细信息,请参阅管道以使用由相同 git 分支名称关联的 2 个项目中的工件,但总而言之,我有以下项目:

  • 游乐场(使用文件夹插件创建的文件夹,用于对以下所有项目进行分组)
  • 前端(多分支管道)
  • 后端(多分支管道)
  • 配置(带有名为 BRANCH_NAME 的参数的管道)

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

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

什么不起作用,我需要你的帮助来解决,是配置管道中从 multibranchPipeline/specificBranch 复制工件的步骤。

如果 BRANCH_NAME 参数(或上游管道)是master它可以工作。如果 BRANCH_NAME 是:release/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 (这是必需的)。

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

谢谢你。

4

2 回答 2

3

我终于找到了问题。由于编码不正确,配置管道未能找到带有斜杠的分支。

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

这(替换/%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之前和固定的项目名称,我注意到差异是%2f 小写的。

大写,像这样:%2F工作:

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

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

node {
  stage('Prepare') {
      def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2F")
      step([$class: 'CopyArtifact', projectName: "${projectname}", selector: [$class: 'StatusBuildSelector', stable: false]])
  }
  stage('Archive') {
      archiveArtifacts '**'
  }
}
于 2017-08-02T12:44:30.153 回答
0

我创建了一个示例项目来尝试重新创建您所看到的内容,并且我能够做到这一点,但我遇到问题的构建master不是release/2017.2. 最终,我意识到我build jobfrontend项目中做错了,它给了我和你一样的错误,因为我还没有完成分支的成功构建frontend/master(我已经完成了release/2017.2分支的成功构建,因为我没有'它configure最初没有触发构建,所以一旦我将它配置为触发构建,它就没有给我同样的错误configure)。

起作用的是将build jobin更改为frontend Jenkinsfile

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分支,所以我认为/项目名称中的 没有任何内在问题。您可以在引用的 repo 中看到我的 simple Jenkinsfiles,并且我使用了与您在问题中发布的相同的管道脚本。

于 2017-07-29T03:58:57.863 回答