Git & Jenkins: отримайте останню зелену комісію на гілці


10

Ми тільки починаємо наполягати на CI-CD і, як немовлячий крок, ми намагатимемось оновлювати стек з останнім зеленим розвитком раз на пару годин. Я досить новачок у Git / Bitbucket, і не можу зрозуміти, як забезпечити оформлення замовлення, яке робить Дженкінс, отримує останнє зобов’язання, яке було позначено Дженкінсом зеленим кольором, а не просто "останнє зобов'язання" як заяву про ковдру.

У нас встановлений плагін Bitbucket Build Notifier Status , тому Bitbucket відстежує, які зобов’язання стають зеленими після запуску тестів на одиницю. Чи є спосіб скористатися цією інформацією, щоб переконатися, що вибрано правильний фіксатор?

Відповіді:


6

Ви не згадуєте мову сценаріїв, яку хочете використовувати, тому я конкретно розповім про HTTP-запити до BitBucket API:

Припущення

Якщо у вас є сховище BitBucket, в якому є три коміти, перший і останній не вдаються до збірки, середина проходить:

  • 4768815 ❌
  • 49d7110 ✅
  • 42d357f ❌

Отримайте список комітетів

Ви можете отримати список комітетів, зателефонувавши за таким методом API:

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

  • owner: РічардСлатер
  • repo_slug: greencommitproofofconcept

Відповідь виглядає приблизно так:

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

Якщо проаналізувати JSON і перетворити цикл на відповіді, ви можете отримати статуси з:

values[n].links.statuses.href

Де nіндекс, тобто 0, 1або 2у наведеному вище прикладі. Якби ви будували це з нуля, це було б у наступному форматі.

Отримайте список статусів від комітету

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

  • owner: РічардСлатер
  • repo_slug: greencommitproofofconcept
  • sha: 4768815fdc27abf4be17096e7c460f7f68f5d39b

Примітка. Це Hypermedia API, що означає, що URL-адреси можуть змінюватися, тому я рекомендую використовувати посилання з попередньої відповіді, а не намагатися генерувати їх з нуля.

Відповідь на вищезазначений запит HTTP буде приблизно таким:

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

З цієї відповіді можна витягнути, stateвикористовуючи:

values[n].state

Знову ж, де nце status- їх може бути багато, якби один вчинок призвів до багатьох складових.

Якщо стан будівництва, про яке ви піклуєтеся, SUCCESSFULто у вас є відповідь, і ви можете негайно повернути shaзобов'язання.

Переведіть цикл на всі комітети з першої фази, якщо у вас закінчується кількість комітетів, перейдіть на nextсторінку, linkяка включена у виклик /commits.

Повна діаграма потоку

На високому рівні потік буде виглядати приблизно так:

Схема потоку

Не забувайте, що це API Hypermedia, тому, коли це можливо, ваш код слід переходити за посиланнями в API, а не намагатися "відгадати їх".


1
Так, це, мабуть, моя найдовша відповідь на ПС коли-небудь.
Річард Слейтер

Я вдячний за час, який ви витратили на пояснення цього, навіть якщо ви думаєте, що я абсолютно божевільний за те, щоб цього хотіти. Прийнято
Олексій

Не зовсім божевільно, просто зробивши свої перші кроки - майте на увазі мою іншу відповідь, коли ви думаєте про архітектуру CI / CD.
Річард Слейтер

3

У типовому трубопроводі безперервної доставки / розгортання у вас трапляється таке:

  1. Розробник натискає одну чи кілька комісій, або запит на потяг об'єднується.
  2. Дженкінс автоматично будує та виконує тести.
  3. У разі успіху Jenkins публікує пакет розгортання у сховищі артефактів; якщо помилка не публікує нічого та повідомляє розробників.
  4. Автоматизація розгортання використовує пакети з репозиторію Artefact і розгортає їх.

Простий CI / CD трубопровід

Мета - уникнути побудови рішення з джерела двічі, ви збираєте його один раз і розгортаєте багато разів. Ви можете реалізувати затвердження в Sonartype Nexus, щоб визначити процес затвердження середовища, тобто Dev → Test → UAT → Stage → Production.

Це сказало ... якщо ви прочитали всі попередні і все ще хочете отримати останню зелену збірку від контролю джерела, то ви можете використовувати одну з двох методик:

  1. Попросіть Дженкінса позначити гілку відповідним тегом, тобто master-greenвикористовуйте це замість того, masterколи ви хочете останню зелену збірку.
  2. Використовуйте зобов’язання BitBucket, щоб отримати список комітетів і статуси / {sha} / статусів над кожним з них, щоб знайти коміти зі статусом "Зелений". Я розширив це рішення в іншій відповіді .

Не соромтеся розмістити подальше запитання, якщо вам потрібна конкретна деталь щодо використання вищезазначених підходів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.