Jenkins nedir? CI sunucusu açıkladı

Jenkins, ardışık düzenleri kullanarak hemen hemen her dil ve kaynak kodu havuzu kombinasyonu için sürekli bir entegrasyon veya sürekli teslim (CI / CD) ortamı kurmanın yanı sıra diğer rutin geliştirme görevlerini otomatikleştirmenin basit bir yolunu sunar. Jenkins, tek tek adımlar için komut dosyaları oluşturma ihtiyacını ortadan kaldırmazken, tüm oluşturma, test ve dağıtım araçları zincirinizi kolayca kendiniz oluşturabileceğinizden daha hızlı ve daha sağlam bir şekilde entegre etmenizi sağlar.

"Gece yapısını bozmayın!" yazılım geliştirme mağazalarında her sabah test edicileri için yeni oluşturulmuş günlük ürün sürümünü yayınlayan temel bir kuraldır. Jenkins'ten önce, bir geliştiricinin gecelik yapıyı bozmamak için yapabileceği en iyi şey, kodu uygulamaya koymadan önce yerel bir makinede dikkatli ve başarılı bir şekilde derleyip test etmekti. Ancak bu, herkesin günlük taahhütleri olmadan , değişikliklerini tek başına test etmek anlamına geliyordu . Gecelik yapının birinin taahhüdüne dayanacağına dair kesin bir garanti yoktu.

Jenkins - başlangıçta Hudson - bu sınırlamaya doğrudan bir yanıttı.

Hudson ve Jenkins

2004'te Kohsuke Kawaguchi, Sun'da Java geliştiricisiydi. Kawaguchi, geliştirme çalışmasında yapıları bozmaktan yoruldu ve depoya kod eklemeden önce kodun çalışıp çalışmayacağını bilmenin bir yolunu bulmak istedi. Bu yüzden Kawaguchi, Java'da bunu mümkün kılmak için Hudson adında bir otomasyon sunucusu kurdu. Hudson, Sun'da popüler oldu ve açık kaynak olarak diğer şirketlere yayıldı.

2011'e ileri sarıldı ve Oracle (Sun'ı satın almıştı) ile bağımsız Hudson açık kaynak topluluğu arasındaki bir anlaşmazlık, isim değişikliğiyle bir çatallaşmaya yol açtı, Jenkins. 2014 yılında Kawaguchi, Jenkins tabanlı sürekli teslimat ürünleri sunan CloudBees'in CTO'su oldu.

Jenkins çok daha aktif olmasına rağmen her iki çatal da var olmaya devam etti. Bugün, Jenkins projesi hala aktif. Hudson web sitesi 31 Ocak 2020'de kapatıldı.

Mart 2019'da Linux Vakfı, CloudBees, Google ve diğer bazı şirketlerle birlikte Continuous Delivery Foundation (CDF) adlı yeni bir açık kaynaklı yazılım temeli başlattı. Jenkins'e katkıda bulunanlar, projelerinin bu yeni vakfa katılması gerektiğine karar verdiler. Kawaguchi, o zamanlar kullanıcılar için önemli hiçbir şeyin değişmeyeceğini yazdı.

Ocak 2020'de Kawaguchi, yeni şirketi Launchable'a geçtiğini duyurdu. Ayrıca Continuous Delivery Foundation'ın Teknik Gözetim Komitesinde kalmasına ve CloudBees'deki rolünü bir danışmana değiştirmesine rağmen resmi olarak Jenkins'ten geri adım atacağını söyledi.

İlgili video: CI / CD ile kodun daha hızlı iletilmesi

Jenkins otomasyonu

Bugün Jenkins, her türden geliştirme görevinin otomasyonunu desteklemek için yaklaşık 1.600 eklentiye sahip önde gelen açık kaynaklı otomasyon sunucusudur. Kawaguchi'nin başlangıçta çözmeye çalıştığı problem, Java kodunun sürekli entegrasyonu ve sürekli teslimi (yani projeler inşa etmek, testler yapmak, statik kod analizi yapmak ve dağıtmak), insanların Jenkins ile otomatikleştirdiği birçok süreçten yalnızca biridir. Bu 1.600 eklenti beş alana yayılır: platformlar, kullanıcı arabirimi, yönetim, kaynak kodu yönetimi ve en sık olarak derleme yönetimi.

