web-dev-qa-db-ja.com

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

私の仕事は、ノードの詳細を収集し、それらを特定の形式でリストすることです。データをファイルに書き込み、csvファイルとして保存し、アーティファクトとして添付する必要があります。しかし、ビルドステップとしてプラグイン「Execute System Groovy」を使用して、ジェンキンスのgroovyスクリプトを使用してファイルを作成することはできません

import jenkins.model.Jenkins
import hudson.model.User
import hudson.security.Permission
import hudson.EnvVars

EnvVars envVars = build.getEnvironment(listener);

filename = envVars.get('WORKSPACE') + "\\node_details.txt";
//filename = "${manager.build.workspace.remote}" + "\\node_details.txt"
targetFile = new File(filename);
println "attempting to create file: $targetFile"

if (targetFile.createNewFile()) {
    println "Successfully created file $targetFile"
} else {
    println "Failed to create file $targetFile"
}
print "Deleting ${targetFile.getAbsolutePath()} : "
println targetFile.delete()

得られた出力

attempting to create file: /home/jenkins/server-name/workspace/GET_NODE_DETAILS\node_details.txt
FATAL: No such file or directory
Java.io.IOException: No such file or directory
    at Java.io.UnixFileSystem.createFileExclusively(Native Method)
    at Java.io.File.createNewFile(File.Java:947)
    at Java_io_File$createNewFile.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.Java:42)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.Java:108)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.Java:112)
    at Script1.run(Script1.groovy:13)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.Java:682)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.Java:666)
    at hudson.plugins.groovy.SystemGroovy.perform(SystemGroovy.Java:81)
    at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.Java:20)
    at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.Java:772)
    at hudson.model.Build$BuildExecution.build(Build.Java:199)
    at hudson.model.Build$BuildExecution.doRun(Build.Java:160)
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.Java:535)
    at hudson.model.Run.execute(Run.Java:1732)
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.Java:43)
    at hudson.model.ResourceController.execute(ResourceController.Java:88)
    at hudson.model.Executor.run(Executor.Java:234)

人々が「マネージャー」オブジェクトを使用しているのを見たとき、どうすればアクセスできますか?タスクを達成する方法についてのアイデアはありますか?

18
bicepjai

問題Groovyシステムスクリプトは常にjenkinsマスターノードで実行されますが、ワークスペースはjenkinsスレーブノードのファイルパスであり、これは存在しませんマスターノード。

コードで確認できます

theDir = new File(envVars.get('WORKSPACE'))
println theDir.exists()

falseを返します

スレーブノードを使用しない場合、trueを返します

Solution通常のFileは使用できないため、FilePathhttp:/ /javadoc.jenkins-ci.org/hudson/FilePath.html

if(build.workspace.isRemote())
{
    channel = build.workspace.channel;
    fp = new FilePath(channel, build.workspace.toString() + "/node_details.txt")
} else {
    fp = new FilePath(new File(build.workspace.toString() + "/node_details.txt"))
}

if(fp != null)
{
    fp.write("test data", null); //writing to file
} 

その後、両方のケースで機能します。

48
Larry Cai

@Larry Caiの回答は、System Groovy Scriptからスレーブノードにファイルを書き込むための1つの部分をカバーしています(マスターノードで実行されるため)。

私が答えている部分は、「人々が「マネージャー」オブジェクトを使用するのを見ることがありますが、どのようにアクセスできますか?」これは、環境変数、ビルドステータス、ビルド表示名など.

https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin から引用:

"groovyスクリプトは、変数マネージャーを使用して、ビルドを装飾するためのさまざまなメソッドを提供できます。これらのメソッドは、ホワイトリストメソッドと非ホワイトリストメソッドに分類できます。"

アクセスするには、ビルド後のgroovyスクリプトで直接呼び出すことができます。例えば

manager.build.setDescription( "custom description")manager.addShortText( "ここにメッセージを追加")

マネージャーオブジェクトで使用できるすべてのメソッドは、ここに文書化されています。

https://wiki.jenkins-ci.org/display/JENKINS/Groovy+Postbuild+Plugin#GroovyPostbuildPlugin-Whitelistedmethods

0
Satish Gupta

Groovyの起動方法によっては、マネージャーオブジェクトは使用できません。例えば「システムgroovyスクリプトを実行する」。

BadgeManagerクラスは、jenkins GroovyPostBuildプラグインAPIで見つけることができます: https://javadoc.jenkins.io/plugin/groovy-postbuild/org/jvnet/hudson/plugins/groovypostbuild/GroovyPostbuildRecorder。 BadgeManager.html#addShortText-Java.lang.String-

回答:GroovyPostBuildプラグインをインポートして、新しいマネージャーオブジェクトを作成します。例えばここでは、「システムGroovyスクリプトの実行」を伴うジョブがマネージャーオブジェクトを作成し、addShortTextメソッドを呼び出します。

// Java.lang.Object
// org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildRecorder.BadgeManager
// Constructor and Description
// BadgeManager(hudson.model.Run<?,?> build, hudson.model.TaskListener listener, hudson.model.Result scriptFailureResult) 

import hudson.model.*
import org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildAction

def build = Thread.currentThread().executable

manager = new org.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildRecorder.BadgeManager(build, null, null)
manager.addShortText("MANAGER TEST", "black", "limegreen", "0px", "white")

この質問にはヒントがあります:ほぼ動作する答えについてはこちらをご覧ください: jenkinsジョブでは、現在のワークスペースでシステムgroovyを使用してファイルを作成しますorg.jvnet.hudson.plugins.groovypostbuild.GroovyPostbuildActionbuild.getActions().add(GroovyPostbuildAction.createShortText(text, "black", "limegreen", "0px", "white"));

0
gaoithe

エラーの原因はパス形式にあると思われます。以下を試してみてください:

変化する

filename = envVars.get('WORKSPACE') + "\\node_details.txt";

filename = envVars.get('WORKSPACE') + "/node_details.txt";

ローカルのjenkinsサーバーで試してみたところ、正常に実行されるからです。

enter image description here

enter image description here

0
mainframer