2013-03-08 24 views
8

Python 2.7 und Jenkinswarten, bis ein Jenkins Build abgeschlossen ist

ich einige Code in Python schreibe, die eine checkin und warten/Umfrage für Jenkins Job ausführen Vollständigkeit. Ich hätte gern ein paar Gedanken darüber, wie ich es erreichen kann.

  1. Python-Funktion Check-in in Perforce- erstellen> Dies kann leicht getan werden als P4 CLI hat
  2. Python-Code zu erkennen, wenn ein Build ausgelöst wurde -> Ich habe die Änderungsliste und die Auftragsnummer. Wie kann ich die Jenkins-API für das Build-Protokoll abfragen, um zu prüfen, ob es die entsprechenden Änderungslisten enthält? Die Ausgabe dieses Schrittes ist eine Build-URL, die den Job ausführt.
  3. Wie warte ich, bis der Job fertig ist?

Es wäre gut, wenn mir jemand mit Schnipsel aus dem Jenkins-REST-API oder von Python jenkins Modul

Antwort

4

Sie können die letzten Build Zeitstempel abfragen kann helfen, zu bestimmen, ob der Build abgeschlossen. Vergleichen Sie es mit dem, was es vor dem Auslösen des Builds war, und sehen Sie, wann es sich ändert. Um den Zeitstempel zu erhalten, fügen Sie /lastBuild/buildTimestamp zu Ihrer Job-URL hinzu

In Ihrer Jenkins, fügen Sie /lastBuild/api/ zu jedem Job hinzu, und Sie werden viele API-Informationen sehen. Es hat sogar Python-API, aber ich nicht vertraut damit kann Ihnen nicht weiter helfen

Wenn Sie jedoch XML verwenden, können Sie lastBuild/api/xml?depth=0 hinzufügen und in der XML, können Sie das <changeSet> Objekt mit Liste der Revisionen sehen/commit messages, die den Build ausgelöst haben

+0

Dies wird fehlschlagen, wenn es andere baut bereits in der Warteschlange –

6

Wenn Sie wissen möchten, ob der Job abgeschlossen ist, sind BuildNumber und BuildTimestamp nicht genug.

Dies ist der Kern davon, wie ich herausfinden, ob ein Job abgeschlossen ist, ich habe es in Ruby, aber nicht Python, also könnte jemand dies in echten Code aktualisieren.

lastBuild = get jenkins/job/myJob/lastBuild/buildNumber 
get jenkins/job/myJob/lastBuild/build?token=gogogo 

currentBuild = get jenkins/job/myJob/lastBuild/buildNumber 
while currentBuild == lastBuild 
    sleep 1 

thisBuild = get jenkins/job/myJob/lastBuild/buildNumber 
buildInfo = get jenkins/job/myJob/[thisBuild]/api/xml?depth=0 

while buildInfo["freeStyleBuild/building"] == true 
    buildInfo = get jenkins/job/myJob/[thisBuild]/api/xml?depth=0 
    sleep 1 

dh. Ich fand, dass ich A) warten musste, bis der Build beginnt (neue Build-Nummer) und B) bis das Gebäude fertig ist (Gebäude ist falsch).

0

wurde durch das gleiche Problem geht und dies für mich gearbeitet, python3 und python-jenkins verwenden.

while "".join([d['color'] for d in j.get_jobs() if d['name'] == "job_name"]) == 'blue_anime': 
     print('Job is Running') 
     time.sleep(1) 

print('Job Over!!') 

Arbeits Github Drehbuch: Link

0

Dieser Ausschnitt beginnt Job bauen und warten, bis Arbeit erledigt ist.

Es ist einfach, den Job zu starten, aber wir brauchen eine Art Logik, um zu wissen, wann der Job erledigt ist. Zuerst müssen wir warten auf Job-ID angewendet werden, und als wir Aufgabe für Details abfragen:

from jenkinsapi import jenkins 

server = jenkins.Jenkins(jenkinsurl, username=username, password='******') 
job = server.get_job(j_name) 
prev_id = job.get_last_buildnumber() 
server.build_job(j_name) 
while True: 
    print('Waiting for build to start...') 
    if prev_id != job.get_last_buildnumber(): 
     break 
    time.sleep(3) 
print('Running...') 
last_build = job.get_last_build() 
while last_build.is_running(): 
    time.sleep(1) 
print(str(last_build.get_status())) 
+0

Bitte versuchen Sie es zu beschreiben, wie Ihre Lösung funktioniert, was ist Das Kernkonzept, mit dem Ihre Lösung das Problem löst – Murmel

Verwandte Themen