代码之家  ›  专栏  ›  技术社区  ›  vruum

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

  •  0
  • vruum  · 技术社区  · 6 年前

    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" 返回正确的结果(即打印文件的内容)。

    在主机上执行时,管道工作正常。感觉好像我错过了一些灾难般简单的东西?还是虫子?

    2 回复  |  直到 3 年前
        1
  •  8
  •   vruum    4 年前

    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 ->
    

    而且很有效。

    编辑 正如@zett42在他们的评论中提到的,这显然是经过设计的,在处理文件时应该只使用内置步骤(readFile,writeFile)( https://issues.jenkins-ci.org/browse/JENKINS-37577?focusedCommentId=267445&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-267445

        2
  •  0
  •   Andrew Gray    6 年前

    确认服务\u versions.csv处于源代码管理中,并首先签出到Jenkins工作区。

    Jenkins中的主从机制和将作业绑定到从机的操作应确保工作区被复制到从机。您应该在文件系统上的位置下看到一个工作区,以配置从属文件来存储文件。您应该可以在Manage Jenkins>管理节点页面,然后查看节点的属性。

    如果您的文件是.NET解决方案的一部分,并且文件属性未设置为“复制”,那么您也可以看到此类问题。

    根据您的评论更新:

    您的cat行在env前面包含一个“$”字符,但下一行没有:

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

    new File(${env.SERVICE_VERSIONS_FILE}).each { line ->
    
        3
  •  0
  •   Ajay    5 年前

    我通过提供jenkins文件的自定义路径解决了这个错误。