← Kursa Dön
📄 Text · 30 min

GitHub Actions Nedir?

Giriş — Kodunu Kim Test Edecek?

Bir ekipte çalışıyorsun. Her gün düzinelerce commit atılıyor, pull request'ler açılıyor, branch'ler merge ediliyor. Ve bir gün birisi farkında olmadan bir bug push ediyor. Testler? Kimse çalıştırmamış. Lint? "Sonra bakarız" denmiş. Build? "Bende çalışıyor" cümlesi havada uçuşuyor.

Bu senaryo her yazılım ekibinin başına gelir — ta ki otomasyonu devreye alana kadar. "Push yaptığında otomatik test çalışsın, PR açıldığında otomatik lint yapılsın, main'e merge edildiğinde otomatik deploy olsun" — işte bu hayalin adı CI/CD ve GitHub'ın bunu gerçekleştiren aracı GitHub Actions.

Bu derste CI/CD kavramını temelden anlayacak, GitHub Actions'ın yapı taşlarını (workflow, job, step, runner) öğrenecek ve ilk workflow dosyanı yazacaksın.


🎬 Analoji: Otomatik Fabrika Hattı

Bir otomobil fabrikası düşün. Arabalar montaj hattından geçer:

  1. Şasi gelir → Robot kollar kapıları takar

  2. Motor takılır → Otomatik test: çalışıyor mu?

  3. Boya yapılır → Kalite kontrol kamerası: çizik var mı?

  4. Son kontrol → Her şey tamam mı? Tamam → sevkiyata çık!

Hiçbir adımda insan müdahalesi yok. Her şey otomatik ve sıralı. Bir adım başarısız olursa hat durur, sorunu bildiren alarm çalar.

GitHub Actions da kodun için böyle bir montaj hattı kurar:

Kod push edildi
    │
    ▼
┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│   Lint       │────►│    Test      │────►│    Build     │
│  (Kod stili  │     │  (Birim      │     │  (Derleme/   │
│   kontrolü)  │     │   testler)   │     │   paketleme) │
└──────────────┘     └──────────────┘     └──────────────┘
                                                │
                          ┌─────────────────────┘
                          ▼
                    ┌──────────────┐
                    │   Deploy     │
                    │  (Yayına al) │
                    └──────────────┘

Bu hat her push'ta otomatik çalışır. Sen kod yaz, gerisini pipeline halleder.


CI/CD Nedir?

CI — Continuous Integration (Sürekli Entegrasyon)

CI, geliştiricilerin kodlarını sık sık (günde birden fazla) ana branch'e entegre etmesi ve her entegrasyonun otomatik olarak doğrulanması pratiğidir.

CI olmadan:                          CI ile:
┌────────────────────┐              ┌────────────────────┐
│ Haftalarca ayrı    │              │ Günde birden fazla  │
│ branch'te çalış    │              │ merge yap           │
│         │          │              │         │           │
│ Merge günü geldi   │              │ Her merge'de:       │
│ → 50 conflict!     │              │ → Otomatik lint     │
│ → Testler bozuk!   │              │ → Otomatik test     │
│ → 2 gün düzeltme   │              │ → Otomatik build    │
│         │          │              │         │           │
│ 😫 "Merge hell"    │              │ ✅ Sorunlar hemen   │
│                    │              │    yakalanır         │
└────────────────────┘              └────────────────────┘

CI'ın temel kuralları:

  1. Sık merge et — Uzun süre ayrı çalışma

  2. Her merge otomatik test edilsin — İnsan güvenilmez, makine güvenilir

  3. Kırılan build en yüksek öncelik — Kırmızı pipeline = her şeyi bırak, düzelt

CD — Continuous Delivery / Continuous Deployment

CD'nin iki anlamı var:

Continuous Delivery (Sürekli Teslimat):
  Kod her zaman deploy edilebilir durumda.
  Son adım (production deploy) MANUEL tetiklenir.
  → "Deploy butonu" her zaman hazır, ama insan basar.

Continuous Deployment (Sürekli Dağıtım):
  Her başarılı pipeline OTOMATIK olarak production'a deploy olur.
  İnsan müdahalesi yok.
  → Commit → Test → Deploy. Tamamen otomatik.
CI/CD Spektrumu:

   Basit ◄──────────────────────────────────────► İleri
   
   [Manuel Test]  [CI]  [CI + CD Delivery]  [CI + CD Deployment]
        │          │           │                    │
    Her şey     Otomatik    Otomatik test       Otomatik test
    elle        test        + Manuel deploy     + Otomatik deploy

