Skip to main content

Welcome to a Grasp lesson

Create a free account to keep studying and create your own study path.

Lesson 31

Committing Changes to GitOps with GitHub Actions

Recommended resources

Merhaba! Önceki dersimizde Rancher Fleet'in dağıtım durumlarını nasıl izleyeceğimizi ve olası sorunları nasıl gidereceğimizi öğrendik. Bu sayede, GitOps deposundaki değişikliklerin kümemize nasıl yansıdığını kontrol etme ve hata ayıklama becerisi kazandık. Artık Sürekli Teslimat (CD) tarafında sağlam bir temelimiz var.

Şimdi ise zincirin eksik halkasını tamamlayacağız: Sürekli Entegrasyon (CI) sürecimizi, CD sürecini tetikleyecek şekilde GitOps depomuza bağlamak.

Bugünkü öğrenme hedefimiz: GitHub Actions iş akışını, GitOps deposuna değişiklikleri commit'leyebilecek şekilde kimlik bilgileriyle yapılandırmak.

Bu dersin sonunda, CI iş akışınıza başka bir depoya yazma yetkisi vermenin neden gerekli olduğunu, bunu güvenli bir şekilde nasıl yapacağınızı ve bu yetkiyi kullanarak iki depo arasında nasıl bir köprü kuracağınızı anlamış olacaksınız. Bu, CI ve CD süreçlerimizi birbirine bağlayan kritik adımdır.

CI/CD Akışına Genel Bakış

Öncelikle, kurmaya çalıştığımız tam otomasyonlu hattın genel resmini hatırlayalım.

GitOps CI/CD Pipeline Overview
Bu şema, GitOps tabanlı bir CI/CD iş akışını göstermektedir. Bizim senaryomuzda "Source Code Repo" uygulama kodumuzu, "Deployment Repo" ise Fleet tarafından izlenen GitOps manifestolarımızı barındıran depodur. Bu derste, şemadaki "CI Pipeline" (GitHub Actions) ile "Deployment Repo" arasındaki ok'u, yani CI'ın CD'yi tetikleme mekanizmasını inşa edeceğiz.

Gördüğünüz gibi, CI boru hattının görevi yalnızca kodu test edip bir imaj oluşturmak değil, aynı zamanda bu yeni imajın kullanılmasını sağlamak için "Deployment Repo"yu güncellemektir.


1. Problem: Çapraz Depo İzinleri

Varsayılan olarak, bir GitHub Actions iş akışı yalnızca kendi bulunduğu depo içinde işlem yapma yetkisine sahiptir. Bu yetki, iş akışı her çalıştığında otomatik olarak oluşturulan ve GITHUB_TOKEN adlı geçici bir anahtar tarafından sağlanır.

Bu bir güvenlik özelliğidir: app-repo'daki bir iş akışının, varsayılan olarak gitops-repo'ya git push komutu göndermesi engellenir.

Push commits to another repository with GitHub Actions

Bu blog yazısı, bizim de karşılaştığımız bu temel sorunu ve çözümünü net bir şekilde açıklıyor: GITHUB_TOKEN'ın kendi deposuyla sınırlı olması ve bu kısıtlamanın nasıl aşılacağı.

Yazının giriş bölümünü ("A workflow can only be triggered..." ve "GITHUB_TOKEN can only be scoped..." paragraflarını) okuyarak sorunun temelini anlayın.

Peki, bu güvenlik engelini nasıl aşarız ve CI iş akışımıza GitOps depomuza yazma iznini nasıl veririz? Cevap, kapsamı daha geniş olan bir kimlik bilgisi kullanmaktır.


2. Çözüm: Personal Access Token (PAT) ve GitHub Secrets

Çözümümüz iki adımlı bir süreçten oluşuyor:

  1. GitOps depomuza erişim izni olan bir Personal Access Token (PAT) oluşturmak.
  2. Bu token'ı, CI iş akışımızın güvenli bir şekilde kullanabilmesi için uygulama depomuzda bir GitHub Secret olarak saklamak.

Adım 2.1: Fine-Grained Personal Access Token Oluşturma

GitHub, belirli izinlere ve depo erişimine sahip, güvenliği artırılmış "Fine-grained" (İnce Ayarlı) token'lar oluşturmanıza olanak tanır. Bu, tüm hesap yerine yalnızca ihtiyacımız olan yetkileri verdiğimiz için en iyi pratiktir.

