Git & Jenkins: uzyskaj najnowsze zielone zatwierdzenie w oddziale


10

Właśnie zaczynamy naciskać na CI-CD i jako mały krok będziemy próbować aktualizować stos z najnowszą zieloną wersją raz na kilka godzin. Jestem dość nowy w Git / Bitbucket i nie mogę wymyślić, jak zapewnić, aby kasy dokonane przez Jenkins otrzymywały ostatnie zatwierdzenie, które zostały oznaczone przez Jenkins na zielono, a nie tylko „ostatnie zatwierdzenie” jako oświadczenie ogólne.

Mamy zainstalowaną wtyczkę Bitbucket Build Status Notifier , więc Bitbucket śledzi, które zatwierdzenia są zielone po uruchomieniu naszych testów jednostkowych. Czy istnieje sposób na wykorzystanie tych informacji, aby upewnić się, że wybrano właściwe zatwierdzenie?

Odpowiedzi:


6

Nie wspominasz o języku skryptowym, którego chcesz używać, więc porozmawiam konkretnie o żądaniach HTTP do interfejsu API BitBucket:

Założenia

Jeśli masz repozytorium BitBucket, w którym znajdują się trzy zatwierdzenia, pierwszy i ostatni nie dają kompilacji, środek mija:

  • 4768815 ❌
  • 49d7110 ✅
  • 42d357f ❌

Uzyskaj listę zatwierdzeń

Możesz uzyskać listę zatwierdzeń, wywołując następującą metodę API:

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

  • owner: RichardSlater
  • repo_slug: greencommitproofofconcept

Odpowiedź wygląda następująco:

{
  "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",
      ...
    }
  ]
}

Jeśli przeanalizujesz JSON i zapętlisz odpowiedzi, możesz wyodrębnić statusy z:

values[n].links.statuses.href

Gdzie njest indeks, czyli 0, 1czy 2w powyższym przykładzie. Jeśli miałbyś to zbudować od zera, byłby w następującym formacie.

Pobierz listę statusów z zatwierdzenia

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

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

Uwaga: jest to interfejs API Hypermedia, co oznacza, że ​​adresy URL mogą się zmieniać, dlatego zalecałbym używanie linków z poprzedniej odpowiedzi, zamiast próbować wygenerować je od zera.

Odpowiedź z powyższego żądania HTTP będzie wyglądać następująco:

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

Z tej odpowiedzi możesz wyodrębnić za statepomocą:

values[n].state

Znowu gdzie njest status- może być ich wiele, jeśli jedno zatwierdzenie spowoduje wiele kompilacji.

Jeśli stan kompilacji, na którym ci zależy, to SUCCESSFULmasz odpowiedź i możesz natychmiast zwrócić shazatwierdzenie.

Zapętlaj wszystkie zatwierdzenia z pierwszej fazy, jeśli zabraknie zatwierdzeń, postępuj zgodnie ze nextstroną linkzawartą w wywołaniu do /commits.

Kompletny schemat przepływu

Na wysokim poziomie przepływ będzie wyglądał następująco:

Schemat przepływu

Nie zapominaj, że jest to interfejs API Hypermedia, więc w miarę możliwości kod powinien podążać za linkami w interfejsie API, zamiast próbować je „odgadnąć”.


1
Tak, to prawdopodobnie moja najdłuższa odpowiedź na SE.
— Richard Slater

Doceniam czas, który poświęciłeś na wyjaśnienie tego, nawet jeśli uważasz, że jestem całkowicie szalony, że tego chcę. Zaakceptowano
— Alex

Nie do końca szalony, wystarczy zrobić kilka pierwszych kroków - pamiętaj o mojej innej odpowiedzi, gdy myślisz o architekturze CI / CD.
— Richard Slater

3

W typowym procesie ciągłego dostarczania / wdrażania miałyby miejsce następujące zdarzenia:

  1. Deweloper wypycha jeden lub więcej zatwierdzeń lub żądanie ściągnięcia jest scalane.
  2. Jenkins automatycznie buduje i wykonuje testy.
  3. Jeśli się powiedzie, Jenkins opublikuje pakiet wdrażania w repozytorium artefaktów; jeśli awaria nic nie opublikuje i powiadomi programistów.
  4. Automatyzacja wdrażania korzysta z pakietów z repozytorium artefaktów i wdraża je.

Prosty rurociąg CI / CD

Celem jest uniknięcie dwukrotnego budowania rozwiązania ze źródła, zbudowanie go raz i wdrożenie go wiele razy. Możesz wdrożyć zatwierdzenia w Sonartype Nexus, aby zdefiniować proces zatwierdzania środowiska, tj. Dev → Test → UAT → Stage → Production.

To powiedziawszy ... jeśli przeczytałeś wszystkie poprzednie i nadal chcesz uzyskać najnowszą zieloną wersję z kontroli źródła, możesz użyć jednej z dwóch technik:

  1. Poproś Jenkinsa o oznaczenie gałęzi tagiem o odpowiedniej nazwie, tj. master-greenUżyj go zamiast, mastergdy chcesz mieć najnowszą zieloną wersję.
  2. Użyj BitBucket zobowiązuje się uzyskać listę zatwierdzeń i popełnić / {} sha / statusy nad każdym z nich, aby znaleźć popełnić z zielonej statusu. Rozszerzyłem to rozwiązanie w innej odpowiedzi .

Zachęcamy do opublikowania pytania uzupełniającego, jeśli chcesz uzyskać szczegółowe informacje na temat korzystania z powyższych metod.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.