web-dev-qa-db-ja.com

JenkinsパイプラインでGroovyを使用して、コンテンツを含むファイルを作成します

「groovyの方法でファイルを操作するのは簡単です」という内容のgroovy1.txtというファイルを作成しようとしています。

注:シェルを使用してこのファイルを作成するのではなく、Groovyを使用してこのファイルを作成します。

Jenkinsパイプラインには次のスクリプトがあります。

node {
def file1 = new File('groovy1.txt')
file1.write 'Working with files the Groovy way is easy.\n'

sh 'ls -l'
// Expecting the file groovy1.txt should present with the content mentioned above
}

しかし、以下のようにFileNotFound(許可が拒否されました)エラーをスローしています

Java.io.FileNotFoundException: groovy1.txt (Permission denied)
at Java.io.FileOutputStream.open0(Native Method)
at Java.io.FileOutputStream.open(FileOutputStream.Java:270)
at Java.io.FileOutputStream.<init>(FileOutputStream.Java:213)
at Java.io.FileOutputStream.<init>(FileOutputStream.Java:162)
at Java.io.FileWriter.<init>(FileWriter.Java:90)
at org.codehaus.groovy.runtime.ResourceGroovyMethods.write(ResourceGroovyMethods.Java:740)
at org.codehaus.groovy.runtime.dgm$1035.doMethodInvoke(Unknown Source)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.Java:1213)
at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.Java:1022)
at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.Java:47)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.Java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.Java:113)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.Java:157)
at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.Java:23)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.Java:104)
at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.Java:155)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.Java:159)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.Java:17)
at WorkflowScript.run(WorkflowScript:3)
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.GeneratedMethodAccessor257.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.ConstantBlock.eval(ConstantBlock.Java:21)
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$101(SandboxContinuable.Java:34)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.lambda$run0$0(SandboxContinuable.Java:59)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.Java:108)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.Java:58)
at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.Java:174)
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
14
smc

Jenkins Pipelineは、ジョブのワークスペース内にファイルを書き込むために使用できる writeFile ステップを提供します。

次の例を見てください。

node {
    writeFile file: 'groovy1.txt', text: 'Working with files the Groovy way is easy.'
    sh 'ls -l groovy1.txt'
    sh 'cat groovy1.txt'
}

このパイプラインスクリプトを実行すると、次の出力が生成されます。

[Pipeline] node
Running on Jenkins in /var/jenkins_home/workspace/test-pipeline
[Pipeline] {
[Pipeline] writeFile
[Pipeline] sh
[test-pipeline] Running Shell script
+ ls -l groovy1.txt
-rw-r--r-- 1 jenkins jenkins 42 Jul  8 16:38 groovy1.txt
[Pipeline] sh
[test-pipeline] Running Shell script
+ cat groovy1.txt
Working with files the Groovy way is easy.[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

Java Fileの使用

Jon S がコメントで言及されているように、Java new File("${env.WORKSPACE}/groovy1.txt")は機能しますonlyノードステップはマスターノードで実行されます-スレーブノードで実行されると、パイプラインコードは失敗します。詳細については、次のスタックオーバーフロースレッドを確認できます。

jenkinsジョブでは、現在のワークスペースでシステムgroovyを使用してファイルを作成します

26
Szymon Stepniak