CI odaklı bir gelişmeyi nasıl önleyebiliriz…?


45

Bir sürü diğer düzenli katkıda bulunan çok büyük bir araştırma liderliğindeki açık kaynaklı proje üzerinde çalışıyorum. Proje artık oldukça büyük olduğu için, projeyi sürdürmek, sürekli entegrasyon (CI) vb. Olmak üzere bir konsorsiyum (iki tam zamanlı çalışandan ve birkaç üyeden oluşur) sorumludur. olsa da katkıları.

Proje yaklaşık yarım milyon ya da daha fazla kod satırından oluşan bir "çekirdek" çerçeveden, konsorsiyum tarafından sürdürülen bir sürü "eklentiden" ve çoğu biz de dahil olduğumuz birkaç harici eklentiden oluşuyor. farkında bile değil.

Şu anda, bizim CI çekirdeği ve sürdürülen eklentileri oluşturur.

Karşılaştığımız en büyük sorunlardan biri, katkıda bulunanların çoğunun (ve özellikle de ara sıra olanların), bakımı yapılan eklentilerin% 90'ını oluşturmamasıdır, bu nedenle çekirdekte yeniden yapılanma değişiklikleri önerdiğinde (bu günlerde oldukça düzenli olarak gerçekleşir), GitHub'a bir çekme isteği yapmadan önce, kodun kendi makinelerinde derlendiğini kontrol ettiler.

Kod işe yarar, mutlu olurlar ve sonra CI inşayı bitirir ve problemler başlar: derleme konsorsiyum tarafından sürdürülen bir eklentide başarısız oldu, katılımcının kendi makinesinde oluşturmadı.

Bu eklenti, örneğin CUDA gibi üçüncü taraf kütüphanelere bağımlı olabilir ve kullanıcı istemez, donanım nedenleriyle bu bozuk eklentiyi nasıl derleyeceğini bilmiyor veya basitçe yapamıyor.

Öyleyse - Ya be-birleşti asla-to-of belirsizlik içinde PR kalır reklam aeternam PRs - Ya katkıda bulunan kırık Eklentinin kaynağında yeniden adlandırılmış değişkeni greps için kod, onun / onu dala iter, bekler değiştirir CI derlemeyi bitirir, genellikle daha fazla hata alır ve CI mutlu olana kadar süreci tekrarlar - Veya konsorsiyumda önceden rezervasyon yaptırmış iki kalıcı üyeden biri yardım eder ve PR'ı makinelerinde tamir etmeye çalışır.

Bu seçeneklerin hiçbiri uygulanabilir değil, ancak nasıl farklı yapılacağını bilmiyoruz. Projelerinizde benzer bir durumla hiç karşılaştınız mı? Ve eğer öyleyse, bu problemi nasıl çözdünüz? Burada görmediğim bir çözüm var mı?


84
Bir sisteme bir eklenti API sağlamanın en üst kuralı, kararlı veya en azından geriye dönük olarak uyumlu tutulmasıdır . Eklenti API'sinde kasıtlı olarak değişiklik yapılmadan çekirdekte yapılan değişiklikler asla herhangi bir eklentinin derlemesini bozmaz (bu, yanlışlıkla çalışmayı bozar, ancak derlemeyi bozmaz). Çekirdeğin içindeki değişken adında yapılan basit bir değişiklik, bir eklentinin kopmasına neden olabilirse , eklentiler ve çekirdek arasındaki ayrım tamamen bozulmuş gibi görünmektedir.
Doktor Brown


1
@KevinKrumwiede: Bunu zaten bildiklerinden eminim ;-) Uyumsuzluklar yaşadıysanız, API'yı bilerek değiştirdiklerinden eminim.
Doktor Brown,

3
Gerçekten yanıltıcı olduğu için soruyu tekrar ifade ediyorum. Gibi bir şey Mevcut CI'mızı bozduklarında PR'ları nasıl yönetebilirim? durumunuzu daha iyi ele geçirmek bence.
bracco23

