Récupérer l'id du travail de jenkins déclenché à distance

je déclenche un Jenkins paramétré depuis l'extérieur de jenkins via une requête http POST:

j'ai activé dans la configuration de la tâche que la tâche peut être déclenchée de l'extérieur et je peux vraiment la déclencher en envoyant à jenkins une requête avec un contenu comme celui-ci:

POST

http://myJenkins.com/myJob/buildWithParameters?token=MYTOKEN Paramètre: SCREEN_SIZE: 27

le déclenchement de la création d'emplois revient avec succès 201 CRÉÉ de la réponse http.

mon problème est que je ne connais pas l'id du travail de construction qui a été créé. Je veux surveiller l'état de l'emploi. Pour ce faire j'ai besoin de connaître le numéro d'identification. Sinon, si je prends la dernière version de ce travail, je pourrais prendre le mauvais.

Est-il un moyen fiable pour obtenir l'id de la tâche?

18
demandé sur Nakilon 2014-07-01 13:50:24

5 réponses

mise à Jour:

réponse a été ajouté ~8 mois après le mien. J'étais pas au courant de l' en-tête de la réponse à l'époque. Cela semble être une bonne option pour certains cas. Cela dit, d'après les mises en garde dans la réponse et les commentaires (surtout autour de paramétrée construit), il semble que cette réponse a encore une certaine utilité dans certains cas.

Origine réponse:

Malheureusement, ce n'est pas aussi simple qu'elle pourrait l'être. c'est à dire, par exemple, le retour d'un JSON réponse avec des informations comme un id.

cependant, je crois qu'une solution solide, mais certainement non triviale, pour contourner cela serait de tirer parti de la cause paramètre dans l'URL que vous utilisez pour déclencher le construire, et dans cette cause, ajouter texte que vous pouvez analyser plus tard pour déterminer que vous déclenchée à partir de votre automatisation.

pour personnaliser davantage le travail spécifique, dans le cas où multiple tournent autour de la même heure, même à partir de votre automatisation, inclure également un ID unique d'un certain type (il pourrait simplement s'agir d'un ID de séquence de votre RDBMS ou similaire) à l'intérieur du paramètre cause.

Ensuite, vous pouvez utiliser le API JSON pour obtenir des informations sur l' emploi vous êtes à distance de déclenchement. Encore, c'est un peu indirecte, mais c'est faisable:

Frapper une URL de la forme:

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

Vous pouvez ajouter ?pretty=true pretty-print dans le navigateur pour une meilleure lisibilité.

Qui vous permettra d'obtenir JSON de la dernière génération. Il contiendra l' l'attribut dans le actions l'attribut, et là (dans un autre imbriquée attribut nommé shortDescription) vous trouverez le cause paramètre que vous avez ajouté, s'il s'agit d'une des constructions que vous avez déclenchées.

vous pouvez analyser à la fois le texte statique spécial et votre ID généré pour voir s'ils correspondent. S'ils le font, vous pouvez obtenir le Jenkins id de la JSON (recherche d' buildNumber, qui est imbriqué).

si cette construction n'est pas du tout déclenchée par votre automation, ou l'était, mais que L'ID ne correspond pas, vous pouvez répéter le processus pour l' n-1 build jusqu'à ce que vous trouver ce que vous cherchez.

Que JSON serait de la forme:

http://<server>:<port>/job/<jobname>/<buildNumber>/api/json
10
répondu khampson 2017-11-03 03:31:34

Depuis Jenkins 1.519, replacement d'un build répond avec une URL dans le Location, vous pointant vers un élément de la file d'attente de compilation:

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

Maintenant, si vous ajoutez api/json (ou api/xml et ainsi de suite) à la fin de celui-ci (dans cet exemple, il serait http://localhost:8666/jenkins/queue/item/39/api/json) vous obtiendrez alors un document qui contiendra le build id pour le travail donné. Pour json l'objet récupéré a executable l'attribut, qui à son tour a number et url attributs. number est l'identifiant de construction pour l'emploi donné (35 ici) et url est l'url de la page de compilation de jenkins.

{
  "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/"
  }
}

être conscient de 2 choses:

  • les éléments inactifs dans la file d'attente de compilation sont des déchets collectés après quelques minutes, donc vous devriez récupérer build id dès que possible
  • par défaut, il prend quelques secondes entre l'élément est ajouté à la file d'attente jusqu'à ce qu'il obtient id de compilation. Pendant cette période executable et canceled les attributs manquants et why ne sera pas null. Vous pouvez modifier ce comportement dans "projet avancé" Options" de votre configuration de travail en modifiant le réglage "période Calme" ou dans la configuration globale de jenkins.

:

  ...
  "url" : "queue/item/39/",
  "why" : "In the quiet period. Expires in 2.4 sec",
  "timestamp" : 1423993879845
}
32
répondu morgwai 2015-05-28 09:16:34

il S'avère que les constructions ont l'ID de file d'attente original. De plus, vous pouvez interroger uniquement le build avec votre numéro de file D'attente et le Poller jusqu'à ce que vous obteniez un résultat car 404 devrait normalement laisser entendre qu'il est en file d'attente.

retirez L'ID de file de L'en-tête Location, par exemple 39

/jenkins/queue/item/39/

interrogez plusieurs fois pour un build avec ce numéro de file d'attente jusqu'à ce que vous obteniez une réponse

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

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

A partir de ce résultat, vous pouvez tirer le numéro de build avec le xpath /build/number/text()

(Note Que J'Ai ne pouvait pas utiliser &xpath=//build[queueId={queueId}]/number/text() dans l'url parce que "primitive XPath result sets forbidden; implement jenkins.security.SecureRequester")

c'est aussi boiteux que de rechercher l'api de file d'attente pour une construction "exécutable". Un avantage est que le point final persistera plus longtemps - jusqu'à ce que la construction soit supprimée, par rapport à un temps arbitraire (qui semble être d'environ 5 minutes).

2
répondu KCD 2016-11-03 23:16:11

j'ai pu utiliser L'api Java Jenkins pour réaliser ce que vous recherchez. https://github.com/jenkinsci/java-client-api

Exemple De Code:

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
répondu user2225713 2017-04-10 19:49:27

voulait ajouter à la réponse de morgwai en utilisant l'en-tête Location.

je viens de résoudre ce problème. La clé après l'en-tête Location est de Poller l'entrée job queue jusqu'à ce qu'elle ait une entrée 'exécutable' qui donne le numéro de la tâche qui a été commencée.

je donne la réponse complète à une question semblable que j'ai vu en premier qui n'a pas complètement répondu au problème:

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

JSON de Jenkins entrée dans la file d'attente avec l'entrée exécutable:

{
    "_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
}
0
répondu P. Hawkins 2018-01-30 23:38:23