Git & Jenkins: Dalda en son yeşil taahhüdü alın


10

CI-CD'ye yeni başlamaya başlıyoruz ve bir bebek adımı olarak, her iki saatte bir en son yeşil gelişimle bir yığını güncellemeyi deneyeceğiz. Git / Bitbucket için oldukça yeniyim ve Jenkins'in yaptığı son ödemenin battaniye ifadesi olarak "son taahhüt" yerine Jenkins tarafından yeşil olarak işaretlendiğinden nasıl emin olacağımı anlayamıyorum.

Biz Bildirici Bitbucket Yapı Durumu Bitbucket kaydedilmesini bizim birim testler çalıştırdıktan sonra yeşil parçayı yapar, böylece eklentisi yüklü değil. Doğru taahhüdün seçildiğinden emin olmak için bu bilgileri kullanmanın bir yolu var mı?

Yanıtlar:


6

Kullanmak istediğiniz kodlama dilinden bahsetmiyorsunuz, bu yüzden özellikle BitBucket API'sine yapılan HTTP istekleri hakkında konuşacağım:

Varsayımlar

İçinde üç taahhüt bulunan bir BitBucket Deponuz varsa , son ve son derleme başarısız oluyor, orta geçiyor:

  • 4768815 ❌
  • 49d7110 ✅
  • 42d357f ❌

Taahhütlerin listesini alın

Aşağıdaki API yöntemini çağırarak taahhütlerin listesini alabilirsiniz:

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

  • owner: RichardSlater
  • repo_slug: greencommitproofofconcept

Yanıt şuna benzer:

{
  "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'u ayrıştırır ve yanıtların üzerinden dönerseniz, durumları şu konumdan çıkarabilirsiniz:

values[n].links.statuses.href

Nerede nindeksi, yani 0, 1ya 2yukarıdaki örnekte. Bunu sıfırdan inşa edecek olsaydınız, aşağıdaki formatta olurdu.

Durumların listesini taahhütten alın

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

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

Not: Bu URL'ler anlamına gelen bir Hypermedia API'sıdır olabilir doğrusu sıfırdan üretmek için çalışmak yerine önceki yanıtından bağlantıları kullanarak öneriyoruz, böylece değiştirin.

Yukarıdaki HTTP isteğinin yanıtı şöyle olacaktır:

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

Bu yanıttan aşağıdakileri statekullanarak ayıklayabilirsiniz :

values[n].state

Yine burada nolduğunu status- Birçok kurar biri sonuçlandı kesinleştirme eğer bunların çoğu söz konusu olabilir.

Önem verdiğiniz yapı için durum SUCCESSFULcevabınız varsa ve hemen shataahhüt için geri dönebilirsiniz .

İlk aşamadaki tüm taahhütleri tekrarlayın, eğer bitirirseniz çağrının içerdiği nextsayfayı takip edin .link/commits

Komple Akış Şeması

Yüksek bir seviyede akış şöyle görünecektir:

Akış diyagramı

Bu bir Hypermedia API olduğunu unutmayın, bu yüzden mümkün olan her yerde kodunuzu "tahmin" denemek yerine API bağlantıları izleyin.


1
Evet, muhtemelen SE hakkındaki en uzun cevabım.
Richard Slater

Bunu istemek için tamamen deli olduğumu düşünseniz bile, bunu açıklamak için harcadığınız zamanı takdir ediyorum. Kabul edildi
Alex

Tamamen deli değil, sadece ilk birkaç adımınızı atıyor - CI / CD mimarilerini düşünürken diğer cevabımı aklınızda tutun.
Richard Slater

3

Tipik bir Sürekli Dağıtım / Dağıtım boru hattında aşağıdakiler olur:

  1. Geliştirici bir veya daha fazla taahhütte bulunur veya bir çekme isteği birleştirilir.
  2. Jenkins testleri otomatik olarak yapar ve yürütür.
  3. Başarılı Jenkins bir Artefakt Deposuna bir dağıtım paketi yayınlarsa; başarısızlık hiçbir şey yayınlamaz ve geliştiricileri bilgilendirirse.
  4. Dağıtım otomasyonu, Artefact Deposundaki paketleri kullanır ve dağıtır.

Basit CI / CD Boru Hattı

Amaç kaçınmaktır bina defalarca, bir kez inşa iki kez kaynağından çözümü ve dağıtın. Ortam onay sürecini tanımlamak için Sonartype Nexus'ta onaylar uygulayabilirsiniz , örn. Dev → Test → UAT → Sahne → Üretim.

Dedi ki ... Eğer öncekilerin tümünü okuduysanız ve hala kaynak kontrolünden en son yeşil yapıyı almak istiyorsanız, iki teknikten birini kullanabilirsiniz:

  1. Jenkins şubeye uygun şekilde adlandırılmış bir etiketle etiketlenmesini sağlayın , yani en son yeşil derlemeyi istediğinizde master-greenkullanmak yerine bu etiketi kullanın master.
  2. Bitlerin bir listesini almak için BitBucket taahhütlerini kullanın ve Green statüsündeki taahhüdü bulmak için her biri üzerinde / {sha} / statuse komutlarını kullanın . Başka bir cevapta bu çözümü genişlettim .

Yukarıdaki yaklaşımların nasıl kullanılacağına ilişkin ayrıntılı bilgi almak isterseniz, takip sorusu gönderebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.