Neden CI/CD?

CI/CD'siz hayat:                    CI/CD ile hayat:
─────────────────                   ─────────────────
"Bende çalışıyor" 🤷               Her ortamda test edilmiş ✅
Deploy günü stresli 😰              Deploy bir buton tıklaması 😌
Bug'lar haftalarca gizli 🐛         Bug'lar dakikalar içinde bulunur 🔍
Gece yarısı hotfix 🌙              Güvenle deploy, güvenle uyu 😴
"Kim bozdu?" kavgası 😠             Git blame + pipeline kaydı 📋

GitHub Actions — Genel Bakış

GitHub Actions, GitHub'ın yerleşik CI/CD platformudur. Repo'nda bir YAML dosyası oluşturursun, GitHub gerisini halleder.

Neden GitHub Actions?

Diğer CI/CD Araçları:         GitHub Actions:
┌─────────────────────┐      ┌─────────────────────────────┐
│ Jenkins             │      │ GitHub ile entegre (doğal)  │
│ → Sunucu kur, yönet │      │ → Repo'nda YAML yaz, bitsin │
│                     │      │                             │
│ CircleCI            │      │ Ücretsiz tier cömert        │
│ → Ayrı hesap, config│      │ → Public repo: sınırsız     │
│                     │      │ → Private: 2000 dk/ay       │
│ Travis CI           │      │                             │
│ → Ayrı servis       │      │ Marketplace: 20,000+ hazır  │
│                     │      │ action                      │
│ GitLab CI           │      │                             │
│ → GitLab kullanman  │      │ Matrix build, caching,      │
│   gerekir           │      │ artifacts — hepsi dahil     │
└─────────────────────┘      └─────────────────────────────┘

GitHub Actions Ücretsiz Limitleri

Public Repository:
  → Dakika: Sınırsız ✨
  → Storage: 500 MB (artifacts)
  → Concurrent jobs: 20

Private Repository (Free plan):
  → Dakika: 2,000 dk/ay
  → Storage: 500 MB
  → Concurrent jobs: 20

Runner Dakika Çarpanları:
  → Linux:   1x  (en ucuz)
  → Windows: 2x
  → macOS:   10x (en pahalı)

GitHub Actions'ın Yapı Taşları

GitHub Actions'ın 5 temel kavramı var. Bunları bir tiyatro prodüksiyonuna benzetelim:

┌─────────────────────────────────────────────────────────────┐
│                    GITHUB ACTIONS MİMARİSİ                  │
│                                                             │
│  Workflow (Oyun)                                            │
│  └── Event (Perde açılış sinyali)                          │
│      └── Job (Sahne / Perde)                               │
│          ├── Runner (Sahne / Tiyatro salonu)                │
│          └── Step (Replik / Hareket)                        │
│              └── Action (Aktörün yeteneği)                  │
└─────────────────────────────────────────────────────────────┘

1. Workflow (İş Akışı)

Bir workflow, otomatik çalışan bir süreçtir. Tiyatrodaki "oyunun" kendisi. Bir YAML dosyası ile tanımlanır.

📁 .github/
  └── workflows/
      ├── ci.yml          ← Her push'ta test çalıştır
      ├── deploy.yml      ← main'e merge olunca deploy et
      └── nightly.yml     ← Her gece otomatik çalış

Bir repo'da birden fazla workflow olabilir. Her biri farklı amaçlar için.

2. Event (Tetikleyici Olay)

Workflow'u başlatan olay. "Perde açılsın!" sinyali.

# push edildiğinde çalış
on: push

# PR açıldığında çalış
on: pull_request

# Her gün saat 02:00'de çalış
on:
  schedule:
    - cron: '0 2 * * *'

# Manuel tetikle (GitHub UI'dan buton)
on: workflow_dispatch

3. Job (İş)

Bir workflow içinde bir veya birden fazla job olabilir. Tiyatrodaki "perdeler" gibi. Varsayılan olarak job'lar paralel çalışır ama birbirine bağımlı yapabilirsin.

jobs:
  lint:        # 1. iş: Lint kontrolü
    ...
  test:        # 2. iş: Testleri çalıştır (lint'ten sonra)
    needs: lint
    ...
  deploy:      # 3. iş: Deploy et (test'ten sonra)
    needs: test
    ...
