Docs

Dokümantasyon / Pipeline'lar

Pipeline tanımı

ejo.yaml şeması; step türleri, depends_on, matrix, if, paths, cache, artifact'lar, çıktılar ve manuel run girdileri.

Pipeline nerede tanımlanır?#

Bir pipeline'ı üç yerden tanımlayabilirsiniz; üçü de aynı şemayı kullanır:

  • Konsolda, Delivery > Pipeline'lar altında.
  • Repo'da bir dosyada, genellikle ejo.yaml. Binding'in Pipeline kaynağı alanında Repo'dan — ejo.yaml source of truth seçildiğinde EJO dosyayı bağlı branch'ten okur ve dosya değiştikçe pipeline'ı günceller.
  • .ejo dosyasının pipeline: bloğunda. Bkz. .ejo dosyası.

Şema katıdır: bilinmeyen bir anahtar (usees: gibi bir yazım hatası) hata verir.

İlk pipeline#

name: web
description: Build, tara ve Kubernetes'e deploy et
steps:
  - name: Clone
    kind: GIT_CLONE
  - name: Build
    kind: KANIKO_BUILD
    config:
      dockerfile_path: Dockerfile
      registry_id: "{{.REGISTRY_ID}}"
    depends_on: [0]
  - name: Testler
    kind: SHELL
    image: node:20-alpine
    config:
      command: npm ci && npm test
    depends_on: [0]
  - name: Deploy
    kind: K8S_DEPLOY
    config:
      image: "{{.ImageTag}}"
      container_port: 3000
      wait_ready: true
      wait_seconds: 120
    depends_on: [1, 2]

Üst düzey alanlar#

Alan Zorunlu Açıklama
name Evet Pipeline'ın adı.
description Hayır Açıklama.
steps Evet En az bir step.
inputs Hayır Manuel run'da sorulacak değerler. Aşağıdaki "Manuel run girdileri" bölümüne bakın.

Step alanları#