Automate GitOps manifest updates with GitHub Actions

Red Hat'in bu makalesi, GitOps akışını otomatikleştirmeyi anlatırken, gerekli olan PAT'ı nasıl oluşturacağınızı adım adım gösteriyor. Biz de bu adımları takip edeceğiz.

Makalenin "Step 3: Create a GitHub Personal Access Token" bölümünü dikkatlice okuyun. Özellikle token'a hangi depo erişimini ve hangi izinleri verdiğine dikkat edin. Bizim senaryomuz için küçük bir farkla bu adımları uygulayacağız.

Yukarıdaki rehberi temel alarak PAT'ımızı oluşturalım:

  1. GitHub hesabınızda Settings > Developer settings > Personal access tokens > Fine-grained tokens yolunu izleyin.
  2. Generate new token'a tıklayın.
  3. Token'ınıza açıklayıcı bir isim verin (örn. gitops-commit-access).
  4. Repository access altında, Only select repositories'i seçin ve GitOps deponuzu (manifestolarınızın bulunduğu depo) listeden bulun ve seçin.
  5. Permissions bölümüne gidin. Repository permissions altında, Contents iznini bulun ve erişim seviyesini Read and write olarak ayarlayın. Bu, iş akışının bu depodaki dosyaları okumasına ve değişiklikleri commit'leyip push'lamasına olanak tanır.
  6. Generate token'a tıklayın.

Çok Önemli: GitHub, oluşturulan token'ı size yalnızca bir kez gösterir. Bu değeri hemen güvenli bir yere kopyalayın. Sayfadan ayrılırsanız token'ı bir daha göremezsiniz.

Adım 2.2: PAT'ı GitHub Secret Olarak Saklama

Şimdi, elde ettiğimiz bu hassas token'ı CI iş akışımızın çalıştığı uygulama depomuza bir sır olarak eklemeliyiz.

Secrets and Environment Variables in your GitHub Action

Bu video, GitHub'da secret ve variable oluşturma ve kullanma sürecini görsel olarak açıklıyor. Secret'ların log'larda otomatik olarak nasıl gizlendiğini göstermesi de önemli bir detay.

Videonun ilk bölümünü (00:17 - 02:45) izleyerek GitHub arayüzünde bir repository secret'ının nasıl oluşturulduğunu görün. Ardından ikinci bölümü (03:29 - 05:23) izleyerek bu secret'ların YAML dosyasında ${{ secrets.SECRET_NAME }} sözdizimi ile nasıl kullanıldığını ve log'larda nasıl *** olarak maskelendiğini gözlemleyin.

Video'da gösterilen adımları takip ederek:

  1. Uygulama deponuzun (PySpark kodunuzun olduğu depo) GitHub sayfasına gidin.
  2. Settings > Secrets and variables > Actions yolunu izleyin.
  3. Repository secrets sekmesinde, New repository secret'a tıklayın.
  4. Secret'a bir isim verin, örneğin GITOPS_REPO_PAT.
  5. Secret alanına, bir önceki adımda kopyaladığınız token değerini yapıştırın.
  6. Add secret'a tıklayarak kaydedin.

Artık CI iş akışımız, GitOps deposuna erişmek için gereken kimlik bilgisine güvenli bir şekilde sahiptir.


3. Uygulama: İş Akışını Yapılandırma

Son adım, GitHub Actions YAML dosyamızı bu yeni yetkiyi kullanacak şekilde düzenlemektir. Amacımız, CI işi sırasında hem uygulama deposunu hem de GitOps deposunu aynı anda çalışma alanına (runner) çekmektir.

Bunun için popüler actions/checkout eylemini iki kez kullanacağız.

Push commits to another repository with GitHub Actions

Daha önce referans verdiğimiz "Push commits to another repository" blog yazısı, bu adım için mükemmel bir YAML örneği sunuyor. Bu örnek, iki farklı depoyu nasıl checkout edeceğinizi ve ardından ikinci depoya nasıl commit göndereceğinizi gösteriyor.

Yazıdaki YAML kod bloğunu inceleyin. actions/checkout@v4 eyleminin iki kez nasıl kullanıldığına dikkat edin. İkinci kullanımda repository, path ve en önemlisi token parametrelerinin nasıl ayarlandığını görün. Bu, bizim de uygulayacağımız temel desendir.

