jenkins-pipeline - 在 Jenkins 管道脚本中找不到文件
问题描述
我正在尝试让当前在我们的 Jenkins 主机上运行的管道脚本,在远程 Jenkins 节点上执行。但我越来越奇怪FileNotFound
例外。
我能够重现该问题的管道的最基本版本是:
node("remoteNode") {
env.SERVICE_VERSIONS_FILE = pwd() + '/service_versions.csv'
stage('Read file') {
git credentialsId: '***', url: '***'
sh "cat $env.SERVICE_VERSIONS_FILE"
new File(env.SERVICE_VERSIONS_FILE).each { line ->
echo "$line"
}
}
}
结果是:
>java.io.FileNotFoundException: /home/***/workspace/DeploymentPipelines/test-deployer/service_versions.csv
> (No such file or directory) at java.io.FileInputStream.open0(Native
> Method) at java.io.FileInputStream.open(FileInputStream.java:195) at
> java.io.FileInputStream.<init>(FileInputStream.java:138) at
> groovy.util.CharsetToolkit.<init>(CharsetToolkit.java:71) at
> org.codehaus.groovy.runtime.ResourceGroovyMethods.newReader(ResourceGroovyMethods.java:1572)
> at
> org.codehaus.groovy.runtime.ResourceGroovyMethods.readLines(ResourceGroovyMethods.java:533)
> at
> org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.asCollection(DefaultTypeTransformation.java:461)
> at
> org.codehaus.groovy.runtime.DefaultGroovyMethods.iterator(DefaultGroovyMethods.java:15955)
> at org.codehaus.groovy.runtime.dgm$367.doMethodInvoke(Unknown Source)
> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)
> at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
> at
> org.codehaus.groovy.runtime.InvokerHelper.invokePojoMethod(InvokerHelper.java:913)
> at
> org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:904)
> at
> org.codehaus.groovy.runtime.InvokerHelper.asIterator(InvokerHelper.java:573)
> at org.codehaus.groovy.runtime.InvokerHelper$asIterator.call(Unknown
> Source) at
> org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
> at
> org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
> at
> com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)
> at
> com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.each(CpsDefaultGroovyMethods:1890)
> at WorkflowScript.run(WorkflowScript:8) at
> ___cps.transform___(Native Method) at com.cloudbees.groovy.cps.impl.ContinuationGroup.methodCall(ContinuationGroup.java:57)
> at
> com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:109)
> at
> com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:82)
> at sun.reflect.GeneratedMethodAccessor324.invoke(Unknown Source) at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> at java.lang.reflect.Method.invoke(Method.java:498) at
> com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
> at
> com.cloudbees.groovy.cps.impl.LocalVariableBlock$LocalVariable.get(LocalVariableBlock.java:39)
> at
> com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
> at
> com.cloudbees.groovy.cps.impl.LocalVariableBlock.evalLValue(LocalVariableBlock.java:28)
> at
> com.cloudbees.groovy.cps.LValueBlock$BlockImpl.eval(LValueBlock.java:55)
> at com.cloudbees.groovy.cps.LValueBlock.eval(LValueBlock.java:16) at
> com.cloudbees.groovy.cps.Next.step(Next.java:83) at
> com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174) at
> com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163) at
> org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:129)
> at
> org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:268)
> at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
> at
> org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:182)
> at
> org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:332)
> at
> org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:83)
> at
> org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:244)
> at
> org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:232)
> at
> org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266) at
> hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
> at
> jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
> at
> jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:59)
> at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
> at java.util.concurrent.FutureTask.run(FutureTask.java:266) at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
> at java.lang.Thread.run(Thread.java:748) Finished: FAILURE
这sh "cat $env.SERVICE_VERSIONS_FILE"
结果(即 - 它打印文件的内容)。
在主服务器上执行时,管道工作正常。感觉我可能错过了一些极其简单的东西?或者它是一个错误?
解决方案
我不太确定它是如何工作或为什么工作的,但我发现了这个https://stackoverflow.com/a/38679858/985291并通过使用 readFile 步骤https://jenkins.io/doc/设法解决了这个问题提到了管道/步骤/工作流程基本步骤/#readfile-read-file-from-workspace。
所以基本上,改变
new File(env.SERVICE_VERSIONS_FILE).each { line ->
至
readFile(env.SERVICE_VERSIONS_FILE).split("\n").each { line ->
它有效。
编辑 正如@zett42 在他们的评论中提到的,这显然是设计使然,在处理文件时您应该只使用构建步骤(readFile,writeFile)。(https://issues.jenkins-ci.org/browse/JENKINS-37577?focusedCommentId=267445&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-267445)
推荐阅读
- qt - Qt QGridLayout 元素的宽度和高度相同,
- java - 我们如何使用 Java 迭代大小约为 2 GB 的 JSON 文件
- vue.js - 嵌套路由的Vue路由器问题
- elasticsearch - 在 linux 中启动服务后,Kibana 服务永远不会运行
- jira - JIRA Core:编辑问题状态时出现错误
- javascript - 单击下一个和上一个按钮 FullCalendar 进入议程视图
- python - 在 Python 中用子文件夹的名称填充列?
- android - 如何在 google play 控制台中声明 webview 所有权?
- ios - 排毒 - 请求被服务委托 (PBProcessManager) 拒绝,原因是:安全
- android - 切换小部件 textOn 和 textOff 文本未以小写形式显示