Paralel çalışan job'lar:          Sıralı (bağımlı) job'lar:
┌──────┐  ┌──────┐               ┌──────┐
│ lint │  │ test │               │ lint │
└──┬───┘  └──┬───┘               └──┬───┘
   │         │                      │
   └────┬────┘                      ▼
        │                        ┌──────┐
        ▼                        │ test │
   ┌────────┐                    └──┬───┘
   │ deploy │                       │
   └────────┘                       ▼
                                 ┌────────┐
                                 │ deploy │
                                 └────────┘

4. Step (Adım)

Bir job içindeki her bir komut veya action çalıştırması. Tiyatrodaki "replikler" gibi — sıralı çalışır.

steps:
  - name: Kodu indir          # Adım 1
    uses: actions/checkout@v4

  - name: Node.js kur          # Adım 2
    uses: actions/setup-node@v4

  - name: Bağımlılıkları yükle # Adım 3
    run: npm install

  - name: Testleri çalıştır    # Adım 4
    run: npm test

Her step ya bir shell komutu (run:) ya da hazır bir action (uses:) çalıştırır.

5. Runner (Çalıştırıcı)

Job'un üzerinde çalıştığı sanal makine. Tiyatrodaki "sahne" gibi — her perde (job) farklı bir sahnede oynanabilir.

jobs:
  test:
    runs-on: ubuntu-latest    # Linux (en yaygın, en ucuz)
    # runs-on: windows-latest  # Windows
    # runs-on: macos-latest    # macOS (en pahalı)
GitHub-Hosted Runner'lar:
┌──────────────────┬────────────────────────────────────┐
│ Runner           │ Özellikler                          │
├──────────────────┼────────────────────────────────────┤
│ ubuntu-latest    │ Ubuntu 22.04, 7GB RAM, 14GB SSD   │
│                  │ En hızlı, en ucuz, en yaygın       │
├──────────────────┼────────────────────────────────────┤
│ ubuntu-24.04     │ Ubuntu 24.04 (belirli versiyon)   │
├──────────────────┼────────────────────────────────────┤
│ windows-latest   │ Windows Server 2022, 7GB RAM      │
│                  │ .NET, PowerShell projeleri         │
├──────────────────┼────────────────────────────────────┤
│ macos-latest     │ macOS Sonoma, 7GB RAM             │
│                  │ iOS/macOS projeleri                │
└──────────────────┴────────────────────────────────────┘

💡 İpucu: ubuntu-latest her zaman en iyi başlangıç noktasıdır. Linux runner'lar hem en hızlı başlar hem en ucuzdur. Windows veya macOS'a sadece gerçekten ihtiyacın varsa geç.


YAML Sözdizimi — Hızlı Rehber

GitHub Actions workflow dosyaları YAML formatında yazılır. YAML'ı hiç bilmiyorsan, 5 dakikada öğrenirsin:

# Yorum satırı

# Anahtar-değer çifti:
name: CI Pipeline
version: 1.0

# Nested (iç içe) yapı — BOŞLUK ile girinti (TAB KULLANMA!):
person:
  name: Tolgahan
  age: 25
  skills:
    - JavaScript
    - Python
    - Git

# Liste:
fruits:
  - apple
  - banana
  - cherry

# Çok satırlı metin:
description: |
  Bu bir
  çok satırlı
  metin bloğudur.

# Boolean:
enabled: true
debug: false

# Sayı:
timeout: 60

⚠️ Dikkat: YAML'da girinti (indentation) boşluk ile yapılır, TAB karakteri kullanma! Tab kullanırsan YAML parser hata verir ve workflow çalışmaz. Editor'ünde "Tab = 2 spaces" ayarını yap.


İlk Workflow'unu Yaz

Şimdi adım adım ilk GitHub Actions workflow'unu yazalım.

Adım 1: Dosya Oluştur

# Proje dizininde:
$ mkdir -p .github/workflows
$ touch .github/workflows/ci.yml

Adım 2: Workflow'u Yaz

# .github/workflows/ci.yml

# 1. Workflow'un adı (GitHub UI'da görünür)
name: CI Pipeline

# 2. Ne zaman çalışsın? (Event/Trigger)
on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

