Sürüm: 0.21.0Bu dokümantasyon Spitfire 0.21.0 içindir.
CI/CD entegrasyonu
Bu sayfa, Spitfire'da kayıtlı bir testi CI/CD pipeline'ınızdan (GitHub Actions, GitLab CI, Jenkins, Azure Pipelines…) nasıl koşturacağınızı, exit code'ların ne anlama geldiğini, performans budget'larını, PR/MR comment'lerini ve pipeline'dan karşılaştırmalı koşu (sürüm A/B) başlatmayı adım adım anlatır.
Ne işe yarar
- Her pull request'te ya da her deploy'dan sonra yük testini elle uğraşmadan koşturur.
- Pipeline adımı koşunun bitmesini bekler ve sonuca göre exit code döndürür: eşik ya da budget kırıldıysa adım kırmızı olur, merge engellenebilir.
--pr-commentile pull request'e (GitHub) ya da merge request'e (GitLab) adım bazında p95, p99 ve hata oranını baseline (referans) koşuya göre gösteren bir özet yazar.--compareile aynı testi iki ortama aynı anda uygular ve "yeni sürüm daha mı yavaş?" sorusuna istatistiksel bir kararla cevap verir.
Test controller'da koşar; CI makinesi yalnızca küçük bir CLI (spitfire) çalıştırır ve
sonucu bekler. Yükü sizin runner'larınız üretir, CI makinesinin gücü önemli değildir.
Ne zaman kullanılır
- Her pull request'te performansın gerilemediğinden emin olmak istediğinizde.
- Staging'e her deploy'dan sonra bir "duman testi" (kısa, düşük yüklü koşu) istediğinizde.
- Sürüm çıkmadan önce yeni sürümü canlıdakiyle karşılaştırmak istediğinizde (bkz. Sürüm karşılaştırma).
- Gece koşan testler için pipeline yerine Spitfire'ın kendi zamanlamasını da kullanabilirsiniz: Zamanlama ve izleme.
Başlamadan önce
- Spitfire'da koşturmak istediğiniz test kayıtlı olmalı ve en az bir kez web arayüzünden başarıyla koşmuş olmalı (testin doğru çalıştığını önce elle görün).
- Token'ı oluşturacak kullanıcının o testi koşturma yetkisi olmalı. Admin her testi
koşturabilir;
userrolündeki bir kullanıcı ancak grubunda "çalıştırabilir" işaretli testleri koşturabilir. Test sayfasında salt görüntüleme rozeti görüyorsanız token'ınız da o testi koşturamaz. - CI makinesi Spitfire'ın web adresine (HTTP portu, Docker kurulumunda varsayılan 8470 ya da önündeki HTTPS adresi) erişebilmeli.
API token oluşturma
CLI, Spitfire'a kişisel bir API token'ıyla bağlanır. Token, sahibinin o anki rolü ve gruplarıyla çalışır; yalnızca testleri listeleyebilir, doğrulayabilir, koşu ve karşılaştırmalı koşu başlatıp durdurabilir ve sonucu okuyabilir. Başka hiçbir şey yapamaz.
Adım adım:
- Sağ üstteki profil menünüzü açın ve API token'ları'na tıklayın.
- Token oluştur düğmesine basın. Yeni API token'ı penceresi açılır.
- Token'a pipeline'ı tanıtan bir ad verin (ör.
github-checkout-pr). Ad denetim kaydında görünür; hangi pipeline'ın koşu başlattığını buradan anlarsınız. - Geçerlilik süresini seçin (süresiz de olabilir). Süresi dolan token 401 alır.
- Oluşturun. Token (
sfpat_…) yalnız bu bir kez gösterilir: kopyalayın. - Token'ı CI'ınızın gizli değişkenine
SPITFIRE_TOKENadıyla kaydedin:- GitHub: Settings → Secrets and variables → Actions.
- GitLab: Settings → CI/CD → Variables (Masked işaretli).
- Pencerede Kopyaladım, kapat'a basın.
Token'ı asla YAML dosyasına, script'e ya da komut satırına düz yazmayın.
--token bayrağı vardır ama önerilmez; her zaman SPITFIRE_TOKEN ortam değişkenini
kullanın.
Bir token'ın sızdığından şüphelenirseniz aynı sayfada İptal et'e basın. O token'ı kullanan pipeline'lar hemen 401 almaya başlar; geri alınamaz. Sonra yeni bir token oluşturup CI değişkenini güncelleyin.
CLI kurulumu
CLI ayrı bir paket kurulumu gerektirmez; controller kendi sürümünün CLI'ını sunar. Bu sayede CLI ile controller her zaman aynı sürümdedir.
Linux (amd64):
curl -fsSL "$SPITFIRE_URL/api/v1/runner-dist/spitfire-cli-linux-amd64.gz" | gunzip > spitfire && chmod +x spitfireWindows (PowerShell):
Invoke-WebRequest "$env:SPITFIRE_URL/api/v1/runner-dist/spitfire-cli-windows-amd64.exe" -OutFile spitfire.exe -UseBasicParsingDocker imajı: CLI, Spitfire imajının içinde de vardır:
docker run --rm -e SPITFIRE_URL -e SPITFIRE_TOKEN algebransoft/spitfire spitfire cloud run "Ödeme akışı"
CLI iki ortam değişkenini okur:
| Değişken | Anlamı |
|---|---|
SPITFIRE_URL |
Spitfire'ın web adresi, ör. https://spitfire.example.com (ya da --url) |
SPITFIRE_TOKEN |
Kişisel API token'ı (sfpat_…) |
SPITFIRE_WORKSPACE |
İsteğe bağlı: çalışma alanı adı ya da kimliği (ya da --workspace) |
Token oluşturulduğu çalışma alanında geçerlidir ve test adları orada aranır. Tüm çalışma
alanlarını gören bir kurulum yöneticisinin token'ı --workspace ile çalışma alanını seçer.
Controller'ın sertifikası kendi kurumsal CA'nızla imzalıysa --ca kurum-ca.pem verin.
--insecure sertifikayı hiç doğrulamaz; yalnızca deneme ortamında kullanın.
Token'ın hangi testleri gördüğünü denemek için:
./spitfire cloud tests # tüm testler
./spitfire cloud tests ödeme # adında "ödeme" geçenlerHer satırda testin kimliği, sürümü ve adı yazar; koşturamadığınız testlerin yanında
(view only) görünür.
Test sayfasındaki CI düğmesi
Hazır YAML'ı elle yazmanıza gerek yok. Test sayfasının üst kısmındaki CI düğmesi (CI'da koştur) o test için doldurulmuş örnekleri gösterir: Spitfire adresi ve test adı yerinde yazılıdır.
- Testler sayfasından testi açın.
- Üstteki CI düğmesine basın. CI'da koştur penceresi açılır.
- Pipeline'ınıza uyan sekmeyi seçin: GitHub Actions, GitLab CI, A/B (GitHub), Docker, Kabuk ya da PowerShell.
- Sağ üstteki Kopyala ile metni alın ve pipeline dosyanıza yapıştırın.
- Pencerenin altındaki API token'ı oluştur → bağlantısı sizi token sayfasına götürür.
Pencerenin altında exit code'lar da yazar: "0 geçti · 99 eşik kırıldı · 97 eşik koşuyu durdurdu · 2 yazma onayı yok (--confirm-writes) · 1 diğer hatalar."
CI düğmesi yalnızca o testi koşturma yetkiniz varsa görünür. Aynı örnekler API token'ları sayfasının altında da vardır (orada test adı yerine bir yer tutucu yazar).
Pipeline'dan test koşturma
GitHub Actions
En basit adım:
# GitHub Actions adımı
- name: Yük testi
env:
SPITFIRE_URL: https://spitfire.example.com
SPITFIRE_TOKEN: ${{ secrets.SPITFIRE_TOKEN }}
run: |
curl -fsSL "$SPITFIRE_URL/api/v1/runner-dist/spitfire-cli-linux-amd64.gz" | gunzip > spitfire && chmod +x spitfire
./spitfire cloud run "Ödeme akışı"Adım koşunun bitmesini bekler. Koşu bitince CLI özeti yazdırır ve sonuca göre çıkar.
GitLab CI
# .gitlab-ci.yml — SPITFIRE_TOKEN: Settings → CI/CD → Variables (masked)
load-test:
image: algebransoft/spitfire
variables:
SPITFIRE_URL: https://spitfire.example.com
script:
- spitfire cloud run "Ödeme akışı"Jenkins, Azure Pipelines ve diğerleri
Herhangi bir kabukta aynı iki satır yeterlidir:
export SPITFIRE_URL=https://spitfire.example.com
# SPITFIRE_TOKEN CI'ın gizli değişkeninden gelir
curl -fsSL "$SPITFIRE_URL/api/v1/runner-dist/spitfire-cli-linux-amd64.gz" | gunzip > spitfire && chmod +x spitfire
./spitfire cloud run "Ödeme akışı" --runners 2 -o summary.json
echo $?Windows ajanında (Azure Pipelines, GitHub windows-latest, Jenkins):
$env:SPITFIRE_URL = 'https://spitfire.example.com'
Invoke-WebRequest "$env:SPITFIRE_URL/api/v1/runner-dist/spitfire-cli-windows-amd64.exe" -OutFile spitfire.exe -UseBasicParsing
.\spitfire.exe cloud run 'Ödeme akışı'
exit $LASTEXITCODESık kullanılan bayraklar
| Bayrak | Ne yapar |
|---|---|
"Ödeme akışı" |
Testin adı ya da kimliği (tek argüman) |
-r 2, --runners 2 |
Boştaki kaç runner kullanılacağı (varsayılan 1) |
-l istanbul=60:2 -l frankfurt=40 |
Yükü lokasyonlara yüzdeyle böler (ad=yüzde[:runner sayısı]) |
--label zone=a |
Yalnızca bu etiketlere sahip runner'lar |
--env staging |
Testin ortamlarından biriyle koşturur |
--scale 0.5 |
Yükü (VU, hız) çarpar: 0.5 yarısı, 2 iki katı |
--var baseUrl=https://staging.example.com |
Bu koşu için bir test değişkenini değiştirir |
-o summary.json |
Koşu özetini JSON olarak yazar |
--report rapor.pdf |
Koşu raporunu PDF ya da .html olarak yazar (build artifact olarak saklayın) |
--report-lang en |
Rapor ve PR özeti dili: tr (varsayılan) ya da en |
--timeout 30m |
Bu süreden sonra koşuyu durdurur ve başarısız sayar (varsayılan: planlanan süre + 15 dk) |
--note "…" |
Koşu notu (varsayılan: pipeline bilgisi, ortamdan okunur) |
--tag nightly |
Koşu etiketi (tekrarlanabilir; varsayılan ci) |
--confirm-writes |
Veri değiştiren adımları olan teste izin verir (aşağıya bakın) |
--commit, --ref, --version-tag v1.4.0 |
Test edilen commit, branch/tag ve sürüm etiketi (varsayılan: CI ortamından) |
CI'dan başlatılan koşular ci etiketi ve pipeline notu alır, denetim kaydına token'ın adıyla
geçer. CLI commit ve branch bilgisini GitHub Actions, GitLab CI, Jenkins ve Azure Pipelines
ortamından kendisi okur; test sayfasındaki Sürüm trendi her koşuyu bu etiketle gösterir.
Veri değiştiren testler
Test SQL/Mongo yazma, riskli Redis komutu ya da veri değiştirdiği işaretli HTTP isteği
içeriyorsa CLI onu onaysız başlatmaz ve 2 ile çıkar. Bu üretim yazma korumasıdır.
Gerçekten istiyorsanız komuta --confirm-writes ekleyin:
./spitfire cloud run "Sipariş oluşturma" --env staging --confirm-writes--confirm-writes'ı canlı (production) ortama karşı koşan bir pipeline'a
eklemeden önce iki kez düşünün: test her koşuda gerçekten veri yazar.
Exit code'lar
Düz koşu (--compare olmadan):
| Exit code | Anlamı | Pipeline'da ne olur |
|---|---|---|
0 |
Geçti: tüm eşikler ve budget'lar sağlandı | Adım yeşil |
99 |
Eşik ya da performans budget'ı kırıldı | Adım kırmızı |
97 |
Bir eşik koşuyu durdurdu (abort) | Adım kırmızı |
2 |
Test veri değiştiriyor, --confirm-writes verilmedi |
Adım kırmızı, koşu başlamadı |
1 |
Diğer hatalar: bağlantı, token, lisans, bulunamayan test, boşta runner yok… | Adım kırmızı |
Karşılaştırmalı koşu (--compare) için exit code'lar farklıdır; aşağıda
Pipeline üzerinden karşılaştırmalı koşu bölümüne bakın.
99 ve 97 k6 ile uyumlu kodlardır; k6'dan geçiyorsanız pipeline'daki
koşullarınız aynen çalışır.
Performans budget'ları
Performans bütçesi (budget), bir adım için üst sınırdır; ör. POST /orders p95 < 300 ms
ya da hata oranı %1'in altında. Budget'ı aşan koşu, kırılan eşik gibi düşer: exit code 99
olur, koşu sayfası, karşılaştırma, rapor ve PR özeti bunu gösterir.
Adım adım budget eklemek:
- Test sayfasını açın. Performans bütçeleri kartını bulun.
- Kartın sağ üstündeki Düzenle'ye basın (yalnızca admin). Performans bütçelerini düzenle penceresi açılır.
- Bütçe ekle'ye basın.
- Adım sütununda Adım seçin… listesinden adımı seçin.
- İstatistik seçin: p95, p99, p90, Ortalama, Maks. ya da Hata oranı.
- Altında kalmalı sütununa sınırı yazın (süreler ms, hata oranı yüzde).
- Gerekirse başka adımlar için tekrarlayın ve kaydedin.
Budget'lar testle birlikte tutulur ama test sürümlerine girmez: değişiklikten sonra başlayan koşular yeni sınırlarla değerlendirilir, eski koşular değişmez.
Testten silinen bir adımı gösteren budget adım silinmiş rozetiyle işaretlenir; böyle bir budget veri bulamaz ve koşuyu düşürür. Silin ya da başka adım seçin.
Performans budget'ı, PR/MR comment'i ve CI'dan karşılaştırmalı koşu lisansınızın planına bağlıdır (Growth yıllık, Scale yıllık, Enterprise). Lisansınız içermiyorsa kayıtlı budget'lar koşuları değerlendirmeye devam eder ama yenisi kaydedilmez.
PR ve MR comment'leri
--pr-comment, pull request'e (GitHub Actions) ya da merge request'e (GitLab CI) bir özet
yazar:
- testin baseline (referans) koşusuna göre her adımın p95, p99 ve hata oranı,
- toleransın ötesinde kötüleşen yerde ⚠️, ör.
`/checkout` p95: 212 ms → 250 ms (+18%) ⚠️, - budget'lar ve eşikler.
Her push yeni bir comment eklemez; aynı comment'i günceller (test başına gizli bir işaretle bulunur). Comment'i yalnızca CI işi, pipeline'ın verdiği token'la yazar; controller GitHub'la ya da GitLab'la hiç konuşmaz.
GitHub Actions
- Workflow'a
pull-requests: writeizni verin. - Adımın
env'ineGITHUB_TOKENekleyin. - Komuta
--pr-comment(ve isterseniz--summary-md spitfire.md) ekleyin.
# .github/workflows/load-test.yml
on: [pull_request]
permissions:
contents: read
pull-requests: write # PR yorumu
jobs:
load-test:
runs-on: ubuntu-latest
steps:
- env:
SPITFIRE_URL: https://spitfire.example.com
SPITFIRE_TOKEN: ${{ secrets.SPITFIRE_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
curl -fsSL "$SPITFIRE_URL/api/v1/runner-dist/spitfire-cli-linux-amd64.gz" | gunzip > spitfire && chmod +x spitfire
./spitfire cloud run "Ödeme akışı" --pr-comment --summary-md spitfire.md--summary-md aynı Markdown'ı bir dosyaya yazar; GitHub'da özet iş sayfasına da düşer
($GITHUB_STEP_SUMMARY).
GitLab CI
- GitLab'da
apikapsamlı bir proje erişim token'ı oluşturun. - Onu maskeli
SPITFIRE_GITLAB_TOKENdeğişkeni olarak kaydedin (yoksaCI_JOB_TOKENdenenir, ama çoğu GitLab sürümü onunla merge request notu yazdırmaz). - İşi merge request pipeline'ında koşturun.
# .gitlab-ci.yml — SPITFIRE_TOKEN: Settings → CI/CD → Variables (masked)
# SPITFIRE_GITLAB_TOKEN: proje erişim token'ı (api kapsamı), maskeli
load-test:
image: algebransoft/spitfire
variables:
SPITFIRE_URL: https://spitfire.example.com
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
- if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH
script:
- spitfire cloud run "Ödeme akışı" --pr-comment --summary-md spitfire.md
artifacts:
when: always
paths: [spitfire.md]Tolerans ve baseline
--pr-tolerance 10: p95/p99'u baseline'a göre %10'dan fazla kötüleşen adımı ⚠️ ile işaretler. Verilmezse testin kendi toleransı geçerlidir.- Testin baseline koşusu yoksa özet değerleri listeler ve baseline'ın nasıl seçileceğini söyler. Baseline, bir koşu sayfasındaki Baseline yap ile seçilir.
Yazılamayan bir comment (izin yok, token yok, lisans içermiyor) yalnızca uyarıdır: CLI nedenini yazar ama exit code değişmez, koşunun sonucudur.
Pipeline üzerinden karşılaştırmalı koşu
--compare, testi iki ortamına aynı anda ve aynı yükle uygular, kararı bekler, adım
bazlı farkları yazdırır ve karara göre çıkar. Ayrıntılar için
Sürüm karşılaştırma.
spitfire cloud run "Ödeme akışı" --compare A=test,B=dev --label-a v2.3 --label-b "$GIT_SHA"| Exit code | Anlamı |
|---|---|
0 |
daha iyi ya da fark yok (--fail-on-inconclusive yoksa belirsiz de) |
98 |
daha kötü (--fail-on-inconclusive ile belirsiz de) |
97 |
geçersiz: bir kol düştü ya da runner koptu, veya --strict ile eşdeğerlik ön kontrolü başarısız |
99 |
B kolu (aday) eşiğini ya da performans budget'ını kırdı |
2, 1 |
yazma onaylanmadı (--confirm-writes iki ortamı da onaylar), diğer hatalar |
Öncelik sırası: önce geçersiz ve daha kötü, sonra B kolunun eşikleri, sonra belirsiz.
Karşılaştırmaya özgü bayraklar: --label-a, --label-b, --fail-on-inconclusive,
--strict, --compare-mode sequential, --rounds, --switch-timeout, --auto-switch.
Bunlar --compare olmadan verilemez; --env ve --var ise --compare ile birlikte
verilemez. --scale burada her kolun test yükündeki payıdır (varsayılan 0.5).
GitHub Actions örneği (test sayfasındaki A/B (GitHub) sekmesi de bunu verir):
# .github/workflows/version-compare.yml
on: [pull_request]
permissions:
contents: read
pull-requests: write
jobs:
compare:
runs-on: ubuntu-latest
steps:
- env:
SPITFIRE_URL: https://spitfire.example.com
SPITFIRE_TOKEN: ${{ secrets.SPITFIRE_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
curl -fsSL "$SPITFIRE_URL/api/v1/runner-dist/spitfire-cli-linux-amd64.gz" | gunzip > spitfire && chmod +x spitfire
./spitfire cloud run "Ödeme akışı" --compare A=test,B=dev \
--label-a v2.3 --label-b "$GITHUB_SHA" --pr-comment --report comparison.pdfGitLab CI örneği:
# .gitlab-ci.yml — SPITFIRE_TOKEN ve SPITFIRE_GITLAB_TOKEN maskeli değişken
version-compare:
image: algebransoft/spitfire
variables:
SPITFIRE_URL: https://spitfire.example.com
rules:
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
script:
- spitfire cloud run "Ödeme akışı" --compare A=test,B=dev --label-a v2.3 --label-b "$CI_COMMIT_SHORT_SHA" --pr-comment --fail-on-inconclusive --strict --report comparison.html
artifacts:
when: always
paths: [comparison.html]CI'dan (API token'ıyla) karşılaştırmalı koşu lisansta compare_ci özelliğini ister
(Growth yıllık, Scale yıllık, Enterprise). Yoksa başlatma 402 license_limit ile reddedilir
ve CLI bunu açıkça yazar. Web arayüzünden başlatılan karşılaştırmalar etkilenmez.
Sık karşılaşılan sorunlar
| Belirti | Neden | Çözüm |
|---|---|---|
CLI 401 ile duruyor |
Token yanlış, iptal edilmiş ya da süresi dolmuş; ya da SPITFIRE_TOKEN adıma geçmemiş |
API token'ları sayfasında token'ın durumuna (etkin, iptal, süresi doldu) bakın; gerekirse yenisini oluşturup CI değişkenini güncelleyin. YAML'da env: altında SPITFIRE_TOKEN'ın olduğundan emin olun. |
| "API token'ı bu işlemi yapamaz; oturum açın." | Token yalnızca test listeleme, koşturma, durdurma ve sonuç okuma yapabilir | İstediğiniz işlemi web arayüzünden yapın. |
| Test bulunamıyor | Test adı farklı yazılmış, test başka bir çalışma alanında ya da token'ın sahibi testi göremiyor | ./spitfire cloud tests ile görünen testleri listeleyin; gerekirse --workspace verin ya da test kimliğini kullanın. |
Testin yanında (view only) |
Token sahibinin testi koşturma yetkisi yok | Bir admin'in testi kullanıcının grubunda "çalıştırabilir" işaretlemesi gerekir. |
Exit code 2 |
Test veri değiştiriyor | Bilerek yapıyorsanız --confirm-writes ekleyin. |
Exit code 1, "Yeterli boşta runner yok" |
Runner'lar başka koşuda ya da çevrimdışı | Runner'lar sayfasına bakın; --runners sayısını azaltın ya da koşuların bitmesini bekleyin. Bkz. Sorun giderme. |
Exit code 1, 402 license_limit |
Planlanan VU, hız, süre, runner ya da lokasyon lisans limitini aşıyor | --scale ile yükü düşürün ya da lisansı yükseltin. Ayrıntı: Sorun giderme. |
| TLS / x509 sertifika hatası | Controller'ın sertifikası CI makinesinin tanımadığı bir CA ile imzalı | --ca kurum-ca.pem verin. --insecure yalnızca denemede. |
| PR comment'i görünmüyor | pull-requests: write izni ya da GITHUB_TOKEN yok; GitLab'da SPITFIRE_GITLAB_TOKEN yok; lisans PR comment'ini içermiyor |
CLI çıktısındaki uyarıyı okuyun; izni/token'ı ekleyin. Exit code bundan etkilenmez. |
| Comment'te ⚠️ yok ama "baseline yok" yazıyor | Testin baseline koşusu seçilmemiş | Bir koşu sayfasında Baseline yap'a basın. |
Adım --timeout ile düşüyor |
Koşu planlanandan uzun sürdü ya da kuyrukta bekledi | --timeout'u artırın; runner'ların boşta olduğundan emin olun. |
| "--compare names the environments: leave out --env and --var" | --compare ile --env/--var birlikte verilmiş |
Ortamları yalnızca --compare A=…,B=… ile verin. |
İlgili sayfalar
- Sürüm karşılaştırma —
--compare'in arkasındaki istatistik ve karar - Zamanlama ve izleme — pipeline olmadan düzenli koşular ve bildirimler
- Sorun giderme — hata kodları, sistem olayları, destek paketi
- API token'ları
Spitfire'da: /api-tokens




