Skip to content

Validácia znalostí v CI ​

Pre-commit hook kontroluje, čo každý commitne. CI job zachytí všetko ostatné: commity s --no-verify, stroje bez kontextu, tímy, ktoré commitujú cez jj (to nespúšťa git hooky), záznamy, ktorých paths po refaktoringu prestali niečomu zodpovedať, a záznamy, ktoré zmena nechala za sebou.

kontext ci ​

sh
kontext ci [--base <rev>] [--format text|markdown] [--strict]

Spustí dve kontroly:

  1. kontext check nad všetkými záznamami: chýbajúce titulky, neznáme druhy, duplicitné ID, zlé dátumy review_by či checked, tajné údaje s vysokou istotou (chyby) a varovania, napríklad vzor v paths, ktorému nezodpovedá žiadny súbor;
  2. drift nad commitnutým rozsahom base..HEAD: aktívne záznamy, ktorých paths pokrývajú súbory zmenené v rozsahu, kým ich vlastný súbor sa v ňom neupravil, nevyradil ani nepotvrdil.

--base je predvolene merge base HEAD s predvolenou vetvou remote (origin/HEAD, inak origin/main, inak origin/master). V pull requeste je to miesto, kde vetva začala. Job potrebuje túto históriu: checkout s fetch-depth: 0. V plytkom klone sa base vráti na HEAD (base_source: fallback-none), rozsah je prázdny, správa to povie a --strict skončí kódom 3.

StavKedy
1check našiel chyby
2--strict a drift vypísal nejaký záznam
0inak; bez --strict je drift len varovanie

--format markdown zapíše správu pre súhrn jobu na GitHube alebo komentár k pull requestu: súhrn kontroly, jej zistenia a tabuľku záznamov s driftom so zmenenými súbormi a commitmi.

GitHub Actions ​

yaml
# .github/workflows/knowledge.yml
name: knowledge
on:
  pull_request:

jobs:
  kontext:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0            # drift needs the default branch's history
      - name: Install kontext
        run: curl -fsSL https://raw.githubusercontent.com/SemanS/kontext/main/scripts/install.sh | KONTEXT_VERSION=v0.4.0 sh
      - name: Check knowledge and list drift
        run: ~/.local/bin/kontext ci --base "origin/${{ github.base_ref }}" --format markdown | tee -a "$GITHUB_STEP_SUMMARY"
        shell: bash               # pipefail: the job fails when kontext ci does

Súhrn sa zobrazí na stránke behu. Pridaj --strict, aby drift zhodil job, keď si tím zvykne záznamy potvrdzovať: reviewer potom v tom istom pull requeste vidí každý vypísaný záznam potvrdený (jednoriadková zmena checked), upravený, nahradený alebo vyradený.

Ak chceš správu ako komentár k pull requestu, zapíš ju do súboru (kontext ci --format markdown > kontext.md) a odovzdaj ju akcii na komentovanie podľa vlastného výberu.

Iné CI systémy ​

Funguje akýkoľvek runner s gitom:

sh
curl -fsSL https://raw.githubusercontent.com/SemanS/kontext/main/scripts/install.sh | KONTEXT_VERSION=v0.4.0 sh
~/.local/bin/kontext ci --base origin/main

Ak chceš len validáciu bez driftu, stačí samotný kontext check (pri chybách stav 1). Štruktúrovaný výsledok dá kontext drift --base <rev> --head HEAD --json, teda výsledok entries.drift.

Čo kontroluje inštalátor ​

scripts/install.sh preloží latest na najnovší tag vydania, stiahne archív pre platformu a overí ho voči SHA256SUMS vydania (staršie vydania: binárku voči sha256 v manifeste). Pred inštaláciou spustí kontext --version. Každé zlyhanie zastaví skript s príčinou a nič nenainštaluje:

  • sťahovanie zlyhalo (sieť, rate limit): skús znova; nič sa nebuilduje z nevydanej vetvy;
  • vydanie nemá archív pre túto platformu alebo checksum, voči ktorému by ho overil;
  • checksum nesedí;
  • binárka tu nebeží, zvyčajne pre glibc staršiu, než proti ktorej bola zostavená (súhrn vydania vypíše glibc floor každej linuxovej binárky).

--from-source (alebo KONTEXT_FROM_SOURCE=1) namiesto toho zostaví ten istý tag cez cargo:

sh
curl -fsSL https://raw.githubusercontent.com/SemanS/kontext/main/scripts/install.sh | KONTEXT_VERSION=v0.9.1 sh -s -- --from-source

Ako kontext kontroluje sám seba ​

Repozitár kontextu spúšťa brány, ktoré tento návod odporúča, v .github/workflows/ci.yml:

JobČo
testcargo test --locked na Linuxe a macOS; jj smoke test beží tam, kde je jj nainštalované
msrv, fmt and clippyprečíta rust-version z Cargo.toml a na tom toolchaine spustí cargo check --locked --all-targets, cargo fmt --check a clippy -D warnings
clippy (latest stable)tie isté linty na najnovšom stable; včasné varovanie, ktoré neblokuje
windowscargo test --locked --no-run
evaluation setcargo test --test eval; správa je súhrn jobu a artefakt
kontext ci on .aipull requesty: kontext ci nad vlastnými znalosťami projektu, s fetch-depth: 0
docs build, docs en/sk paritypull requesty: npm run docs:build bez deployu; docs/en a docs/sk majú rovnaké súbory
cargo denylicencie, bany a zdroje blokujú; advisories sa len hlásia

Akcie sú pinované na SHA commitu. Tag vydania sa musí rovnať verzii v Cargo.toml; testy bežia znova pred zostavením akejkoľvek binárky a vydanie smie zapisovať len publish job.

Pred tagovaním scripts/release-check.sh zostaví kandidáta a ukáže, čo mení pre tých, čo ho čítajú:

sh
PEER_DIR=~/src/peer KONTEXT_PREV=~/.local/bin/kontext KONTEXT_STORES=~/src/shop:~/src/lib scripts/release-check.sh

S PEER_DIR spustí tri integračné suity Peeru proti kandidátovi (bez neho ich preskočí). Pre každý store v KONTEXT_STORES prečíta každý záznam cez entries.list a entries.get predchádzajúcou binárkou aj kandidátom a pri každom zázname vypíše, v čom sa líši stav, verification.kind, verification.verified, since.commits a riadené cesty, so súčtami.

Užitočné doplnky ​

  • kontext log --json vytvorí strojovo čitateľnú časovú os rozhodnutí, napr. pre dokumentačný web.
  • kontext check skenuje znalosti aj na tajné údaje; lokálne nastav secrets.scan = "staged", ak chceš, aby hook skenoval každý stagnutý súbor.

Vydané pod licenciou MIT alebo Apache-2.0.