2014-07-01 12 views
13

jestem wywołując parametryczne Jenkins od spoza Jenkins poprzez żądanie HTTP POST:Pobieranie id zdalnie wyzwalane jenkins pracy

mam włączone w konfiguracji pracy, że praca może być uruchamiany z zewnątrz i mogę naprawdę wyzwalać go wysyłając Jenkins wniosek o zawartości takich jak to:

POST
http://myJenkins.com/myJob/buildWithParameters?token=MYTOKEN Parametr: SCREEN_SIZE: 27

Wyzwalanie tworzenie miejsc pracy zwraca powiodło 201 UTWORZONE odpowiedzi hTTP.

Mój problem polega na tym, że nie znam identyfikatora utworzonego zadania budowlanego. Chcę monitorować stan pracy. Aby to zrobić, muszę znać identyfikator. W przeciwnym razie, jeśli po prostu wziąłem najnowszą kompilację tej pracy, mógłbym wziąć niewłaściwą pracę.

Czy istnieje niezawodny sposób na uzyskanie identyfikatora utworzonej pracy?

Odpowiedz

6

Aktualizacja:

W other answer dodano ~ 8 miesięcy po kopalni. Nie zdawałem sobie wtedy sprawy z nagłówka lokalizacji w odpowiedzi. W niektórych przypadkach brzmi to jak dobry wybór. To powiedziawszy, opierając się na zastrzeżeniach w odpowiedzi i komentarzach (szczególnie w przypadku kompilacji sparametryzowanych), wydaje się, że ta odpowiedź nadal ma pewne zastosowanie w niektórych przypadkach.

Oryginalny odpowiedź:

Niestety, nie robią to tak proste, jak mogłoby być. to znaczy, na przykład, zwracając odpowiedź z odpowiedzią taką jak id.

Uważam jednak, stały, choć z pewnością nietrywialne, obejście, które byłoby wykorzystać przyczyna parametr w adresie URL użyć do uruchomienia kompilacji, a wewnątrz tej przyczyny, dodać unikalny tekst że możesz później parsować, aby ustalić, czy uruchomiłeś go ze swojej automatyzacji.

Aby dodatkowo uniqueify konkretną pracę, w przypadku wielokrotności są uruchomione w tym samym czasie, nawet z automatyzacji, również zawierać unikatowy identyfikator jakiegoś typu (może to być po prostu sekwencja ID z RDBMS lub podobne) wewnątrz parametru przyczyny.

Następnie można użyć JSON API, aby uzyskać informacje na temat pracy jesteś zdalnie wyzwalającego. Ponownie, jest to nieco pośredni, ale wykonalne:

Hit URL w postaci:

http://<server>:<port>/job/<jobname>/lastBuild/api/json 

Możesz dodać ?pretty=true do całkiem-print go w przeglądarce dla lepszej czytelności ludzkiej.

Dostaniesz JSON z ostatniej kompilacji.Będzie ona zawierać przyczyn atrybut wewnątrz actions atrybutu, a tam (w innym zagnieżdżonego atrybutu o nazwie shortDescription) można znaleźć parametr przyczyną dodaną, jeśli ten był jednym z buduje pan wywołał.

Można przeanalizować zarówno specjalny tekst statyczny, jak i wygenerowany identyfikator, aby sprawdzić, czy pasują do siebie. Jeśli tak, można również uzyskać identyfikator Jenkins id również z JSON (numer wersji buildNumber, który jest zagnieżdżony).

Jeśli ta kompilacja nie została w ogóle uruchomiona przez twoją automatyzację lub była, ale identyfikator nie pasuje, możesz powtórzyć proces dla N - 1 build, dopóki nie znajdziesz tego, czego szukasz .

To JSON byłby formularza:

http://<server>:<port>/job/<jobname>/<buildNumber>/api/json 
+0

Czy możesz wyjaśnić, jak dodać parametr 'cause'? Szukałem dokumentacji Jenkinsa i nie mogłem znaleźć żadnego odniesienia do tego parametru. – Muxa

+0

Jest to parametr określony w adresie URL używanym do uruchomienia kompilacji za pośrednictwem * curl * lub podobnego. na przykład dodaj parametr 'cause = foo_100' do adresu URL. – khampson

+0