2
Yapma / test süreciniz ne kadar zor / karmaşık? Sadece tek bir komutu çalıştırma veya tek bir düğmeyi tıklatma meselesi olmalıdır. Bu noktada, kullanıcıların bir PR göndermeden önce tüm testleri kendileri için yapmalarını beklemek makul olur.
Alexander,

Yanıtlar:


68

CI odaklı gelişme iyi! Bu, testleri çalıştırmamak ve bozuk kod dahil olmaktan çok daha iyidir! Ancak, bu işin içinde olan herkes için bunu kolaylaştırmak için birkaç şey var:

  • Beklentileri belirleyin: CI'nin sık sık ek sorunlar bulduğunu ve bunların bir birleşme öncesinde düzeltilmesi gerektiğini açıklayan katkı belgelerine sahip olun. Belki de ufacık, yerel değişikliklerin daha iyi sonuç vermesinin olası olduğunu açıklayın - bu nedenle büyük bir değişikliği birden fazla PR'a bölmek mantıklı olabilir.

  • Yerel testi teşvik edin: Sisteminiz için bir test ortamı oluşturmayı kolaylaştırın. Tüm bağımlılıkların yüklendiğini doğrulayan bir komut dosyası? Gitmeye hazır bir Docker konteyner mi? Sanal makine görüntüsü? Test çalıştırıcınızın daha önemli testlere öncelik verilmesini sağlayan mekanizmalar var mı?

  • CI'nın kendileri için nasıl kullanılacağını açıklayın: Hayal kırıklığının bir kısmı bu geri bildirimin yalnızca bir PR gönderdikten sonra gelmesidir. Katkıda bulunanlar kendi depoları için CI kurarlarsa, daha erken geri bildirim alırlar ve diğer insanlar için daha az CI bildirimi üretirler.

  • Her iki şekilde de tüm PR'leri çöz: Bir şey bozulduğu için birleştirilemezse ve sorunların çözülmesinde ilerleme kaydedilmezse, hemen kapatın. Bu terk edilmiş açık halkla ilişkiler her şeyi mahvetti ve herhangi bir geri bildirim sorunu görmezden gelmekten daha iyi. Bunu çok güzel ifade etmek ve tabii ki problem çözüldüğünde birleşmekten mutluluk duyacağınızı açıkça söylemek mümkündür. (ayrıca bkz: Kapanış Art of Jessie Frazelle tarafından , sürdürüp kullananlar için En İyi Uygulamalar: Öğrenme hayır demek )

    Ayrıca, bu terkedilmiş PR'ları keşfedilebilir hale getirerek başkalarının onları alabilmesini sağlayın. Kalan sorunlar daha mekanik ve sisteme aşinalık gerektirmiyorsa, bu, yeni katılımcılar için iyi bir görev olabilir.

Uzun vadeli bakış açısına göre, bu değişiklikler ilgisiz işlevselliği bozuyor gibi görünüyor, bu nedenle sık sık mevcut tasarımınızın biraz sorunlu olduğu anlamına gelebilir. Örneğin, eklenti arayüzleri çekirdeğinizin iç kısımlarını uygun şekilde kapsıyor mu? C ++ uygulama ayrıntılarını yanlışlıkla sızdırmayı kolaylaştırır, ancak aynı zamanda kötüye kullanımı çok zor olan güçlü soyutlamalar oluşturmayı da mümkün kılar. Bunu gece boyunca değiştiremezsiniz, ancak yazılımın uzun vadeli evrimini daha az kırılgan bir mimariye doğru yönlendirebilirsiniz.


13
"Bu terk edilmiş açık halkla ilişkiler her şeyi mahvetti" "Keşke daha fazla bakıcı bu tavrı benimseydi 😔
GammaGames

34

Sürdürülebilir bir eklenti modeli oluşturmak, ana çerçevenizin, eklentilerin güvenebileceği sağlam bir arayüz ortaya çıkarmasını gerektirir. Altın kural, zaman içinde yeni arayüzler sunabilmenizdir ancak önceden yayınlanmış bir arayüzü asla değiştiremezsiniz. Bu kurala uyursanız, konsorsiyum tarafından korunan veya harici bir kural olsun, yanlışlıkla eklentileri kırma korkusu olmadan tüm istediğiniz ana çerçevenin uygulanmasını yeniden düzenleyebilirsiniz .

