Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins复制项目找不到文件夹/multiProjectPipeline/branchWithSlash_Jenkins_Jenkins Pipeline_Jenkins 2 - Fatal编程技术网

Jenkins复制项目找不到文件夹/multiProjectPipeline/branchWithSlash

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的分支和一个

我在Windows Server 2016上安装了Jenkins LTS 2.60.2,并使用以下插件:

  • 文件夹插件(6.1.0)
  • 插件(1.38.1)
  • 管道插件(2.5)+所有相关管道子插件
  • 各种其他依赖插件
有关我的设置的更多详细信息,请参阅,但总而言之,我有以下几项:

  • 游乐场(使用文件夹插件创建的文件夹,用于对以下所有项目进行分组)
  • 前端(多分支管道)
  • 后端(多分支管道)
  • 配置(使用名为BRANCH_NAME的参数的管道)
前端和后端的git回购都有一个名为master的分支和一个名为release/2017.2的分支

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

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

如果分支_NAME参数(或上游管道)为master,则该参数有效。如果分支机构名称为:release/2017.2,则我得到以下错误:

错误:找不到工件副本的项目: 游乐场/前端/版本%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),则无法使用。我做错了什么?你能帮忙吗?当然,如果它是一个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