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:
Şasi gelir → Robot kollar kapıları takar
Motor takılır → Otomatik test: çalışıyor mu?
Boya yapılır → Kalite kontrol kamerası: çizik var mı?
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ı:
Sık merge et — Uzun süre ayrı çalışma
Her merge otomatik test edilsin — İnsan güvenilmez, makine güvenilir
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 deployNeden 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_dispatch3. 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 testHer 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-latesther 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.ymlAdı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 buildAdım 3: Push Et ve İzle
$ git add .github/workflows/ci.yml
$ git commit -m "ci: Add CI pipeline"
$ git push origin mainArtı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
@v4yerine commit SHA kullanmak daha güvenlidir. Çünkü bir action'ın maintainer'ıv4tag'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: trueKarar:
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 yazPratik Ö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 buildBu 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 testBu 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ırHata 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.logGitHub 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 test2. 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 ci3. 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!*
AI Asistan
Sorularını yanıtlamaya hazır