Jenkins nasıl çalışır?

Jenkins, bir WAR arşivi ve ana işletim sistemleri için yükleyici paketleri, bir Homebrew paketi, Docker görüntüsü ve kaynak kodu olarak dağıtılır. Kaynak kodu, birkaç Groovy, Ruby ve Antlr dosyasıyla çoğunlukla Java'dır.

Jenkins WAR'ı bağımsız olarak veya Tomcat gibi bir Java uygulama sunucusunda sunucu uygulaması olarak çalıştırabilirsiniz. Her iki durumda da, bir web kullanıcı arayüzü üretir ve REST API'sine yapılan çağrıları kabul eder.

Jenkins'i ilk kez çalıştırdığınızda, kurulumun kilidini açmak için ilk web sayfasına yapıştırabileceğiniz uzun bir rastgele parolaya sahip bir yönetici kullanıcı oluşturur.

Jenkins eklentileri

Jenkins kurulduktan sonra ya varsayılan eklenti listesini kabul etmenize ya da kendi eklentilerinizi seçmenize izin verir.

İlk eklenti setinizi seçtikten sonra, Yükle düğmesine tıklayın ve Jenkins onları ekleyecektir.

Jenkins ana ekranı mevcut derleme kuyruğunu ve Executor durumunu görüntüler ve yeni öğeler (işler) oluşturmak, kullanıcıları yönetmek, derleme geçmişlerini görüntülemek, Jenkins'i yönetmek, özel görünümlerinize bakmak ve kimlik bilgilerinizi yönetmek için bağlantılar sunar.

Yeni bir Jenkins öğesi, altı iş türünden herhangi biri artı öğeleri düzenlemek için bir klasör olabilir.

Bir komut satırı arayüzü açma seçeneği de dahil olmak üzere Jenkins'i Yönet sayfasından yapabileceğiniz 18 şey vardır. Ancak bu noktada, tipik olarak komut dosyaları tarafından tanımlanan gelişmiş iş akışları olan ardışık düzenlere bakmalıyız.

Jenkins ardışık düzenleri

Jenkins'i yapılandırdıktan sonra sıra, Jenkins'in sizin için oluşturabileceği bazı projeler oluşturmaya gelir. Eğer iken edebilir komut dosyaları oluşturmak için web arayüzünü kullanın mevcut en iyi uygulama Jenkinsfile adında bir boru hattı komut dosyası, yaratmaktır , ve depo içine atın. Aşağıdaki ekran görüntüsü, çok şubeli bir ardışık düzen için yapılandırma web formunu göstermektedir.

Gördüğünüz gibi, temel Jenkins kurulumumdaki bu tür ardışık düzenler için dal kaynakları GitHub dahil Git veya Subversion depoları olabilir. Başka tür depolara veya farklı çevrimiçi depo hizmetlerine ihtiyacınız varsa, bu sadece uygun eklentileri eklemek ve Jenkins'i yeniden başlatmak meselesidir. Denedim, ancak listede bir Jenkins eklentisi olmayan bir kaynak kodu yönetim sistemi (SCM) düşünemedim.

Jenkins ardışık düzenleri bildirime dayalı veya betik olabilir. Bir bildirime boru hattı, iki basit, Groovy uyumlu sentaks-ve kullanır İsterseniz ile, dosyayı başlayabilirsiniz #!groovydoğru yönde kod editörü işaret etmek. Bildirim temelli bir ardışık düzen , aşağıdaki üç aşamalı örnekte olduğu gibi bir pipelineblok ile başlar, bir agentve stagesçalıştırılabilir olanı tanımlar steps.

boru hattı {

    ajan herhangi biri

    aşamalar {

        stage ('Build') {

            adımlar {

                echo 'Bina ..'

            }

        }

        stage ('Test') {

            adımlar {

                echo 'Test ediliyor ..'

            }

        }

        stage ('Dağıt') {

            adımlar {

                echo 'Dağıtılıyor ....'

            }

        }

    }

}

