Skip to content

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:

KodeLangkah CI sebaiknya
0lolos
1gagal: sebuah aturan gagal
2gagal sebagai build rusak: konfigurasinya salah dan tidak ada yang diukur
3gagal, atau beri peringatan: suite tidak dapat memutuskan
4gagal dan teruskan ke seseorang
5gagal 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.70

Eksekusi 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.yaml
exact-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.ndjson
run_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.yaml

YOUR_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 suite

Perbandingan terhadap eksekusi yang tidak selesai keluar dengan 5, sama seperti gerbang atas satu eksekusi: tidak ada hasil berpasangan untuk diputuskan.

Langkah selanjutnya