Git & Jenkins: Holen Sie sich das neueste Green Commit für den Zweig


10

Wir fangen gerade erst an, auf CI-CD zu drängen, und als kleinen Schritt werden wir versuchen, alle paar Stunden einen Stack mit der neuesten grünen Entwicklung zu aktualisieren. Ich bin ziemlich neu in Git / Bitbucket und kann nicht herausfinden, wie ich sicherstellen kann, dass die von Jenkins vorgenommene Kaufabwicklung das letzte Commit erhält, das von Jenkins grün markiert wurde, und nicht nur "das letzte Commit" als pauschale Anweisung.

Wir haben das Bitbucket Build Status Notifier- Plugin installiert, sodass Bitbucket nach Ablauf unserer Unit-Tests nachverfolgt , welche Commits grün sind. Gibt es eine Möglichkeit, diese Informationen zu nutzen, um sicherzustellen, dass das richtige Commit ausgewählt wird?

Antworten:


6

Sie erwähnen nicht die Skriptsprache, die Sie verwenden möchten, daher werde ich speziell auf die HTTP-Anforderungen an die BitBucket-API eingehen:

Annahmen

Wenn Sie ein BitBucket-Repository haben , in dem drei Commits enthalten sind, schlagen der erste und der letzte den Build fehl, die Mitte wird übergeben:

  • 4768815 ❌
  • 49d7110 ✅
  • 42d357f ❌

Holen Sie sich die Liste der Commits

Sie können die Liste der Commits abrufen, indem Sie die folgende API-Methode aufrufen:

https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commits

  • owner: RichardSlater
  • repo_slug: greencommitproofofconcept

Die Antwort sieht folgendermaßen aus:

{
  "pagelen": 30,
  "values": [
    {
      "hash": "4768815fdc27abf4be17096e7c460f7f68f5d39b",
      "repository": { ... },
      "links": {
        ...
        "statuses": {
          "href": "https://api.bitbucket.org/2.0/repositories/RichardSlater/greencommitproofofconcept/commit/4768815fdc27abf4be17096e7c460f7f68f5d39b/statuses"
        }
      },
      "author": { ... },
      "parents": [ ... ],
      "date": "2017-04-10T11:38:18+00:00",
      "message": "README.md edited online with Bitbucket",
      "type": "commit"
    },
    {
      "hash": "49d7110b98616358d16055960a4abdf2926b890d",
      ...
    },
    {
      "hash": "42d357f1df7a7d7bcf1f10a9f3a5a40d85d5b11c",
      ...
    }
  ]
}

Wenn Sie den JSON analysieren und die Antworten durchlaufen, können Sie die Status extrahieren aus:

values[n].links.statuses.href

Wo nist der Index, das heißt 0, 1oder 2in dem obigen Beispiel. Wenn Sie dies von Grund auf neu erstellen würden, hätte es das folgende Format.

Rufen Sie die Liste der Status aus dem Commit ab

https://api.bitbucket.org/2.0/repositories/{{owner}}/{{repo_slug}}/commit/{{sha}}/statuses"

  • owner: RichardSlater
  • repo_slug: greencommitproofofconcept
  • sha: 4768815fdc27abf4be17096e7c460f7f68f5d39b

Hinweis: Dies ist ein Hypermedia - API , die die Urls bedeutet , könnte ändern , damit ich die Links von der vorherigen Antwort verwenden würde empfehlen , anstatt zu versuchen , sie von Grund auf neu zu generieren.

Die Antwort von der obigen HTTP-Anfrage lautet wie folgt:

{
  "pagelen": 10,
  "values": [
    {
      "key": "POC-01",
      "name": "Build #1",
      "repository": { ... },
      "url": "http://devops.stackexchange.com/q/809/397",
      "links": { ... },
      "refname": null,
      "state": "FAILED",
      "created_on": "2017-04-10T13:04:28.261734+00:00",
      "updated_on": "2017-04-10T13:04:28.261759+00:00",
      "type": "build",
      "description": "Changes by Richard Slater"
    }
  ],
  "page": 1,
  "size": 1
}

Aus dieser Antwort können Sie Folgendes extrahieren state:

values[n].state

Wieder wo nist das status- es könnte viele von ihnen geben, wenn ein Commit zu vielen Builds führen würde.

Wenn der Status für den Build, den Sie interessieren, lautet SUCCESSFUL, haben Sie Ihre Antwort und können diese sofort shafür das Commit zurückgeben.

Durchlaufen Sie alle Commits aus der ersten Phase. Wenn Ihnen die Commits ausgehen, folgen Sie der nextSeite link, die im Aufruf von enthalten ist /commits.

Komplettes Flussdiagramm

Auf hohem Niveau sieht der Fluss folgendermaßen aus:

Flussdiagramm

Vergessen Sie nicht, dass dies eine Hypermedia-API ist. Lassen Sie Ihren Code also nach Möglichkeit den Links in der API folgen, anstatt zu versuchen, sie zu "erraten".


1
Ja, es ist wahrscheinlich meine längste Antwort auf SE überhaupt.
Richard Slater

Ich schätze die Zeit, die Sie gebraucht haben, um dies zu erklären, auch wenn Sie denken, ich bin völlig verrückt danach, es zu wollen. Akzeptiert
Alex

Nicht ganz verrückt, nur die ersten Schritte - denken Sie an meine andere Antwort, wenn Sie über CI / CD-Architekturen nachdenken.
Richard Slater

3

In einer typischen Continuous Delivery / Deployment-Pipeline würde Folgendes passieren:

  1. Der Entwickler überträgt einen oder mehrere Commits oder eine Pull-Anforderung wird zusammengeführt.
  2. Jenkins erstellt und führt automatisch Tests aus.
  3. Bei Erfolg veröffentlicht Jenkins ein Bereitstellungspaket in einem Artefakt-Repository. Wenn Fehler nichts veröffentlicht und Entwickler benachrichtigen.
  4. Die Bereitstellungsautomatisierung verwendet Pakete aus dem Artefact Repository und stellt sie bereit.

Einfache CI / CD-Pipeline

Ziel ist es, zu vermeiden , dass die Lösung zweimal aus dem Quellcode erstellt wird. Sie werden einmal erstellt und mehrmals bereitgestellt. Sie können Genehmigungen in Sonartype Nexus implementieren , um den Genehmigungsprozess für die Umgebung zu definieren, z. B. Dev → Test → UAT → Phase → Produktion.

Das heißt ... wenn Sie alle vorherigen gelesen haben und dennoch den neuesten grünen Build aus der Quellcodeverwaltung erhalten möchten, können Sie eine von zwei Techniken verwenden:

  1. Lassen Sie Jenkins den Zweig mit einem entsprechend benannten Tag versehen, dh master-greenverwenden Sie diesen, anstatt masterden neuesten grünen Build zu verwenden.
  2. Verwenden Sie die BitBucket- Commits , um eine Liste der Commits und Commit / {sha} / -Status für jedes Commit abzurufen und das Commit mit einem grünen Status zu finden. Ich habe diese Lösung in einer anderen Antwort erweitert .

Sie können gerne eine Folgefrage stellen, wenn Sie Einzelheiten zur Verwendung der oben genannten Ansätze wünschen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.