Alan Açıklama
name Zorunlu. Step'in adı.
kind Step türü, örneğin SHELL, DOCKER_BUILD, K8S_DEPLOY. uses ile birlikte kullanılamaz.
config Step türüne özel ayarlar. Değerler {{.DEGISKEN}} şablonları içerebilir.
uses Bir step pack step'i: <pack>/<step>@<versiyon>. Bkz. Step pack'ler.
with uses step'inin girdileri.
image Yalnızca SHELL step'lerinde: komutu bu container image'ında çalıştırır.
depends_on Bu step'in beklediği step'lerin sıra numaraları (0'dan başlar).
continue_on_failure true ise bu step fail olsa da pipeline devam eder.
matrix Step'i eksenlerin her kombinasyonu için çoğaltır.
if Koşul; true olarak değerlenirse step çalışır.
paths Değişen dosyalara göre filtre (glob listesi).
runs_on Step'i yalnızca bu label'lara sahip agent'ların çalıştırabilmesini sağlar.
cache Run'lar arasında saklanacak dizinler.
artifacts Step'in yükleyeceği dosyalar.
needs_artifacts Step başlamadan indirilecek artifact'lar.
id_tokens Yalnızca SHELL step'lerinde: EJO OIDC token'ları. Bkz. Secret'lar ve değişkenler.
test_reports Step'in yazdığı JUnit raporları (glob listesi).
parallelism Step'i 2-16 parçaya (shard) böler.
split parallelism ile test dosyalarını geçmiş sürelerine göre dağıtır: split.files.

Sıra ve bağımlılıklar#

  • depends_on hiç yazılmazsa step bir önceki step'i bekler (sıralı akış).
  • depends_on: [] step'in hemen başlayabileceği anlamına gelir.
  • depends_on: [1, 2] step'in 1 ve 2 numaralı step'lerin ikisini de beklemesini sağlar; bağımsız step'ler paralel çalışır.
  • Döngüler ve kendine bağımlılık reddedilir.

Matrix#

- name: Test
  kind: SHELL
  image: python:3.12-slim
  matrix:
    suite: [unit, integration]
    db: [postgres, sqlite]
  config:
    command: pytest tests/{{.MatrixSuite}} --db={{.MatrixDb}}

Her kombinasyon ayrı bir step olarak çalışır. Eksen değerleri step'te {{.MatrixSuite}} ve {{.matrix_suite}} biçiminde kullanılabilir. Bir step en fazla 32 kombinasyona açılabilir. Matrix'li bir step'e bağımlı olan step, tüm kombinasyonların bitmesini bekler.

Koşullar: if ve paths#

- name: Production'a deploy
  kind: K8S_DEPLOY
  if: '{{eq .Branch "main"}}'
  paths: ["src/**", "Dockerfile"]
  • if bir şablondur; sonuç true, 1 veya yes ise step çalışır, false, 0, no veya boş ise atlanır. Başka bir sonuç hata verir.
  • paths GitHub Actions tarzı glob'lardır: * ve ? dizin sınırını geçmez, ** geçer. Değişen dosyalardan biri eşleşirse step çalışır. Değişen dosya listesi bilinmeyen run'larda (manuel, schedule, tag) step her zaman çalışır. EJO değişen dosya listesini yalnızca GitHub olaylarından alır; GitLab ve Azure DevOps repo'larında paths filtreli step'ler her zaman çalışır.

Cache ve artifact'lar#

- name: Build
  kind: SHELL
  image: node:20-alpine
  config:
    command: npm ci && npm run build
  cache:
    key: npm
    key_files: [package-lock.json]
    paths: [node_modules]
  artifacts:
    name: dist
    paths: [dist]
    when: on_success
    expire_in: 30d
Alan Açıklama
cache.key, cache.key_files Cache anahtarı ve anahtara eklenecek dosyalar.
cache.paths Saklanacak dizinler. Çalışma dizini içinde olmalıdır; ~/ ile başlayan yollar reddedilir.
cache.restore_keys Tam eşleşme yoksa denenecek anahtarlar.
artifacts.name, artifacts.paths Yüklenecek artifact'ın adı ve dosyaları.
artifacts.when on_success (varsayılan) veya always (step fail olsa da yükle).
artifacts.expire_in Artifact'ın ne kadar tutulacağı: sayı ve birim (30d, 2w, 12h, 90m) ya da never. Boşsa organizasyonun artifact retention'ı geçerlidir (varsayılan: global artifacts.retention_days, 14). never zamana bağlı süre dolumu olmaması demektir; artifact'ı pin'lemez (yalnızca admin pin'i korur), dolayısıyla organizasyonun artifact quota'sı onu yine silebilir. Pipeline kaydedilirken doğrulanır.
needs_artifacts[].name İndirilecek artifact'ın adı. Varsayılan kaynak, aynı binding'de aynı commit için başarılı olmuş en son run'dır.
needs_artifacts[].from_step Artifact'ı üreten step'in adı (isteğe bağlı).
needs_artifacts[].source, artifact_id artifact_id ile belirli bir artifact'ı seçer.

Cache'ler agent'ın diskinde ve ayrıca master'da (remote cache) tutulur; aynı repository binding'in tüm agent'ları paylaşır. Restore önce agent'ın diskine, sonra master'a bakar. Organizasyonun cache quota'sı (varsayılan 5 GB) aşılınca en uzun süredir hit almayan girdi önce silinir; 14 gün hit almayan girdiler de silinir. pull_request run'ları branch cache'lerini okuyabilir ama yalnızca kendi pr-<numara>- key'lerine yazar; branch run'ları bu key'leri hiç restore etmez. Bir pull_request run'ı başka bir pull request'in key'lerini de okumaz; cache key ya da restore_keys girdisi pr- ile başlayamaz (pipeline kaydedilirken reddedilir, key içindeki template'ler de parse edilebilmelidir). Bir repository'nin girdilerini Cache'ler sekmesinden yönetebilirsiniz.

Artifact'lar expire_in süresini (ya da retention varsayılanını) aşınca saatlik sweeper tarafından silinir. Üç grup asla silinmez: pin'lenmiş artifact'lar (deployment'ın artifact listesindeki pin butonu), her repository binding ve pipeline için artifact'ı olan son başarılı run'ın artifact'ları ve şu anda bir production environment'a deploy edilmiş run'ın artifact'ları (orada en son başarılı run ile onun promote ettiği build). Son iki grup listede "kept" rozeti taşır. Süre dolumundan sonra sweeper ayrıca organizasyonun artifact quota'sını (Settings > Organization > Storage; boş = sınırsız, self-hosted'da varsayılan) uygular: korunmayan en eski artifact'lar önce silinir. Quota için yalnızca bitmiş run'ların en az bir saatlik artifact'ları silinir; korunan, yeni ya da bitmemiş artifact'lar toplamı quota'nın üstünde tutabilir ve yalnızca böyle veri kaldığında master warning loglar.

Image build cache#

DOCKER_BUILD ve KANIKO_BUILD, image layer'larını image'ın push edildiği registry'de tutabilir; böylece temiz bir agent'ta ya da yeni bir Kaniko pod'unda build bu layer'ları yeniden kullanır.

- name: Build image
  kind: KANIKO_BUILD
  config:
    registry_id: "..."
    cache: registry          # off | registry (true da registry demektir)
    cache_repo: registry.example.com/team/app/cache   # opsiyonel
    cache_ttl: 168h          # opsiyonel, sadece KANIKO_BUILD
Anahtar Açıklama
cache registry registry layer cache'i açar; off (veya hiç yazmamak) bugünkü davranışı korur. Blueprint'ler ve konsoldan eklenen yeni step'ler registry ile başlar; mevcut step'ler değişmez.
cache_repo Layer'ların gideceği yer. Image ile aynı registry'de olmalıdır, çünkü step'in yalnızca o registry için credential'ı vardır (image'ı ve cache'i aynı credential push eder). KANIKO_BUILD varsayılanı: <image repository>/cache. DOCKER_BUILD varsayılanı: <image repository>:buildcache.
cache_ttl Sadece KANIKO_BUILD: cache'lenmiş layer'ın ne kadar süre yeniden kullanılacağı; süre (168h) veya gün (7d). Varsayılan 168h.

KANIKO_BUILD, Kaniko'ya --cache=true --cache-repo=... --cache-ttl=... verir. DOCKER_BUILD, docker buildx build --cache-from type=registry,ref=... --cache-to type=registry,ref=...,mode=max --load kullanır. registry_id yoksa cache'i koyacak yer yoktur; docker buildx yoksa ya da agent'ın builder'ı registry cache export edemiyorsa (varsayılan docker driver'ı containerd image store ya da bir docker-container builder ister), step log'a warning yazar ve Docker daemon'ın kendi layer cache'i ile build eder. cache anahtarı yoksa DOCKER_BUILD her zaman böyle build eder.

Image cache pull_request run'ları için salt okunurdur: branch build'lerinin layer'larını yeniden kullanırlar ama hiç layer yazmazlar (KANIKO_BUILD --no-push-cache ekler, DOCKER_BUILD --cache-to'yu bırakır); böylece güvenilmeyen kod, branch build'inin güveneceği layer'lar yerleştiremez. Pipeline kaydedilirken cache, cache_ttl ve cache_repo doğrulanır.

Registry'ye özel notlar: Amazon ECR'da cache repository'sinin var olması gerekir (Kaniko için <image repository>/cache oluşturun ya da cache_repo verin); BuildKit için EJO, ECR host'larında cache export'a image-manifest=true,oci-mediatypes=true ekler. Cache layer'ları image ile aynı repository namespace'ine yazılır, yani image'ı push edebilen her credential cache'i de push edebilir. Kaniko, push kabul eden her registry ile çalışır; cache repository'si her yeni layer ile büyür, storage'a göre faturalayan registry'lerde registry'nin kendi lifecycle policy'sini tanımlayın.

Step türleri#

En sık kullanılan config anahtarları aşağıdadır. Tüm alanları konsoldaki step formunda açıklamalarıyla görebilirsiniz.

Tür Ne yapar Sık kullanılan config anahtarları
GIT_CLONE Repo'yu run'ın commit'inde clone eder. depth (varsayılan 1)
SHELL Bir shell komutu çalıştırır. command, working_dir, outputs; step düzeyinde image
DOCKER_BUILD Agent host'unda Docker ile image build eder; registry_id ile push eder. dockerfile_path, context_path, image_tag, build_args, registry_id, repository, cache, cache_repo
PODMAN_BUILD Agent host'unda podman build ile (Docker daemon olmadan) image build eder; registry_id ile push eder. Agent host'unda podman gerekir; Kubernetes agent'ında kullanılamaz (KANIKO_BUILD kullanın). dockerfile_path, context_path, image_tag, build_args, target, platform, format (oci ya da docker), layers, registry_id, repository, cache, cache_repo, cache_ttl. platform tek bir os/arch[/variant] olmalı; build_args değerleri düz skaler olmalı ve secret içermemeli.
TERRAFORM hashicorp/terraform image'ında, pipeline'ın OIDC cloud kimliğiyle terraform çalıştırır. plan, plan dosyasını ve bir özeti saklar (run sayfasında ve approval kartında görünür, PR'a yorum olarak yazılır); apply aynı deployment'ın plan'ını uygular; destroy için allow_destroy ve approval isteyen bir environment gerekir. Docker agent ister (terraform capability). command (plan, apply, destroy), working_dir, workspace, vars, var_files, backend_config, version, allow_destroy, auto_plan, lock_timeout
KANIKO_BUILD Kubernetes'te Docker daemon'ı olmadan build edip push eder. dockerfile_path, image_tag, registry_id, repository, namespace, cache, cache_repo, cache_ttl
DOCKER_RUN Docker host'unda container çalıştırır (önceki container'ı değiştirir). container_name, image_tag, ports, env, wait_ready, healthcheck_url
DOCKER_COMPOSE_UP Repo'daki compose dosyasını ayağa kaldırır. compose_file, project_name
DOCKER_STOP Bir container'ı durdurup siler (PR teardown). container_name
K8S_DEPLOY Bir Deployment ve Service oluşturur veya günceller. image, name, namespace, replicas, container_port, env, wait_ready, wait_seconds
K8S_APPLY Verdiğiniz manifest'i kubectl apply ile uygular. manifest, namespace
K8S_DELETE Deployment ve Service'i siler (PR teardown). name, namespace
KUSTOMIZE_DEPLOY Repo'daki kustomization'ı image'ı değiştirerek uygular ya da GitOps repo'suna yazar. path, image_name, image, strategy, gitops_repo_url, gitops_branch
HELM_UPGRADE helm upgrade --install çalıştırır. chart, release, namespace, values_file, set, image_set, wait
HELM_UNINSTALL Bir Helm release'ini kaldırır. release, namespace
TRIVY_SCAN Image'ı Trivy ile tarar (Kubernetes Job). image_ref, severity (varsayılan HIGH,CRITICAL), exit_code, ignore_unfixed
SBOM_GENERATE CycloneDX SBOM üretir (Kubernetes Job). image_ref
COSIGN_SIGN Image'ı cosign ile imzalar (Kubernetes Job). image_ref, tlog_upload
SONAR_SCAN SonarQube analizi çalıştırır. project_key, sources, quality_gate_wait
ARGOCD_SYNC Bir Argo CD Application'ının sync olmasını bekler veya başlatır. instance, application, mode, revision, timeout
CLOUD_RUN_DEPLOY Image'ı pipeline'ın OIDC kimliğiyle (saklanan anahtar yok) gcloud run deploy ile Google Cloud Run'a deploy eder. İsteğe bağlı revision traffic canary. service, region, image, env, secrets (Secret Manager referansları), cpu, memory, min_instances, max_instances, concurrency, port, allow_unauthenticated, service_account, strategy, cli_image, cloud
ECS_DEPLOY Tek bir container'ın image'ı değiştirilmiş yeni task definition revision'ı kaydeder, Amazon ECS service'ini günceller ve services-stable bekler; başarısızlıkta önceki task definition'a döner. cluster, service, container_name, image, env, wait_seconds, circuit_breaker, circuit_breaker_rollback, desired_count, cli_image, cloud
AZURE_CONTAINERAPP_DEPLOY Azure Container App image'ını az containerapp update ile günceller. İsteğe bağlı revision weight canary. name, resource_group, image, env, secret_env, cpu, memory, min_replicas, max_replicas, wait_seconds, strategy, cli_image, cloud
LAMBDA_DEPLOY Bir AWS Lambda function'ını container image'dan veya zip'ten (zip_file) günceller, version yayınlar ve alias'ı ona taşır. İsteğe bağlı alias routing weight canary. function_name, region, alias, image, zip_file, env, memory_size, function_timeout, strategy, cli_image, cloud
CLOUD_FUNCTIONS_DEPLOY Cloud Functions 2nd gen (HTTP) function'ını bir source dizininden gcloud functions deploy --gen2 ile deploy eder. İsteğe bağlı Cloud Run revision traffic canary. function_name, region, runtime, entry_point, source_dir, env, secrets, memory, min_instances, max_instances, function_timeout, allow_unauthenticated, service_account, strategy, cli_image, cloud

Not: DOCKER_BUILD, PODMAN_BUILD ve KANIKO_BUILD push için bir registry ister. Registry'leri Altyapı > Registry'ler altında tanımlayın ve step'te registry_id ile seçin. Otomatik SBOM ve tarama da yalnızca registry'ye push edilen image'lar için çalışır.

Değişkenler ve şablonlar#

config değerlerinde {{.Ad}} şablonları kullanabilirsiniz. Agent bunları run başladığında doldurur.

Değişken Örnek Açıklama
Branch main Deploy edilen branch.
CommitSHA 9fceb02d0ae5… Tam commit hash'i.
ShortSHA 9fceb02 Commit hash'inin ilk karakterleri.
Event commit Run'ı başlatan olay.
IsPR false Run bir pull request tarafından başlatıldıysa true.
RepoFullName acme/web Sahibiyle birlikte repo adı.
RepoSlug acme-web Kaynak adlarında kullanılabilecek repo adı.

Bunlara ek olarak:

  • Değişkenleriniz: Altyapı > Değişkenler altında tanımladığınız her anahtar {{.ANAHTAR}} olarak kullanılabilir. Bkz. Secret'lar ve değişkenler.
  • Önceki step'lerin çıktıları: Örneğin build step'inden sonra {{.ImageTag}} ve {{.ImageDigest}}, GIT_CLONE'dan sonra {{.WorkDir}}.

Step çıktıları#

Her step türü belirli çıktılar üretir:

Tür Çıktılar
GIT_CLONE WorkDir
DOCKER_BUILD, PODMAN_BUILD, KANIKO_BUILD ImageTag, ImageDigest
TERRAFORM TerraformAdd, TerraformChange, TerraformDestroy, TerraformChanges
K8S_DEPLOY K8sDeploymentName, K8sServiceName, K8sDeployNamespace, PreviewURL
HELM_UPGRADE HelmRelease, HelmNamespace
CLOUD_RUN_DEPLOY, AZURE_CONTAINERAPP_DEPLOY ServiceURL, Revision, PreviousRevision (Azure'da ayrıca Fqdn)
LAMBDA_DEPLOY FunctionVersion, PreviousVersion, FunctionArn, FunctionAlias (ServiceURL alias'ın function URL'si varsa)
CLOUD_FUNCTIONS_DEPLOY ServiceURL, Revision, PreviousRevision
ECS_DEPLOY TaskDefinitionArn, PreviousTaskDefinitionArn
TRIVY_SCAN ScanCritical, ScanHigh, ScanMedium, ScanLow, ScanFindingTotal ve diğerleri
COSIGN_SIGN SignedImage, SignatureKeyID
SBOM_GENERATE SbomFormat, SbomComponents

Bir SHELL step'i kendi çıktılarını $EJO_OUTPUT dosyasına AD=değer satırları olarak yazar ve bunları config.outputs listesinde belirtir:

- name: Versiyonu bul
  kind: SHELL
  image: alpine:3.20
  config:
    command: echo "APP_VERSION=$(cat VERSION)" >> "$EJO_OUTPUT"
    outputs: [APP_VERSION]
- name: Kullan
  kind: SHELL
  image: alpine:3.20
  config:
    command: echo "Versiyon {{.APP_VERSION}}"

WorkDir, CommitSHA veya Branch gibi sistem değişkenlerinin üzerine çıktı yazılamaz.

Manuel run girdileri#

Bir pipeline, elle başlatılan run'larda değer isteyebilir:

name: web
inputs:
  - {name: target, options: [staging, production], default: staging}
  - {name: dry_run, type: bool, default: "false"}
steps:
  - name: Göster
    kind: SHELL
    image: alpine:3.20
    config:
      command: echo "hedef=$INPUT_TARGET dry_run=$INPUT_DRY_RUN"
  • Girdi alanları: name, type (string, number, bool), required, default, options, pattern, label, help.
  • Değerler her step'e INPUT_<AD> environment variable'ı olarak gelir.
  • Zorunlu girdiler yalnızca manuel run'larda sorulur. Push ve tag run'ları varsayılanları kullanır; schedule için her zorunlu girdinin bir varsayılanı olmalıdır.
  • Girdiler açık metin saklanır, bu yüzden secret olamaz. Secret'ları değişkenlerden okuyun.

Sonraki adımlar#

Son güncelleme: 21 Ekim 2026