- Jenkins, Sürekli Entegrasyon (CI / Continuous Integration) ve Sürekli Dağıtım (CD / Continuous Delivery) amacıyla Java ile yazılmış açık kaynaklı bir otomasyon aracıdır.
- Jenkins, yazılım projelerinizi sürekli olarak oluşturmak ve test etmek için kullanılır, bu da geliştiricilerin değişiklikleri projeye entegre etmesini ve kullanıcıların yeni bir sürüm elde etmesini kolaylaştırır.
- Ayrıca, çok sayıda test ve dağıtım teknolojisiyle bütünleşerek yazılımınızı sürekli olarak teslim etmenize olanak tanır.
- Jenkins ile kuruluşlar, otomasyon yoluyla yazılım geliştirme sürecini hızlandırabilir.
- Jenkins, derleme, belgeleme, test etme, paketleme, aşama, devreye alma, statik analiz ve çok daha fazlası dahil olmak üzere her türlü geliştirme yaşam döngüsü sürecini entegre eder.
- Yazılım geliştirme sürecinde birleştirme işlemlerinin otomatikleştirilmesidir.
- Yani, yazılım geliştiricilerin yaptıkları değişiklikler sürekli olarak ana kod tabanına entegre edilir ve böylece çatallanma ve birleştirme hataları önceden tespit edilir.
- Jenkins, bu süreci otomatikleştirmek için kullanılan bir araçtır.
-
Yazılımın sürekli olarak hızlı ve güvenli bir şekilde kullanıma sunulması için yapılan bir dizi uygulama ve süreçlerdir.
-
Bu süreçler arasında test otomasyonu, konfigürasyon yönetimi, uygulama dağıtımı, sürüm kontrolü vb. yer alır.
-
Jenkins, bu süreci de otomatikleştirmek için kullanılan bir araçtır.
-
Yani, CI, kod değişikliklerinin entegrasyonunu otomatikleştirirken, CD ise yazılımın sürekli olarak güvenli ve hızlı bir şekilde kullanıma sunulmasını sağlar.
- İşlerin ardışık bir sırada yapılması, bir işlemin çıktısının sonraki gelen işlemin girdisi olması anlamına gelmektedir.
- Fabrikadaki üretim bantlarını aklımıza getirelim.
- Üretilen eşya, hattın içerisinde farklı duraklara gelir.
- Her durakta bir işlem görür ve sonraki aşamaya geçer.
- Pipeline içerisinde yer alan fazları ifade eder. Örneğin standart bir yazılım projesinde build -> test -> deploy adımlarından her birisi bir fazı ifade eder.
-
Stage içerisinde yer alan adımları ifade eder.
-
Jenkins üzerinde kodumuzun geçtiği aşamaları düşünelim:
-
Build -> Test -> Deployment
-
Build (derleme) aşamasını bir evre (stage) olarak düşünelim.
-
Test evresi de sonraki evre.
-
Deployment evresi de en son çalışacak evre olarak düşünelim.
-
Bu işlemler Jenkins üzerinde ardışık bir sırada çalışmaktadır.
-
Build işlemi hatalı olursa, yani kodumuz derlenmez ise, sonraki evreye geçmeyecektir.
-
Aynı şekilde test safhasında hata oluşursa, deployment işlemi gerçekleşmeyecektir.
- Jenkins'i kısa bir özet geçtiğimize göre , jenkins nasıl kurulur o adımlara geçelim.
- İsterseniz kendi local'ınıza jenkinsi indirebilirsiniz.
- Ama ben böyle yapmayacağım.
- Google cloud hesabımdan ubuntu bir makine kuracağım.
- İlk önce https://cloud.google.com/ sayfasına girininiz.
- Compute Engine > VM instances > Create Instance diyerek oluşturmaya başlayalım.
- Karşımıza böyle bir sayfa geliyor.
- Sunucu adınızı giriniz.
- Boot Disk bölümünden ubuntu 20.04'ü seçiniz.
- Son olarak HTTP isteklerine izin veriyoruz.
- Create kısmına tıklıyoruz.
- Sunucu oluşturma tamamlandı. Şimdi yapmamız gereken SSH ile içine giriyoruz.
- Karşımıza böyle bir ekran açılıyor.
- Şimdi yapmamız gereken sunucunun içinde docker ve docker-compose yüklemek.
- Yazacağım komutları tek tek yazınız.
- Docker
sudo apt-get remove docker docker-engine docker.io containerd runc
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
apt-cache policy docker-ce
sudo apt install docker-ce -y
sudo systemctl status docker
docker --version
- Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version
- Eğer bu komutların ne işe yaradığını merak ediyorsanız bu sayfalara bakabilirsiniz :
- https://phoenixnap.com/kb/install-docker-on-ubuntu-20-04
- https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-compose-on-ubuntu-20-04
- Şimdi docker-compose.yaml dosyası oluşturup içine jenkins image'nı yazmamız gerekiyor.
sudo su
nano docker-compose.yaml
- nano docker-compose.yaml dediğimiz zaman içine yazı yazabileceğimiz bir text sayfası açılır.
- İçine jenkins image'nı yazıyoruz.
- Yazdıktan sonra ctrl + x , y , enter yapıyoruz.
ls
- ls çekip dosyamızı görebiliriz.
version: "3.7"
services:
jenkins:
image: jenkins/jenkins:lts
privileged: true
restart: always
user: root
ports:
- "8080:8080"
container_name: jenkins
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose
- jenkins_vol:/var/lib/jenkins/data
volumes:
jenkins_vol:
- Şimdi gelelim container ayağa kaldırma kısmına.
docker-compose up -d
docker ps
- ps çekerek container durumuna bakabiliriz.
- Artık jenkins yükleme kısmını tamamladık. Gelelim jenkins yönetim ekranına.
- Sunucumuzun oluştuğu ekranı açalım.
- Bu kısımda iki tane IP adresi var. Bunlardan kısaca bahsedelim
- Internal IP : Makinenizin Google Cloud ağındaki yerel IP adresidir. Bu IP adresi, yalnızca Google Cloud ağındaki diğer kaynaklarla iletişim kurmak için kullanılabilir ve internete erişim sağlamak için kullanılamaz.
- External IP : Makinenizin internet üzerinden erişilebilir genel IP adresidir.Bu IP adresi, makinenize internet üzerinden erişim sağlamak için kullanılır ve internetteki diğer kaynaklarla iletişim kurmak için kullanılır.
- Bu kısmıda öğrendiğimize göre bir tane browser açalım ve External IP:8080 adresine bağlanalım.
- External IP:8080 adresine girdiğimiz zaman önümüze bir ekran geliyor ve key istiyor.
- Bu key'i almak için SSH tekrardan girelim.
docker ps
- docker ps çekelim.
docker logs -f containerId
- container'ımızın loglarına bakarsak şifreyi görebiliriz.
- Tamamlanmasını bekleyelim.
- Instance Configuration sayfasında direk save and finish kısmına tıklayınız.
- Artık yönetim sayfasını açmış oluyoruz.
- Şimdi bu kısımda Kontrol Merkezi > Jenkins'i Yönet > Plugin Manager > Available Plugins kısmından Maven Integration, Pipeline Maven Integration , Pipeline Utility Steps ,Docker , Docker Commons , Docker Pipeline , docker-build-step kısımlarını indirip sunucuya restart atıyoruz.
- Bu adımıda tamamladığımıza göre şimdi yeni bir öge oluşturalım.
- Açılan sayfada şu adımları doldurup seçiyoruz.
- Bu alanda jenkinsfile dosyasını kendi repomuzdan alması için bunu seçiyoruz.
- Projemizin url'ini veriyoruz.
- Daha sonra add kısmına basıp jenkins'i seçiyoruz ve önümüze Jenkins Credentials Provider: Jenkins ekranı geliyor.
- Bu kısımda github bilgilerimizi giriyoruz. Önerim password kısmına bir token girmeniz. Bu adımları izleyerek yapabilirsiniz.
- Önce github sayfasına giriş yapalım
- Ardından ayarlar kısmını açalım ve en alt da developer setting kısmına tıklayalım.
- Token kısmından gerkli izinleri vererek oluşturun ve size bir token verecektir, onu password kısmına yapıştırın.
- Hangi brach deyseniz onu seçin. Script Path seçin ve kaydet kısmına tıklayın.
- Son bir adımımız kaldı o da docker hesabını bağlamak.
- Bu adımları izleyerek bir credentials oluşturun ve karşınıza şu ekran gelecek.
- Aynı github kısmı gibi password kısmını token oluşturarak verin.
- Jenkins yapılandırma kısmı bitti. Şimdi benim oluşturduğum Jenkinsfile dosyasına bakalım.
pipeline {
agent any
stages {
stage('Build Maven') {
agent {
docker {
image 'maven:3.8.5-openjdk-17'
args '-v $HOME/.m2:/root/.m2'
reuseNode true
}
}
steps {
checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'rasitesdmr', url: 'https://github.com/rasitesdmr/SpringBoot-Jenkins-GCP.git']])
sh 'mvn clean package -DskipTests'
}
}
stage("Docker Build Image"){
steps{
script{
withCredentials([usernameColonPassword(credentialsId: 'docker', variable: 'dockerhub')]) {
sh 'docker build -t rasitesdmr1486/springboot-jenkins-gcp:latest .'
}
}
}
}
stage("Docker Push Image"){
steps{
script{
withDockerRegistry(credentialsId: 'docker', toolName: 'docker', url: "" ){
sh 'docker tag rasitesdmr1486/springboot-jenkins-gcp:latest rasitesdmr1486/springboot-jenkins-gcp:latest'
sh 'docker push rasitesdmr1486/springboot-jenkins-gcp:latest'
}
}
}
}
stage("Docker Compose"){
steps{
sh 'docker-compose up -d'
}
}
}
}
- İlk başta maven image indiriyoruz.
- Projeyi github'dan çekiyoruz ve build edip jar dosyası haline getiriyoruz.
- Docker Hub'a push'ladıktan sonra sunucumuzda çalışan container'ımızı yeniden başlatıyoruz.
- Böylece proje hep güncel kalıyor.
- Şu kısma değinmek istiyorum. Diyelimki projeye birşeyler ekledik ve commit push yaparak github'a gönderdik. Jenkins bunu otomatik yapması için github projenin ayarlar kısmınnda Webhooks açmamız gerekiyor. Gelin bu adımlara bakalım.
- URL kısmı bu şekilde olaması gerek http://IP:8080/github-webhook/
- Artık github'a push yaptığınızda jenkins otomatik tetiklenecektir.
- SSH sunucuya bağlanıyoruz.
- docker ps çekerek projem ayaktamı ona bakıyorum.
- Projemde swagger kullanıyorum. Gelin swagger dan bakalım.
- Gördüğümüz gibi sadece bir tane metodum var.
- Projeme öğrencilerin listesini çekmek için bir metot ekleyip github'a push'layacam ve ardından neler gerçekleşiyor onlara bakalım.
- Adımlarım başarıyla tamamlandı.
- Şimdi swagger kısmına bakalım.
- Canlı sunucumdaki proje düzgün bir şekilde güncellendi.