CI/CD Süreçleri ve Otomatik Deploy Örneği

Python Web Uygulaması ile Gerçek Hayat Senaryosu

Emre Can Yılmaz

Ondokuz Mayıs Üniversitesi

2025

İçerik

  • CI/CD: Continuous Integration (Sürekli Entegrasyon) ve Continuous Deployment/Delivery (Sürekli Dağıtım)
  • Gerçek hayat örneği: Python ile yazılmış basit bir web uygulaması, birim testler ve otomatik deploy

CI/CD Nedir?

Continuous Integration (CI) - Sürekli Entegrasyon

  • Geliştiricilerin sık sık kod değişiklikleri yaptığı süreç
  • Her kod değişikliğinde otomatik testlerin çalıştırılması
  • Hataların erken tespit edilmesi ve çözülmesi
  • Kod kalitesinin artırılması (statik kod analizi)
  • Kodun sürekli olarak entegrasyonunu sağlamak

Continuous Deployment/Delivery (CD) - Sürekli Dağıtım

  • Testleri geçen kodun otomatik olarak üretim ortamına aktarılması
  • Hızlı, güvenilir ve sürekli güncelleme sağlama

CI/CD Süreçleri

Tipik bir CI/CD süreci birkaç aşamadan oluşur:

  • Geliştirici kod değişikliklerini git reposuna gönderir (push)
  • CI sunucusu değişiklikleri algılayıp derlemeyi tetikler
  • Kod derlenir ve test edilir (birim, entegrasyon testleri)
  • Test sonuçları geliştiriciye bildirilir
  • Başarılı olduğunda, çıktılar (varsa) staging ortamına dağıtılır
  • Yayın öncesi staging ortamında ek testler yapılabilir
  • CD sistemi onaylanan değişiklikleri üretim ortamına (production) dağıtır (deploy eder)

Image credit: Bytebytego

Avantajlarını Özetleyelim

  • Hataların erken tespiti
  • Daha az insan hatası
  • Daha hızlı ve güvenilir dağıtım süreçleri
  • Kod kalitesinin artması
  • Hızlı geri bildirim döngüsü

CI/CD Araçları

GitHub Actions

  • GitHub üzerinde CI/CD süreçlerini otomatikleştirmek için kullanılan bir araçtır.
  • İş akışları (workflows) oluşturularak, kod gönderildiğinde otomatik testler ve deploy işlemleri yapılabilir.

Popüler GitHub Actions Alternatifleri

  • GitLab CI/CD: GitLab’ın yerleşik CI/CD aracı, projelerle entegre çalışır.
  • CircleCI: Bulut tabanlı, hızlı ve kolay yapılandırma imkanı sağlar.
  • Travis CI: Özellikle açık kaynak projeler için popüler bir CI/CD platformu.
  • Jenkins: Açık kaynak, esnek yapılandırma seçenekleri sunar.
  • Buildkite: Özellikle büyük projeler için ölçeklenebilir bir CI/CD çözümü.

Demo Öncesi Temel Kavramlar

SSH

  • Güvenli bir bağlantı kurmak için kullanılan bir protokoldür.
  • Kimlik doğrulama için SSH anahtarları kullanılır.
  • SSH anahtarları, özel anahtar (private key) ve genel anahtar (public key) çiftinden oluşur.
  • Özel anahtar, geliştiricinin bilgisayarında saklanırken, genel anahtar sunucuda bulunur.
  • SSH anahtarları, genellikle ~/.ssh dizininde saklanır.

Git

  • Versiyon kontrol sistemi; kodun geçmişini takip eder, geçmişteki bir noktaya dönüş sağlar ve kod üzerinde birlikte çalışmayı kolaylaştırır.
  • GitHub, GitLab gibi platformlar üzerinde barındırılır.

Repository (Repo)

  • Projenin kodlarının ve geçmişinin saklandığı yer.
  • Yerel (local) ve uzaktaki (remote) olmak üzere iki türü vardır.
  • Yerel repo, geliştiricinin bilgisayarında bulunur; uzaktaki repo ise GitHub, GitLab gibi platformlarda bulunur.

Commit

  • Kod değişikliklerinin yerelde kaydedilmesi işlemidir.

Push

  • Yerel repodan, uzaktaki Git deposuna kod gönderme işlemi.

Pull

  • Uzaktaki Git deposundan, yerel repoya kod alma işlemi.

