Yapıyı başarısız kılan otomatik olarak geri alma taahhütleri


43

Bir meslektaşım, CI sunucumuzu yapıda başarısız olan işleri geri almak için yapmayı düşündüğünü söyledi, bu yüzden HEADgiriş masterher zaman kararlıdır (yapıyı en az geçerken olduğu gibi).

Bu en iyi uygulama mı, yoksa mastergeliştirici düzeltene kadar kırılmaktan daha mı sorunlu olabilir ?

Benim düşüncem, taahhüdün geri alınmasının, taahhüt ve düzeltmeyi okuma görevini daha karmaşık hale getireceğidir (geliştirici geri döndürmek ve sonra düzeltmeyi yapmak zorunda kalır, ki bu da aynı şekilde dağınıktır git log) düzeltme. masterKararlı olmada bazı avantajlar görsem de, bu başarısız taahhütler beni ikna etmiyor.

düzenleme: farketmez masterya da başka bir geliştirme dalı, farketmez , ancak soru aynı kalır: CI sistemi inşa başarısız oldu bir taahhüt geri dönmeli mi?

başka bir (uzun) düzenleme: Tamam, gitgarip bir şekilde kullanıyoruz. Şubeler kavramının gerçek CI'ye aykırı olduğuna inanıyoruz, çünkü bir şubeye bağlı kalmak sizi diğer geliştiricilerden ve değişikliklerinden izole ediyor ve şubenizi yeniden düzenlemek ve olası çatışmalarla baş etmek zorunda olduğunuzda zaman kazandırıyor. Herkes masterbu çatışmayı kabul ederse , en aza indirgenir ve her taahhüt tüm testleri geçer.

Tabii ki, bu sizi yalnızca kararlı bir şekilde itmeye zorlar (ya da yapıyı bozarsınız) ve geriye dönük uyumluluğu bozmamak ya da yeni özellikler eklerken özellik değiştirme yapmak için daha dikkatli bir şekilde programlamanızı sağlar.

Bu şekilde veya bu şekilde CI yaparken travmalar vardır, ancak bu sorunun kapsamı dışındadır ( bununla ilgili soruya bakın ). Tercih ederseniz, soruyu cevaplayabilirim: küçük bir geliştirici ekibi bir özellik dalında birlikte çalışır. Bir geliştirici o dalın yapısını bozan bir şey yaparsa, CI sistemi taahhüdünü geri almalı mı yoksa geri almamalı mı?


38
Başarısız olan inşaatlarla masterbaşlamak için asla ulaşılmamalıydı . Gelişme ve özellik dalları bunun için kullanılır. Bu değişiklikler, daha sonra birkaç geliştiricinin tüm yeni özelliklerinin birlikte çalışıp çalışmayacağını ve yalnızca test edildiğinde ustalaşabileceğini test edebileceğiniz bir entegrasyon dalı gibi bir şeye gider. Ya da en azından bu olası bir iş akışı.
thorsten müller

1
@ thorstenmüller, o zaman tüm geliştiricilerin kullandığı bir geliştirme dalında olduğunu hayal edin. CI sistemi geri dönme işlemi yapılamayan bir işlem yapmalı mı?
Carlos Campderrós

7
Git'i garip bir şekilde kullanıyor gibisin. Genel olarak, insanlar kendi şubelerinde kendi depoları üzerinde çalışmalı ve kişisel yapıları için değişikliklerin tamam olduğunu doğruladıkları için CI’ye yalnızca bir kez ana basmalılar.
Wilbert

4
> "bu çatışmalar minimuma indirilmiş"; birleşme zamanında daha az çatışma elde edersiniz, ancak kötü birleşmelerle ilgili sorunları çok daha fazla alırsınız. Çözüm, dalda değil, ustadan dalınıza, sürecinizin bir parçası olarak sürekli birleşmektir.
deworde

2
... Neden bu kadar başarısız yapıya başlayamayacağına karar veremesin?
user253751

Yanıtlar:


55

