GitHub Actions Marketplace Aksiyonlarını Kullanma Rehberi
GitHub Actions ile CI/CD pipeline kuruyorsunuz ve her şeyi sıfırdan yazmak zorunda mıyım diye düşünüyorsunuz? İşte tam burada Marketplace devreye giriyor. GitHub Actions Marketplace, binlerce hazır action barındıran dev bir ekosistem ve bu ekosistemi doğru kullanmak pipeline geliştirme sürecinizi dramatik biçimde hızlandırıyor. Bu yazıda Marketplace action’larını nasıl bulacağınızı, güvenli şekilde nasıl kullanacağınızı ve gerçek deployment senaryolarında nasıl entegre edeceğinizi adım adım ele alacağız.
GitHub Actions Marketplace Nedir?
Marketplace, GitHub tarafından barındırılan ve topluluk ya da resmi organizasyonlar tarafından geliştirilmiş action’ların bir kataloğudur. Temel olarak üç tip action bulursunuz:
- Docker container action: İzole bir ortamda çalışır, daha yavaş başlar ama tutarlıdır
- JavaScript action: Node.js üzerinde çalışır, hızlıdır ve tüm runner’larda çalışır
- Composite action: Birden fazla adımı tek bir action’da birleştirir
Bir action kullanmak için yapmanız gereken tek şey uses: direktifini workflow dosyanıza eklemek. Ancak “tek şey” dediğimde bunu hafife almayın, çünkü hangi versiyonu kullandığınız, action’ın güvenilirliği ve gizli bilgilerin nasıl yönetildiği kritik öneme sahip.
Action Versiyonlama ve Güvenlik
Marketplace’ten action kullanırken versiyonu her zaman sabitleyin. Bunu üç farklı şekilde yapabilirsiniz:
# Tag ile (önerilen - semantik versiyonlama)
uses: actions/checkout@v4
# Commit SHA ile (en güvenli yöntem)
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
# Branch ile (tehlikeli - production'da kullanmayın)
uses: actions/checkout@main
Commit SHA kullanımı en güvenli yöntemdir çünkü tag’lar değiştirilebilir. Bir saldırgan popüler bir action’ın maintainer’ını ele geçirirse tag’ı kötü amaçlı koda yönlendirebilir. SHA sabitlediğinizde bu riske karşı korunursunuz.
Hangi action’lara güveneceğinizi belirlerken şu kriterlere bakın:
- actions/ veya github/ organizasyonuna ait action’lar GitHub’ın resmi action’larıdır
- Yıldız sayısı ve fork sayısı yüksek, aktif maintenance olan projeler tercih edin
- Action’ın kaynak kodunu mutlaka inceleyin, özellikle secrets kullanıyorsa
- “Verified creator” rozetine sahip action’ları önceliklendirin
Temel Marketplace Action’ları
actions/checkout
Her workflow’un neredeyse başına koyacağınız ilk action bu:
name: Build Pipeline
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Kodu checkout et
uses: actions/checkout@v4
with:
fetch-depth: 0 # Tüm git geçmişini al
submodules: recursive # Submodule'leri de çek
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0 parametresi özellikle önemli. Varsayılan değer 1 olduğunda sadece son commit gelir, bu da bazı araçların (SonarQube gibi) düzgün çalışmamasına yol açar.
actions/setup-node ve Dil Setup Action’ları
Uygulama dağıtımlarında runtime ortamını ayarlamak için setup action’ları kullanırsınız:
jobs:
deploy-nodejs-app:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Node.js ortamını hazırla
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm' # npm cache'ini etkinleştir
cache-dependency-path: package-lock.json
- name: Bağımlılıkları yükle
run: npm ci
- name: Build al
run: npm run build
- name: Testleri çalıştır
run: npm test
cache: 'npm' parametresi çok değerli, özellikle büyük projelerde build sürelerini ciddi ölçüde kısaltır. Benzer şekilde Python için actions/setup-python, Java için actions/setup-java bulunur.
Gerçek Dünya Senaryosu 1: Node.js Uygulamasını AWS EC2’ye Deploy Etmek
Diyelim ki bir Node.js REST API’niz var ve bunu AWS EC2’ye SSH üzerinden deploy etmek istiyorsunuz. Bu senaryoda birkaç Marketplace action’ı bir arada kullanacağız:
name: Production Deploy
on:
push:
branches: [main]
env:
APP_DIR: /var/www/myapi
PM2_APP_NAME: myapi
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- run: npm ci
- run: npm test
deploy:
needs: test
runs-on: ubuntu-latest
environment: production
steps:
- uses: actions/checkout@v4
- name: Node.js kur
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'npm'
- name: Production build
run: |
npm ci --production
npm run build
- name: Artifact oluştur
run: |
tar -czf deploy.tar.gz
dist/
node_modules/
package.json
ecosystem.config.js
- name: Sunucuya dosyaları kopyala
uses: appleboy/[email protected]
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
source: deploy.tar.gz
target: /tmp/
- name: Deploy scripti çalıştır
uses: appleboy/[email protected]
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USER }}
key: ${{ secrets.EC2_SSH_KEY }}
script: |
set -e
cd ${{ env.APP_DIR }}
cp -r . ./backup_$(date +%Y%m%d_%H%M%S)
tar -xzf /tmp/deploy.tar.gz -C ${{ env.APP_DIR }}
pm2 reload ${{ env.PM2_APP_NAME }} --update-env
pm2 save
echo "Deploy tamamlandi!"
Bu workflow’da appleboy/scp-action ve appleboy/ssh-action kullandık. Bu action’lar topluluk tarafından çok yaygın kullanılıyor ve güvenilir kabul ediliyor ancak her zaman SHA sabitlemeyi düşünün.
actions/cache ile Build Sürelerini Optimize Etmek
jobs:
build-java-app:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Java 17 kur
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
cache: 'maven'
- name: Maven bağımlılıklarını cache'le
uses: actions/cache@v4
with:
path: ~/.m2/repository
key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }}
restore-keys: |
${{ runner.os }}-maven-
- name: Build ve test
run: mvn clean package -DskipTests=false
- name: JAR artifact'ı sakla
uses: actions/upload-artifact@v4
with:
name: app-jar
path: target/*.jar
retention-days: 7
hashFiles('**/pom.xml') ile pom.xml değiştiğinde cache otomatik geçersiz olur. Bu pattern Docker layer caching mantığına benzer ve çok etkili.
Gerçek Dünya Senaryosu 2: Docker Image Build ve Registry’e Push
Containerized uygulamalar için en yaygın kullanılan pattern budur:
name: Docker Build ve Deploy
on:
push:
branches: [main]
tags: ['v*']
jobs:
docker-build-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- uses: actions/checkout@v4
- name: Docker meta bilgileri oluştur
id: meta
uses: docker/metadata-action@v5
with:
images: |
ghcr.io/${{ github.repository }}
mycompany/myapp
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=ref,event=branch
type=sha,prefix=sha-
- name: QEMU kur (multi-platform için)
uses: docker/setup-qemu-action@v3
- name: Docker Buildx kur
uses: docker/setup-buildx-action@v3
- name: GitHub Container Registry'e giriş yap
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Docker Hub'a giriş yap
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build ve push
uses: docker/build-push-action@v5
with:
context: .
platforms: linux/amd64,linux/arm64
push: ${{ github.event_name != 'pull_request' }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
Burada dikkat çekici birkaç nokta var. docker/metadata-action otomatik olarak tag stratejisi yönetiyor. type=sha ile her commit’in SHA’sı tag olarak ekleniyor, bu da rollback yaparken büyük kolaylık sağlıyor. cache-from: type=gha ise GitHub Actions cache’ini Docker layer cache için kullanıyor.
Bildirim ve Entegrasyon Action’ları
Pipeline sonuçlarını takım üyelerine bildirmek için Slack veya diğer mesajlaşma araçları entegrasyonları çok işe yarıyor:
- name: Slack bildirimi gönder
if: always()
uses: slackapi/[email protected]
with:
payload: |
{
"text": "Deploy Durumu: ${{ job.status }}",
"blocks": [
{
"type": "section",
"text": {
"type": "mrkdwn",
"text": "*${{ github.repository }}* - Deploy ${{ job.status == 'success' && 'basarili' || 'basarisiz' }}n*Branch:* ${{ github.ref_name }}n*Commit:* ${{ github.sha }}n*Tetikleyen:* ${{ github.actor }}"
}
}
]
}
env:
SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_WEBHOOK_TYPE: INCOMING_WEBHOOK
if: always() koşulu job başarısız olsa bile bildirimin gönderilmesini sağlar. Production ortamlarında bu özellikle önemli.
Güvenlik Tarama Action’ları
Modern bir CI/CD pipeline güvenlik taramaları içermeli. Bunu ihmal etmek ciddi açıklara yol açabilir:
security-scan:
runs-on: ubuntu-latest
permissions:
security-events: write
contents: read
steps:
- uses: actions/checkout@v4
- name: Trivy ile container tarama
uses: aquasecurity/[email protected]
with:
image-ref: ghcr.io/${{ github.repository }}:latest
format: sarif
output: trivy-results.sarif
severity: CRITICAL,HIGH
exit-code: '1'
- name: Sonuçları GitHub Security'e yükle
uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: trivy-results.sarif
- name: Dependency review
uses: actions/dependency-review-action@v4
with:
fail-on-severity: high
exit-code: '1' parametresi kritik güvenlik açığı bulunduğunda pipeline’ı durduruyor. Bu sayede güvenlik açıklı bir image asla production’a çıkmıyor.
Environment ve Secrets Yönetimi
Marketplace action’ları kullanırken secrets yönetimi kritik öneme sahip. Birkaç önemli nokta:
- GITHUB_TOKEN otomatik olarak oluşturulur ve çoğu işlem için yeterlidir
- Hassas bilgileri repository secrets veya environment secrets olarak saklayın
- Action’lara minimum gerekli permission verin
jobs:
deploy:
runs-on: ubuntu-latest
environment: production
permissions:
contents: read # Sadece okuma
packages: write # Package registry için
id-token: write # OIDC token için (AWS, Azure)
steps:
- name: AWS kimlik doğrulama (OIDC ile - en güvenli yöntem)
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam::123456789:role/GitHubActionsRole
aws-region: eu-west-1
- name: ECR'e giriş yap
uses: aws-actions/amazon-ecr-login@v2
- name: ECS service'i güncelle
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
with:
task-definition: task-definition.json
service: my-service
cluster: my-cluster
wait-for-service-stability: true
OIDC tabanlı authentication statik access key kullanmaktan çok daha güvenlidir. aws-actions/configure-aws-credentials action’ı bu süreci kolaylaştırıyor. Access key’i secrets’a kaydetmek yerine IAM role assume ediyorsunuz, bu hem daha güvenli hem de key rotasyonu derdi ortadan kalkıyor.
Reusable Workflows ile Action Kompozisyonu
Birden fazla projede aynı deployment pattern kullanıyorsanız reusable workflow’lar hayat kurtarır:
# .github/workflows/reusable-deploy.yml
name: Reusable Deploy Workflow
on:
workflow_call:
inputs:
environment:
required: true
type: string
image-tag:
required: true
type: string
secrets:
EC2_SSH_KEY:
required: true
EC2_HOST:
required: true
jobs:
deploy:
runs-on: ubuntu-latest
environment: ${{ inputs.environment }}
steps:
- uses: actions/checkout@v4
- name: Deploy to server
uses: appleboy/[email protected]
with:
host: ${{ secrets.EC2_HOST }}
username: deploy
key: ${{ secrets.EC2_SSH_KEY }}
script: |
docker pull myapp:${{ inputs.image-tag }}
docker stop myapp || true
docker run -d --name myapp
--restart unless-stopped
-p 3000:3000
myapp:${{ inputs.image-tag }}
Bu reusable workflow’u ana workflow’dan şöyle çağırırsınız:
# .github/workflows/main.yml
jobs:
deploy-staging:
uses: ./.github/workflows/reusable-deploy.yml
with:
environment: staging
image-tag: ${{ needs.build.outputs.image-tag }}
secrets:
EC2_SSH_KEY: ${{ secrets.STAGING_SSH_KEY }}
EC2_HOST: ${{ secrets.STAGING_HOST }}
Action Yazarken Dikkat Edilmesi Gerekenler
Mevcut action’lar ihtiyacınızı karşılamıyorsa kendiniz yazabilirsiniz. Composite action için basit bir örnek:
# .github/actions/notify-deploy/action.yml
name: 'Deploy Bildirim'
description: 'Deploy durumunu bildirir'
inputs:
status:
description: 'Deploy durumu'
required: true
environment:
description: 'Hedef ortam'
required: true
slack-webhook:
description: 'Slack webhook URL'
required: true
runs:
using: composite
steps:
- name: Slack mesajı gönder
shell: bash
run: |
STATUS_EMOJI=$([[ "${{ inputs.status }}" == "success" ]] && echo "✅" || echo "❌")
curl -X POST "${{ inputs.slack-webhook }}"
-H 'Content-type: application/json'
-d "{"text": "${STATUS_EMOJI} ${{ inputs.environment }} deploy: ${{ inputs.status }}"}"
Yaygın Hatalar ve Çözümleri
Marketplace action kullanırken sık karşılaşılan sorunlar şunlar:
- Versiyon pin’lememek:
@mainveya@latestkullanmak beklenmedik breaking change’lere yol açar - Fazla permission vermek:
permissions: write-allkoymak yerine sadece gerekli izinleri verin - Secrets’ı log’a basmak:
echo $SECRETyazmayın, GitHub maskeliyor ama iyi alışkanlık değil - Artifact retention süresini atlamak:
retention-daysbelirtmezseniz varsayılan 90 gün ve storage doluyor - Cache key çakışması: Farklı branch’ler aynı cache key kullanınca beklenmedik davranışlar oluşabilir
Marketplace Action Güncellemelerini Takip Etmek
Dependabot’u aktifleştirerek action güncelleme PR’larını otomatik alabilirsiniz:
# .github/dependabot.yml
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
groups:
actions:
patterns:
- "actions/*"
- "docker/*"
Bu yapılandırma her hafta action güncellemelerini kontrol edip PR açıyor. Özellikle güvenlik yamalarının hızla uygulanması açısından değerli.
Sonuç
GitHub Actions Marketplace, CI/CD pipeline’larınızı sıfırdan inşa etmek yerine hazır, test edilmiş blokları bir araya getirerek hızlıca kurmanızı sağlıyor. Ancak bu kolaylık beraberinde sorumluluk getiriyor. Her action’ı körü körüne kullanmak yerine kaynak kodunu inceleyin, commit SHA ile sabitleyin ve minimum gerekli izinleri verin.
Pratikte şu yaklaşımı benimseyin: Resmi action’lar için tag sabitleme yeterlidir, üçüncü taraf action’lar için SHA sabitlemeyi tercih edin. OIDC tabanlı cloud authentication’a geçin, statik key’lerden uzak durun. Reusable workflow’larla tekrar eden pattern’leri merkezileştirin.
Marketplace bu kadar zengin bir ekosisteme sahipken tekerleği yeniden icat etmek sadece zaman kaybı. Enerjiinizi uygulama geliştirmeye harcayın, pipeline altyapısını ise topluluk tarafından test edilmiş action’lar üzerine kurun. Güvenli ve hızlı pipeline’lar dilerim.