# 3. İşler (Jobs)
jobs:
  # İlk job: Build ve Test
  build-and-test:
    # Hangi runner'da çalışsın?
    runs-on: ubuntu-latest

    # Adımlar (Steps)
    steps:
      # Adım 1: Repo kodunu indir
      - name: 📥 Checkout code
        uses: actions/checkout@v4

      # Adım 2: Node.js kur
      - name: 📦 Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'

      # Adım 3: Bağımlılıkları yükle
      - name: 📚 Install dependencies
        run: npm ci

      # Adım 4: Lint kontrolü
      - name: 🔍 Run linter
        run: npm run lint

      # Adım 5: Testleri çalıştır
      - name: 🧪 Run tests
        run: npm test

      # Adım 6: Build
      - name: 🏗️ Build project
        run: npm run build

Adım 3: Push Et ve İzle

$ git add .github/workflows/ci.yml
$ git commit -m "ci: Add CI pipeline"
$ git push origin main

Artık GitHub'da repo'nun Actions sekmesinde workflow çalışmaya başlar:

GitHub → Repository → Actions tab

┌─────────────────────────────────────────────────────┐
│ CI Pipeline                                          │
│                                                      │
│ ✅ ci: Add CI pipeline  ─  main  ─  2m 15s          │
│    └── build-and-test                                │
│        ├── ✅ 📥 Checkout code          (2s)         │
│        ├── ✅ 📦 Setup Node.js          (5s)         │
│        ├── ✅ 📚 Install dependencies   (45s)        │
│        ├── ✅ 🔍 Run linter             (12s)        │
│        ├── ✅ 🧪 Run tests              (38s)        │
│        └── ✅ 🏗️ Build project          (33s)        │
│                                                      │
│ ❌ fix: Quick patch  ─  develop  ─  1m 02s          │
│    └── build-and-test                                │
│        ├── ✅ 📥 Checkout code          (2s)         │
│        ├── ✅ 📦 Setup Node.js          (5s)         │
│        ├── ✅ 📚 Install dependencies   (45s)        │
│        ├── ❌ 🔍 Run linter             (8s)  ← FAIL│
│        ├── ⏭️  🧪 Run tests             (skipped)   │
│        └── ⏭️  🏗️ Build project         (skipped)   │
└─────────────────────────────────────────────────────┘

Bir step başarısız olursa (exit code ≠ 0), sonraki step'ler atlanır ve job kırmızı olarak işaretlenir.


Hazır Action'lar — Marketplace

Her şeyi sıfırdan yazmana gerek yok. GitHub Marketplace'te 20,000+ hazır action var:

En Çok Kullanılan Action'lar

# 1. Kodu indir (neredeyse HER workflow'da)
- uses: actions/checkout@v4

# 2. Node.js kur
- uses: actions/setup-node@v4
  with:
    node-version: '20'
    cache: 'npm'            # node_modules cache'le

# 3. Python kur
- uses: actions/setup-python@v5
  with:
    python-version: '3.12'

# 4. Java kur
- uses: actions/setup-java@v4
  with:
    distribution: 'temurin'
    java-version: '21'

# 5. Artifact yükle (build çıktısını sakla)
- uses: actions/upload-artifact@v4
  with:
    name: build-output
    path: dist/

# 6. Cache (bağımlılıkları cache'le, hızlandır)
- uses: actions/cache@v4
  with:
    path: ~/.npm
    key: npm-${{ hashFiles('package-lock.json') }}

Action Versiyonlama

# Major version (önerilen — güvenlik yamaları otomatik gelir):
uses: actions/checkout@v4

# Tam versiyon (kesin pin):
uses: actions/checkout@v4.1.1

# Commit SHA (en güvenli — supply chain saldırısına karşı):
uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11

# Branch (önerilmez — değişebilir):
uses: actions/checkout@main

⚠️ Dikkat: Üçüncü parti action'larda @v4 yerine commit SHA kullanmak daha güvenlidir. Çünkü bir action'ın maintainer'ı v4 tag'ini kötü niyetli koda yönlendirebilir. SHA değiştirilemez.


uses vs run — Ne Zaman Hangisi?

# uses: Hazır Action çalıştır
# → Karmaşık işler için (checkout, setup, deploy)
# → Marketplace'ten gelir
# → "with:" parametresiyle yapılandırılır
- uses: actions/setup-node@v4
  with:
    node-version: '20'

# run: Shell komutu çalıştır
# → Basit komutlar için (npm install, npm test)
# → Doğrudan shell'de çalışır
# → "env:" ile ortam değişkeni eklenebilir
- run: npm test
  env:
    CI: true