Bu deseni kendi CI iş akışınıza (örneğin .github/workflows/ci.yml) şu şekilde entegre edebilirsiniz. Mevcut pytest ve ruff adımlarınızın olduğu işin içine yeni adımlar ekleyeceğiz.

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:



      # Adım 1: Uygulama deposunu 'app' dizinine checkout et
      - name: Checkout Application Repo
        uses: actions/checkout@v4
        with:
          path: app




      # Adım 2: GitOps deposunu 'gitops' dizinine checkout et
      # Burada oluşturduğumuz PAT'ı kullanıyoruz.
      - name: Checkout GitOps Repo
        uses: actions/checkout@v4
        with:
          repository: <github_kullanici_adiniz>/<gitops_repo_adiniz> # Örn: my-user/pyspark-fleet-manifests
          path: gitops
          token: ${{ secrets.GITOPS_REPO_PAT }} # Sakladığımız secret'ı burada kullanıyoruz




      # ... (Python kurulumu, bağımlılıkların yüklenmesi, test ve lint adımları burada devam eder)
      # Örnek:
      # - name: Set up Python
      #   uses: actions/setup-python@v4
      #   with:
      #     python-version: '3.9'
      #     cache: 'pip'
      #     cache-dependency-path: 'app/requirements.txt'




      # - name: Install dependencies
      #   run: pip install -r app/requirements.txt




      # - name: Run tests
      #   run: pytest app/tests/




      # Adım 3: Değişiklik yapma ve commit'leme (Konsept Kanıtlama)
      # BU ADIM SADECE BİR GÖSTERİMDİR. GERÇEK UYGULAMAYI BİR SONRAKİ DERSTE YAPACAĞIZ.
      - name: Make a test commit
        run: |
          cd gitops
          git config user.name "github-actions[bot]"
          git config user.email "github-actions[bot]@users.noreply.github.com"
          
          echo "Test commit from CI job $(date)" > test.txt
          git add test.txt
          git commit -m "Test: Automated commit from GitHub Actions"
          git push

Bu YAML dosyasındaki son adıma dikkat edin:

  • cd gitops ile GitOps deposunun olduğu dizine geçiyoruz.
  • git config ile commit'i yapacak olan bot kullanıcısını tanımlıyoruz.
  • test.txt adında basit bir dosya oluşturup bunu commit'leyip push'luyoruz.

Bu iş akışını çalıştırdığınızda, test ve lint adımları başarılı olursa, GitOps deponuzda "Test: Automated commit from GitHub Actions" mesajıyla yeni bir commit görmelisiniz. Bu, kimlik bilgileri yapılandırmamızın başarıyla çalıştığının kanıtıdır!


Özet ve Sonuç

Bu derste, CI/CD boru hattımızın en önemli bağlantılarından birini kurduk. Artık GitHub Actions iş akışımız, GitOps depomuzla güvenli bir şekilde etkileşime geçme yeteneğine sahip.

Temel Çıkarımlar:

  • GITHUB_TOKEN, güvenlik nedeniyle yalnızca kendi deposu içinde etkilidir.
  • Başka bir depoya yazma yetkisi vermek için, kapsamı daraltılmış bir Fine-grained Personal Access Token (PAT) kullanmak en iyi pratiktir.
  • Oluşturulan PAT, CI iş akışının çalıştığı depoda bir GitHub Secret olarak güvenle saklanmalıdır.
  • İş akışı içinde, actions/checkout eylemi token parametresi ile kullanılarak hedef depoya erişim sağlanır.
  • Erişim sağlandıktan sonra, standart git komutları (config, add, commit, push) kullanılarak değişiklikler diğer depoya gönderilebilir.

Gelecek Dersin Önizlemesi:
Artık CI iş akışımız GitOps deposuna commit yapma gücüne sahip olduğuna göre, bir sonraki adımda ona zeka katacağız. Bir sonraki dersimizde, CI sürecinde oluşturulan yeni Docker imaj etiketini alıp, GitOps deposundaki Kubernetes manifest dosyasını (örneğin values.yaml) otomatik olarak güncelleyen ve bu değişikliği commit'leyen bir script yazacağız. Bu, baştan sona tam otomatik CI/CD boru hattımızı tamamlayan son pratik adım olacak.