Jenkins ile Otomasyon
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
- Jenkinsfile anlatımı
- Declarative Pipeline sözdizimi
- Pipeline adım referansı
- Configuration as Code (JCasC)
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 -dJenkins 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
initialAdminPasswordkazıp çıkarmanız gerekmiyor.
İki container'ın da çalıştığını doğrulayın:
docker compose -f labs/jenkins/infra/docker-compose.yml psGit 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-1verin - 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 nodesSave, 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-2verin - 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
devsecopsyazı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 mainGit istemciniz kimlik bilgisi soracak —
student/studentgirin.
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-gateverin - 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.gityazın - Credentials yanındaki Add → Jenkins ile bir Username with password
kimlik bilgisi ekleyin: kullanıcı
student, parolastudent. Sonra açılır listeden seçin. - Branch Specifier alanını
*/masteryerinerefs/heads/mainyapın - Script Path alanına
labs/jenkins/manual-gate/Jenkinsfileyazın
Jenkins host adı olarak
localhostdeğilgiteakullanıyor. İki container aynı Docker ağında olduğu için Jenkinsgiteaadını DNS ile çözüyor. Sizin makinenizden aynı sunuculocalhost: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.

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 mainTakı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 daVOLUMEtanımlıyor, bu yüzden yalnızcadownç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 existshatası verir.
Sonraki lablarda kafa karıştırmaması için Gitea remote'unu kaldırın:
git remote rm gitea