pipelineJenkins pipeline eklentisini çağırmak için zorunlu dış bloktur. agentboru hattını nerede çalıştırmak istediğinizi tanımlar. anyboru hattını veya aşamayı çalıştırmak için mevcut herhangi bir aracı kullanacağını söylüyor. Daha spesifik bir aracı, kullanılacak bir kapsayıcı bildirebilir, örneğin:

ajan {

    docker {

        görüntü 'maven: 3-alp'

        "tanımlı-etiketim" etiketi

        args '-v / tmp: / tmp'

    }

}

stagesbir veya daha fazla aşama yönergesi dizisi içerir. Yukarıdaki örnekte, üç aşama Oluşturma, Test Etme ve Dağıtmadır.

stepsasıl işi yap. Yukarıdaki örnekte, adımlar yalnızca mesajları yazdırdı. Daha kullanışlı bir derleme adımı aşağıdaki gibi görünebilir:

boru hattı {

    ajan herhangi biri

    aşamalar {

        stage ('Build') {

            adımlar {

                sh 'make'

                archiveArtifacts artifacts: '** / target / *. jar', parmak izi: true

            }

        }

    }

}

Burada makebir kabuktan çağırıyoruz ve sonra üretilen tüm JAR dosyalarını Jenkins arşivine arşivliyoruz.

postBölüm boru hattı çalıştırmak veya aşamanın sonunda idare edilecek eylemleri tanımlar. Sen sonrası bölümünde sonrası durum blok numarası kullanabilirsiniz: always, changed, failure, success, unstable, ve aborted.

Örneğin, aşağıdaki Jenkins dosyası her zaman JUnit'i Test aşamasından sonra çalıştırır, ancak yalnızca ardışık düzen başarısız olursa bir e-posta gönderir.

boru hattı {

    ajan herhangi biri

    aşamalar {

        stage ('Test') {

            adımlar {

                sh 'kontrol et'

            }

        }

    }

    İleti {

        her zaman {

            junit '** / target / *. xml'

        }

        başarısızlık {

            mail to: [email protected], subject: 'Pipeline başarısız oldu :('

        }

    }

}

Bildirim temelli ardışık düzen, ardışık düzenleri tanımlamak için ihtiyaç duyduğunuz şeylerin çoğunu ifade edebilir ve Groovy tabanlı bir DSL olan komut dosyalı ardışık düzen sözdiziminden öğrenmesi çok daha kolaydır. Komut dosyası oluşturulmuş ardışık düzen aslında tam gelişmiş bir programlama ortamıdır.

Karşılaştırma için, aşağıdaki iki Jenkins dosyası tamamen eşdeğerdir.

Bildirime dayalı boru hattı