Branch (Dal)

  • Projede farklı özelliklerin veya düzeltmelerin üzerinde çalışmak için kullanılan bir kopyadır.
  • Ana dal (main/master) genellikle “production” kodunu temsil ederken, diğer dallar geliştirme sürecinde kullanılır.
  • Dallar, kod üzerinde paralel çalışmayı sağlar.
  • Dallar, ana dal ile birleştirilebilir (merge) ve bu işlem genellikle “pull request” (PR) ile yapılır.

Pull Request (PR)

  • Bir dalın başka bir dal ile birleştirilmesi için yapılan istektir.
  • Pull request, kod incelemesi ve onay sürecini başlatır.
  • Pull request onaylandıktan sonra, dal istenen ile birleştirilir (merge) ve kod değişiklikleri istenen dala yansır.

Image Credit: https://www.geeksforgeeks.org/

Deploy

Uygulamanın çalışır hale getirilip, üretim veya test ortamına aktarılması.

  • Push Based Deploy: Kod gönderildiğinde (push) otomatik olarak deploy sürecinin tetiklenmesi.

  • Pull Based Deploy: Kod değişikliklerinin belirli aralıklarla kontrol edilip, otomatik olarak deploy edilmesi.

Konteyner Tabanlı Sanallaştırma

  • Uygulamaların ve bağımlılıklarının izole bir ortamda çalıştırılmasını sağlar.
  • Her konteyner, uygulamanın çalışması için gereken tüm bileşenleri içerir.
  • Konteynerler, sanal makinelerden daha hafif ve hızlıdır.
  • Uygulamalar, konteynerler içinde taşınabilir ve farklı ortamlarda çalıştırılabilir.

Docker

  • Uygulamaların konteynerler içinde çalıştırılmasını sağlayan bir platformdur.

Image Credit: docker.com

Dokku

  • Docker tabanlı küçük ölçekli Platform-as-a-Service (PaaS) çözümü; uygulamaların kolayca deploy edilmesini sağlar.
  • Dokku, uygulamaları Docker konteynerleri içinde çalıştırır ve geliştiricilerin uygulamalarını kolayca dağıtmasına olanak tanır.
  • Git tabanlı bir dağıtım (deploy) süreci sunar; kod gönderildiğinde (git push) otomatik olarak uygulamayı günceller.

Platform as a Service (PaaS)

Geliştiricilere uygulama geliştirme, çalıştırma ve yönetme için altyapı yönetimi gerektirmeyen bulut tabanlı bir platform sağlayan bir hizmet modelidir.

Demo Zamanı!

Adımlar

  1. Kod Geliştirme: Python web uygulaması yazılır ve Git ile versiyonlanır.

  2. Kod Push: Kod, GitHub gibi bir uzaktaki repoya gönderilir.

  3. GitHub Actions İş Akışı:

    • Kodun checkout edilmesi
    • Python ortamının kurulması
    • Bağımlılıkların yüklenmesi
    • Birim testlerin çalıştırılması
  4. Deploy Süreci: Testler başarılı ise, Dokku sunucusuna otomatik deploy gerçekleşir.

Örnek Python Web Uygulaması

  • Flask: Python ile yazılmış hafif bir web framework’üdür.

Basit bir Flask uygulaması örneği:

import os
from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello():
    name = os.environ.get("NAME", "Default")
    return f"Hello, {name}. Welcome to the CI/CD World!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=3000)

Testler

Uygulamanın temel fonksiyonunu test eden örnek bir test (pytest kullanılarak):

def test_home():
    from app import app
    client = app.test_client()
    response = client.get("/")
    assert response.data == b"Hello, CI/CD World!"

Uygulamayı Kendi Bilgisayarınızda Çalıştırma

Python sürümlerini ve sanal ortamları yönetmek için uv kullanabilirsiniz.

  1. Gerekli Kütüphaneleri Yükleyin:

    uv venv
    source .venv/bin/activate && uv pip install flask pytest
  2. Testleri Çalıştırın:

    uv run python -m pytest -v
  3. Uygulamayı Çalıştırın:

    export NAME="Emre Can" && uv run python app.py
  4. Tarayıcıda Uygulamayı Görüntüleyin:

Dokku ile Otomatik Deploy

Uygulama Oluşturma ve Yapılandırma

dokku apps:create flask-demo
dokku config:set flask-demo FLASK_APP=app.py NAME=Cezmi
dokku ports:add flask-demo http:80:3000
dokku domains:add flask-demo flask-demo.emrecan.dev
dokku letsencrypt:set --global email [email protected]
dokku letsencrypt:enable flask-demo
dokku letsencrypt:cron-job --add

Uygulama için SSH Anahtarı Oluşturma

