labs

Bu lab modernize edildi ama ucтan uca dogrulanmadi. Takilirsaniz bize bildirin.

Jenkins ile Otomasyon

45 dkdockerGitHub'da gor
Bu sayfada

Jenkins ile Otomasyon

Jenkins muhtemelen en yaygın kullanılan otomasyon sunucusu — en çok sevilen değil, en çok kullanılan. Uzun zamandır hayatta ve asıl özelliği genişletilebilirliği: 1.800'den fazla yayınlanmış eklentiden oluşan bir çerçevesi var, bu sayede her tür uygulamayı derleyebiliyor ve her üçüncü parti sistemle entegre olabiliyor. Job tanımlamak için bir web arayüzü var ve bu tanımlar sunucunun dosya sisteminde saklanıyor.

Arayüz ve eklentiler aynı zamanda insanların Jenkins'ten hoşlanmama sebepleri. Eklentiler düzenli olarak güvenlik bildirimlerine konu oluyor, yani sık güncellenmeleri gerekiyor; ama otomatikleştirmeleri zahmetli. Emekli olması gereken tarihten çok sonra hâlâ ayakta tutulan Jenkins sunucuları görürsünüz — çünkü kimse tam o eklenti setini yeniden oluşturabileceğinden ve job tanımlarını yeni sunucuya aktarabileceğinden emin değildir.

Biz Jenkins'i tersinden kullanacağız: en az eklenti, job tanımları kaynak kontrolünde.

Kaynaklar

Jenkins'i Çalıştırmak

Jenkins'i ve yerel bir Git sunucusunu (Gitea) başlatın:

docker compose -f labs/jenkins/infra/docker-compose.yml up -d

Jenkins imajı bu Dockerfile ile derleniyor. Eklentiler ve yönetici kullanıcısı Configuration as Code ile imaja gömülü geliyor; yani kurulum sihirbazı yok ve logların içinden initialAdminPassword kazıp çıkarmanız gerekmiyor.

İki container'ın da çalıştığını doğrulayın:

docker compose -f labs/jenkins/infra/docker-compose.yml ps

Git sunucusunu hazırlayın

Gitea boş bir veritabanıyla açılıyor; kendinize bir kullanıcı oluşturun:

docker compose -f labs/jenkins/infra/docker-compose.yml exec -u git gitea gitea admin user create --admin --username student --password student --email [email protected] --must-change-password=false

--must-change-password=false önemli: bu olmadan Gitea ilk girişte parola değiştirmeye zorluyor ve lab'ın devamındaki Jenkins kimlik bilgileri çalışmıyor.

http://localhost:3000 adresinden Gitea'ya girin: student / student.

Jenkins'e giriş yapın

http://localhost:8080 adresini açın. İlk açılışta bir dakika sürebilir — Jenkins eklentilerini yüklüyor. Giriş bilgileri:

  • kullanıcı: student
  • parola: student

Arayüzü biraz gezin. Tam anlamıyla "web 1.0". Sol menüde ana seçenekler var, Manage Jenkins (Jenkins yönetimi) dahil; sayfanın ortası job oluşturduktan sonra job listesini gösteriyor.

Freestyle Job Oluşturmak

Klasik bir Jenkins job'ıyla başlayalım — adımları web arayüzünde tek tek kurduğunuz freestyle tipi:

  • ana ekranda Create a job (job oluştur) tıklayın
  • adını lab-1 verin
  • tipini Freestyle project seçin
  • OK tıklayın

Yapılandırma sayfasında bir build'in tipik parçaları için bölümler var: kaynak kod, build tetikleyicileri, build adımları.

Metin yazdıran basit bir script çalıştıracağız:

  • Build Steps bölümüne inin
  • Add build step tıklayın
  • Execute shell seçin
  • Command kutusuna şunu yapıştırın:
echo "This is build number: $BUILD_NUMBER of job: $JOB_NAME"
  • Save tıklayın

Jenkins bir job'ı çalıştırırken bir dizi ortam değişkeni tanımlıyor ve adımlarınız bunları okuyabiliyor. Bu script, her çalıştırmada artan build numarasını ve job adını yazdırıyor.

