2013-01-08 19 views
5

私はいくつかのステップを持つbuildbotビルドファクトリを持っています。 1つのステップが定期的にタイムアウトし、buildbotが例外をスローして終了します。しかし、この場合でも、生成されたログを保存できるようにしたいと考えています。 1つのオプションは、前のステップがタイムアウトした場合にのみ実行されるステップを追加することです。 doStepIfを使用することは可能です。しかし、状態をTIMEOUTと表示する方法はありません。ちょうどSUCCESS, WARNINGS, FAILURE, or SKIPPEDです。 この問題を解決する最善の方法は何ですか?前のタイムアウトが発生した場合の条件ステップの実行方法

doStepIf機能の例:

from buildbot.status.builder import Results, SUCCESS 

def doStepIf(step): 
    allSteps = step.build.getStatus().getSteps() 
    lastStep = allSteps[-1] 
    rc = lastStep.getResults()[0] # returns a tuple of (rc, string) 
    # if the rc == SUCCESS then don't continue, since we don't want to run this step 
    return Results[rc] == Results[SUCCESS] 
+0

'haltOnFailure'属性値にはどのようなステップがありますか? Trueに設定されている場合、 'alwaysRun'属性がTrueに設定されていない限り、さらなるステップ(ログ保存など)はスキップされます。詳細はhttp://docs.buildbot.net/latest/manual/cfg-buildsteps.html?highlight=haltonfailure#common-parametersを参照してください。 – rutsky

答えて

0

ここでは、部分的なソリューションです。

##----------------------------------------------------------------------------- 
# Run checker for the timeout condition. 
# It will return True if the last step timed out. 
def if_tmo(step): 
    allSteps = step.build.getStatus().getSteps() 
    lastStep = allSteps[0] 
    for bldStep in allSteps: 
     if (bldStep.isFinished() == True): 
      (result, strings) = bldStep.getResults()  # returns a tuple of (rc, string) 
      lastStep = bldStep 
     else: 
      # this step didn't run yet. The one before is the last one 
      break; 

    # In the timed out step the log is either empty or has the proper string 
    logText = lastStep.getLogs()[0].getText() 
    timedOutStep = False 
    if (len(logText) == 0 or (logText.find("command timed out") != -1)): 
     timedOutStep = True 

    return (timedOutStep) 

私は少し異なる方法論(link)の例をいくつか見ましたが、これはあまりにも動作するはずです。

getSteps()すべてのステップを返します。すでに実行されたものがどれだけあるかを知る必要があります。

注:このコードは部分の部分解です。スクリプトで何かが印刷されても機能しないためです。 がない場合は、が出力された場合にのみ動作します。

関連する問題