Can';t使用FileInputStream从Jenkins管道打开文件

Can';t使用FileInputStream从Jenkins管道打开文件,jenkins,groovy,continuous-integration,jenkins-pipeline,continuous-deployment,Jenkins,Groovy,Continuous Integration,Jenkins Pipeline,Continuous Deployment,我在我的Jenkins奴隶上运行以下代码: node('hozuki-ferrari-best-girl') { def propertiesPath = "${env.OURH_Properties}" sh "less ${propertiesPath}" Properties props = new Properties() props.load(new FileInputStream(propertiesPath)) properties['versionCode']=100500

我在我的Jenkins奴隶上运行以下代码:

node('hozuki-ferrari-best-girl') {
def propertiesPath = "${env.OURH_Properties}"

sh "less ${propertiesPath}"

Properties props = new Properties()
props.load(new FileInputStream(propertiesPath))
properties['versionCode']=100500

sh "less ${propertiesPath}"
}
less调用工作正常,但FileInputStream引发异常:

java.io.FileNotFoundException: /home/jenkins-slave/publicKey/OURH.properties (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 java.io.FileInputStream.<init>(FileInputStream.java:93)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
    at org.codehaus.groovy.reflection.CachedConstructor.doConstructorInvoke(CachedConstructor.java:77)
    at org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:84)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:60)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:235)
    at org.kohsuke.groovy.sandbox.impl.Checker$3.call(Checker.java:200)
    at org.kohsuke.groovy.sandbox.GroovyInterceptor.onNewInstance(GroovyInterceptor.java:42)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onNewInstance(SandboxInterceptor.java:146)
    at org.kohsuke.groovy.sandbox.impl.Checker$3.call(Checker.java:197)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedConstructor(Checker.java:202)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.constructorCall(SandboxInvoker.java:21)
    at WorkflowScript.run(WorkflowScript:7)
    at ___cps.transform___(Native Method)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.dispatchOrArg(FunctionCallBlock.java:96)
    at com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:82)
    at sun.reflect.GeneratedMethodAccessor198.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:122)
    at org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261)
    at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:19)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:35)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:32)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
    at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:32)
    at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:331)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:243)
    at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:231)
    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:112)
    at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
    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:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
java.io.FileNotFoundException:/home/jenkins slave/publicKey/OURH.properties(没有这样的文件或目录)
位于java.io.FileInputStream.open0(本机方法)
在java.io.FileInputStream.open(FileInputStream.java:195)
位于java.io.FileInputStream。(FileInputStream.java:138)
位于java.io.FileInputStream。(FileInputStream.java:93)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)
位于sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
在sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:423)
位于org.codehaus.groovy.reflection.CachedConstructor.invoke(CachedConstructor.java:83)
位于org.codehaus.groovy.reflection.CachedConstructor.doconConstructorInvoke(CachedConstructor.java:77)
位于org.codehaus.groovy.runtime.callsite.ConstructorSite$ConstructorSiteNoUnwrap.callConstructor(ConstructorSite.java:84)
位于org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallConstructor(CallSiteArray.java:60)
位于org.codehaus.groovy.runtime.callsite.AbstractCallSite.callConstructor(AbstractCallSite.java:235)
位于org.kohsuke.groovy.sandbox.impl.Checker$3.call(Checker.java:200)
位于org.kohsuke.groovy.sandbox.GroovyInterceptor.onNewInstance(GroovyInterceptor.java:42)
位于org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.sandboxiterceptor.onNewInstance(sandboxiterceptor.java:146)
位于org.kohsuke.groovy.sandbox.impl.Checker$3.call(Checker.java:197)
位于org.kohsuke.groovy.sandbox.impl.Checker.checkedConstructor(Checker.java:202)
位于com.cloudbees.groovy.cps.sandbox.sandboxivoker.constructorCall(sandboxivoker.java:21)
在WorkflowScript.run处(WorkflowScript:7)
在cps.transform(本机方法)
位于com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.DispatcherArg(FunctionCallBlock.java:96)
位于com.cloudbees.groovy.cps.impl.FunctionCallBlock$ContinuationImpl.fixArg(FunctionCallBlock.java:82)
在sun.reflect.GeneratedMethodAccessor198.invoke处(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:498)
com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
位于com.cloudbees.groovy.cps.impl.LocalVariableBlock$LocalVariable.get(LocalVariableBlock.java:39)
位于com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
位于com.cloudbees.groovy.cps.impl.LocalVariableBlock.evalLValue(LocalVariableBlock.java:28)
位于com.cloudbees.groovy.cps.LValueBlock$BlockImpl.eval(LValueBlock.java:55)
位于com.cloudbees.groovy.cps.LValueBlock.eval(LValueBlock.java:16)
位于com.cloudbees.groovy.cps.Next.step(Next.java:83)
com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:174)
com.cloudbees.groovy.cps.Continuable$1.call(Continuable.java:163)
位于org.codehaus.groovy.runtime.GroovyCategorySupport$ThreadCategoryInfo.use(GroovyCategorySupport.java:122)
位于org.codehaus.groovy.runtime.GroovyCategorySupport.use(GroovyCategorySupport.java:261)
位于com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:163)
位于org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:19)
位于org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:35)
位于org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:32)
位于org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
位于org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:32)
位于org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:174)
位于org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:331)
位于org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$100(CpsThreadGroup.java:82)
位于org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:243)
位于org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:231)
在org.jenkinsci.plugins.workflow.cps.cpsvmecutorservice$2.call(cpsvmecutorservice.java:64)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
在hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
位于jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
位于java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
运行(Thread.java:745)
怎么了? 这可能很重要:

  • 我启用了Groovy沙盒
  • 在gradle构建脚本内部,类似的代码可以正常工作
  • Env变量存在,其值为绝对文件路径

  • 这样读取属性似乎解决了我的问题:

    def props = readProperties file: propertiesPath
    

    尝试从脚本中排除所有不重要的命令。仅保留以下内容:
    新文件('/home/jenkins slave/publicKey/OURH.properties').getText()
    。若命令失败,但文件存在,那个么我想你们必须解决访问权限的问题。