Jenkins 复制工件无法找到 folder/multiProjectPipeline/branchWithSlash
Jenkins Copy Artifact unable to find folder/multiProjectPipeline/branchWithSlash
我在 Windows Server 2016 上安装了 Jenkins LTS 2.60.2 并使用了这些插件:
- 文件夹插件 (6.1.0)
- Copy Artifact 插件 (1.38.1)
- 管道插件 (2.5) + 所有依赖的管道子插件
- 各种其他依赖插件...
有关我的设置的更多详细信息,请参阅 ,但总而言之,我有这些项目:
- 游乐场(使用文件夹插件创建的文件夹,用于对以下所有项目进行分组)
- 前端(多分支管道)
- 后端(多分支管道)
- 配置(带有名为 BRANCH_NAME 的参数的管道)
前端和后端 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
构建也成功完成。
希望这对您有所帮助。我能够正确构建 master
和 release/2017.2
分支,因此我认为项目名称中的 /
没有任何内在问题。您可以在引用的回购协议中看到我的简单 Jenkinsfile
s,并且我使用了与您在问题中发布的相同的管道脚本。
我终于找到问题了。由于编码不正确,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 '**'
}
}
我在 Windows Server 2016 上安装了 Jenkins LTS 2.60.2 并使用了这些插件:
- 文件夹插件 (6.1.0)
- Copy Artifact 插件 (1.38.1)
- 管道插件 (2.5) + 所有依赖的管道子插件
- 各种其他依赖插件...
有关我的设置的更多详细信息,请参阅
- 游乐场(使用文件夹插件创建的文件夹,用于对以下所有项目进行分组)
- 前端(多分支管道)
- 后端(多分支管道)
- 配置(带有名为 BRANCH_NAME 的参数的管道)
前端和后端 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
构建也成功完成。
希望这对您有所帮助。我能够正确构建 master
和 release/2017.2
分支,因此我认为项目名称中的 /
没有任何内在问题。您可以在引用的回购协议中看到我的简单 Jenkinsfile
s,并且我使用了与您在问题中发布的相同的管道脚本。
我终于找到问题了。由于编码不正确,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 '**'
}
}