Skip to content

Kılavuzlar

CI'da çalıştırma

CI'da kapı denetimi sürüm politikasını ve her çıkış kodunun ne anlama geldiğini anlatır. Bu sayfa ise bir CI işinin içinde olan kısımdır: Oloproof'un orada nasıl kurulacağı, iş çalışırken kanıtın nerede durduğu, bir sonucun tablo ayrıştırmadan nasıl okunacağı ve bir pull request'in hedeflediği dala karşı nasıl karşılaştırılacağı.

Çıkış kodu kapının kendisidir

oloproof run kapısına göre çıkar. Onu çalıştıran bir CI adımı, kapı engellediğinde başarısız olur; genellikle istenen de budur ve ek bir bağlantı gerektirmez:

KodBir CI adımı şunu yapmalı
0geçmeli
1başarısız olmalı: bir kural başarısız oldu
2bozuk derleme olarak başarısız olmalı: yapılandırma hatalıydı ve hiçbir şey ölçülmedi
3başarısız olmalı ya da uyarmalı: paket karar veremedi
4başarısız olmalı ve bir kişiye yönlendirilmeli
5bozuk derleme olarak başarısız olmalı: çalıştırma tamamlanmadı

Ekiplerin üzerinde tartıştığı kod 3'tür. Varsayılan politika bu kodda engeller, çünkü karar veremeyecek kadar küçük bir paket, değişikliğin güvenli olduğunu göstermemiştir. Paketini büyütürken işin yeşil yanmasını isteyen bir ekip bunu çıkış kodunu yok sayarak değil, politikada belirterek yapabilir:

version: 1
block_on: [FAIL, MANUAL_REVIEW]
warn_on: [INSUFFICIENT_EVIDENCE]
rules:
  - id: exact-label-floor
    metric: exact_label
    min: 0.70

examples/support_bot/ klasörünün, kendi politikası altında 3 ile engelleyen aynı kayıtlı çalıştırması, bu politika altında:

oloproof gate RUN_ID --policy advisory.yaml
exact-label-floor: INSUFFICIENT_EVIDENCE (interval_overlaps_threshold)
  about 1614 more cases would decide it, if the observed rate holds (1632 in total)

0 ile çıkar. Karar değişmedi. Yalnızca sürüm eylemi değişti ve incelemeden geçen bir dosya öyle söylediği için değişti.

Sonucu veri olarak okumak

--json, standart çıktıya satır başına bir JSON olayı, standart hataya ise insan için tabloları yazar; böylece CI günlüğü tabloları tutar, bir betik de olayları okur. run.ndjson dosyasına kaydedildiğinde çalıştırmanın kimliği her satırdadır ve son satır çıkış kodunu taşır:

jq -r 'select(.type == "run_started") | .run_id' run.ndjson
jq -c 'select(.type == "run_finished")' run.ndjson
run_01M3C3WS0SBTFAG55M7ECM1EZ4
{"run_id":"run_01M3C3WS0SBTFAG55M7ECM1EZ4","timestamp":"2026-09-25T11:06:03.646415Z","type":"run_finished","status":"DECIDED","completeness":"COMPLETE","exit_code":3}

İlerleme ve eşzamanlılık her olay türünü listeler.

Kanıtın durduğu yer

Bir çalıştırma, çalıştırıldığı oloproof.yaml dosyasının yanındaki .oloproof/store.sqlite içinde saklanır ve oloproof init, .oloproof/ klasörünü .gitignore dosyasına ekler. Bir CI işi boş bir depoyla başlar; bu yüzden her iş her vakayı yeniden yürütür ve bir işten hiçbir şey sonrakine görünmez.

Bu en çok karşılaştırma için önemlidir, çünkü karşılaştırma iki çalıştırmanın da tek bir depoda olmasını gerektirir. Bir projenin iki ayrı checkout'u her biri kendi deposunu alır; dolayısıyla birinden yapılan temel çalıştırma diğerinden bulunamaz:

Configuration error: unknown run 'run_01M3C3XSX9KY5T8VFZXA1CVBES'

