CI/CD boru hatları: GitHub Eylemleri, GitLab CI
CI/CD boru hatları: GitHub Eylemleri, GitLab CI
1) CI/CD Görev ve Platform Alanı
CI/CD, depodan üretim ortamlarına değişikliklerin sürekli olarak toplanması, test edilmesi ve teslim edilmesidir. Hedefler:- Sürümlerin hızı ve öngörülebilirliği (kısa teslim süresi).
- Kalite (otomatik testler, statik/dinamik analiz).
- Tedarik zinciri güvenliği (artefakt imzalama, erişim kontrolü).
- Güvenilirlik (kanarya yatakları, hızlı geri dönüş).
- Gözlemlenebilirlik (her aşamada izleme ve metrikler).
Anahtar ilkeler: "Kod olarak boru hattı", değişmez eserler ", bir kez inşa edin - çok çalıştırın", "vardiya-sol güvenlik",'sol ayrıcalık ", deterministik meclisler.
2) Konveyörlerin mimari desenleri
Stage-gate: oluştur, test et, güvenlik, paket, deploy, post-deploy kontrolleri.
Fan-out/Fan-in: Sonuçların birleştirilmesiyle paralel matris derlemeleri (diller/platformlar).
Promosyon: Aynı eser çevre yoluyla teşvik edilir (dev ^ stage ^ prod) ve yeniden birleştirilmez.
Gövde tabanlı + kısa dallar: sürüklenme minimizasyonu, PR/MR üzerinde otomatik kontroller
Yeniden kullanılabilir: Yeniden kullanılabilir iş akışları GitLab: includes/child-pipelines).
GitOps (isteğe bağlı): "montaj've" teslimat "ayrımı (Argo CD/Flux monitör bildirimsel repo ortamları).
3) Tedarik zinciri güvenliği
Tanımlama: Koşucudan buluta OIDC federasyonu (uzun ömürlü anahtarlar olmadan).
Sırlar: merkezi depolama, bağlam kısıtlaması, günlüğe kaydetme yasağı.
Eserlerin/konteynerlerin imzası (cosign/Sigstore), kabul kontrolünde imzanın doğrulanması.
SBOM (CycloneDX/SPDX) ve SCA, SAST/DAST/Konteyner Taraması - "zorunlu kapı".
Politikacılar: IaC/manifestolar için OPA/Conftest,'en son yok ", ayrıcalıklı kapları yasaklıyor.
Koşucuların izolasyonu: Özel bir ağda prod koşucular, giden erişimi genel internetten ayırın.
4) GitHub Eylemleri - Yapı ve Uygulamalar
4. 1 iş akışı yapısı
'.github/workflows/.yml' - триггеры ('on: push, pull_request, schedule, workflow_call').
Standardizasyon için yeniden kullanılabilir iş akışları (linter, SCA, konteyner montajı, dağıtım).
4. 2 Örnek: OIDC ve görüntü imzası ile çok aşamalı boru hattı
yaml name: ci-cd
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
permissions:
id-token: write # для OIDC contents: read packages: write
jobs:
build_test_matrix:
runs-on: ubuntu-latest strategy:
matrix:
node: [18, 20]
os: [ubuntu-latest]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4 with: { node-version: ${{ matrix. node }} }
- name: Cache npm uses: actions/cache@v4 with:
path: ~/.npm key: npm-${{ runner. os }}-${{ matrix. node }}-${{ hashFiles('/package-lock. json') }}
- run: npm ci
- run: npm run lint && npm test -- --ci
docker_build_sign:
runs-on: ubuntu-latest needs: build_test_matrix steps:
- uses: actions/checkout@v4
- name: Login to GHCR uses: docker/login-action@v3 with:
registry: ghcr. io username: ${{ github. actor }}
password: ${{ secrets. GITHUB_TOKEN }}
- name: Build image run:
docker build --pull --no-cache -t ghcr. io/org/app:${{ github. sha }}.
docker push ghcr. io/org/app:${{ github. sha }}
- name: Generate SBOM uses: anchore/syft-action@v0 with:
image: ghcr. io/org/app:${{ github. sha }}
format: cyclonedx-json output-file: sbom. json
- name: Cosign sign (OIDC)
uses: sigstore/cosign-installer@v3
- name: Sign image run:
cosign sign ghcr. io/org/app:${{ github. sha }} \
--yes \
--identity-token $ACTIONS_ID_TOKEN_REQUEST_TOKEN \
--rekor-url https://rekor. sigstore. dev
deploy_stage:
runs-on: ubuntu-latest needs: docker_build_sign environment:
name: stage url: https://stage. example. com steps:
- uses: actions/checkout@v4
- name: Assume cloud role via OIDC uses: aws-actions/configure-aws-credentials@v4 with:
role-to-assume: arn:aws:iam::123456789012:role/github-deployer aws-region: eu-central-1
- name: Helm deploy (canary 10%)
run:
helm upgrade --install app charts/app \
--set image. tag=${{ github. sha }} \
--set canary. enabled=true --set canary. traffic=10
- name: Smoke checks run:./scripts/smoke. sh
promote_prod:
runs-on: ubuntu-latest needs: deploy_stage environment:
name: production url: https://app. example. com concurrency: prod-release steps:
- name: Manual approval gate run: echo "Requires environment approvers in repo settings"
- name: Promote canary → 100% (blue-green)
run:
helm upgrade --install app charts/app \
--set image. tag=${{ github. sha }} \
--set canary. enabled=false
- name: Post-deploy checks & rollback on SLO breach run:./scripts/verify_or_rollback. sh
Anahtarlar:
- 'hatalar' minimize edilir, 'id-token: write' OIDC için etkinleştirilir.
- Onaylayıcıları ve URL'leri olan ortamlar, "eşzamanlılık" yarışa karşı korur.
- Kanarya trafiğinin dahil edilmesi ve SLO üzerinden otomatik geri dönüş.
4. 3 Yeniden kullanılabilir iş akışı (çağrı örneği)
yaml jobs:
security_suite:
uses: org/.github/.github/workflows/security. yml@v1 with:
severity_threshold: high
5) GitLab CI - Yapı ve Uygulamalar
5. 1 Temel yapı
'.gitlab-ci. Kökünde yml '; Anahtar varlıklar: 'aşamalar', 'işler', 'kurallar', 'ihtiyaçlar', 'eserler', 'ortamlar', 'manuel'.
Yeniden kullanım: 'include:' (yerel/uzak desenler), karmaşık monorepolar için alt/üst boru hatları.
5. 2 Örnek: matris, önbellek, imza, ortamlar ve onaylar
yaml stages: [lint, test, build, security, deploy]
variables:
DOCKER_TLS_CERTDIR: "" # docker: dind acceleration
IMAGE_TAG: $CI_COMMIT_SHA
lint:
stage: lint image: node:20 script:
- npm ci
- npm run lint cache:
key: "npm-${CI_COMMIT_REF_SLUG}"
paths: [node_modules/]
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
test:
stage: test image: node:20 parallel:
matrix:
- NODE_VERSION: ["18", "20"]
script:
- nvm install $NODE_VERSION true
- npm ci
- npm test -- --ci artifacts:
when: always reports:
junit: report. xml
build_image:
stage: build image: docker:26. 1 services: [ "docker:26. 1-dind" ]
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:$IMAGE_TAG.
- docker push $CI_REGISTRY_IMAGE:$IMAGE_TAG artifacts:
expire_in: 1 week paths: [ "sbom. json" ]
after_script:
- syft $CI_REGISTRY_IMAGE:$IMAGE_TAG -o cyclonedx-json > sbom. json
security_scans:
stage: security image: alpine:3. 20 script:
- trivy image --exit-code 0 --severity HIGH,CRITICAL $CI_REGISTRY_IMAGE:$IMAGE_TAG rules:
- if: '$CI_COMMIT_BRANCH == "main"'
deploy_stage:
stage: deploy image: bitnami/kubectl:1. 30 environment:
name: stage url: https://stage. example. com on_stop: stop_stage script:
- kubectl set image deploy/app app=$CI_REGISTRY_IMAGE:$IMAGE_TAG -n stage
-./scripts/smoke. sh needs: [build_image, security_scans]
when: manual allow_failure: false
stop_stage:
stage: deploy image: bitnami/kubectl:1. 30 environment:
name: stage action: stop script:
- kubectl rollout undo deploy/app -n stage
deploy_prod:
stage: deploy image: alpine/k8s:1. 30. 2 environment:
name: production url: https://app. example. com rules:
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual allow_failure: false script:
-./scripts/canary_traffic. sh 10
-./scripts/verify_or_rollback. sh
Anahtarlar:
- 'paralel. Matris 'matris gruplarını simüle eder.
- 'artifacts' + test raporları.
- Onaylar için'on _ stop ', manuel'ne zaman: Manuel' olan ortamlar.
- Bir görüntü oluşturmak için DIND (daha iyi - k8s koşucusunda Kaniko/BuildKit).
5. 3 Çocuk boru hatları ve monorepolar için dahil
yaml include:
- local:.gitlab/ci/includes/security. yml
- project: org/platform/pipelines file: /k8s/deploy. yml ref: v1
stages: [prepare, component_a, component_b, deploy]
component_a:
stage: component_a trigger:
include:.gitlab/ci/component_a. yml strategy: depend
component_b:
stage: component_b trigger:
include:.gitlab/ci/component_b. yml strategy: depend
6) Monorepository ve multiservice
Dizin tabanlı sahiplik: CODEOWNERS ve yola göre kapsamlı testler.
Artımlı yapılar: etkilenen paketleri/çizelgeleri tanımlamak; Yol tuşlarına ve kilit dosyalarına göre önbellek.
Dinamik boru hatları: alt boru hatları/' workflow _ call 'yalnızca değişen bileşenler için çalışır.
Sürüm oluşturma: her modül için semver, serbest bırakma aşamasında changelog.
7) Önbelleğe alma ve hızlanma
İçerik adresi önbellekleri (hashFiles/lockfile).
Bağımlılıklar ve eserler için ayrı önbellek.
Önceden sıcak koşucu görüntüleri (araç zincirleri, SDK).
Yerel paket aynaları (npm/pip/maven) ve konteyner kayıt defteri önbelleği.
8) Serbest bırakma stratejileri ve geri alma
Kanarya: yavaş yavaş artan trafik yüzdesi; SLO bozulması sırasında otomatik durdurma.
Mavi-Yeşil: paralel yığınlar, anında geçiş.
Gölge: istemciyi etkilemeden yinelenen istekler.
Özellik bayrakları: bayrak seviyesinde kullanıma sunma, serbest bırakma seviyesinde değil.
Geri alma: tek düğmeli komut dosyalarını temizleyin, artifact sürümü sürüm meta verilerinde saklanır.
9) Altyapı ve GitOps
IaC: Terraform/Ansible/Helm ayrı repolarda yönetilir; Bir kapı gibi kod olarak politika.
GitOps-kontur: Argo CD/Flux ortamların manifestoları ile repo gözlemlemek; Boru hattı yalnızca bir eser oluşturur ve Git'teki sürümleri günceller.
Avantajları: çevre değişikliklerinin net geçmişi, idempotency, Git aracılığıyla standart geri dönüşler.
10) CI/CD'nin gözlenebilirliği
DORA metrikleri: tükenme oranı, taahhütten üretime kadar geçen süre, başarısızlık oranı, MTTR.
Telemetri: iş kuyruklarının zamanı, aşamaların süresi, önbelleğin isabet oranı, lapa lapa testlerin sıklığı.
Güvenlik kayıtları: Tahliyeyi kim başlattı, hangi kapılardan geçildi, hangi istisnalar çıkarıldı.
11) Erişim kontrolü ve onayları
Şube koruması ve zorunlu kontroller.
Çevre onayları: sahne/prod üzerinde ayrı onaylayıcılar listesi.
Manuel adımlar için JIT erişimi, oturum kaydı.
Görevlerin ayrılması: "kod yazar", "onaylar", "serbest bırakır" için farklı roller.
12) Sık hatalar (anti-desenler)
OIDC rolleri yerine repo sırlarında uzun ömürlü bulut anahtarları.
Sahne ve prod için farklı eserlerin birleştirilmesi ('bir kez inşa "ihlali).
'latest' etiketler ve değiştirilebilir görüntüler.
Sırları adım günlüklerinde yayınlama (devre dışı maskeleme).
Üretim dağıtımları için ortak bir kamu koşucusu.
Güvenlik "kapılarının" olmaması (SAST/SCA/Policy) ve dağıtım sonrası kontroller.
13) Uygulama kontrol listesi (0-60 gün)
0-15 gün
Gövde tabanlı, PR/MR kurallarını, zorunlu statik kontrolleri yapılandırın.
OIDC federasyonunu buluta etkinleştir; Minimum 'permissions'.
Post runners: public - CI için, private - CD için.
16-30 gün
SBOM, görüntü imzası ekleyin; Küme - İmza Doğrulaması.
Kanarya/mavi-yeşil girin; SLO tarafından otomatik geri alma.
Bağımlılıkların ve eserlerin önbelleği, önceden sıcak görüntüler.
31-60 gün
Ayrı montaj ve teslimat (GitOps), kod olarak ilke kapısı.
Boru hatlarının bozulması için DORA metrikleri ve uyarıları oluşturun.
Tüm hizmetler için şablon boru hatları (yeniden kullanılabilir/alt).
14) Pratik güvenilirlik ipuçları
Küçük, hızlı boru hatlarını destekleyin (PR sinyalinden 10-12 dakika önce).
Lapa lapa testleri öldür: karantina etiketleri + paralel düzeltme.
CI eserlerini karıştırmayın ve eserleri serbest bırakmayın; depolama meta verileri (commit, time, SBOM, signatures).
Geliştiricilere boru hattı adımlarıyla aynı yerel komut dosyaları verin (dev-prod paritesi).
15) Yeniden kullanım için şablonlar
15. 1 GitHub Eylemleri - güvenlik yeniden kullanılabilir iş akışı (basitleştirilmiş)
yaml name: security-suite on:
workflow_call:
inputs:
severity_threshold:
type: string required: false default: high jobs:
sast_sca:
runs-on: ubuntu-latest steps:
- uses: actions/checkout@v4
- run:./sec/sast. sh --threshold ${{ inputs. severity_threshold }}
- run:./sec/sca. sh --format cyclonedx-json --out sbom. json artifacts: # if using actions/upload-artifact
- sbom. json
15. 2 GitLab - şablon dağıtımını içerir (basitleştirilmiştir)
yaml
.deployment_template:
image: alpine/k8s:1. 30 script:
- helm upgrade --install $APP charts/$APP --set image. tag=$IMAGE_TAG rules:
- if: '$CI_COMMIT_BRANCH == "main"'
16) Sonuç
GitHub Actions ve GitLab CI, hızlı ve güvenli bir kod - prod döngüsü için olgun mekanizmalar sağlar. Başarının anahtarı standardizasyon ve güvenliktir: Anahtarlar yerine OIDC, imza ve SBOM, kalite kapıları, promosyonlu tek bir eser, GitOps teslimatı ve DORA aracılığıyla gözlemlenebilirlik. Boru hatlarını bir ürün olarak inşa edin: Ölçün, basitleştirin, hızlandırın - ve sürümler bir olay değil, bir angarya haline gelecektir.