Merhaba! Önceki dersimizde, CI iş akışımıza GitOps depomuza yazma izni vererek CI ve CD dünyaları arasında bir köprü kurduk. actions/checkout ve bir Personal Access Token (PAT) kullanarak başka bir depoya git push yapabileceğimizi kanıtladık.
Şimdi bu köprünün üzerinden anlamlı bir trafik geçirme zamanı. Bu derste, CI sürecinde oluşturulan yeni Docker imaj etiketini alıp, bu bilgiyi GitOps deposundaki Kubernetes manifestolarını otomatik olarak güncellemek için kullanacağız. Bu adım, CI'dan CD'ye geçişi tam anlamıyla otomatikleştirecektir.
Bugünkü öğrenme hedefimiz: Bir CI işi içinde bir Kubernetes manifestosunun imaj etiketini otomatikleştirecek şekilde güncellemek ve bu değişikliği depoya geri commit'lemek.
Bu dersin sonunda, bir uygulama değişikliğinin, GitOps deposunda nasıl otomatik bir manifest güncellemesine dönüştüğünü ve bu sürecin CI/CD boru hattımızı nasıl tamamladığını tam olarak anlamış olacaksınız.
CI/CD Otomasyon Döngüsünü Tamamlamak
Kurduğumuz mimariyi tekrar gözden geçirelim. Nihai hedefimiz, uygulama kodunda yapılan bir değişikliğin, herhangi bir manuel müdahale olmadan Kubernetes kümesinde çalışan yeni bir sürüme dönüşmesidir.