Karar:
  Yaptığın iş basit bir shell komutu mu?
  ├── Evet → run: kullan
  └── Hayır (kurulum, indirme, API çağrısı...)
      ├── Marketplace'te hazır action var mı?
      │   ├── Evet → uses: kullan
      │   └── Hayır → run: ile script yaz

Pratik Örnekler

Örnek 1: Minimal Python CI

name: Python CI

on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Run tests
        run: python -m pytest

Örnek 2: Birden Fazla Job

name: Full Pipeline

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm ci
      - run: npm run lint

  test:
    runs-on: ubuntu-latest
    needs: lint                    # lint başarılı olursa çalış
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm ci
      - run: npm test

  build:
    runs-on: ubuntu-latest
    needs: test                    # test başarılı olursa çalış
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
      - run: npm ci
      - run: npm run build
Bu pipeline'ın akışı:

  ┌──────┐     ┌──────┐     ┌──────┐
  │ lint │────►│ test │────►│build │
  └──────┘     └──────┘     └──────┘
    2 dk         3 dk         1 dk
                              
  Toplam: ~6 dakika (sıralı)

Örnek 3: Paralel Test Matrisi

name: Cross-Platform Test

on: [push]

jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macos-latest]
        node: [18, 20, 22]

    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
      - run: npm ci
      - run: npm test

Bu 9 job oluşturur (3 OS × 3 Node.js versiyonu) ve hepsi paralel çalışır:

┌─────────────────┬─────────┬─────────┬─────────┐
│                 │ Node 18 │ Node 20 │ Node 22 │
├─────────────────┼─────────┼─────────┼─────────┤
│ Ubuntu          │   ✅    │   ✅    │   ✅    │
│ Windows         │   ✅    │   ✅    │   ❌    │
│ macOS           │   ✅    │   ✅    │   ✅    │
└─────────────────┴─────────┴─────────┴─────────┘
           9 job paralel çalışır!

Workflow Dosyası Hata Ayıklama

Yaygın Hatalar

# ❌ HATA 1: Tab kullanımı
jobs:
	test:                    # TAB! YAML bunu kabul etmez
    runs-on: ubuntu-latest

# ✅ DOĞRU: Boşluk kullan
jobs:
  test:                      # 2 boşluk
    runs-on: ubuntu-latest
# ❌ HATA 2: Yanlış girinti
steps:
- name: Test              # Girinti yok!
  run: npm test

# ✅ DOĞRU:
steps:
  - name: Test            # 2 boşluk girinti
    run: npm test
# ❌ HATA 3: Eksik checkout
steps:
  - run: npm test         # Kod yok! Checkout yapmadın!

# ✅ DOĞRU:
steps:
  - uses: actions/checkout@v4   # Önce kodu indir
  - run: npm test               # Sonra çalıştır

Hata Ayıklama İpuçları

# Debug bilgisi görmek için:
steps:
  - name: Debug info
    run: |
      echo "Branch: ${{ github.ref }}"
      echo "Event: ${{ github.event_name }}"
      echo "Actor: ${{ github.actor }}"
      echo "SHA: ${{ github.sha }}"
      pwd
      ls -la
    env:
      ACTIONS_STEP_DEBUG: true   # Detaylı log

  # Sadece başarısız olduğunda çalışan step:
  - name: Upload logs on failure
    if: failure()
    run: cat logs/error.log

GitHub Actions Context ve Expressions

Workflow dosyasında dinamik değerler kullanabilirsin:

# ${{ ... }} sözdizimi ile expression kullan:
steps:
  - name: Show context
    run: |
      echo "Repository: ${{ github.repository }}"
      echo "Branch: ${{ github.ref_name }}"
      echo "Commit: ${{ github.sha }}"
      echo "Actor: ${{ github.actor }}"
      echo "Event: ${{ github.event_name }}"
      echo "Run ID: ${{ github.run_id }}"
      echo "Run Number: ${{ github.run_number }}"
Sık kullanılan context'ler:
┌─────────────────────────────┬──────────────────────────────┐
│ Expression                  │ Açıklama                      │
├─────────────────────────────┼──────────────────────────────┤
│ github.repository           │ "user/repo-name"              │
│ github.ref                  │ "refs/heads/main"             │
│ github.ref_name             │ "main"                        │
│ github.sha                  │ Commit hash                   │
│ github.actor                │ İşlemi tetikleyen kullanıcı  │
│ github.event_name           │ "push", "pull_request"        │
│ github.workspace            │ Checkout dizini               │
│ runner.os                   │ "Linux", "Windows", "macOS"   │
│ matrix.*                    │ Matrix değişkenleri           │
│ secrets.*                   │ Repo secret'ları              │
│ env.*                       │ Ortam değişkenleri            │
└─────────────────────────────┴──────────────────────────────┘

