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?

Alex
źródło

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ąć”.

Richard Slater
źródło
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.

Richard Slater
źródło