2013-01-08 3 views
5

J'ai une fabrique de buildbot avec plusieurs étapes. L'une des étapes expire périodiquement, ce qui oblige buildbot à lancer une exception et à quitter. Cependant, même dans ce cas, j'aimerais pouvoir stocker les journaux générés. Une option consiste à ajouter une étape qui ne s'exécute que si l'étape précédente a expiré. L'utilisation de doStepIf est possible. Cependant, il n'y a aucun moyen de voir le statut TIMEOUT il y a juste SUCCESS, WARNINGS, FAILURE, or SKIPPED. Quelle est la meilleure façon de résoudre ce problème?Comment exécuter une étape conditionnelle si le délai a expiré

un exemple de la fonction 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

Quelle valeur d'attribut 'haltOnFailure' a votre étape? Si elle est définie sur True, les étapes suivantes (par exemple, le stockage des journaux) seront ignorées, sauf si l'attribut 'alwaysRun' est défini sur True. Voir http://docs.buildbot.net/latest/manual/cfg-buildsteps.html?highlight=haltonfailure#common-parameters pour plus de détails – rutsky

Répondre

0

Voici la solution partielle:

##----------------------------------------------------------------------------- 
# 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) 

J'ai vu quelques exemples d'un peu différent méthodologie (link), mais cela devrait fonctionner aussi.

getSteps() retournera une liste de tous étapes. Juste besoin de savoir lesquels ont déjà fonctionné.

Remarque: Ce code est une solution partielle car si le script imprime quelque chose cela ne fonctionnera pas. Cela fonctionnera seulement s'il y avait aucune sortie du tout.

Questions connexes