Açıkladığınızdan, iyi tanımlanmış bir arayüze sahip değilsiniz ve bir değişikliğin eklentileri bozup bozmayacağını söylemek zorlaşıyor. Bu arayüzü tanımlamaya ve onu kod tabanınızda açık bir hale getirmeye çalışın; böylece katkıda bulunanlar neyi değiştirmemeleri gerektiğini bilir.


20
CI otomatikleştirilmiş testlere sahip olmalıdır. Eklentilerin aynı arayüze sahip olmasını sağlamak istiyorsanız, her eklenti ihtiyaç duydukları arayüzü ifade eden testlere katkıda bulunmalıdır. Bu şekilde gelin ve arayüz değiştiğinde, hangisi olacağını, hangi eklentileri kırdığınızı bilirsiniz. Bu testleri yerel olarak yapmam için bana ver ve PR'yi yayınlamadan önce neyi kırdığımı bileceğim.
candied_orange

1
@ lagarkane iyi tanımlanmışlık, teknikten ziyade bir politika konusudur. Dışında sizinki gibi bir yükseltme, önceki davranışını bırakan bir yazılım var. Perl5, Perl6 ile uyumlu değildir, Python2.7, Python3.4 vb. İle tam uyumlu değildir. O zaman ne olursa olsun hala eski kodu destekleyen bir yazılım vardır. Netscape Navigator 4 için yazılmış hemen hemen tüm javascript kodlarını modern tarayıcılarda çalıştırabilirsiniz. Tcl programlama dili, orijinal versiyona vs. geri dönüş yolu ile uyumludur ...
slebetman

3
@lagarkane: Konsorsiyumu oluşturmak doğru yönde atılmış bir adımdı ve çekirdek üyeler enerjilerini bu arayüzleri oluşturmaya odaklarsa, gelecek doktora ve stajyerlerin kırılmalarını en aza indirirken projenizi güçlü tutmaya devam etmelerini sağlayabilirsiniz. :)
casablanca

4
@Fattie: Bu, Apple için işe yarıyor, çünkü tüketiciye yönelik başarılı ürünler geliştiriyorlar ve geliştiriciler bir parçası olmak isterlerse oynamaya zorlanıyorlar. Bu geliştiricilerin aslında değişikliklerin bozulmasından hoşlanmaları pek mümkün değildir ve kesinlikle açık kaynaklı bir proje için iyi bir model değildir.
casablanca

1
@ casablanca hem MacOS hem de WindowsOS soyları oldukça başarılı. (Muhtemelen, saf varlığın en büyük iki ürünü, insanın varlığındadır.) Onlarca yıl boyunca kesinlikle zıt yaklaşımları vardı. Görünüşe göre her ikisi de başarılı olmuş!
Fattie

8

Dürüst olmak gerekirse, bunu daha iyi idare edebileceğinizi düşünmüyorum - değişiklikler projenizin korunan kısımlarının kırılmasına neden olursa, CI başarısız olacaktır.

Projenizde, contributing.mdyeni ve ara sıra katkıda bulunanların katkılarını hazırlamalarına yardımcı olacak bir benzeri var mı ? Hangi eklentilerin çekirdeğin bir parçası olduğu ve uyumlu kalması gereken net bir listeniz var mı?

Bağımlılık vb. Nedenlerden dolayı her şeyi bir makinede oluşturmak zorsa, katkıda bulunanlarınızın kullanması için kullanıma hazır docker görüntüleri oluşturmayı düşünebilirsiniz.


1
Cevap için teşekkürler! Evet, herkese açık olarak katkıda bulunacak ortak kurallarımız var, ancak önerdiğiniz gibi, zaten iyi bir fikir olacak olan eklentileri listelemiyor. Liman işçisi görüntüleri yapmak, şu anki katkıda bulunan süreçte büyük bir gelişme gibi görünüyor!
Girişiniz