Artık job sayfasındasınız. Sol menüden yeniden yapılandırabilirsiniz; orta bölüm son çalıştırmaları gösteriyor.

Build Now tıklayın. Bittiğinde çıktıya bakın: http://localhost:8080/job/lab-1/1/console

📋 Job'ı bir kez daha çalıştırın — çıktı nasıl değişti?

Takıldınız mı?

Tekrar Build Now tıklayın. Tamamlandığında çıktı burada: http://localhost:8080/job/lab-1/2/console

Job adı aynı; build numarası bir arttı.


Bu Jenkins sunucusunda gerçek bir pipeline'da kullanacağınız başka araçlar da kurulu. Sürümlerini yazdırırsanız ne olur?

📋 Job'ı düzenleyip javac ve docker sürümlerini yazdırın, ardından kubectl get nodes ile Kubernetes düğümlerini listeleyin.

Nasıl yapılacağını bilmiyor musunuz?

Job sayfasında Configure tıklayın. Command kutusunu güncelleyin:

javac --version

docker version

kubectl get nodes

Save, sonra Build Now tıklayın.


Build başarısız oluyor. Shell komutları bir çıkış kodu döndürür: 0 başarı, sıfır dışındaki her şey hata demektir. javac ve docker çalışıyor — Docker komut satırı imajın içinde ve container'a host'un Docker socket'i bağlanmış durumda. Ama kubectl get nodes konuşacak bir küme bulamıyor, sıfır dışında bir kodla çıkıyor ve Jenkins adımı başarısız sayıyor.

Bu adımdan sonra başka adımlar olsaydı çalışmazlardı: job ilk hatada durur.

Peki bu job tanımı tam olarak nerede duruyor? Jenkins sunucusunun dosya sisteminde. Yeni bir sunucuya nasıl taşırdınız? Üzerinde yapılan bir değişikliği nasıl gözden geçirirdiniz? İşte bu yüzden tanımı kaynak kontrolünde tutan pipeline yapısını kullanıyoruz.

Pipeline'lar

Pipeline'lar hâlihazırda kurulu olan workflow-aggregator eklentisinden geliyor. Bir pipeline job'ı, declarative sözdizimiyle yazılmış bir script'i — Jenkinsfile'ı — çalıştırır.

Bu lab'ın eski sürümü görsel pipeline editörü için Blue Ocean arayüzünü kullanıyordu. Blue Ocean artık bakımlı değil; Jenkins bugün yerleşik Pipeline arayüzünü ve Stage View'ı sunuyor, biz de onu kullanacağız.

Yeni bir job oluşturun:

  • http://localhost:8080/view/all/newJob adresini açın
  • adını lab-2 verin
  • tipini Pipeline seçin
  • OK tıklayın

Sayfanın altındaki Pipeline bölümüne inin. Tanımı Pipeline script olarak bırakıp şunu yapıştırın:

pipeline {
    agent any
    stages {
        stage('Audit') {
            steps {
                echo "This is build number: ${env.BUILD_NUMBER} of job: ${env.JOB_NAME}"
                sh 'javac --version'
            }
        }
    }
}

Save, sonra Build Now tıklayın.

📋 Job sayfasını açın. Freestyle job'a göre görünüm nasıl farklı?

Takıldınız mı?

Stage View görüyorsunuz — her aşama için bir kolon içeren, her birinin ne kadar sürdüğünü ve geçip geçmediğini gösteren bir tablo. Tek aşamayla etkileyici değil; aşama ekledikçe build'in zamanını nerede harcadığını ve nerede kırıldığını görmenin en hızlı yolu oluyor.

Build'e girip Console Output ile tam logu görebilirsiniz.


Bu freestyle job'dan iyi, ama tanım hâlâ Jenkins'in içinde duruyor. Sırada onu Git'e taşımak var.

Pipeline'ları Kaynak Kontrolünde Tutmak

Sırada bu Jenkinsfile var. Birkaç aşaması var ve ilginç olanı Deploy: devam etmeden önce bir insandan onay istemek için input bloğu kullanıyor.