Koşullu Çalıştırma

steps:
  # Sadece main branch'te çalış:
  - name: Deploy
    if: github.ref == 'refs/heads/main'
    run: npm run deploy

  # Sadece PR'da çalış:
  - name: PR Check
    if: github.event_name == 'pull_request'
    run: npm run lint

  # Önceki step başarısız olsa bile çalış:
  - name: Cleanup
    if: always()
    run: rm -rf temp/

  # Önceki step başarısız olduğunda çalış:
  - name: Notify on failure
    if: failure()
    run: echo "Build failed!"

İlk Gerçek Dünya Workflow'u

Bir React + Node.js projesi için tam bir CI workflow'u:

# .github/workflows/ci.yml
name: CI

on:
  push:
    branches: [main, develop]
  pull_request:
    branches: [main]

# Aynı branch'e yeni push gelirse eski workflow'u iptal et
concurrency:
  group: ci-${{ github.ref }}
  cancel-in-progress: true

jobs:
  quality:
    name: Code Quality
    runs-on: ubuntu-latest

    steps:
      - name: 📥 Checkout
        uses: actions/checkout@v4

      - name: 📦 Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'          # npm cache'i otomatik yönet

      - name: 📚 Install dependencies
        run: npm ci             # ci = clean install (lock file'dan)

      - name: 🔍 Lint
        run: npm run lint

      - name: 🎨 Format check
        run: npx prettier --check .

      - name: 🧪 Unit tests
        run: npm test -- --coverage

      - name: 🏗️ Build
        run: npm run build

      - name: 📊 Upload coverage
        if: github.event_name == 'push' && github.ref == 'refs/heads/main'
        uses: actions/upload-artifact@v4
        with:
          name: coverage-report
          path: coverage/
          retention-days: 30
# Push et ve izle:
$ git add .github/workflows/ci.yml
$ git commit -m "ci: Add comprehensive CI pipeline"
$ git push origin main

# GitHub → Actions → workflow çalışmaya başlar ✅

Yaygın Hatalar

1. Checkout Unutmak

# ❌ En yaygın hata: Kod yok!
steps:
  - run: npm test  # "npm: command not found" veya dosya bulunamaz

# ✅ Her zaman checkout ile başla:
steps:
  - uses: actions/checkout@v4
  - run: npm test

2. npm install yerine npm ci

# ❌ npm install — package-lock.json'ı değiştirebilir
- run: npm install

# ✅ npm ci — package-lock.json'dan birebir yükler (CI için doğru yol)
- run: npm ci

3. Yanlış Dosya Yolu

# ❌ Workflow dosyası yanlış yerde:
.github/workflow/ci.yml      # "workflow" tekil — ÇALIŞMAZ!
github/workflows/ci.yml      # Nokta eksik — ÇALIŞMAZ!

# ✅ Doğru konum:
.github/workflows/ci.yml     # Tam olarak bu yol!

Özet

  • CI/CD, kodun otomatik olarak test edilmesi (CI) ve deploy edilmesi (CD) pratiğidir — elle yapılan hataları ortadan kaldırır

  • GitHub Actions, GitHub'ın yerleşik CI/CD platformudur — repo'nda YAML dosyası oluşturursun, GitHub runner'larda çalıştırır

  • Workflow bir YAML dosyasıdır; Event onu tetikler; Job paralel veya sıralı iş birimleridir; Step her bir adımdır; Runner çalıştırma ortamıdır

  • `uses:` hazır action'ları çalıştırır, `run:` shell komutlarını çalıştırır — çoğu workflow ikisini birlikte kullanır

  • `actions/checkout@v4` neredeyse her workflow'un ilk adımıdır — kodu runner'a indirir

  • Workflow dosyaları `.github/workflows/` dizininde olmalı, YAML'da TAB değil boşluk kullanılmalı, girinti tutarlı olmalıdır


*Bir sonraki derste workflow'ları derinleştireceğiz: Tetikleyiciler, ortam değişkenleri, secret'lar, matrix strategy ve caching!*