Bu makalemizde temel seviyede bir ci/cd sürecini kapsayan örneği inceleyeceğiz. Örneğimizde Github, Jenkins, Sonarqube ve Docker araçlarını kullanarak bir web uygulamasının publish işlemlerini gerçekleştireceğiz.
Yapacağımız işlemi basitçe özetlemek gerekirse;
- Ubunut 22.04 serverımız üzerine Jenkins CICD aracımızı kuracağız.
- Docker Kurulumu yapacağız.
- Jenkins serverımız üzerinde Sonarqube uygulamamızı container olarak çalıştıracağız.
- Developer biriminin yazmış olduğu uygulamayı git reposundan Jenkins CI/CD aracımıza indireceğiz.
- Jenkins aracımızla kodlarımızı SonarQube aracımıza gönderip analizden geçireceğiz.
- Analiz sonrası kodumuzu “Dockerfile” dosyası ile bir imaja dönüştürüp hostumuz üzerinde docker imajımızı çalıştırarak uygulamamızın publish işlemini gerçekleştireceğiz.
Tüm bu süreçlerimizi yaparken bize Jenkins aracımız yardımcı olacak bu ön bilgilendirme sonrası artık kuruluma geçebiliriz.
Jenkins Server Kurulumu
Jenkins aracımızın çalışması için makinemizde Java kurulu olmalı bu sebeple ilk olarak Linux sunucumuza Java kurulumu yapıyorum.
Java Kurulumu
sudo apt update && sudo apt upgrade -y sudo apt install -y wget apt-transport-https wget -O - https://packages.adoptium.net/artifactory/api/gpg/key/public | tee /etc/apt/keyrings/adoptium.asc echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | tee /etc/apt/sources.list.d/adoptium.list sudo apt update -y sudo apt install temurin-17-jdk -y
Java kurulumu tamamlandıktan sonra Jenkins kurulumuna geçebiliriz artık aşağıdaki komutları çalıştırarak kurulumu yapıyoruz.
Jenkins Kurulumu
#Curl aracı kurulum için gerekli apt-get install curl -y #git aracı git dosyalarını çekmek için gerekli apt-get install git -y curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null sudo apt-get update -y sudo apt-get install jenkins -y sudo systemctl start jenkins sudo systemctl status jenkins
Kurulum tamamlandıktan sonra http://your_server_ip_or_domain:8080 sunucumuza bağlantı kuruyoruz.
Bizleri aşağıdaki şekilde bir ekran karşılıyor ve burada aşağıdaki komutu jenkins sucumuzda çalıştırarak verdiği parolayı alarak initial admin parolası ile giriş yapıyoruz.
cat /var/lib/jenkins/secrets/initialAdminPassword
Jenkins için bir kullanıcı adı ve parola belirliyoruz.
Jenkins kurulumu muzu tamamladık.
Jenkins eklenti kurulumu
Jenkins çok fonksiyonlu bir CI/CD aracıdır ve içerisinde bir çok platformla entegrasyon için eklentiler mevcuttur bunları ihtiyacınıza göre indirip kurmanız gerekir.
Manage Jenkins–>Plugins
Sonarqube eklentisini indiriyoruz.
Jenkins ilk Projeyi oluşturma
New item diyerek yeni bir proje oluşturuyoruz. Burada “Freestyle Project ” diyerek devam ediyoruz. Ben “Auto-Pipeline” isminde bir proje oluşturuyorum.
Bir sonraki ekranda projenin configuration adımları geliyor ilk olarak git depomuzdan dosyamızı indireceğiz.
Source Code Management –>git bölümüne geliyoruz ve aşağıdaki linki yapıştırıyoruz.
https://github.com/serdarbayram01/Simple-DevOps-CI-CD-Project1.git
Save diyoruz ve aşağıdaki bölümünde “Build Now” dikerek işlemi başlatıyoruz.
Çıktımız yukarıdaki gibi yeşil tik ile sonuçlandıysa herşey yolunda demektir.
Workspace e giderek Jenkins sunucumuza indirmiş olduğumuz dosyaları görüntüleyebiliriz.
Docker Kurulumu
Aşağıdaki komutlarla docker engieen i makinemize yüklüyoruz.
sudo apt-get update sudo apt-get install docker.io -y sudo usermod -aG docker ${USER} sudo usermod -aG docker jenkins sudo usermod -aG docker ubuntu newgrp docker sudo chmod 666 /var/run/docker.sock docker --version
Sonarqube kurulumu
Jenkins serverımız üzerinde SonarQube uygulamamız container olarak çalışacak aşağıdaki komutu çalıştırıp SQ kurulumunu yapıyoruz.
docker run -d --restart always --name sonarqube-custom -p 9000:9000 sonarqube:lts-community
Sonarqube kurulumunu tamamladık
Aşağıdaki komutla çalışan containerları listeliyoruz.
docker ps -a
http://sunucu-ip-adresiniz:9000
username :admin
password :admin
yukarıdaki bilgilerle giriş yapıyoruz ve kendimize yeni bir şifre belirliyoruz.
Sonarqube uygulamamızda analizden geçireceğimiz proje için “Manually” diyerek proje oluşturma adıma başlıyoruz.
Hangi projeyi analize tabi tutacaksak o projenin adını yazıyorum, karışmaması için jenkins üzerind e”Auto-pipeline” ismini kullanmıştık bunu kullanıyorum.
Bu bir jenkins uygulaması olduğu için jenkins seçeneğini seçiyorum.
Configure Analaysis diyerek devam ediyoruz.
“use global settings” seçerek devam ediyorum.
Burada Kırmızı alan içindeki bölümdeki keyi bir yere not ediyoruz.
Sonarqube token yapılandırması.
Sonarqube için bir token oluşturacağız ve bu token ile sonarqube serverımıza analiz çıktıları vermesi için erişim sağlayabileceğiz. My Account tabına gidiyoruz.
Security tabına gidiyorum “sonarqube-Token” adında bir token oluşturuyorum ve Global analaysis seçeneğini seçiyorum ki bu token ile her projeyi analizden geçirebilelim. Diğer seçenekte dilerseniz oluşturduğunuz token’u sadece bir projeye özel oluşturarak güvenlik sıkılaştırması yapabilirsiniz.
Oluşan token numarasını bir yere not ediyoruz.
Jenkins Sonarqube configuration
Credential Tanımlama
Manage Jenkins→Credential
Global menüsüne tıklıyoruz.
Sağ üst bölümdeki “New Credential” butonuna basıyoruz “secret Text” i seçiyoruz ve bir önceki bölümde oluşturduğumuz token bilgisini buraya giriyoruz. ID bölümüne “sonar-cred” yazarak kayıt ediyoruz.
Dashboard→Manage Jenkins→Tools
SonarQube Scanner alanına geliyoruz ve Sonarqube Scanner objemizin hangi versiyonu kullanacağını seçiyoruz.
adına “sonar-scanner” diyerek kayıt ediyoruz.
Manage Jenkins→System Menüsüne geçiyoruz.
SonarQube Serverımızın ip adres bilgilerini Jenkins serverımıza ekliyoruz.
Add butonuna basarak SonarQube hesap bilgilerimizi tanımlayacağımız panele geçiyoruz.
“SonarQube Server” bölümünde sonarqube sunucumuzun bilgilerini giriyoruz biz jenkins makinemizin üzerinde çalıştırdığımız için sonar qube makinemizi local host giriyorum eğer farklı bir sunucuda çalıştırıyorsanız o sunucunun ip adresini ve port bilgisini buraya girmeniz gerekiyor . Ayrıca Credential bölümünde sonar token bilgilerimizi girmiştik burada o bilgileri “sonar-cred” adı altında ekliyoruz.
SonarQube Test
Sonar Qube entegrasyonunu tamamladık şu an bir test başlatıp kodumuzu analizden geçirebilir durumdayız.
Şimdi bunu test edeceğiz.
oluşturmuş olduğumuz “Auto-pipline” projesini açıp configure diyoruz ve aşağıdaki adımları takip ediyoruz.
Build triggers→Execute SonarQube Scanner
SonarQube üzerinde proje oluştururken elde ettiğimiz key bilgisini aşağıdaki alana giriyoruz ve confiğimizi kayıt ediyoruz.
Jenkis jobumuzu çalıştırıyoruz.
Console çıktısı
Eğer tüm adımları doğru yapılandırdıysanız yukarıda gördüğünüz gibi success bilgisini(yeşil tik) görüntüleyeceksiniz.
Sonar Qube çıktsına baktığımızda kodumuz analizden geçirilmiş ve aşağıdaki şekilde bir raporun oluşmuş olduğunu göreceksiniz.
Docker Project Run
Şimdi sıra indirdiğimiz ve analizden geçirdiğimiz bu uygulamamızı Dockerfile ı kullanarak Docker imajı haline getirerek container olarak çalıştırmak.
Projemizi config bölümünde “Build Step” bölümüne yeni bir adım daha ekliyoruz “Execute shell” i seçiyoruz.
Bu seçenek ile jenkins yani docker hostumuz üzerinde shell komutlarını çalıştırıyor olacağız dolayısıyla bu araç ile gui üzerinden shell komutlarını giriyor olacağız.
Burada eklediğimiz adımların önemi bulunmakta bu adım sonarqube işleminden sonra devam edecek adım oluyor.
docker build -t mywebsite . docker run -d -p 8000:8000 --name=First-WebSite mywebsite
Uygulamamız oldukça basit tasarlanmış 8000 portundan yayın yapan bir container üzerinde one-page bir web sayfası.
Save diyerek değişiklikleri kayıt ediyoruz.
Projemizi çalıştırdığımızda işlemin tamamlandığını görebilirsiniz.
CLI üzerinden docker containerlara baktığımızda kodumuzun imajı derleyip container ı run ettiğini görebilirsizin.
Sitemizi browser üzerinden artık görüntüleyebiliriz.