DevOps and Infrastructure

GitHub Actions ile Sürekli Entegrasyon ve Dağıtımı Ustalaşmak

Modern yazılım geliştirme yaşam döngüsünde hız ve güvenilirlik esastır. Sürekli Entegrasyon ve Sürekli Dağıtım (CI/CD) hatları, bu verimliliğin omurgasıdır; geliştirme ekiplerinin kod değişikliklerini sık sık birleştirmesini ve üretimi güvenle dağıtmasını sağlar. Jenkins ve GitLab CI gibi araçlar bu alanda uzun süredir hakim olsa da, GitHub Actions derin GitHub ekosistemi entegrasyonu ve güçlü, esnek bir sözdizimi sunarak güçlü bir rakip olarak ortaya çıkmıştır. Bu kılavuz, temel kavramlardan gelişmiş iş akışı yapılandırmalarına kadar ilerleyerek GitHub Actions kullanarak sağlam bir CI/CD hattı nasıl oluşturulacağını keşfeder.

İş Akışları ve Tetikleyicileri Anlamak

GitHub Actions'ın kalbinde iş akışları yer alır. Bunlar, GitHub'daki herhangi bir kod projesini oluşturmak, test etmek, paketlemek, yayınlamak veya dağıtmak için deposunda kurabileceğiniz otomatik süreçlerdir. Bir iş akışı, deposunun `.github/workflows` dizininde saklanan bir YAML dosyası ile tanımlanır. Bir hat tasarlamadaki ilk adım, tetikleyicileri tanımlamaktır. GitHub Actions `push`, `pull_request`, `schedule` ve `workflow_dispatch` gibi çeşitli olayları destekler. Standart bir CI/CD hattı için, genellikle kod belirli bir dalı (branch) itildiğinde veya bir çekme isteği (pull request) açıldığında iş akışını tetiklemek istersiniz. ```yaml name: CI/CD Pipeline on: push: branches: [ main, develop ] pull_request: branches: [ main ] ``` Yukarıdaki örnekte, hat `main` veya `develop` dallarına yapılan her itmede ve bir çekme isteği `main` dalını hedeflediğinde çalışır. Bu, kodun üretim ortamına ulaşmadan önce doğrulanmasını sağlar.

İşler, Çalıştırıcılar ve Adımlar

Bir iş akışı, bir veya daha fazla işten oluşur; bu işler de bir veya daha fazla adımdan oluşur. Her adım, çalıştırılacak bir kabuk betiği veya yürütülecek bir eylemdir. Eylemler, GitHub Actions'ın yeniden kullanılabilir yapı taşlarıdır; resmi GitHub tarafından yönetilen eylemlerden topluluk katkılı olanlara kadar uzanır. Tipik bir Node.js uygulaması için hat şu şekilde görünebilir: ```yaml jobs: build-and-test: runs-on: ubuntu-latest steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' - name: Install dependencies run: npm ci - name: Run linter run: npm run lint - name: Run tests run: npm test ``` Burada, Ubuntu'nun en son sürümünde çalışan `build-and-test` adlı tek bir iş tanımlıyoruz. Adımlar, kodu kontrol etmeyi, Node.js ortamını kurmayı, tekrarlanabilir yapılar sağlayan `npm ci` kullanarak bağımlılıkları yüklemeyi ve linting ile test betiklerini çalıştırmayı içerir.

Ortam Değişkenleri ve Gizli Bilgiler

Hattınız büyüdükçe, API anahtarları, veritabanı kimlik bilgileri ve dağıtım belirteçleri gibi hassas verileri yönetmeniz gerekecektir. GitHub Actions, bunları depo gizli bilgileri (repository secrets) aracılığıyla güvenli bir şekilde yönetmek için bir yol sağlar. Gizli bilgileri asla YAML dosyalarınıza sabit kodlamayın (hardcode etmeyin). Bir gizli bilgiyi kullanmak için, iş akışınızda `secrets` bağlamı aracılığıyla ona atıfta bulunursunuz. Dağıtım adımları için, bu gizli bilgileri dağıtım betiğinize geçirebilirsiniz: ```yaml - name: Deploy to Production if: github.ref == 'refs/heads/main' run: | ./deploy.sh env: DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }} AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} ``` `if` koşulu, dağıtımın yalnızca kod `main` dalına birleştirildiğinde gerçekleşmesini sağlar; bu da özellik dallarından (feature branches) yanlışlıkla yapılan dağıtımları önler.

Önbellekleme ve Optimizasyon

GitHub Actions'ın en önemli performans avantajlarından biri önbellekleme özelliğidir. `node_modules` veya Maven depoları gibi bağımlılıkları önbelleğe alarak, işlerin çalışması için geçen süreyi önemli ölçüde azaltabilirsiniz. `actions/cache` eylemi, kilitleme dosyasına dayalı bir anahtar belirlemenize olanak tanır; bu da önbelleğin yalnızca bağımlılıklar değiştiğinde geçersiz kılınmasını sağlar. ```yaml - name: Cache node modules uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- ```

Sonuç

GitHub Actions, yazılım geliştirme iş akışınızı otomatikleştirmek için kapsamlı bir araç seti sunar. İş akışlarını, eylemleri ve önbelleği kullanarak hem verimli hem de güvenli ve sürdürülebilir hatlar oluşturabilirsiniz. Küçük bir yan projeyi mi yoksa büyük ölçekli bir kurumsal uygulamayı mı dağıtın, GitHub Actions'ı ustalaşmak, her modern DevOps mühendisi için temel bir beceridir. Küçük başlayın, iş akışlarınız üzerinde iterasyon yapın ve geliştirme hızınızın uçtuğunu görün.
Share: