Hướng dẫn
Chạy trong CI
Cổng trong CI trình bày chính sách phát hành và ý nghĩa của từng mã thoát. Trang này là phần diễn ra bên trong một job CI: cách cài đặt Oloproof ở đó, bằng chứng nằm ở đâu trong khi job chạy, cách đọc một kết quả mà không cần phân tích cú pháp một bảng, và cách so sánh một pull request với nhánh mà nó nhắm tới.
Mã thoát chính là cổng
oloproof run thoát theo cổng của nó. Một bước CI chạy lệnh này sẽ thất bại khi cổng chặn, điều thường là điều bạn muốn và không cần cấu hình thêm:
| Mã | Một bước CI nên |
|---|---|
| 0 | đạt |
| 1 | thất bại: một quy tắc không đạt |
| 2 | thất bại như một bản build hỏng: cấu hình sai và không có gì được đo |
| 3 | thất bại, hoặc cảnh báo: bộ kiểm thử không thể quyết định |
| 4 | thất bại và chuyển cho một người xem xét |
| 5 | thất bại như một bản build hỏng: lần chạy không hoàn tất |
Mã 3 là mã mà các nhóm hay tranh luận. Chính sách mặc định chặn với mã này, vì một bộ kiểm thử quá nhỏ để quyết định thì chưa cho thấy thay đổi là an toàn. Một nhóm muốn job hiển thị xanh trong khi mở rộng bộ kiểm thử của mình có thể nói rõ điều đó trong chính sách, thay vì phớt lờ mã thoát:
version: 1
block_on: [FAIL, MANUAL_REVIEW]
warn_on: [INSUFFICIENT_EVIDENCE]
rules:
- id: exact-label-floor
metric: exact_label
min: 0.70Cùng một lần chạy đã lưu của examples/support_bot/, vốn bị chặn với mã 3 theo chính sách của chính nó, khi áp dụng chính sách này:
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)Lệnh thoát với mã 0. Quyết định không thay đổi. Chỉ có hành động phát hành thay đổi, và nó thay đổi vì một tệp đang được xem xét nói như vậy.
Đọc kết quả dưới dạng dữ liệu
--json ghi mỗi dòng một sự kiện JSON ra đầu ra chuẩn và các bảng dành cho người đọc ra luồng lỗi chuẩn, nên log CI giữ lại các bảng còn một script thì đọc các sự kiện. Khi lưu vào run.ndjson, id của lần chạy có trên mọi dòng, và dòng cuối cùng mang mã thoát:
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}Tiến trình và mức đồng thời liệt kê mọi loại sự kiện.
Bằng chứng nằm ở đâu
Một lần chạy được lưu trong .oloproof/store.sqlite bên cạnh oloproof.yaml mà nó được chạy từ đó, và oloproof init thêm .oloproof/ vào .gitignore. Một job CI bắt đầu với kho lưu trữ trống, nên mọi job thực thi lại mọi trường hợp, và không gì từ job này có thể thấy được ở job tiếp theo.
Điều đó quan trọng nhất với một so sánh, vốn cần cả hai lần chạy trong cùng một kho lưu trữ. Hai bản checkout của một dự án mỗi bản có kho lưu trữ riêng, nên một lần chạy đường cơ sở từ bản này không thể được tìm thấy từ bản kia:
Configuration error: unknown run 'run_01M3C3XSX9KY5T8VFZXA1CVBES'OLOPROOF_HOME trỏ mọi lệnh tới một kho lưu trữ duy nhất, bất kể oloproof.yaml của lệnh nằm ở đâu. Thư mục mà biến này chỉ định chứa .oloproof/store.sqlite.
Cài đặt Oloproof trong một job
Oloproof không được phát hành lên một chỉ mục gói nào, nên không có dòng pip install nào tải nó về theo tên. Một job cài đặt nó từ một bản checkout của kho mã nguồn Oloproof, giống như cách một nhà phát triển làm: actions/checkout với repository: chỉ tới nơi lưu bản sao kho mã nguồn đó của nhóm bạn, và một token: có quyền đọc nó nếu kho là riêng tư. Thư mục gốc của kho mã nguồn build ra gói, và gói cung cấp lệnh oloproof.
So sánh một pull request với nhánh gốc của nó
Checkout nhánh gốc và pull request cạnh nhau, chạy từng bên vào cùng một kho lưu trữ, rồi so sánh:
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 và OLOPROOF_REPO_TOKEN là các giá trị giữ chỗ cho bản sao kho mã nguồn của bạn và một secret có quyền đọc nó. Hai lần chạy mang || true vì cổng riêng của chúng không phải là câu hỏi ở đây; mã thoát của so sánh mới là câu hỏi.
Các bước tương tự trên máy tính cá nhân, với dự án được tạo sẵn được checkout hai lần:
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)Cả hai lần chạy phải dùng cùng một bộ kiểm thử. Một pull request sửa một trường hợp sẽ thay đổi digest của bộ kiểm thử, và so sánh sẽ từ chối thay vì ghép cặp các trường hợp không còn là cùng một trường hợp:
Configuration error: runs 'run_01M3C3XXVZ1X0J2PR1ZW1WVGVZ' and 'run_01M3C3XW7X64B0Z0ACZV27WSW6' used different suites (sha256:baff4f101901d9a37cd440f99b9a70032f9488891b4f590f18a81017c26ba794 and sha256:2011286a7ec00c8c31560bb6d037b54a501a15f6251ac7c2d578d0c40e226d72); comparisons pair scenario by scenario over one suiteSo sánh một lần chạy chưa hoàn tất sẽ thoát với mã 5, giống như một cổng áp lên lần chạy đó: không có kết quả ghép cặp nào để quyết định.
Tiếp theo
- Cổng trong CI trình bày chính sách và thứ tự báo cáo các mã thoát.
- Quy tắc so sánh trình bày những gì một chính sách so sánh có thể yêu cầu.