Bunu, aşağıdaki nedenlerle yapmaya karşı olacağım:

  • Sizin adınıza kodu değiştirmek için otomatik bir araç kurduğunuzda , yanlış yapma veya bu değişikliği yapmayı bırakmanız gereken yerlerde (örneğin, Google Mock’un en son sürümü) bir durum ortaya çıkma riski vardır. İçinde bir hata vardı, bu yüzden kodun başarısız değil) ve yeniden yapılandırmak için zaman harcamalısın. Ayrıca, kodunuzdaki bir hata yerine derleme sistemindeki bir hata nedeniyle derlemenin başarısız olma riski her zaman küçüktür. Benim için, CI duyduğu güveni kazanma hakkındadır benim kod doğrudur; bu sadece endişelenmem için onu başka bir potansiyel sorun kaynağına dönüştürecektir.

  • "Yapıyı" bozan hata türleri, düzeltilmesi çok az zaman alan saçma hatalar olmalıdır (bir yorumda belirtildiği gibi, bu sizin için geçerlidir). Eğer daha ince ve karmaşık böcekler düzenli olarak ustalaşıyorsa, doğru çözüm "daha hızlı düzeltmek" değildir, özellik dallarını birleştirmeden önce gözden geçirirken daha dikkatli olmak gerekir.

  • Hata düzgün bir şekilde giderilirken ustayı birkaç dakika boyunca inşa edilemez bırakmak kimseye zarar vermez. CEO'nun şahsen şahsen kontrol edeceği ve kodu doğrudan müşterilere rastgele bir anda (en azından umarım katılımınız olmadan) yayınlayacak gibi değil. Eğer hatayı düzeltmek için önce bir şeyler bırakmak gerekir pek olası durumunda, o zaman kolayca yayınlamadan önce manuel olarak dönmek için karar verebilirsin.


1
Ayrıca, yalnızca başarılı yapılar konuşlandırılabilecek bir "yapı damlası" oluşturulmasını tetiklemelidir. Bir derleme başarısız olursa, konuşlandırılabilir bir yapı düşmesi olmamalıdır, bu nedenle birisinin müşterilere kötü kod yayınlaması riski olmamalıdır.
Mark Freedman,

