web-dev-qa-db-ja.com

Jenkins PipelinecurrentBuildの継続時間は常に0を返します

レポートのビルド期間を取得しようとしていますが、常に0が返されます。

ドキュメントを読んだり、Slackプラグインのソースを調べたり、他のリソースを読んだりすることで、次のいずれかを実行できるはずです。

def duration = currentBuild.duration
def duration = currentBuild.durationString
def duration = currentBuild.durationString()
def duration = currentBuild.getDurationString()

どれも機能しません。私の理解では、これは、ビルドが実際に完了する前にこれを呼び出しているため、期間がまだ利用できないためである可能性があります。

パイプラインの構造は次のようになります。

node {
    try {
        stage("Stage 1"){}
        stage("Stage 2"){}
    } catch (e) {
        currentBuild.result = "FAILED"
        throw e
    } finally {
        notifyBuild(currentBuild.result)
    }
}

def notifyBuild(String buildStatus = 'STARTED') {
    def duration = currentBuild.duration;
}

私の質問は:

  1. なぜ私は期間を取得しないのですか
  2. パイプラインに「ビルド後」のステップを指定する方法はありますか?私が読んだものから、try-catchingはそのように機能するはずです

私の一時的な解決策は、以下を使用することです。

int jobDuration = (System.currentTimeMillis() - currentBuild.startTimeInMillis)/1000;

これは問題なく動作しますが、常に秒単位で時間を示します。私はthinkcurrentBuild.duration異なるユニットを与えるのに十分賢いはずです(?)

7
Tomas

更新2018-02-19、これはパイプラインサポートAPIプラグインの2.14リリースで修正されました。 この問題を参照してください。

durationがいつ有効であると予想されるかについてのドキュメントが見つからない場合。しかし、判断 実装から 実行/ビルドが完了した直後に設定されているようです。完了している可能性のあるcurrentBuild.previousBuildを表すために使用されるのと同じオブジェクトであるため、currentBuildオブジェクトで使用できると思います。

だからあなたの質問に答えるために:

  1. 期間フィールドは、ビルドが完了した後にのみ有効になります。
  2. いいえ、「ビルド後」のステップを指定する方法はありません。

そうは言っても、あなたの回避策は良い解決策だと思います(関数でラップしてGPL(グローバル公共図書館)に入れるかもしれません)。

最後のボーナス質問はI think the currentBuild.duration should be smart enough to give different units (?)です。 _Took 10min 5sec_のように適切にフォーマットされた文字列を参照している場合、_currentBuild.duration_は、経過した秒数とともに長い値を返すだけなので、適切にフォーマットされません。代わりに、あなたができることは hudson.Util#getTimeSpanString(long duration) を呼び出すことです。このような:

_import hudson.Util;

...

echo "Took ${Util.getTimeSpanString(System.currentTimeMillis() - currentBuild.startTimeInMillis)}"
_

これにより、現在のビルド期間で適切にフォーマットされた文字列が返されます。

11
Jon S