8

Bu nedenle, çekirdekte yeniden yapılanma değişiklikleri önerdiklerinde (bu günlerde oldukça düzenli olarak gerçekleşir), kodun github üzerinden bir çekme talebi yapmadan önce makinelerinde derlendiğini kontrol ettiler.

Bu nedenle, açık kaynaklı projelerin serbest stilinin düşebileceği yer burası; Merkezi olarak organize edilen projelerin çoğu, özellikle bir API sınırını geçtiğinde çekirdek yeniden yapılanmaya karşı temkinlidir. Bir API sınırını yeniden yansıtırlarsa, genellikle tüm değişikliklerin bir kerede API ana sürümüne göre artmasıyla planlandığı ve eski API'nin korunduğu bir "büyük patlama" olur .

"Tüm API değişikliklerinin önceden planlanması gerekir" kuralını önerebilirim: Eğer kendilerine yaklaşımlarını önceden kabul etmek için bakıcılarla temas etmemiş bir kişiden, API ile geriye dönük olarak uyumsuz bir değişiklik yaparsa, sadece kapanır ve gönderen kuralı işaret etti.

Eklenti API'sinin açık bir şekilde sürümlendirilmesine de ihtiyacınız olacak. Bu, tüm v1 eklentileri oluşturmaya ve çalışmaya devam ederken v2'yi geliştirmenizi sağlar.

Ayrıca neden bu kadar çok sayıda temel yeniden yapılandırma ve API değişikliği yapıldığını biraz daha sorgulayacağım . Gerçekten gerekli mi yoksa sadece insanlar kişisel zevklerini projeye empoze ediyorlar mı?


2

CI sürecinin, Halkla İlişkiler artırmadan önce katılımcılara daha sıkı, daha kapsamlı ve daha görünür olması gerekiyor. Örnek olarak, BitBucket'in buna izin veren bir boru hattı özelliği vardır; burada ona CI derleme işlemini tanımlayan bir dosya verir ve başarısız olursa dalın birleştirilmesi önlenir.

Teknolojiden bağımsız olarak, bir katılımcının bir şubeye ittiği zaman otomatik kurgular sağlamak, onlara değişiklik yaparken nelere dikkat etmeleri gerektiğine dair daha hızlı geri bildirim verecektir ve olaydan sonra düzeltilmesi gerekmeyen PR'lere yol açacaktır.

Tasarım sorunları çözmek için iyi olurdu, ancak bu soruna diktir.


2

Kod işe yarar, mutlu olurlar ve sonra CI inşayı bitirir ve problemler başlar: derleme konsorsiyum tarafından sürdürülen bir eklentide başarısız oldu, katılımcının kendi makinesinde oluşturmadı.

Bu eklenti, örneğin CUDA gibi üçüncü taraf kütüphanelere bağımlı olabilir ve kullanıcı istemez, donanım nedenleriyle bu bozuk eklentiyi nasıl derleyeceğini bilmiyor veya basitçe yapamıyor.

Çözümünüz basittir: Katkı engelini azaltın .

(1) düzenleme-derleme-test döngüsünü hızlandırmanın ve (2) sorunsuz ortam farklılıklarını yapmanın en basit yolu, derleme sunucuları sağlamaktır :

  • Etli toplama makineleri: Derlemeyi hızlandırmak için 24, 48 veya 96 çekirdek, 2GB RAM / çekirdek, SSD.
  • Doğru donanıma sahip olduklarından emin olun: FPGA, Grafik Kartı, ne gerekiyorsa.
  • Önceden yüklenmiş tüm gerekli yazılım kütüphanelerinin bulunduğu bir Docker resmi oluşturun.

Ve sonra bu derleme sunucularını katkıda bulunanlara açın. Yeni bir Docker görüntüsüne uzaktan giriş yapabilmeli ve bu makinede uzaktan düzenleme-derleme testi yapabilmelidirler.