OLOPROOF_HOME, oloproof.yaml dosyası nerede olursa olsun her komutu tek bir depoya yönlendirir. Gösterdiği dizin .oloproof/store.sqlite dosyasını barındırır.

Oloproof'u bir işte kurmak

Oloproof bir paket dizinine yayımlanmamıştır; bu yüzden onu adıyla getiren bir pip install satırı yoktur. Bir iş onu, bir geliştiricinin yaptığı gibi, Oloproof deposunun bir checkout'undan kurar: repository: alanı ekibinizin o depo kopyası nerede duruyorsa onu gösteren actions/checkout ve depo özelse onu okuyabilen bir token:. Deponun kökü paketi derler ve paket oloproof komutunu sağlar.

Bir pull request'i tabanıyla karşılaştırmak

Taban dalı ve pull request'i yan yana checkout edin, ikisini de aynı depoya çalıştırın ve karşılaştırın:

name: oloproof
on: pull_request
jobs:
  evaluate:
    runs-on: ubuntu-latest
    env:
      OLOPROOF_HOME: ${{ github.workspace }}/evidence
    steps:
      - uses: actions/checkout@v4
        with:
          path: pr
      - uses: actions/checkout@v4
        with:
          ref: ${{ github.base_ref }}
          path: main
      - uses: actions/checkout@v4
        with:
          repository: YOUR_ORG/Oloproof
          token: ${{ secrets.OLOPROOF_REPO_TOKEN }}
          path: oloproof-src
      - uses: actions/setup-python@v5
        with:
          python-version: "3.12"
      - run: python -m pip install ./oloproof-src
      - run: mkdir -p "$OLOPROOF_HOME"
      - run: oloproof run --config main/oloproof.yaml --json > base.ndjson || true
      - run: oloproof run --config pr/oloproof.yaml --json > cand.ndjson || true
      - name: compare
        run: |
          candidate=$(jq -r 'select(.type == "run_started") | .run_id' cand.ndjson)
          baseline=$(jq -r 'select(.type == "run_started") | .run_id' base.ndjson)
          oloproof compare "$candidate" "$baseline" --config pr/oloproof.yaml --policy pr/compare.yaml

YOUR_ORG/Oloproof ve OLOPROOF_REPO_TOKEN, deponun sizdeki kopyası ve onu okuyabilen bir gizli değer için yer tutuculardır. İki çalıştırma || true taşır, çünkü burada soru onların kendi kapıları değil; karşılaştırmanın çıkış kodudur.

Aynı adımlar bir dizüstü bilgisayarda, iskeleti oluşturulmuş proje iki kez checkout edilmiş hâlde:

Comparison sha256:31ac104779bda1726ba55b661107cbe256fae5f1d831c79b1283a07651b58cbf of run_01M3C3XX4TM0WSZW8K81PHRGAW against run_01M3C3XW7X64B0Z0ACZV27WSW6 · 30 paired cases
exact_label: +0.0 points [-16.5, +16.5] · 30 paired · 0 missing · 0 excluded
Decisions
  no-regression  exact_label  non-inferiority, margin 5.0 points  INSUFFICIENT_EVIDENCE  interval_overlaps_margin
Gate: BLOCK (exit 3)

İki çalıştırma da aynı paket üzerinde olmalıdır. Bir vakayı düzenleyen bir pull request paketin özetini (digest) değiştirir ve karşılaştırma, artık aynı vaka olmayan vakaları eşleştirmek yerine reddeder:

Configuration error: runs 'run_01M3C3XXVZ1X0J2PR1ZW1WVGVZ' and 'run_01M3C3XW7X64B0Z0ACZV27WSW6' used different suites (sha256:baff4f101901d9a37cd440f99b9a70032f9488891b4f590f18a81017c26ba794 and sha256:2011286a7ec00c8c31560bb6d037b54a501a15f6251ac7c2d578d0c40e226d72); comparisons pair scenario by scenario over one suite

Tamamlanmamış bir çalıştırmanın karşılaştırması, böyle bir çalıştırma üzerindeki kapıyla aynı şekilde 5 ile çıkar: karar verilecek eşleştirilmiş bir sonuç yoktur.

Sonraki adımlar