首页 文章

在jenkins管道脚本中找不到文件

提问于
浏览
0

我正在尝试在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(没有这样的文件或目录)java.io.FileInputStream.open0(Native Method)at java.io.FileInputStream . 开(FileInputStream.java:195)在java.io.FileInputStream中 . (FileInputStream.java:138)在groovy.util.CharsetToolkit . (CharsetToolkit.java:71)在org.codehaus.groovy.runtime.ResourceGroovyMethods.newReader( ResourceGroovyMethods.java:1572)维持在org.codehaus在org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation.asCollection(DefaultTypeTransformation.java:461 org.codehaus.groovy.runtime.ResourceGroovyMethods.readLines(ResourceGroovyMethods.java:533)) .groovy.runtime.DefaultGroovyMethods.iterator(DefaultGroovyMethods.java:15955)在org.codehaus.groovy.runtime.dgm $ 367.doMethodInvoke(来源不明)在groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1213)在常规 . lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)org.codehaus.groovy.runtime.InvokerHel per.invokePojoMethod(InvokerHelper.java:913)在org.codehaus.groovy.runtime.InvokerHelper.invokeMethod(InvokerHelper.java:904)在org.codehaus.groovy.runtime.InvokerHelper.asIterator(InvokerHelper.java:573)在组织位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)的org.codehaus.groovy.runtime.callsite.AbstractCallSite上的.codehaus.groovy.runtime.InvokerHelper $ asIterator.call(未知来源) . 呼叫(AbstractCallSite.java:113)在com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)在com.cloudbees.groovy.cps.CpsDefaultGroovyMethods.each(CpsDefaultGroovyMethods:1890)在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.j AVA:82)在sun.reflect.GeneratedMethodAccessor324.invoke(未知来源)在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在java.lang.reflect.Method.invoke(Method.java:498)在玉米.cloudbees.groovy.cps.impl.ContinuationPtr $ ContinuationImpl.receive(ContinuationPtr.java:72)位于com.cloudbees.groovy的com.cloudbees.groovy.cps.impl.LocalVariableBlock $ LocalVariable.get(LocalVariableBlock.java:39) .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)com.cloudbees.groovy.cps.LValueBlock.eval(LValueBlock.java:16)位于com.cloudbees的com.cloudbees.groovy.cps.Next.step(Next.java:83) . 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( GroovyCate gorySupport.java:129)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)atg.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:332)org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access位于org.jenkinsci.plugins.workflow.cps.CpsThreadGroup $ 2.call(CpsThreadGroup.java)的org.jenkinsci.plugins.workflow.cps.CpsThreadGroup $ 2.call(CpsThreadGroup.java:244)$ 200(CpsThreadGroup.java:83) 232)atg.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)jenkins.util.ContextResettingExecutorService $ 1.run(ContextResettingExecutorService.java:28)jenkins.security.ImpersonatingExecutorService $ 1.run(Imperson) atingExecutorService.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)java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:624)at java.lang.Thread.run(Thread.java:748)已完成:FAILURE

sh“cat $ env.SERVICE_VERSIONS_FILE”返回正确的结果(IE . 它打印文件的内容)管道在主服务器上执行时工作正常 . 感觉我可能会遗漏一些灾难性的简单事情?还是一个bug?

2 回答

  • 0

    我不是真的确定它是如何工作或为什么工作,但我发现这个https://stackoverflow.com/a/38679858/985291并设法通过使用提到的readFile步骤https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/#readfile-read-file-from-workspace来解决问题 .

    所以基本上,改变

    new File(env.SERVICE_VERSIONS_FILE).each { line ->
    

    readFile(env.SERVICE_VERSIONS_FILE).split("\n").each { line ->
    

    它的工作原理 .

  • 0

    确认service_versions.csv位于源代码管理中并首先签出到Jenkins工作区 .

    Jenkins中的主从机制以及将作业绑定到从属服务器的操作应确保将工作空间复制到从属服务器 . 您应该在文件系统下的位置下看到一个工作空间,以配置从属存储文件 . 您应该可以在Manage Jenkins> Manage Nodes页面上找到它,然后查看节点的属性 .

    如果您的文件是.NET解决方案的一部分,并且文件属性未设置为“始终复制”,则您还可以看到这些类型的问题 .

    Update based on your comment:

    你的猫行在env前面包含一个'$'字符,但下一行没有它:

    new File(env.SERVICE_VERSIONS_FILE).each { line ->
    

    看起来你在这行的env前面缺少'$',它应该是:

    new File(${env.SERVICE_VERSIONS_FILE}).each { line ->
    

相关问题