web-dev-qa-db-ja.com

クラス環境内で呼び出されると、jenkinsprintln出力のGroovyスクリプトが消えます

クラス関数内からのprintlnからの出力は失われます。

スクリプトの例(outputclass.groovy):

class OutputClass
{
    OutputClass()
    {
        println("Inside class")  // This will not show in the console
    }
}

println("Outside class")  // Only this is shown in the console
output = new OutputClass()

JenkinsCLIを使用してGroovyスクリプトを実行します

Java -jar ..\jenkins-cli.jar -s JENKINS_SERVER_URL groovy outputclass.groovy

これを出力するだけです:

クラス外

クラスはSystem.out.printlnのprintlnを暗黙的に使用し、System.outはログファイルに送信されているようですが、クラス外のprintlnは別のものを使用しており、スクリプトコンソールに出力されます。次のコードは動作を示しています。

System.out.println("First")
println("Second")

出力:

2番目

Jenkinsスクリプトコンソールに出力するように出力デバイスを明示的に設定するにはどうすればよいですか?

19
Magnus

私はここで自分で解決策を見つけました http://mriet.wordpress.com

Groovyプラグインが起動すると、2つのバインディングがスクリプトに渡されます。バインディングから、out変数を取得できます。それを取得し、out.printlnを使用して、プレーンなprintlnではなくスクリプトコンソールに出力します。

以下のスクリプトは完全な解決策を示しています。

import hudson.model.*

// Get the out variable
def out = getBinding().out;

class OutputClass
{
    OutputClass(out)  // Have to pass the out variable to the class
    {
        out.println ("Inside class")
    }
}

out.println("Outside class")
output = new OutputClass(out)
22
Magnus

ビルド後のステップとしてskriptを使用する場合(前述のCLIで動作するかどうかはわかりません)、ビルドインロガーを使用できます。

manager.listener.logger.println("some output")

したがって、あなたの場合、このようなものが役立つかもしれません:

class OutputClass
{
    OutputClass(logger)  // Have to pass the out variable to the class
    {
         logger.println ("Inside class")
    }
}

output = new OutputClass(manager.listener.logger)

参照 Groovyプラグインドキュメントの例1

3
Sergej Werfel

これは メーリングリストの投稿 役に立ちますか?

出力は標準出力に送信されるため、ログファイルを確認すると、おそらく次のようなものが表示されます。INFO[STDOUT] Hello World

システムスクリプトの使用を主張する場合は、バインディングがクラス内に表示されないため、変数をクラスに渡す必要があります(したがって、標準出力に渡されます)。あなたはこのようなものを使うべきです

public class Hello {
  static void say(out) {
    out << "Hello World "
  }
}
println "Started ..."
Hello.say(out)
0
tim_yates

私にとってうまく機能した簡単な解決策は、各スクリプトの上にこの行を追加することでした。これにより、コード全体(クラスの内部および外部)で従来のprintlnコマンドを使用できるようになり、コードが直感的になります。

import hudson.model.*
System.out = getBinding().out;

これにより、次のようなログエントリを作成できます。

println("Outside class");

class OutputClass {
    OutputClass() {
        println ("Inside class")
    }
}

new OutputClass();

System.outのデフォルトの印刷ストリームを、バインディングを介してJenkinsから渡されたものに置き換えます。

0
Tom Fink