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.

-
Tetkik (Trigger) Ayarları
-
main
dalına yapılanpush
veyapull request
olaylarında otomasyonumuzun çalışacağını belirttik,
-
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
-
Ç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.
- Çalışma ortamı Ubuntu’nun en güncel imajı (
jobs:
build-and-deploy:
runs-on: ubuntu-latest
-
Kodun İndirilmesi
-
actions/checkout@v3
ile repodaki en güncel kod sanal makineye çekilir.
-
steps:
- name: Checkout code
uses: actions/checkout@v3
-
Docker Buildx Kurulumu
- Çoklu mimari build desteği için
docker/setup-buildx-action@v3
ile Buildx eklentisi yüklenir.
- Çoklu mimari build desteği için
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
-
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 }}
-
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
-
İ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
-
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
-
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.
- Sunucudaki docker compose dosyasının
- 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