Önce Jenkins'in çekebilmesi için lab reposunu yerel Git sunucumuza koymamız gerekiyor.

http://localhost:3000 adresindeki Gitea'da sağ üstteki + işaretine tıklayıp New Repository seçin:

  • Repository Name alanına devsecops yazın
  • diğer her şeyi varsayılan bırakın
  • Create Repository tıklayın

Şimdi yerel Gitea sunucunuzu bu repoya remote olarak ekleyip push edin:

git remote add gitea http://localhost:3000/student/devsecops.git

git push gitea main

Git istemciniz kimlik bilgisi soracak — student / student girin.

http://localhost:3000/student/devsecops adresine bakın, tüm lab içeriğini göreceksiniz. Kendi özel GitHub'ınız.

Jenkins'e dönüp http://localhost:8080/view/all/newJob adresinde bir job daha oluşturun:

  • adını manual-gate verin
  • tipini Pipeline seçin
  • OK tıklayın

Pipeline bölümüne inin:

  • Definition alanını Pipeline script from SCM yapın
  • SCM alanını Git yapın
  • Repository URL alanına http://gitea:3000/student/devsecops.git yazın
  • Credentials yanındaki Add → Jenkins ile bir Username with password

    kimlik bilgisi ekleyin: kullanıcı student, parola student. Sonra açılır listeden seçin.

  • Branch Specifier alanını */master yerine refs/heads/main yapın
  • Script Path alanına labs/jenkins/manual-gate/Jenkinsfile yazın

Jenkins host adı olarak localhost değil gitea kullanıyor. İki container aynı Docker ağında olduğu için Jenkins gitea adını DNS ile çözüyor. Sizin makinenizden aynı sunucu localhost:3000, çünkü yayınlanmış port o.

Kaydedip build'i çalıştırın. Build ve Test aşamalarını geçiyor, sonra duruyor ve sizi bekliyor.

📋 Job arayüzünde Deploy aşamasının devam etmesini ve build'in bitmesini nasıl sağlarsınız?

Takıldınız mı?

Stage View her aşama için bir kutu gösteriyor; tamamlananlar yeşil. Deploy kutusu duraklatılmış durumda bekliyor.

Jenkins manuel onay noktasında bekliyor

Duraklatılmış aşamanın üzerine gelip çıkan isteme tıklayın (ya da build'i açıp Paused for Input bağlantısını kullanın). Jenkinsfile'da tanımlanmış onay penceresi açılacak. Do it! tıklayın, build devam edecek.


input blokları gerçekten faydalı: dağıtımın tamamını otomatikleştirip, insan kararının önemli olduğu noktada yine de onay isteyebiliyorsunuz.

Lab

Sıra sizde. Bu repoda basit bir Java uygulaması derleyip çalıştıran başka bir pipeline var. Jenkinsfile şu yolda: labs/jenkins/hello-world/Jenkinsfile

  • bu pipeline'ı çalıştıracak yeni bir job oluşturun
  • SCM'i her dakika değişiklik için yoklayan bir build tetikleyicisi ekleyin
  • build başarısız olacak 🙂 Jenkinsfile'ı düzeltip değişikliği Gitea

    sunucunuza push etmeniz gerekecek

  • build çalıştığında derlenmiş ikili dosyalar nereye gidiyor?

Düzeltmenizi push etmek için:

git add labs/jenkins/hello-world/Jenkinsfile

git commit -m 'Lab solution'

git push gitea main

Takıldınız mı? İpuçlarına bakın veya çözümü inceleyin.


Temizlik

Lab container'larını kaldırın:

docker compose -f labs/jenkins/infra/docker-compose.yml down -v

-v önemli. Her iki imaj da VOLUME tanımlıyor, bu yüzden yalnızca down çalıştırırsanız Compose arkada isimsiz bir volume bırakır. Gitea'nın veritabanı orada hayatta kalır ve lab'ı tekrar çalıştırdığınızda kullanıcı oluşturma adımı user already exists hatası verir.

Sonraki lablarda kafa karıştırmaması için Gitea remote'unu kaldırın:

git remote rm gitea