Git & Jenkins: dapatkan komit hijau terbaru di cabang

10

Kami baru saja mulai mendorong CI-CD dan sebagai langkah awal kami akan mencoba memperbarui tumpukan dengan pengembangan hijau terbaru setiap dua jam sekali. Saya cukup baru di Git / Bitbucket, dan tidak dapat menemukan cara untuk memastikan checkout yang dibuat Jenkins mendapat komit terakhir telah ditandai hijau oleh Jenkins, bukan hanya "komit terakhir" sebagai pernyataan selimut.

Kami memiliki plugin Bitbucket Build Status Notifier terinstal, sehingga Bitbucket melacak yang melakukan hijau setelah pengujian unit kami berjalan. Apakah ada cara untuk memanfaatkan info ini untuk memastikan komit yang tepat diambil?

Alex
sumber

Jawaban:

6

Anda tidak menyebutkan bahasa scripting yang ingin Anda gunakan, jadi saya akan berbicara secara khusus tentang permintaan HTTP ke API BitBucket:

Asumsi

Jika Anda memiliki Repositori BitBucket yang memiliki tiga commit di dalamnya, yang pertama dan yang terakhir gagal membangun, yang di tengah lewat:

  • 4768815 ❌
  • 49d7110 ✅
  • 42d357f ❌

Dapatkan daftar komitmen

Anda bisa mendapatkan daftar komitmen dengan memanggil metode API berikut:

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

  • owner: RichardSlater
  • repo_slug: greencommitproofofconcept

Responsnya seperti ini:

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

Jika Anda menguraikan JSON dan mengulangi tanggapan, Anda dapat mengekstrak status dari:

values[n].links.statuses.href

Di mana nindeks, yaitu 0, 1atau 2dalam contoh di atas. Jika Anda membuat ini dari awal, itu akan dalam format berikut.

Dapatkan daftar status dari komit

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

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

Catatan: ini adalah API Hypermedia yang artinya url dapat berubah jadi saya akan merekomendasikan menggunakan tautan dari respons sebelumnya daripada mencoba membuatnya dari awal.

Respons dari permintaan HTTP di atas akan seperti:

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

Dari respons ini Anda dapat mengekstrak statemenggunakan:

values[n].state

Lagi di mana nadalah status- mungkin ada banyak dari mereka jika salah satu komit mengakibatkan banyak membangun.

Jika keadaan untuk bangunan yang Anda pedulikan adalah SUCCESSFULmaka Anda memiliki jawaban Anda dan Anda dapat segera mengembalikannya shauntuk komit.

Ulangi semua komit dari fase pertama, jika Anda kehabisan komit, ikuti nexthalaman linkyang termasuk dalam panggilan ke /commits.

Diagram Alir Lengkap

Pada level tinggi, alirannya akan terlihat seperti ini:

Diagram alir

Jangan lupa ini adalah Hypermedia API sehingga sedapat mungkin minta kode Anda untuk mengikuti tautan di API daripada mencoba untuk "menebaknya".

Richard Slater
sumber
1
Ya, itu mungkin jawaban terpanjang saya di SE.
Richard Slater
Saya menghargai waktu yang Anda berikan untuk menjelaskan ini bahkan jika Anda pikir saya benar-benar gila karena menginginkannya. Diterima
Alex
Tidak sepenuhnya gila, hanya mengambil beberapa langkah pertama - ingat jawaban saya yang lain ketika Anda berpikir tentang arsitektur CI / CD.
Richard Slater
3

Dalam pipa Pengiriman / Penerapan Berkelanjutan yang khas, Anda akan mengalami hal-hal berikut:

  1. Pengembang mendorong satu atau beberapa komitmen, atau, permintaan tarik digabungkan.
  2. Jenkins secara otomatis membuat dan menjalankan tes.
  3. Jika Jenkins yang berhasil menerbitkan paket penerapan ke Gudang Artefak; jika kegagalan tidak mempublikasikan apa pun dan memberi tahu pengembang.
  4. Otomasi penyebaran menggunakan paket-paket dari Gudang Artefact dan menyebarkannya.

Pipa CI / CD Sederhana

Tujuannya adalah untuk menghindari membangun solusi dari sumber dua kali, Anda membangunnya sekali dan menggunakannya berkali-kali. Anda dapat mengimplementasikan persetujuan di Sonartype Nexus untuk menentukan proses persetujuan lingkungan, yaitu Dev → Test → UAT → Stage → Production.

Yang mengatakan ... jika Anda telah membaca semua sebelumnya dan masih ingin mendapatkan bangunan hijau terbaru dari kontrol sumber maka Anda dapat menggunakan salah satu dari dua teknik:

  1. Suruh Jenkins memberi tag pada cabang dengan tag yang sesuai namanya, master-greenlalu gunakan itu alih-alih mastersaat Anda menginginkan bangunan hijau terbaru.
  2. Gunakan komit BitBucket untuk mendapatkan daftar komit dan komit / {sha} / status di atas masing-masing komit untuk menemukan komit dengan status Hijau. Saya telah memperluas solusi ini dalam jawaban lain .

Jangan ragu untuk mengirim pertanyaan tindak lanjut jika Anda ingin detail spesifik tentang cara menggunakan pendekatan di atas.

Richard Slater
sumber