Panduan
Menjalankan di CI
Gerbang CI membahas kebijakan rilis dan arti setiap kode keluar. Halaman ini membahas bagian yang terjadi di dalam job CI: cara memasang Oloproof di sana, di mana bukti disimpan selama job berjalan, cara membaca hasil tanpa mengurai tabel, dan cara membandingkan pull request dengan branch yang ditujunya.
Kode keluar adalah gerbangnya
oloproof run keluar sesuai gerbangnya. Langkah CI yang menjalankannya gagal ketika gerbang memblokir, yang biasanya memang Anda inginkan dan tidak memerlukan pengaturan tambahan:
| Kode | Langkah CI sebaiknya |
|---|---|
| 0 | lolos |
| 1 | gagal: sebuah aturan gagal |
| 2 | gagal sebagai build rusak: konfigurasinya salah dan tidak ada yang diukur |
| 3 | gagal, atau beri peringatan: suite tidak dapat memutuskan |
| 4 | gagal dan teruskan ke seseorang |
| 5 | gagal sebagai build rusak: eksekusi tidak selesai |
Kode 3 adalah yang biasa diperdebatkan tim. Kebijakan bawaan memblokir pada kode ini, karena suite yang terlalu kecil untuk memutuskan belum menunjukkan bahwa perubahan itu aman. Tim yang ingin job tetap hijau selama suite-nya berkembang dapat menyatakannya dalam kebijakan, alih-alih mengabaikan kode keluar:
version: 1
block_on: [FAIL, MANUAL_REVIEW]
warn_on: [INSUFFICIENT_EVIDENCE]
rules:
- id: exact-label-floor
metric: exact_label
min: 0.70Eksekusi tersimpan yang sama dari examples/support_bot/, yang memblokir dengan 3 di bawah kebijakannya sendiri, di bawah kebijakan ini:
oloproof gate RUN_ID --policy advisory.yamlexact-label-floor: INSUFFICIENT_EVIDENCE (interval_overlaps_threshold)
about 1614 more cases would decide it, if the observed rate holds (1632 in total)Perintah itu keluar dengan 0. Keputusannya tidak berubah. Hanya tindakan rilis yang bergeser, dan bergeser karena sebuah file yang ditinjau menyatakannya.
Membaca hasil sebagai data
--json menulis satu event JSON per baris ke standard output dan tabel untuk manusia ke standard error, sehingga log CI tetap memuat tabel dan skrip membaca event-nya. Jika disimpan ke run.ndjson, id eksekusi ada di setiap baris, dan baris terakhir membawa kode keluar:
jq -r 'select(.type == "run_started") | .run_id' run.ndjson
jq -c 'select(.type == "run_finished")' run.ndjsonrun_01M3C3WS0SBTFAG55M7ECM1EZ4
{"run_id":"run_01M3C3WS0SBTFAG55M7ECM1EZ4","timestamp":"2026-09-25T11:06:03.646415Z","type":"run_finished","status":"DECIDED","completeness":"COMPLETE","exit_code":3}Progres dan konkurensi mencantumkan setiap jenis event.
Di mana bukti disimpan
Eksekusi disimpan di .oloproof/store.sqlite di samping oloproof.yaml tempat eksekusi itu dijalankan, dan oloproof init menambahkan .oloproof/ ke .gitignore. Job CI dimulai dengan store kosong, sehingga setiap job mengeksekusi ulang setiap kasus, dan tidak ada yang dari satu job terlihat oleh job berikutnya.
Hal ini paling penting untuk perbandingan, yang memerlukan kedua eksekusi dalam satu store. Dua checkout sebuah proyek masing-masing mendapat store sendiri, sehingga eksekusi baseline dari yang satu tidak dapat ditemukan dari yang lain:
Configuration error: unknown run 'run_01M3C3XSX9KY5T8VFZXA1CVBES'OLOPROOF_HOME mengarahkan setiap perintah ke satu store, di mana pun oloproof.yaml-nya berada. Direktori yang ditunjuknya menyimpan .oloproof/store.sqlite.
Memasang Oloproof di sebuah job
Oloproof tidak dipublikasikan ke indeks paket, jadi tidak ada baris pip install yang mengambilnya berdasarkan nama. Job memasangnya dari checkout repositori Oloproof, dengan cara yang sama seperti yang dilakukan pengembang: actions/checkout dengan repository: yang menunjuk ke lokasi salinan repositori itu milik tim Anda, dan token: yang dapat membacanya jika repositori itu privat. Root repositori membangun paketnya, dan paket itu menyediakan perintah oloproof.
Membandingkan pull request dengan basisnya
Lakukan checkout branch basis dan pull request berdampingan, jalankan masing-masing ke store yang sama, lalu bandingkan:
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.yamlYOUR_ORG/Oloproof dan OLOPROOF_REPO_TOKEN adalah placeholder untuk salinan repositori Anda dan secret yang dapat membacanya. Kedua eksekusi diberi || true karena gerbang masing-masing bukan pertanyaannya di sini; kode keluar perbandingan itulah yang menjadi pertanyaan.
Langkah yang sama di laptop, dengan proyek hasil scaffold yang di-checkout dua kali:
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)Kedua eksekusi harus menggunakan suite yang sama. Pull request yang mengubah sebuah kasus mengubah digest suite, dan perbandingan menolak alih-alih memasangkan kasus yang tidak lagi merupakan kasus yang sama:
Configuration error: runs 'run_01M3C3XXVZ1X0J2PR1ZW1WVGVZ' and 'run_01M3C3XW7X64B0Z0ACZV27WSW6' used different suites (sha256:baff4f101901d9a37cd440f99b9a70032f9488891b4f590f18a81017c26ba794 and sha256:2011286a7ec00c8c31560bb6d037b54a501a15f6251ac7c2d578d0c40e226d72); comparisons pair scenario by scenario over one suitePerbandingan terhadap eksekusi yang tidak selesai keluar dengan 5, sama seperti gerbang atas satu eksekusi: tidak ada hasil berpasangan untuk diputuskan.
Langkah selanjutnya
- Gerbang CI membahas kebijakan dan urutan pelaporan kode keluar.
- Aturan perbandingan membahas apa saja yang dapat diminta kebijakan perbandingan.