1
kesinlikle kullandığım ve bundan daha iyi kullanılan bir seçenek daha var bence ve ağır kullanımda (twitter'da kullanıyoruz). usta üzerine başarısız inşa etmeyin VE saçma sapan hataların hala düzeltilmesi kolaydır. Aşağıda tam cevabımı görün.
Dean Hiller

26

Önce şartlar üzerinde anlaşalım.

İki farklı senaryoyu ayırt etmek için kişisel olarak Sürekli İnşa ve Sürekli Entegrasyon terimlerini kullanıyorum:

  • Sürekli Yapı: havuzun son derlemeden bu yana değişip değişmediğini düzenli aralıklarla kontrol eden ve varsa der / test eden bir araçtır.
  • Sürekli Entegrasyon: Çekme İsteklerini alan ve görünür hale getirmeden önce en son başa doğru onları doğrulayan bir araç .

İkincisi, Sürekli Entegrasyon, koruduğu havuzun her zaman yeşil olduğu anlamına gelir 1 : kesinlikle daha iyidir.

Sorunuz sadece Continuous Build için gerçekten anlamlı, bu yüzden bunun sizin kurulumunuz olduğunu farz ediyorum.

1 : Çevresel nedenler aynı zamanda bir yapıyı mahvedebilir, örneğin kodlanmış bir yılı (2015) içeren bir test 2016 yılının Ocak ayından itibaren başarısız olmaya başlayabilir, bir disk doldurabilir, ... Tabii ki dengesiz bir veba testleri. Bu meseleleri merakla görmezden geliyorum; yoksa asla bir yere gidemeyiz.


Sürekli bir Yapı kurulumunuz varsa, yapıyı bozmuş olabilecek taahhütlerin tersine çevrilmesini gerçekten otomatikleştirebilirsiniz, ancak birkaç incelik vardır.

  • Taahhütleri gerçekten kaldıramazsınız: diğer meslektaşlar onları çoktan kontrol etmiş olabilir ve bir sonraki taahhüdünde çalıştıklarında geri iteceklerdir. Bunun yerine, tersine çevirme işlemi ters fark yaratmalıdır. Oh, ve iş arkadaşlarınız, tekrar doğru itmek için bir yol bulmak zorunda olduklarından, doğru olduklarında çalışmalarını geri aldığınız için nefret edecekler ...
  • Aslında sadece son taahhüdünüzü soyamazsınız (bir birleştirmedir), ancak tüm taahhütleri belli bir noktaya kadar soymanız gerekir. Örneğin, bilinen son iyi taahhüt (sistemi önyükleme yaparken dikkatli olun).
  • Dış nedenleri (çevre sorunları) düşünmeniz ve her şeyi 0 gününe geri döndüren bir kurulumdan kaçınmanız gerekir. Neyse ki, son bilinen iyi taahhüdümüze geri dönmek bu konuyu takip ediyor.
  • Bilinen son iyi yapının artık inşa edilemeyeceğini (çevre sorunları) düşünmeniz gerekir, bu durumda diğer tüm taahhütlerin tersine çevrilmesi muhtemeldir. İdeal olarak, başarısızlık durumunda ve geri dönmeden önce, bilinen en son yapıyı kontrol edip yeniden test edersiniz. Geçerse, geri döndürün, aksi takdirde bir uyarı yükseltir.

Bu sistemde, dengesiz bir test veya sık sık iş yapan bir meslektaş durumunda, birçok iyi taahhüdün tersine çevrileceğini unutmayın. İş arkadaşlarınız sizden nefret edecek.


Umarım korku hikayem, kırılmış bir depoya izin verme sorununu ortaya çıkarmıştır ve şimdi, PR'nin doğrudan depoya hiçbir zaman doğrudan itilmediği, bunun yerine her zaman bir iş kuyruğunda birleştirme kuyruğuna alındığı ve her seferinde bir bütünleştirildiği sıraya uygun bir Sürekli Entegrasyon boru hattı uygulayacaksınız. veya roll-up'lar ile):

  • yerel olarak depo başkanı getirmek
  • çekme isteklerini uygulayın
  • inşa et ve test et
  • başarı durumunda depoya itin, aksi halde başarısız olarak işaretleyin
  • sonraki isteklere taşı

Her ikisini de denedikten sonra bu kesinlikle daha iyi.


2
Bu gerçekten doğru cevap - doğru çözüm, kötü değişikliklerin ana şubeye ulaşmalarını engellemek, inişlerine izin vermemek ve daha sonra onları geri almakla uğraşmak zorunda kalmak.
Daniel Pryden

Bence buradaki sorun, sorgulayıcının "sizi diğer geliştiricilerden izole etme ve değişikliklerinin" belirtilen maliyetlerinin faydalardan daha ağır olduğuna inanıyor olduğunu düşünüyorum. Belirtilen maliyetler, iki kişinin birbirinden uzaklaştığı önemsiz birleşme riskinin artması. IMO'nun bozuk koddan izole olmanın faydası açıktır. Sorgulayıcı, kesilen kodun kısa bir süre masteriçin çekilebildiği "iyimser" bir strateji almak ve testler başarısız olduğunda bu durumu düzeltmek istiyor . Diğer herkes sizin önerdiğiniz gibi "karamsar" bir strateji izliyor ve sadece geçiş kodunu kullanmanız için uygun hale getiriyor.
Steve Jessop

("kullanılabilir" ifadesiyle master"ideal", geliştiricilerin nezaketle yapabileceği bir şey olan "çekilme " anlamına gelir , ancak bunu başarmak masteriçin test edilmeden ve geçmeden önce gelen taahhütleri ertelemelisiniz . cherry-pick test edilmemiş veya test edilmiş ve başarısız olmuş kod da iyi ve kod bu anlamda "kullanılabilir", sadece bahsettiğim şey değil)
Steve Jessop

