Koddan Konteynere: GitHub Actions, Docker Hub ve Docker Compose ile CI/CD

Bir önceki gönderimde CI/CD kavramlarını detaylıca konuşmuştuk bu yazımda, baştan sonra bir Github Actions oluşturacağız.

Ön Hazırlıklar

Öncelikle, GitHub Actions’ın CI/CD pipeline’ınızı otomatik olarak algılayıp çalıştırabilmesi için proje kök dizininizde şu yolu oluşturmalısınız:

.github/
└── workflows/
    └── deploy.yml
  • Dosya Konumu olarak .github/workflows/ klasörü altında
  • Dosya adı: istediğiniz başka bir isim de verebilirsiniz uzantısı .yml olmak şartıyla

    bu sayede github action’u tanıyarak otamatik olarak tetikleyicisine göre çalışacaktır.

Settings > Secret and variables bölümünden sunucumuzun ve docker hub bilgilerimizi secret olarak tanımlatıp giriyoruz.

  1. Tetkik (Trigger) Ayarları
    • main dalına yapılan push veya pull request olaylarında otomasyonumuzun çalışacağını belirttik,
on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]
  1. Çalışma Ortamı
    • Çalışma ortamı Ubuntu’nun en güncel imajı (ubuntu-latest) ayarladık.
    • CI/CD’nin hangi makine üzerinde çalıştırılacağını belirtmekteyiz şayet .Net Framework kullansam windows sanal makine ya da iOS/macOS uygulaması derlemek istesem mecburen “macos-latest” kullanmam gerekirdi.
jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
  1. Kodun İndirilmesi
    • actions/checkout@v3 ile repodaki en güncel kod sanal makineye çekilir.
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
  1. Docker Buildx Kurulumu
    • Çoklu mimari build desteği için docker/setup-buildx-action@v3 ile Buildx eklentisi yüklenir.
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
  1. Docker Hub’a Giriş
    • docker/login-action@v3 ile, GitHub Secrets’dan alınan secret bilgileriyle Docker Hub’a othorizasyon yapılır.
      - name: Login to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
  1. Docker Compose Kurulumu
    • Yazılımımın bir çok ihtiyacı olduğundan ve hepsini ayrı ayrı build etmek yerine tek bir docker compose dosyası bütün parçaları aynı anda build ederek güncellemek için sanal makineye docker compose yüklüyoruz
      - name: Set up Docker Compose
        run: |
            sudo curl -L "https://github.com/docker/compose/releases/download/v2.5.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
            sudo chmod +x /usr/local/bin/docker-compose
  1. İmajların Build & Push Edilmesi
    • Docker Compose dosya yolunu vererek tüm servisleri aynı anda build alarak docker build imajlarını docker hub imaj repository’sine yüklüyoruz
      - name: Build and Push Docker images
        run: |
          docker-compose -f docker/docker-compose.yml build
          docker-compose -f docker/docker-compose.yml push
  1. Uzak Sunucuya SSH ile Bağlanma & Docker Hub Girişi
    • En güncel yazılımımızın prod ortama deploy etmek için sanal makinemizden SSH ile sunucuya bağlanıyoruz ve imajları çekebilmek için docker hub’a login oluyoruz aslında kendimiz tek bir sefer docker hub’a login olursak bu tekrardan login olmaya gerek yok ancak sanal makine baglandığımızdan her seferinde login olmak zorundayız.
      - name: Login to Docker Hub on server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: ${{ secrets.SSH_PORT }}
          script: |
            echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
  1. Sunucuda Deploy (CD)
    • Sunucudaki docker compose dosyasının /var/www/app dizinine gidilir, son imajı çekiyoruz ve up -d ile canlıya alıyoruz aslında burada hatalı olması durumunda roll-back stratejiside geliştirilebilirdi.
      - name: Deploy on server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          port: ${{ secrets.SSH_PORT }}
          script: |
            cd /var/www/app
            docker-compose -f docker/docker-compose.yml pull
            docker-compose -f docker/docker-compose.yml up -d

Not: GitHub Actions, kendi başına “tek bir pipeline” değildir; aslında CI/CD iş akışlarınızı tanımlayıp çalıştırabileceğiniz bir otomasyon platformudur;

  • Workflow (İş Akışı): .github/workflows/ altına koyduğunuz her bir yml dosyası, birer workflow yani iş akışıdır.
  • Job (İş): her workflow içinde birden fazla job tanımlayabiliriz işleri paralel veya ardışık çalıştırabiliriz.
  • Step (Adım): Her job, komutları veya eylemleri (actions) barındıran adımlar dizisidir.

Bu yapı sayesinde, “CI/CD pipeline” kavramını şöyle diyebiliriz:

  • Pipeline = Workflow + Job’lar + Step’ler

Yani GitHub Actions ile istediğiniz sayıda pipeline (iş akışı) oluşturur, her birinde derleme, test, imaj build/push ve deploy gibi adımları tasarlarız ve github actions platformu da bu tanımları okuyup uygun runnerları(sanal makineleri) çalıştırarak CI/CD sürecinizi otomatikleştirir.

İşlemlerimizin sonunda action başarı ile gerçekleşiyor ve yazdığımız son kod başarılı şekilde sunucumuza güncelleniyor.


Leave a Reply

Your email address will not be published. Required fields are marked *