ssh-keygen -t ed25519 -C "[email protected]"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/Users/emrecan/.ssh/id_ed25519): /Users/emrecan/.ssh/cezmi_ed25519
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/emrecan/.ssh/cezmi_ed25519
Your public key has been saved in /Users/emrecan/.ssh/cezmi_ed25519.pub
The key fingerprint is:
SHA256:VlPuiuSDVY3Z/t08BMvfLAOxFkpZMkjxHbItzs146Mc [email protected]
The key's randomart image is:
+--[ED25519 256]--+
|       .oo+ +    |
|        .. ^ .   |
|          % O.   |
|         * @.+o  |
|        S * Xo . |
|       * o = oo+o|
|      . + o E +o*|
|         . .   o.|
|                 |
+----[SHA256]-----+

SSH Anahtarını Dokku’ya Ekleme

dokku ssh-keys:add flask-demo < ~/.ssh/cezmi_ed25519.pub

Uygulama için SSH Anahtarını GitHub’a Ekleme

  1. GitHub’da repository’nizi açın.
  2. “Settings” > “Security” > “Secret and variables” > “Actions” sekmesine gidin.
  3. “New Repository Secret” butonuna tıklayıp “SSH_PRIVATE_KEY” adında yeni bir secret oluşturun.
  4. “Value” kısmına yukarıda oluşturduğunuz SSH anahtarını ~/.ssh/cezmi_ed25519 yapıştırın.
  5. “Add secret” butonuna tıklayın.
  6. Bu işlem, GitHub Actions’ın Dokku sunucusuna erişmesini sağlar.

DNS Yapılandırması

  • Uygulamanızın alan adını Dokku sunucusuna yönlendirin. (A kaydı veya CNAME kaydı ile)
  • Örneğin, flask-demo.emrecan.dev alan adını Dokku sunucusuna yönlendirin.

Dokku ile Uygulamayı İlk Kez Deploy Etme

git init
git add .
git commit -m "Initial commit"
git remote add dokku [email protected]:flask-demo
git push dokku main:master
  • Bu komut, yerel repodaki kodu Dokku sunucusuna gönderir ve otomatik olarak deploy işlemini başlatır.
  • Dokku, kodu alır, bağımlılıkları yükler ve uygulamayı başlatır.
  • Dokku, uygulamanızın çalıştığını kontrol eder ve gerekli ayarları yapar.
  • Uygulamanız artık https://flask-demo.emrecan.dev adresinde erişilebilir olmalıdır.

CI/CD Sürecini Otomatikleştirme

GitHub Actions Workflow Örneği

GitHub Actions ile CI/CD sürecini otomatikleştirmek için bir iş akışı (workflow) dosyası oluşturulur. Bu dosya, .github/workflows dizininde deploy.yml adıyla kaydedilir.

GitHub Actions Workflow Örneği

name: CI/CD Pipeline

on:
  push:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'

    - name: Install uv
      run: pip install uv

    - name: Create virtual environment
      run: uv venv

    - name: Install dependencies
      run: |
        uv pip install -r requirements.txt

    - name: Run tests
      run: |
        uv run python -m pytest
      env:
        NAME: CI/CD World

  deploy:
    needs: test
    runs-on: ubuntu-latest
    if: success()
    steps:
      - name: Cloning repo
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Push to dokku
        uses: dokku/github-action@master
        with:
          git_push_flags: '--force'
          git_remote_url: 'ssh://[email protected]:22/flask-demo'
          ssh_private_key: ${{ secrets.SSH_PRIVATE_KEY }}

Kodun GitHub’a Gönderilmesi

git add .
git commit -m "Add CI/CD workflow"
git push origin main

Sonuçları takip etme

  • GitHub Actions sekmesine gidin.
  • İş akışının (workflow) durumu ve test sonuçları burada görüntülenir.
  • Başarılı bir şekilde deploy edildiğinde, Dokku sunucusundaki uygulama otomatik olarak güncellenir.
  • Uygulamanızı tarayıcıda görüntülemek için alan adınızı ziyaret edin: https://flask-demo.emrecan.dev
  • Uygulamanızın çalıştığını görmelisiniz: “Hello, Cezmi!”

GitHub Actions

Sonuç

  • Bu örnek senaryo, gerçek hayatta nasıl otomasyon uygulanabileceğini göstermektedir.
  • Farklı CI/CD araçları, projenin ihtiyaçlarına göre çeşitli seçenekler sunar.

Örnek projeye ulaşmak için: flask-demo

Teşekkürler!

  • Sorularınız varsa sormaktan çekinmeyin!

Kaynaklar