Jenkins复制项目找不到文件夹/multiProjectPipeline/branchWithSlash
我在Windows Server 2016上安装了Jenkins LTS 2.60.2,并使用以下插件:Jenkins复制项目找不到文件夹/multiProjectPipeline/branchWithSlash,jenkins,jenkins-pipeline,jenkins-2,Jenkins,Jenkins Pipeline,Jenkins 2,我在Windows Server 2016上安装了Jenkins LTS 2.60.2,并使用以下插件: 文件夹插件(6.1.0) 插件(1.38.1) 管道插件(2.5)+所有相关管道子插件 各种其他依赖插件 有关我的设置的更多详细信息,请参阅,但总而言之,我有以下几项: 游乐场(使用文件夹插件创建的文件夹,用于对以下所有项目进行分组) 前端(多分支管道) 后端(多分支管道) 配置(使用名为BRANCH_NAME的参数的管道) 前端和后端的git回购都有一个名为master的分支和一个
- 文件夹插件(6.1.0)
- 插件(1.38.1)
- 管道插件(2.5)+所有相关管道子插件
- 各种其他依赖插件
- 游乐场(使用文件夹插件创建的文件夹,用于对以下所有项目进行分组)
- 前端(多分支管道)
- 后端(多分支管道)
- 配置(使用名为BRANCH_NAME的参数的管道)
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),则无法使用。我做错了什么?你能帮忙吗?当然,如果它是一个bug(我在搜索中发现了一些类似的文件夹设置不起作用的bug,但是它们已经被修复了…所以我真的想知道…)在复制工件插件中,请将bug归档并在这里共享链接,这样我们都可以监控它的进度
谢谢。我创建了一个新版本来尝试重新创建您看到的内容,而且我能够以一种方式这样做,只是我遇到问题的版本是master
,而不是release/2017.2
。最后,我意识到我在frontend
项目中执行的构建工作不正确,它给了我与您相同的错误,因为我从未成功完成frontend/master
分支的构建(我已经成功地完成了release/2017.2
分支的构建,因为我最初没有让它触发configure
构建,所以一旦我将其配置为触发configure
构建,它就不会给我同样的错误)
有效的方法是将前端
jenkins文件
中的构建作业
更改为:
生成作业:“游乐场/配置”,参数:[$class:'StringParameterValue',名称:'BRANCH_name',值:env.BRANCH_name]],静止期:2,等待:false
添加quietPeriod
可以在完成上一个作业之间留出几秒钟的安静时间(我不确定这是否关键,但这似乎是一个很好的故障保护,可以尝试确保有足够的时间完成构建),但重要的部分是wait:false
,它指示Jenkins这个构建不应该等待触发的构建完成。一旦我改变了这一点,frontend/master
分支成功完成,它触发的configure
构建也成功完成
希望这能有所帮助。我能够让我的master
和release/2017.2
分支正确构建,因此我不认为项目名称中的/
有任何内在问题。你可以在引用的repo中看到我的简单Jenkinsfile
,我使用了与你发布的相同的管道脚本在您的问题中。我终于找到了问题。配置管道无法找到带有斜杠的分支,因为编码不正确
因此,在我的问题中,在配置管道中:
这(将/
替换为%2f
)是错误的,并生成错误:
def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2f")
def projectname = "playground/frontend/" + URLEncoder.encode("${BRANCH_NAME}", "UTF-8").replace("+", "%20")
这是对斜杠进行编码的正确方法,它可以正常工作:
def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2f")
def projectname = "playground/frontend/" + URLEncoder.encode("${BRANCH_NAME}", "UTF-8").replace("+", "%20")
归功于:
更新:事实上,我做了进一步的调查,在步骤
之前添加了echo“${projectname}”
,使用了以前的固定项目名,我注意到差异是%2f
小写
大写,如下:%2F
工作:
def projectname = "playground/frontend/" + "${BRANCH_NAME}".replace("/", "%2F")
因此,固定配置管道看起来是这样的(我保留了replace函数,这对于我的情况来说已经足够了):
也可能是我遇到了一个稍有不同的错误,这无法解决您的问题。不过,它确实表明您尝试执行的操作是可行的。感谢您的回答Kdawg,可能我没有指定,但问题出在配置作业中。我成功运行了前端作业(调用configure的最后一部分使用了try-and-catch,因此即使失败,构建也会标记为成功),然后我通过指定参数“release/2017.2”再次运行配置作业这就是错误显示的地方。在我的设置中,我没有使用github,而是使用gerrit作为git存储库。可能在github上它可以工作,但在其他git服务器上它不能工作?Kdawg、quietPeriod和wait帮助以加快构建并避免使用try/catch,但是配置管道总是会失败,出现以下错误:错误:无法找到art的项目ifact副本:游乐场/前端/发布%2f201