Doğru çözüm, kötü değişikliklerin HERHANGİ bir şubeye ulaşmasını engellemektir. Başarısız olan taahhütler asla halka açıklanmamalıdır.
Miles Rout

5

Bu en iyi uygulama mı, yoksa geliştirici tamir edene kadar ustayı kırmaktan daha mı sorunlu olabilir?

Bu sorunlu. "Usta HEAD bozuldu; üst değişikliği geri getireceğim" kararını veren kişi, aynı şeyi yapan CI sisteminden tamamen farklı.

İşte birkaç dezavantaj:

  • Otomatik ters çevirme işlemindeki hatalar depoyu mahveder;

  • bu, tek bir değişiklik setinin (en üstteki) yapıyı bozduğunu varsaymaktadır (gerçekçi değildir)

  • Bakanlar, sorunu çözmek için sadece soruşturma ve taahhüt etmekten çok daha fazla çalışacaklar (aynı zamanda ters geçmişe bakmak zorunda kalacaklar)

Şubeler kavramının gerçek CI'ye aykırı olduğuna inanıyoruz, çünkü bir şubeye bağlı kalmak sizi diğer geliştiricilerden ve değişikliklerinden izole ediyor ve şubenizi yeniden düzenlemek ve olası çatışmalarla baş etmek zorunda olduğunuzda zaman kazandırıyor.

Bu inanç (dalları vs. CI) yanlıştır. Yalnızca birim olarak test edilmiş değişiklik setlerini işlediğiniz tek bir sabit dalı tutmayı düşünün . Gerisi (özellik dalları ve yerel şubeler) her bir geliştiricinin sorumluluğunda olmalı ve CI politikanızın bir parçası olmamalıdır.

Özellik dallarında diğer geliştiricilerden izole edilmek istersiniz . Bu size sağlar:

  • keşif kodlaması yapmak

  • kod tabanı ile deneme

  • Yedekleme noktaları ayarlamak (mahvetmek durumunda), daha anlamlı değişiklik geçmişi oluşturmak (taahhüt mesajları yoluyla) ve çalışmanızı yedeklemek ve tamamen başka bir şeye geçmek ( "git commit && git checkout" yazmanız için gereken süre)

  • uzun süren düşük öncelikli görevleri yerine getirin (örneğin, veri katmanının 80 sınıfının tümünü değiştiren bir yeniden düzenleme işlemi gerçekleştirmek istiyorsunuz: her biri bir kod derlemesi değiştirene kadar günde iki tane değiştirirsiniz (ancak bunu yapabilirsiniz). tek bir taahhütte bulunana kadar kimseyi etkilemeden).

Bir geliştirici o dalın yapısını bozan bir şey yaparsa, CI sistemi taahhüdünü geri almalı mı yoksa geri almamalı mı?

Olmamalı. CI şubenize sabit kodlar koymak, otomatik bir sistem değil, üreticinin sorumluluğundadır.


2

Ana şubenizi her zaman iyi durumda tutmak için bir Gerrit + Jenkins ortamı kullanmanızı öneririm. İnsanlar yeni kodlarını Gerrit'e zorlarlar ve bu eki çekmesi için bir Jenkins işini tetikler, inşa eder, test eder, vb. Düzeltme ekiniz ve Jenkins gibi diğer geliştiriciler işini başarıyla tamamlarsa, Gerrit bu kod parçasını ana şubenize birleştirir.

@ Brian-vandenberg tarafından tarif edilen benzer bir ortam

Şubenizi iyi durumda tutmanın yanı sıra, yazılımınızla ilgili kod kalitesini ve bilgi paylaşımını artıran bir kod inceleme adımı ekleyin.

[1] Jenkins https://jenkins-ci.org/

[2] Gerrit https://www.gerritcodereview.com/


1

CI asla reponun taahhüt geçmişini değiştirmemelidir.

Buradaki doğru çözüm, test edilmemiş ve doğrulanmamışsa ana şubeye hiçbir taahhüt eklenmemesidir.

Özellik dalları üzerinde mi çalışıyorsunuz, CI'nin bunlarda otomatik olarak çalışmasını sağlayın ve eğer yapılar başarısız olursa, bunları master'da birleştirmeyin.

