GitHub Actions'a Giriş
İlk olarak Medium’da yayımlandı.
Günümüzde yazılım geliştirme sürecinde, projeler kapsamında kodun entegrasyonu, testi ve dağıtımı süreci için bir otomasyon elzem hale gelmiştir. Bu süreçleri otomatikleştirerek hem zaman kazanabilir, hem de insan kaynaklı hataları en aza indirebiliriz. Bu noktada bu sorunun çözümüne GitHub Actions koşuyor. Bu yazıda, GitHub Actions ile CI/CD süreçlerinin nasıl otomize edileceğine bir giriş yapılmaktadır.
CI/CD Nedir?
DevOps süreçlerinin temel bir parçası olan Sürekli Entegrasyon (CI — Continuous Integration) ve Sürekli Dağıtım (CD — Continuous Deployment) kavramları, yazılım geliştirme süreçlerini hızlandırmak, yazılımın kalitesini artırmak ve geliştiricilerin daha etkili bir şekilde çalışmasını sağlamak için geliştirilmiş bir yaklaşımdır.
Sürekli Entegrasyon (CI)
Geliştiricilerin yazılım kodlarını düzenli ve sık aralıklarla birleştirmelerini ve otomatik olarak test etmelerini sağlayan bir yazılım geliştirme sürecidir. Sürekli entegrasyonun temel amacı, farklı geliştiricilerin kodlarını sürekli olarak ana koda (main branch) entegre etmelerini sağlamaktır. Bu işlem, çatallanmaların (forks) önlenmesine yardımcı olur ve farklı geliştiricilerin çalışmalarını uyumlu bir şekilde bir araya getirir.
Sürekli entegrasyonun ana başlıkları aşağıdaki gibidir:
- Kod Birleştirme: Geliştiriciler kendi kodlarını ana koda entegre etmek için “pull request” gibi iş akışları kullanırlar.
- Otomatik Derleme: Sürekli entegrasyon (CI) araçları, ana koda gönderilen her değişikliği otomatik olarak derler ve temel hataları kontrol eder.
- Otomatik Testler: Yazılımın işlevselliği, performansı ve güvenilirliği için otomatik testler (Unit Test) çalıştırılır.
- Bildirimler: CI sistemi, testlerin sonuçlarını geliştiricilere bildirir. Eğer bir hata bulunursa, geliştiricilere geri bildirimde bulunur.
Sürekli Dağıtım (CD)
CI sürecinin devamıdır ve yazılımın otomatik olarak üretim (production) ortamına dağıtılmasını içerir. Bu, yazılımın sürekli olarak güncellenmesini ve yayımlanmasını sağlar. Sürekli Dağıtımın temel amacı, yazılımın hızla ve güvenilir bir şekilde kullanıcılara sunulmasını sağlamaktır.
- Otomatik Dağıtım: CD sistemi, başarıyla geçen bir CI işleminin ardından yazılımı üretim (Production) ortamına otomatik olarak dağıtır (Deployment).
- Değişiklik İzleme: CD sistemi, prodüksiyon ortamında meydana gelen değişiklikleri izler ve hataları otomatik olarak belirler.
- Geri Alım (Rollback): Eğer bir hata olursa, CD sistemi otomatik olarak önceki sürüme geri dönebilir.
- İzleme ve Raporlama: Üretim (Production) ortamında yazılımın performansını ve kullanılabilirliğini izler ve raporlar.
CI/CD’nin avantajları:
- Hızlı İterasyonlar: Yeni özellikler ve düzeltmeler hızla kullanıcılara sunulabilir.
- Hata Azaltma: Hataların erken tespit edilmesini sağlar.
- Güvenilirlik: Dağıtım, geri alım ve güvenilirliği artırır.
Sürekli Dağıtım (Continuous Deployment) ve Sürekli Teslimat (Continuous Delivery) Arasındaki Farklar
Sürekli Dağıtım ve Sürekli Teslimat süreçleri, Sürekli Entegrasyon (CI) sürecinin doğal uzantılarıdır ve birbirlerine oldukça benzerler. Bu iki yaklaşımın ana farkı, insan müdahalesinin seviyesidir. Sürekli Teslimat süreci, yazılımın üretim ortamına hazır hale getirilip test edilmesini savunur, ancak bu sürümün üretim ortamına otomatik olarak dağıtılmaması gerektiğini vurgular ve bir manuel onay gerektirir. Öte yandan, Sürekli Dağıtım süreci, yazılımın sürekli olarak ve otomatik olarak prodüksiyon ortamına dağıtılmasını içerir, bu nedenle insan müdahalesine ihtiyaç duymaz.
GitHub Actions’ın Temelleri
GitHub Actions, GitHub platformunda entegre olarak gelen bir CI/CD ve otomasyon aracıdır. Belirli bir trigger vasıtasıyla (push, pull request vb.) otomatik işlemler gerçekleştirebilir ve bunu workflow olarak adlandırılan yapılar içerisinde yapar. Buna kodun test edilmesi veya belirli bir branch üzerindeki kodun otomatik dağıtılmasını örnek olarak verebiliriz.
GitHub Actions’da Temel Bileşenler
GitHub Actions, YAML formatında tanımlanan workflow dosyaları, GitHub deposunun kök dizininde .github/workflows klasöründe saklanır ve belirli olaylar tetiklendiğinde çalıştırılır. Aşağıda workflow için önemli temel unsurlar sıralanmıştır.
Adlandırma ve Tanımlama
Bir GitHub Actions workflow’unu tanımlarken, bir ad ve bir açıklama vermelisiniz. Bu ad, workflow’u tanımlayan açıklamayla birlikte kolayca anlaşılmasını sağlar.
Tetikleyici Olaylar
on anahtar kelimesi, workflow’un hangi olaylara tepki vereceğini belirtir. Örneğin, commit işlemi (push) workflow’u tetiklemesi için kullanılabilir. Ayrıca belirli dallara veya olay türlerine filtreler eklemek de mümkündür.
Jobs
Bir job, belirli bir işletim sistemi üzerinde çalıştırılan bir dizi sıralı görevi temsil eder. Bir job’un içinde birden çok adım (step) tanımlanabilir. Önemli bir diğer nokta ise GitHub Actions’ta birden çok job tanımlanabilir ve paralel olarak çalıştırılabilir, fakat bir job’un içerisindeki step’ler sıralı çalışmak durumundadır.
Steps
Belirli bir görevi veya komutu çalıştıran bireysel birimler step olarak adlandırılır ve daha önce de belirtildiği gibi sırayla çalıştırılır. Bir step içerisinde, doğrudan kabuk komutları çalıştırabilir veya önceden tanımlanmış bir eylem (action) kullanılabilir.
Örneğin, “Build” adlı bir job içerisinde üç step belirlenebilir: ilk step ilgili repoyu lokal dizine çekmek için bir görev içerir; ikinci step sadece “Hello, world!” çıktısını veren bir komut için bir adım ve step adı tanımlanır; son olarak, birden fazla komutun tek bir adımda nasıl tanımlanabileceğine dair bir örnek incelenebilir.
Çalışma Ortamı (runs-on)
Her işlem, belirli bir çalışma ortamında çalışır. GitHub Actions, farklı işletim sistemlerini ve versiyonlarını destekler. İşlem, hangi çalışma ortamında çalışacağını runs-on anahtar kelimesiyle belirtir.
Kütüphane Kullanımı (uses)
Belirli görevlerin (steps) gerçekleştirilmesi için dışsal kütüphaneler veya eylemler (actions) kullanılabilir. Bu, özel görevleri otomasyonun bir parçası olarak dahil etmenizi sağlar.
Son Olarak
Karmaşık yapılandırmaları basit YAML dosyaları ile tanımlayarak, GitHub Actions ile projeler daha etkili, hızlı ve hata riski olmadan yönetilebilir. Hem küçük ölçekli projeler için hem de büyük ölçekli uygulamalar için mükemmel bir çözümdür.