Merhaba,
Bu makalede aşağıdaki adımları ve toolları kullanarak bir CI/CD projesi gerçekleştireceğiz. Dosyalara aşağıdaki Github adresimden ulaşabilirsiniz.
Burada 2 tane git repository kullanacağım.
- Repo: Developerın değişiklikleri push ettiği repository
- Repo: ArgoCD ile sync olacak repository.
Proje şu şekilde çalışacak. Developer commit yaptığında build edilen image kubernetes manifest file üzerinde değişecek ve bu manifest file yi 2. repoya pushlayacak ve ArgoCD güncel olan 2. repository ile sync olacaktır.
1- Kubernetes Üzerine Jenkins Kurulumu
2. Ngrok ile webhook servisini dışarı açma
3- Jenkins Konfigurasyonu ve Github ile Webhook Konfigurasyonu
4. Jenkins Üzerinde Gerekli Credentials Bilgilerinin Tanımlanması
5- Jenkins Pipeline Yazılacak. Pipeline üzerinde aşağıdaki adımlar gerçekleştirilecektir.
a. Docker ile build et ve Docker Huba push et
c. Kubernetes üzerinde çalıştır
6- Projeyi Githuba Push Et
7- ArgoCD ile Gitops
Gerekli Toollar
Docker
Kubernetes
Jenkins
Github
ArgoCD
Ngrok
``
- Kubernetes Üzerinde Jenkins Kurulumu
Jenkins in resmi sitesinden gerekli adımları izleyerek kurulum sağlayabilir ve arayüze erişim sağlayabiliriz.
https://www.jenkins.io/doc/book/installing/kubernetes/
Kurulum adımından sonra aşağıdaki pluginleri yükleyelim.
Github
Github API
Docker Plugin
Docker Pipeline
Kubernetes
Kubernetes CLI Plugin
Kubernetes Credentials
- Ngrook ile Jenkins Üzerinde Webhook Servisini Dışarıya Açma
Ngrok, localde çalışan uygulamaları tünelleyerek dış erişime açmamızı sağlayan bir reverse proxy'dir. Bunun aşağıdaki linkten ngrok kurulum dosyamızı indiriyoruz ve siteye kayıt oluyoruz.
Sol taraftan "Your Authtoken" sekmesinden yeni bir token oluşturuyoruz. Ardından bu jenkins arayüzüne erişebilen bir sunucudan bu servisi açacağız. Benim ortamında bir windows var ve ben bu sunucu üzerinden açacağım.
İndirmiş olduğumuz exe dosyası çalıştırıp aşağıdaki komutları çalıştırıyoruz.
ngrok config add-authtoken $YOUR_AUTHTOKEN
,
ngrok http http://172.35.28.152:8080
Bu işlemden sonra karşımıza aşağıdaki şekilde bir ekran çıkması gerekmektedir. Burada 172.35.28.152 benim jenkinse eriştiğim URL ve porttur.
https://ngrok.com/downloads/windows
- Jenkins Konfigurasyonu ve Github ile Webhook Konfigurasyonu
Webhook ile repositorye commit attığımızda pipelinenin otomotik olarak çalışmasını sağlayacağız. Bunun için 3. adımda jenkins sunucumuzun webhook servisini dış erişime açmamız gerekmektedir.
Şimdi developerın değişiklikleri push ettiği repositorye geliyorum ve yukarıdan setting gelip sol taraftan webhook sekmesine tıklıyorum.
Bu işlemlerden sonra ngrok ' un bize verdiği URL'i ve sonuna /github-webhook/ şeklinde URL'i tamamlıyoruz. Diğer ayarlamaları aşağıdaki gibi düzenledikten sonra buradan işimiz bitiyor.
4. Jenkins Üzerinde Gerekli Credentials Bilgilerinin Tanımlanması
Pipeline içerisinde kullacağımız aşağıdaki credentials bilgilerini tanımlayacağız.
a. Docker HUB
b. Repository'e push edebilmesi için Github Credentials
c. Kubernetes config dosyasının credentials
d. Docker yüklü node'nin credentials bilgileri
a. *Docker HUB Credentials Bilgilerinin Eklenmesi
Docker HUB hesabımıza giriş yaptıktan sonra aşağıdaki linkten bir personel access token oluşturuyoruz ve read&write yetkisi veriyoruz. Güvenlik için expire date belirleyebiliriz.
Ardından Jenkins üzerinde Manage Jenkins > Credentials > System(global) > Global Credentials > Add Credentials ile credentials bilgilerimizi giriyoruz. Password yerine verilen tokenı girdikten sonra ID yerine pipeline üzerinde kullanacağımız ismi giriyoruz.
b. Repository'e push edebilmesi için Github Credentials
Github üzerinde sağ üst tarafta bulunan profile tıkladıktan sonra Setting > Developer Settings > Personel Access Token > Fine-grained token > Create New Token ile yeni bir token oluşturuyoruz. Test ortamında tüm repositoryler ve yetkiler olabilir ama production ortamda sadece belirli repository ve minimum yetkiler ile tanımlamalıyız.
Bu tokenı kopyalıyoruz ve DockerHUB credentials tanımı ile aynı şekilde tanımlıyoruz.
c. Kubernetes config dosyasının credentials
Kubernetes clusterımızın config dosyasını kaydediyoruz ve Jenkins > Credentials > System(global) > Global Credentials > Add Credentials sekmesinden bu sefer credentials tipini secret file olarak tanımlıyoruz ve kaydettiğimiz dosyayı import ediyoruz. Bu dosya genel olarak /root./kube/ altında config ismindedir.
d. Docker yüklü node'nin credentials bilgileri
a ve b adımında olduğu gibi "Username ve Password" tipinde docker sunucumuzun erişim bilgilerini tanımlıyoruz. Bu adımdan sonra Manage Jenkins > Nodes > New Node ardından isim ve Type değerini "Permanent Agent" seçip ilerliyoruz ve ben aşağıdaki gibi docker sunucumun bilgileri tanımlıyorum. Önemli olaran host ve tanımladığımız credentials bilgilerini doğru seçmemiz yeterlidir. Bu işlemden sonra node üzerine tıklayıp launch agent diyoruz.
Düzeltme: Biz node ye kullanıcı adı ve parola ile bağlandığımız için "Host Key Verification Strategy" seçeneğini "Non Verifying Verification Strategy" yapacağız. Ama daha güvenli olması açısından key ile bağlantısı sağlanabilir.
5. Jenkins Üzerinde Pipeline Yazılması
Jenkins anasayfasında sol taraftan New Item diyoruz ve isim verdikten sonra tipini pipeline seçiyoruz. Ardından commit attığımızda çalışabilmesi için aşağıdaki seçeneği seçiyoruz ve aşağıdaki pipeline yi yapıştıyoruz. Repo, credentials, node vb. bunları kendinize göre düzenleyebilirsiniz. Ben bu pipeline üzerinde kubernetese deploy etmesi için stage yazdım ama aslında o işi ArgoCD ye bırakmamız gerekmektedir.
`
pipeline {
agent {
label 'docker-nodes'
}
environment {
image_name="suleymanakturk:v${BUILD_NUMBER}"
}
stages {
stage('Checkout From Git') {
steps {
git branch: 'main', credentialsId: 'Github', url: 'https://github.com/suleymanakturk/Developer-Push-Repo.git'
}
}
stage('Build Docker Image') {
steps {
sh "docker build -t ${image_name} ."
}
}
stage('Push Image to DockerHub') {
steps {
script {
withDockerRegistry(credentialsId: 'Dockerhub', toolName: 'docker') {
sh "docker tag ${image_name} suleymanakturk/${image_name}"
sh "docker push suleymanakturk/${image_name}"
}
}
}
}
stage('Update Deployment File') {
steps {
sh """
mv ./kubernetes_file/* .
yq -i '.spec.template.spec.containers[0].image = "suleymanakturk/"+env(image_name)' deployment.yaml
find . -mindepth 1 -path ./.git -prune -o ! -name '*.yaml' -exec rm -rf {} +
"""
}
}
stage('Commit & Push Deployment YAML to Repo2') {
steps {
script {
sh """
git config --global user.email "akturksuleyman47@gmail.com"
git config --global user.name "Suleyman AKTURK"
git add .
git diff --cached --quiet || git commit -m "Jenkins Pipeline Update Deployment File | image: ${image_name}"
"""
withCredentials([usernamePassword(credentialsId: 'Github', usernameVariable: 'GIT_USERNAME', passwordVariable: 'GIT_PASSWORD')]) {
sh "git push --force https://${GIT_USERNAME}:${GIT_PASSWORD}@github.com/suleymanakturk/ArgoCD-Repo.git main"
}
}
}
}
stage('Deploy to Kubernetes Cluster') {
steps {
withKubeConfig(
caCertificate: '',
clusterName: '',
contextName: '',
credentialsId: 'kubernetes-credentals',
namespace: '',
restrictKubeConfigAccess: false,
serverUrl: 'https://172.35.28.10:6443'
) {
sh "kubectl apply -f deployment.yaml"
}
}
}
}
}
`
- Githuba Push Edilmesi
index.html isimli bir dosyam var ve developer bunu repository e push ettiğinde tüm adımlar sırasıyla çalışacak.
- ArgOCD ile Gitops
Eğer repository public değilse öncelikle github bilgilerimizi argocd üzerinde tanımlamamız gerekmektedir. Ama public olduğunu varsayaraktan ilerliyorum, sonraki makalelerde argocd ile ilgili daha detaylı bilgi verebilirim.
Eğer private ise Setting > Repository > üzerinden github bilgilerimizi tanımlıyoruz.
Applications > New App ile yeni bir applications oluşturuyoruz , basit olarak aşağıdaki şekilde tanımlanabilir.
ArgoCD ile Github Repomuz SYNC olduğunda aşağıdaki gibi bir görüntü karşımıza çıkacaktır.
Tabi burada ArgoCD üzerinde application oluşturmayı manuel yaptık, istersek bu applications için bir kubernetes manifest dosyası yazıp pipeline üzerinde onu da deploy edebiliriz.
Bir sonraki makalede görüşmek üzere, kendinize iyi bakın.
Top comments (0)