Önceki derste bu güncelleme için izni aldık. Bugün ise bu güncellemenin nasıl yapılacağını öğreneceğiz.
Yöntem 1: Basit Metin Değişikliği (sed)
Manifesto güncellemenin en basit yollarından biri, YAML dosyasını bir metin dosyası olarak ele alıp sed gibi komut satırı araçlarıyla düzenlemektir. sed (stream editor), metin üzerinde bul ve değiştir işlemleri yapmak için güçlü bir araçtır.
Bu yaklaşım, CI iş akışında şu şekilde işler:
- CI işi, yeni imaj etiketini (örneğin Git commit SHA'sının kısa hali) bir değişkene alır.
- GitOps deposunu klonlar.
sedkomutunu kullanarak ilgili manifest dosyasındakiimage:satırını bulur ve etiketi yeni değerle değiştirir.- Değiştirilen dosyayı GitOps deposuna commit'ler ve push'lar.
Kubernetes CI/CD: Build a Pipeline (ArgoCD + Github Actions)
Bu video, ArgoCD kullanan bir CI/CD boru hattı kurmayı gösterse de, temel prensipler bizim için de geçerlidir. Videonun bu bölümü, sed kullanarak bir dağıtım manifestosunun imaj etiketinin bir GitHub Actions iş akışı içinde nasıl güncellendiğini ve ardından bu değişikliğin GitOps deposuna nasıl commit'lendiğini adım adım gösteriyor.
Videonun 13:59 - 22:02 arasındaki bölümünü izleyin. Özellikle "Update gitops repository" adımında kullanılan run bloğundaki shell komutlarını inceleyin. sed komutunun YAML dosyasındaki image alanını nasıl hedef aldığını ve yeni imaj etiketiyle nasıl güncellediğini anlamaya odaklanın. Ayrıca, git komutlarının bu değişikliği nasıl commit'lediğine dikkat edin.
sed yaklaşımı hızlı ve basittir ancak bazı dezavantajları vardır:
- Kırılganlık: YAML dosyasının yapısındaki (örn. girinti) küçük bir değişiklik bile
sedkomutunun başarısız olmasına neden olabilir. - Bakım Zorluğu: Karmaşık manifestolarda doğru satırı hedeflemek için yazılan
regexifadeleri karmaşıklaşabilir.
Bu yüzden, daha sağlam ve Kubernetes'e özel bir aracı incelemek genellikle daha iyi bir yaklaşımdır.
Yöntem 2: Kustomize ile Yapısal Güncelleme (Önerilen Yöntem)
- Modül'de Rancher Fleet için
overlayyapısını öğrendiğinizde aslında Kustomize'ın temel prensipleriyle tanıştınız. Kustomize, Kubernetes için şablon-serbest (template-free) bir yapılandırma yönetim aracıdır ve YAML dosyalarını "anlayarak" düzenler. Bu, onusedgibi metin tabanlı araçlardan çok daha güvenilir kılar.
Fleet'in overlay mekanizması, Kustomize'ı temel alır. Bu nedenle, GitOps deponuzu güncellemek için kustomize CLI aracını kullanmak, mevcut yapınızla mükemmel bir uyum içinde olacaktır.
Yapacağımız işlem kustomize edit set image komutunu kullanmaktır. Bu komut, belirtilen imajın etiketini kustomization.yaml dosyasında akıllıca günceller.
Kustomize explained in 60 minutes with detailed GitHub notes | Demo Included
Bu video Kustomize'ı detaylıca açıklıyor. Özellikle bu bölüm, kustomization.yaml içindeki images transformer'ını kullanarak bir imaj etiketinin, ana manifesto dosyasına dokunmadan nasıl güncellenebileceğini gösteriyor. Biz bu işlemi komut satırından yapacağız, ancak mantık aynı.
Videonun 31:58 - 35:30 arasındaki bölümünü izleyin. images bloğunun bir kustomization.yaml dosyasına nasıl eklendiğini ve newName ile newTag direktiflerinin imajı nasıl değiştirdiğini gözlemleyin. Bu, kustomize edit set image komutunun arka planda ne yaptığını anlamanıza yardımcı olacaktır.
Uygulama: GitHub Actions ile Kustomize Entegrasyonu
Şimdi, kustomize aracını CI iş akışımıza entegre ederek imaj etiketini otomatik olarak güncelleyelim.
İş akışımız şu adımları izleyecek:
- Uygulama kodunu ve GitOps manifestolarını checkout et.
- (Varsayım) Kodu test et, Docker imajını oluştur ve
github.shagibi bir etiketle container registry'ye push'la. kustomizeCLI aracını runner'a kur.kustomize edit set imagekomutunu kullanarak ilgilioverlayiçindekikustomization.yamldosyasını güncelle.- Değişikliği GitOps deposuna commit'le ve push'la.
Aşağıda, bu adımları içeren bir GitHub Actions iş akışı parçası bulunmaktadır. Bunu mevcut ci.yml dosyanıza entegre edebilirsiniz.
# .github/workflows/ci.yml
# ... (on: push, pull_request vb. tanımlamaları)
jobs:
build-test-and-update-manifest:
runs-on: ubuntu-latest
steps:
# Adım 1: Gerekli repoları checkout etme
- name: Checkout Application Repo
uses: actions/checkout@v4
with:
path: app
- name: Checkout GitOps Repo
uses: actions/checkout@v4
with:
repository: <github_kullanici_adiniz>/<gitops_repo_adiniz>
path: gitops
token: ${{ secrets.GITOPS_REPO_PAT }} # Önceki derste oluşturduğumuz secret
# Adım 2: İmaj etiketini belirleme (Bu adımlar Docker build'den sonra gelir)
# Örnek olarak kısa commit SHA'sını kullanıyoruz
- name: Get Short SHA for Image Tag
id: sha
run: echo "tag=$(echo ${GITHUB_SHA::7})" >> $GITHUB_OUTPUT
# Adım 3: Kustomize'ı kurma
- name: Install Kustomize
run: |
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash
sudo mv kustomize /usr/local/bin/
# Adım 4: Kustomize ile imaj etiketini güncelleme
# 'overlays/dev' ve 'your-registry/pyspark-etl' kısımlarını kendi yapınıza göre düzenleyin
- name: Update Image Tag in Kustomization
run: |
cd gitops/overlays/dev
kustomize edit set image your-registry/pyspark-etl=your-registry/pyspark-etl:${{ steps.sha.outputs.tag }}
echo "--- kustomization.yaml after update ---"
cat kustomization.yaml
# Adım 5: Değişiklikleri GitOps deposuna commit'leme ve push'lama
# `EndBug/add-and-commit` eylemi bu işi bizim için basitleştirir
- name: Commit and Push Manifest Changes
uses: EndBug/add-and-commit@v9
with:
cwd: './gitops' # Çalışma dizinini gitops olarak ayarla
add: 'overlays/dev/kustomization.yaml' # Sadece değiştirilen dosyayı ekle
author_name: 'github-actions[bot]'
author_email: 'github-actions[bot]@users.noreply.github.com'
message: 'ci(dev): Update pyspark-etl image to ${{ steps.sha.outputs.tag }}'
push: true
YAML Dosyasındaki Önemli Noktalar:
-
kustomize edit set image ...: Bu komutun formatıkustomize edit set image <orijinal_imaj_adi>=<yeni_imaj_adi_ve_etiketi>şeklindedir. İmaj adınız değişmiyorsa, sadece etiketi güncellersiniz. Bu komut,kustomization.yamldosyanızda aşağıdaki gibi birimagesbloğu oluşturur veya günceller:images: - name: your-registry/pyspark-etl newTag: <yeni_sha_degeri> -
EndBug/add-and-commit@v9: Bu popüler GitHub Action,gitkomutlarını manuel olarak yazma zahmetinden kurtarır.cwd(current working directory) parametresi ilegitopsdizini içinde çalışmasını,addile hangi dosyayı commit'leyeceğini vemessageile commit mesajını belirtiriz.push: trueile de commit'in otomatik olarak gönderilmesini sağlarız.
İş akışınız başarıyla tamamlandığında, GitOps deponuzda aşağıdaki gibi bir commit görmelisiniz.

Özet ve Sonuç
Bu dersle birlikte, CI/CD boru hattımızın en kritik otomasyon adımlarından birini tamamladık. Artık CI sürecimiz, sadece test ve imaj oluşturmakla kalmıyor, aynı zamanda oluşturduğu yeni imajı dağıtmak üzere CD sürecini tetikleyecek şekilde manifestolarımızı akıllıca güncelliyor.
Temel Çıkarımlar:
- Kubernetes manifestolarını CI içinde güncellemek için
sedgibi metin araçları kullanılabilir, ancakKustomizegibi yapısal araçlar daha sağlam ve güvenilirdir. kustomize edit set imagekomutu, imaj etiketlerinikustomization.yamldosyasında güncellemek için standart ve hataya daha az açık bir yöntemdir.- GitHub Actions iş akışları,
kustomizeCLI'yı kurup çalıştırabilir veEndBug/add-and-commitgibi yardımcı eylemlerle yapılan değişiklikleri kolayca GitOps deposuna commit'leyebilir. - Bu otomasyon, uygulama kodundaki bir değişikliğin, GitOps deposundaki "istenilen durum" tanımına otomatik olarak yansımasını sağlar.
Gelecek Dersin Önizlemesi:
Tüm parçaları birleştirdik! CI boru hattımız artık test ediyor, lint denetimi yapıyor, Docker imajı oluşturuyor ve GitOps manifestosunu güncelliyor. GitOps aracımız (Fleet) ise bu manifestoyu izleyerek dağıtımı yapıyor. Bir sonraki dersimizde, bu tam entegre boru hattını baştan sona çalıştıracak, süreci izleyecek ve bir geliştirme ortamı için kod değişikliğinden otomatik dağıtıma kadar tüm akışı gözlemleyeceğiz.