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. .ejodosyasınınpipeline: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_onhiç 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"]
ifbir şablondur; sonuçtrue,1veyayesise step çalışır,false,0,noveya boş ise atlanır. Başka bir sonuç hata verir.pathsGitHub 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ındapathsfiltreli 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_BUILDveKANIKO_BUILDpush için bir registry ister. Registry'leri Altyapı > Registry'ler altında tanımlayın ve step'teregistry_idile 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
secretolamaz. Secret'ları değişkenlerden okuyun.