Świetna odpowiedź! Istnieje potencjalny warunek wyścigowy, w którym wyzwalane wykonywanie zadań jest nadal w kolejce podczas przeszukiwania historii kompilacji dla unikalnego identyfikatora. Można tego uniknąć, używając lokalizacji uwzględnionej w utworzonej odpowiedzi 201 i zasadniczo czekając na jej opuszczenie kolejki. – jpadams

29

Od Jenkins 1.519, enqueuing kompilacji odpowiada URL w Location, wskazując do pozycji w kolejce produkcji:

$ nc localhost 8666 
POST /jenkins/job/morgRemote/buildWithParameters?jenkins_status=1&jenkins_sleep=20&token=morgRemote HTTP/1.1 
Host: localhost:8666 

HTTP/1.1 201 Created 
Location: http://localhost:8666/jenkins/queue/item/39/ 
Content-Length: 0 
Server: Jetty(winstone-2.8) 

Teraz, jeśli dodasz api/json (lub api/xml itd.) Na końcu (w tym przykładzie będzie to http://localhost:8666/jenkins/queue/item/39/api/json), otrzymasz dokument, który będzie zawierał identyfikator kompilacji dla danego zadania. Dla json pobrany obiekt ma atrybut executable, który z kolei ma atrybuty number i url. number to identyfikator kompilacji dla danego zadania (tutaj 35) i url to adres URL strony budowania Jennkins.

{ 
    "actions" : [ 
    { 
     "parameters" : [ 
     { 
      "name" : "jenkins_status", 
      "value" : "1" 
     }, 
     { 
      "name" : "jenkins_sleep", 
      "value" : "20" 
     } 
     ] 
    }, 
    { 
     "causes" : [ 
     { 
      "shortDescription" : "Started by remote host 127.0.0.1", 
      "addr" : "127.0.0.1", 
      "note" : null 
     } 
     ] 
    } 
    ], 
    "blocked" : false, 
    "buildable" : false, 
    "id" : 39, 
    "inQueueSince" : 1423993879845, 
    "params" : "\njenkins_status=1\njenkins_sleep=20", 
    "stuck" : false, 
    "task" : { 
    "name" : "morgRemote", 
    "url" : "http://localhost:8666/jenkins/job/morgRemote/", 
    "color" : "red" 
    }, 
    "url" : "queue/item/39/", 
    "why" : null, 
    "cancelled" : false, 
    "executable" : { 
    "number" : 35, 
    "url" : "http://localhost:8666/jenkins/job/morgRemote/35/" 
    } 
} 

zdawać sobie sprawę z 2 rzeczy:

  • nieaktywnych elementów w kolejce budowania są śmieci zebrane po kilka minut, więc należy pobrać build id ASAP
  • domyślnie trwa kilka sekund między pozycji jest dodawany do kolejki, dopóki nie otrzyma identyfikatora kompilacji. W tym czasie brakujących atrybutów executable i canceled, a why nie będzie mieć wartości null. Możesz zmienić to zachowanie w "Zaawansowanych opcjach projektu" konfiguracji pracy, modyfikując ustawienie "Okres cichy" lub konfigurację globalną Jeny.

:

... 
    "url" : "queue/item/39/", 
    "why" : "In the quiet period. Expires in 2.4 sec", 
    "timestamp" : 1423993879845 
} 
+1

Dziękuję za odpowiedź! To częściowo działało dla mnie. Jestem na 1.5559 i jeśli mam sponowane parametryzować build i use/build, otrzymuję lokalizację. Kiedy używam buildWithParameters, pojawia się błąd ... oczekiwany. Na sparametryzowanej kompilacji nie otrzymuję poprawnej lokalizacji. Jeśli używam/buduję, otrzymuję URL pracy i jeśli używam buildWithParameters, nic nie dostaję w nagłówku Location. Jakieś pomysły? –

+0

Jeśli chodzi o pobieranie ID kompilacji, ponieważ pozycja kolejki zostanie zgubiona, zobacz ten problem: https://issues.jenkins-ci.org/browse/JENKINS-31039 – KCD

+1

"domyślnie zajmuje kilka sekund między dodaniem elementu do ustawiaj kolejkę, dopóki nie pojawi się identyfikator kompilacji "- może to potrwać kilka sekund, godzin lub dni! Dopóki Jenkins nie znajdzie executora, który wykona zadanie, zadanie nie będzie miało numeru kompilacji. –