boru hattı {

    aracı {docker 'düğümü: 6.3'}

    aşamalar {

        stage ('build') {

            adımlar {

                sh 'npm —version'

            }

        }

    }

Komut dosyası yazılmış ardışık düzen

düğüm ('docker') {

    ödeme scm

    stage ('Build') {

        docker.image ('düğüm: 6.3'). içinde {

            sh 'npm —version'

        }

    }

}

Mavi Okyanus, Jenkins GUI

En yeni ve en iyi Jenkins kullanıcı arayüzünü istiyorsanız, grafik kullanıcı deneyimi sağlayan Blue Ocean eklentisini kullanabilirsiniz. Blue Ocean eklentisini mevcut Jenkins kurulumunuza ekleyebilir veya bir Jenkins / Blue Ocean Docker konteyneri çalıştırabilirsiniz. Blue Ocean yüklendiğinde, Jenkins ana menünüzde ekstra bir simge olacaktır:

Dilerseniz Mavi Okyanusu direkt açabilirsiniz. Jenkins sunucusundaki / blue klasöründedir. Blue Ocean'da boru hattı oluşturma, düz Jenkins'e göre biraz daha grafikseldir:

Jenkins Docker

Daha önce de bahsettiğim gibi, Jenkins aynı zamanda bir Docker görüntüsü olarak da dağıtılır. Süreçte daha fazlası yok: SCM türünü seçtikten sonra, bir URL ve kimlik bilgileri sağlarsınız, ardından tek bir depodan bir ardışık düzen oluşturur veya kuruluştaki tüm depoları tararsınız. Jenkinsfile olan her dal bir ardışık düzen alacaktır.

Burada, varsayılan SCM sağlayıcıları listesinden birkaç daha fazla Git hizmeti eklentisiyle birlikte gelen bir Blue Ocean Docker görüntüsü çalıştırıyorum:

Bazı ardışık düzenleri çalıştırdıktan sonra, Blue Ocean eklentisi yukarıda gösterildiği gibi durumlarını gösterecektir. Aşamaları ve adımları görmek için ayrı bir ardışık düzeni yakınlaştırabilirsiniz:

Ayrıca dalları (üstte) ve aktiviteleri (altta) yakınlaştırabilirsiniz:  

-

Neden Jenkins kullanmalı?

Kullandığımız Jenkins Pipeline eklentisi, muhtemelen Jenkins için en yaygın kullanım olan genel bir sürekli entegrasyon / sürekli teslim (CICD) kullanım durumunu destekler. Diğer bazı kullanım durumları için özel hususlar vardır.

Java projeleri Jenkins için orijinal varoluş nedeniydi. Jenkins'in Maven ile oluşturmayı desteklediğini daha önce görmüştük; ayrıca Ant, Gradle, JUnit, Nexus ve Artifactory ile de çalışır.

Android bir tür Java çalıştırır, ancak çok çeşitli Android cihazlarda nasıl test yapılacağı konusunu ortaya çıkarır. Android öykünücüsü eklentisi, tanımlamayı istediğiniz kadar benzetilmiş cihaz oluşturmanıza ve test etmenize olanak tanır. Google Play Publisher eklentisi, sürümleri gerçek cihazlarda yayınlamak veya daha ileri testler için Google Play'de bir alfa kanalına göndermenize olanak tanır.

Bir ardışık düzen için aracı olarak bir Docker konteyneri belirttiğimiz ve bir Docker konteynerinde Jenkins ve Blue Ocean'ı çalıştırdığımız örnekler gösterdim. Docker konteynerleri, bir Jenkins ortamında hızı, ölçeklenebilirliği ve tutarlılığı geliştirmek için çok kullanışlıdır.

Jenkins ve GitHub için iki ana kullanım durumu vardır. Bunlardan biri, GitHub deponuza yapılan her kayıtta Jenkins'i tetiklemek için bir hizmet kancası içerebilen derleme entegrasyonudur. İkincisi, OAuth aracılığıyla Jenkins'e erişimi kontrol etmek için GitHub kimlik doğrulamasının kullanılmasıdır.

Jenkins, Java'nın yanı sıra birçok başka dili destekler. C / C ++ için, konsoldan hataları ve uyarıları yakalamak, CMake ile derleme betikleri oluşturmak, birim testleri çalıştırmak ve statik kod analizi gerçekleştirmek için eklentiler vardır. Jenkins'in PHP araçlarıyla bir dizi entegrasyonu vardır.

Python kodunun oluşturulması gerekmese de (örneğin, Cython kullanmıyorsanız veya kurulum için bir Python çarkı oluşturmadığınız sürece), Jenkins'in Nose2 ve Pytest gibi Python test ve raporlama araçları ve kod kalitesi ile entegre olması yararlıdır. Pylint gibi araçlar. Benzer şekilde, Jenkins Rake, Cucumber, Brakeman ve CI :: Reporter gibi Ruby araçlarıyla entegre olur.

CI / CD için Jenkins

Genel olarak, Jenkins pipeline kullanan dillerin ve kaynak kod depolarının hemen hemen her kombinasyonu için bir CI / CD ortamı kurmanın yanı sıra bir dizi başka rutin geliştirme görevini otomatikleştirmenin basit bir yolunu sunar. Jenkins, tek tek adımlar için komut dosyaları oluşturma ihtiyacını ortadan kaldırmazken, tüm oluşturma, test ve dağıtım araçları zincirinizi kolayca kendiniz oluşturabileceğinizden daha hızlı ve daha sağlam bir şekilde entegre etmenizi sağlar.