如何使用perforce作为SCM设置Jenkins管道全局库?

时间:2016-12-06 15:47:50

标签: jenkins jenkins-plugins jenkins-pipeline

我花了很多时间没有任何成功。根据{{​​3}}我应该可以使用任何可用的SCM,但我不知道如何映射路径,在哪里,如果在任何地方,插入$ {library.RegLib.version}或使用什么工作区名称。

我按照上述文档设置了一个库:

<root>/src/org/somelib/MyLib.groovy

包含:

package org.registration;

def doTest() {
    echo "test running..."
}

我尝试了很多不同的东西,但没有任何作用。我还尝试重新启动Jenkins,如上所述this。没有变化。

我的构建报告:

Loading library MyLib@#1
java.lang.ArrayIndexOutOfBoundsException: 1
    at org.jenkinsci.plugins.p4.tasks.AbstractTask.setEnvironment(AbstractTask.java:106)
    at org.jenkinsci.plugins.p4.PerforceScm.checkout(PerforceScm.java:391)
    at org.jenkinsci.plugins.workflow.steps.scm.SCMStep.checkout(SCMStep.java:109)
    at org.jenkinsci.plugins.workflow.libs.SCMSourceRetriever.doRetrieve(SCMSourceRetriever.java:107)
    at org.jenkinsci.plugins.workflow.libs.SCMRetriever.retrieve(SCMRetriever.java:63)
    at org.jenkinsci.plugins.workflow.libs.LibraryAdder.retrieve(LibraryAdder.java:150)
    at org.jenkinsci.plugins.workflow.libs.LibraryAdder.add(LibraryAdder.java:131)
    at org.jenkinsci.plugins.workflow.libs.LibraryDecorator$1.call(LibraryDecorator.java:99)
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1053)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:591)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:569)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:546)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:298)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:268)
    at groovy.lang.GroovyShell.parseClass(GroovyShell.java:688)
    at groovy.lang.GroovyShell.parse(GroovyShell.java:700)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:67)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:429)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:392)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:221)
    at hudson.model.ResourceController.execute(ResourceController.java:98)
    at hudson.model.Executor.run(Executor.java:404)
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: Loading libraries failed

“默认版本”设置为1,因为只有一次提交。我也试过#1。我不知道是映射特定文件还是顶级目录。如果我删除默认版本,则构建失败并抱怨我没有设置版本。它应该是可选的,但显然不是。

我也尝试过使用vars目录

<root>/vars/doTest.groovy

包含:

def call(msg) {
    echo msg
}

但我认为还需要加载库。文档对此不清楚。

因此...

这适用于perforce吗?

如何映射路径以使其有效?

如何使vars中的代码可访问?它是作为整个库的一部分加载的吗?

我的代码中某处有错误吗?

非常感谢。

4 个答案:

答案 0 :(得分:0)

安装Pipeline Shared Libraries插件。

配置在Manage Jenkins中 - &gt;全球管道图书馆

检索方法应为legacy mode。添加存储库

勾选Load implicitly以加载每个版本中的脚本

将groovy文件放在vars / yourGroovy.groovy中并从Jenkinsfile调用它:

yourGroovy()

答案 1 :(得分:0)

p4插件似乎是一个开放的问题,与p4插件无法处理与工作区根目录不同位置的perforce签出有关:

https://issues.jenkins-ci.org/browse/JENKINS-40055

https://issues.jenkins-ci.org/browse/JENKINS-36243

编辑:根据第一期的记者的说法,你可以使用旧的插件版本来使用它:

  

在workflow-cps-global-lib的2.4版本中没有崩溃   开始只在2.5版本中发生。

答案 2 :(得分:0)

这真的很晚,但是我想知道您是否找到了解决方案。

在Amityo的回答中,您评论说您的Perforce源路径为//<prod>/trunk/src/apps/jenkinslib#${library.RegLib.version}/...,如果在管道中未明确指定其他版本,则为${library.RegLib.version} = 1

我认为Jenkins会从字面上查找名为jenkinslib#1的文件夹,因为您的文件夹仅名为jenkinslib,所以找不到该文件夹​​。

我不知道您如何设置结构以支持不同的版本,但是即使配置页面告诉您添加库,在地图中将//<prod>/trunk/src/apps/jenkinslib/...作为源路径也可能有效。 RegLib.version。

我本来会在Amityo的帖子上评论所有这些,但是我没有足够的声誉。

答案 3 :(得分:0)

为了回应#HS10,我这样做了,我一直在意要更新它,以使他人受益多年,但是生活中的其他一切似乎都变得更加重要。既然您已经问过,这就是我所做的。

在Jenkins / Configuration的“全局管道库”下,我设置了以下内容:

enter image description here

具体来说,提供一个function onEachFeature (feature, layer) { layer.on('mouseover', function (e) { e.target.setStyle({ color: "#FF0000" }); }); layer.on('mouseout', function (e) { e.target.setStyle({ color: "#000000" }); }); } 并将Name设置为Default version。将head设置为Retrieval method。 Perforce还没有现代SCM支持。在Legacy SCM下,选择Source Code Management。请注意,这是Perforce Software插件,而不是列为p4的旧Perforce插件。我怀疑使用Perforce自己编写的版本很重要。选择您已配置的凭据,并提供匹配的工作空间名称和映射。我可能不早知道有错。其他设置应由您自行决定。库目录结构与文档相同。我确实有一段时间认为工作空间名称必须为Perforce,但最近的实验似乎证明了这一点。

在您的管道中,像这样导入库:

_global_lib

您现在应该有一个可以使用的库。

我想我也有这个错误。请注意,下划线很重要。有关更多详细信息,请参见“全球图书馆”文档。获得这项工作使我非常痛苦,所以我希望这可以使某人免于遭受类似的经历。