2

Okazuje się buduje mieć oryginalny identyfikator kolejki. Ponadto możesz wyszukiwać tylko kompilację z identyfikatorem kolejki i odpytywać, dopóki nie uzyskasz wyniku, ponieważ 404 normalnie oznacza, że ​​jest on ustawiony w kolejce.

Wyciągnij identyfikator kolejki z nagłówka lokalizacji, np.39

/jenkins/queue/item/39/ 

Wielokrotnie zapytanie do kompilacji z tej liczby kolejek aż otrzymasz odpowiedź

"http://{jenkins}job/{job}/api/xml?tree=builds[number,queueId]&xpath=//build[queueId=\"{queueId}\"]"; 

<build> 
    <number>411</number> 
    <queueId>39</queueId> 
</build> 

z tego wyniku można wyciągnąć numer kompilacji z XPath /build/number/text()

(UWAGA Mogłem nie używaj &xpath=//build[queueId={queueId}]/number/text() w adresie URL, ponieważ "primitive XPath result sets forbidden; implement jenkins.security.SecureRequester")

Jest równie niepoprawny, jak odpytywanie api w kolejce dla " wykonywalna "kompilacja. Jedną z zalet jest to, że punkt końcowy będzie się utrzymywał dłużej - do momentu skasowania kompilacji, w porównaniu do arbitralnego czasu (który wydaje się wynosić około 5 minut).

+0

Dzięki za to! Również elementy xpath znacznie ułatwiają pracę, nie potrzebują parsera JSON, aby znaleźć właściwy bit danych. – Frans

0

Udało mi się użyć apletu Java Jenkins, aby osiągnąć to, czego szukasz. https://github.com/jenkinsci/java-client-api

Przykładowy kod:

JenkinsServer jenkinsServer = new JenkinsServer(newURI("http://yourJenkinsServer:8080/")); 
JobWithDetails smokeTestJob = jenkinsServer.getJob("YourJobName");   
Map<String,String> jobParams = new HashMap<String,String>(); 
QueueReference queueReference = smokeTestJob.build(jobParams); 

do { 
    Thread.sleep(2000L); 
    queueItem = jenkinsServer.getQueueItem(queueReference); 
    log("Job still in queue"+queueItem.getExecutable()); 
    } while (queueItem.getExecutable() == null); 

Build build = jenkinsServer.getBuild(queueItem); 

while(build.details().isBuilding()){ 
    log("Job still running"); 
    Thread.sleep(10000L); 
} 

log("Result="+build.details().getResult()); 
0

chcielibyście dodać do morgwai odpowiedź przy użyciu nagłówka Location.

Właśnie rozwiązałem ten problem. Kluczem po nagłówku Lokalizacja jest odpytywanie pozycji kolejki zadań, dopóki nie ma pozycji "wykonywalny", która daje numer zadania, który został uruchomiony.

daję pełną odpowiedź na podobne pytanie, które widziałem po pierwsze, że nie w pełni odpowiedzieć na problem:

https://stackoverflow.com/a/48531874/9291603

JSON z Jenkins wpisu kolejki zadań z wejściem wykonywalnego:

{ 
    "_class": "hudson.model.Queue$LeftItem", 
    "actions": [ 
     { 
      "_class": "hudson.model.CauseAction", 
      "causes": [ 
       { 
        "_class": "hudson.model.Cause$RemoteCause", 
        "addr": "10.20.30.60", 
        "note": null, 
        "shortDescription": "Started by remote host 10.20.30.60" 
       } 
      ] 
     } 
    ], 
    "blocked": false, 
    "buildable": false, 
    "cancelled": false, 
    "executable": { 
     "_class": "org.jenkinsci.plugins.workflow.job.WorkflowRun", 
     "number": 45, 
     "url": "http://192.168.115.187:8080/job/rf_systest/45/" 
    }, 
    "id": 95, 
    "inQueueSince": 1517342648136, 
    "params": "", 
    "stuck": false, 
    "task": { 
     "_class": "org.jenkinsci.plugins.workflow.job.WorkflowJob", 
     "color": "blue_anime", 
     "name": "rf_systest", 
     "url": "http://192.168.115.187:8080/job/rf_systest/" 
    }, 
    "url": "queue/item/95/", 
    "why": null 
} 
Powiązane problemy