Bunlar bir endişe durumunda, özellik dalında çalışarak ve yapı ana / entegrasyon / yerel şubede ne olursa olsun, daha sonra testleri çalıştırarak birleştirmeyi test eden ek bir derlemeye sahip olabilirsiniz.


1
Bu soruya hiçbir şekilde cevap vermiyor. Derleme bir özellik dalında başarısız olursa, CI işlemi geri almalı mı?
Carlos Campderrós

Derleme, özellik dalında başarılı ancak birleştirme işleminden sonra başarısız olursa ne olur ?
Matthieu M.

@MatthieuM. birleştirme bir taahhüttür, birleştirilen CI aşaması yapıyı geri almalı mıdır?
Carlos Campderrós

@ CarlosCampderrós: ​​Şahsen hiçbir zaman işleri geri almaya çalışan bir kuruma sahip olamam ; çok fazla karmaşık.
Matthieu M.

Yorumlara değindim.
Daenyth,

1

Yapım sunucumuz için Jenkins kullanıyoruz ve idareleri zorlamak için gatekeeper modelini kullanıyoruz - burada Jenkins ve taahhüt tetikleyicilerinin (meslektaş gözden geçirenlerin işlerini yapmasını sağlayan) bir kombinasyonu kapı bekçisidir.

Taahhütler dolaylı olarak bir kıvrım yoluyla Jenkins'e itilir , burada ana repoyu klonlar ve sonra birleşme taahhüdünü / işlemlerini gerçekleştirir ve gerekli tüm inşaatları yapar (Linux / solaris için). Tüm yapılar tamamlanırsa, taahhüt zorlanır.

Şimdiye kadar tartışılan sorunların tümü değilse, bu birçok kişiden kaçınır:

  • tarih değişikliği
  • kırılmayı düzeltmek zorunda olan kişi sizseniz, tarihin doğru olması
  • istikrarsızlık (kırılmış yapılar şeklinde) asla tanıtılmaz

Ayrıca başarıyla tamamlanan ünite testleri gibi diğer gereklilikleri doğrudan uygulamamızı sağlar.


re: Eksi oyla, cevabım hakkında sevmediğiniz şeyler hakkında yorum yapar mısınız?
Brian Vandenberg

0

Son taahhüdünüzün yapıyı bozduğunu söyleyerek bu otomatik e-postayı kaç kez aldınız? Kaç kere yanılıyor? Ama şimdi gerçekten senin mi, yoksa aynı anda başka bir şey yapan başka birinin mi olduğunu kontrol etmek zorundasın. Ya da belki çevresel bir şeydi.

Sistem kesin olarak bilmiyorsa, kesinlikle otomatikleştirmek istemiyorum.


0

Sorulan soru hatalı. Buna rağmen saygı duyuyorum

"Branş kavramının gerçek CI'ye aykırı olduğuna inanıyoruz, çünkü bir şubeye bağlı kalmak sizi diğer geliştiricilerden ve onların değişikliklerinden izole ediyor"

Yapmanız gereken şey bu adımlar.

  • İsterseniz ustayla çalışın (bu iyidir ve herkesten değişiklikleri çekmeye devam edin) AMA yerel olarak ustalık ETMEYİNİZ
  • SADECE değişikliklerinizi usta yerine getirmeden ÖNCE, bir adres oluşturun.
  • otomatik binanızın tüm request_XXX şubesi yapmasını sağlayın
  • Seçenek 1: molalar oluşturun veya molaları birleştirin ... reddedilenleri değiştirin ve asla ustalığa inmez
  • Seçenek 2: inşaat işleri, jenkins ustayı iter ve günceller

O zaman, yaptığımız şey, HERKESİN ustalık taahhüdünde bulunmalarını önlemeye gitmekte kararlı bir kanca takmaktır. Harika çalışıyor .... Hiçbir zaman hiç kırık yapılamaz ve hiçbir geri dönüş de ustadan taahhüt eder.

sonra Dean

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.