Sonra:

  • Korunan eklentileri oluşturma / test etmemek için mazeretleri yok: her şey ellerinde.
  • CI odaklı PR'larla uzun bir geri bildirim beklemek zorunda değiller: artımlı derlemeleri ve hata ayıklama yetenekleri var (tahmin etmek yerine).

Genel olarak, derleme sunucuları birden fazla katılımcı arasında paylaşılabilir, ancak özel donanım çevre birimleri söz konusu olduğunda bir katılımcının söz konusu çevre birimini kendi başına kullanması gerekebilir.


Kaynak: canavarların fiyatı ve ihtiyaç duyduğumuz model çeşitliliği göz önüne alındığında FPGA kullanarak yazılım üzerinde çalışmak, her geliştiricinin makinesinde kurulu her FPGA modelini bulamazsınız.


1

Herhangi bir sözleşmeyi değiştirmeden çekirdeğe katkıda bulunmak, bağımlı yazılımı kırabilirse, şunlardan birini önerir:

  • Arabirimlerinizin sözleşmeleri belirsiz olabilir. Belki işlevlerinize ve işlev parametrelerinize özellikler eklemek, sözleşmeleri daha net hale getirmek için müşteri koduna ek sınırlamalar getirilmesinde yardımcı olabilir. Ya da sözleşmeyle ilgili değişiklikler uyguluyorsanız, anlamsal versiyonlamanın benimsenmesi yardımcı olabilir.
  • Ünite testleri olası çağrı senaryolarının yeterince kapsamaz.

Her iki sorunun da çözülmesi kolay olmalı, ancak çekirdek ekibin bunu yapma kapasitesine sahip olamayacağından bahsediyorsunuz. Bir seçenek, sorunu ele almak için topluluktan yardım istemek olacaktır.


1

Başka hiç kimse bunu potansiyel bir çözüm olarak ortaya çıkarmamış gibi görünmüyor.

  • erişebileceğiniz tüm eklentileri listeler.
  • bu eklentilerin tanımladığı tüm testleri çalıştır
  • çekirdek ve tüm eklentiler arasındaki tüm istek / yanıtları / etkileşimleri kaydet
  • bu kayıtları saklayın, bunlar şimdi kaba uyumluluk testleridir.

Çekirdeği geliştirirken, geliştiricilere bu uyumluluk testlerini yapmalarını teşvik edin. Başarısız olursa check-in yapmayın.

Bu% 100 uyumluluk sağlamayacak, ancak çok daha fazla sayıda sorunla erken başlayacak.

İkincil yarar, bu kayıtların hangi arayüzlerin aktif olarak kullanıldığını ve hangi özelliklerin aktif olarak kullanıldığını vurgulayabilmesidir.


0

Durumu göründüğü gibi anlamakta güçlük çekiyorum: CI sadece bir şube mi kuruyor?

CI ile birden fazla şube açamamanızın bir nedeni var mı?

Bu sorunun en basit çözümü, herhangi bir katılımcının kendi branşında CI inşasını yönetmesini mümkün kılmaktır .

O zaman bu dalın çekme talebinin kabul edilmesi için özellik dalında başarılı bir CI derlemesi yapmanız yeterlidir.


Bu sorunu özetliyor gibi görünüyor.
Fattie

1
"Ya da katkıda bulunan [...] kodu değiştiriyor, şubesini zorluyor, CI'nin derlemesini bitirmesini bekliyor, genellikle daha fazla hata alıyor ve CI mutlu olana kadar süreci tekrarlıyor" diyor. durum zaten, fakat sorun şu ki böyle uzun bir hata ayıklama döngüsü ile geliştirmek biraz acı verici.
npostavs

@npostavs Teşekkürler, sanırım ilk veya iki defa okuduğumda özlediğim şey buydu. Öyle olsa bile ... Sanırım sorun gibi görünmüyorum. Çok fazla bağımlılık var, kırılamıyorlar, bu nedenle bir katılımcının tümüyle uyumlu kalması gerekiyor. Büyük yazılımın doğası budur. Yapıyı daha hızlı, belki de yapmak için kesinlikle çalışmalar yapılabilir, ancak başka türlü ne kısayol olabilir?
Kyralessa
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.