All checks were successful
CI / lint (push) Successful in 47s
CI / notebooks-smoke (push) Successful in 1m33s
Deploy / notebooks (push) Has been skipped
Deploy / zotero (push) Has been skipped
Deploy / docs (push) Has been skipped
Deploy / api (push) Has been skipped
Deploy / llm (push) Has been skipped
Deploy / mc (push) Successful in 18s
Infra CI / notebooks (push) Successful in 1m12s
Infra CI / zotero (push) Successful in 23s
Infra CI / docs (push) Successful in 1m37s
Infra CI / api (push) Successful in 1m6s
Infra CI / llm (push) Successful in 47s
Infra CI / mc (push) Successful in 14s
Deploy / report (push) Successful in 14s
CI / test (push) Successful in 17m50s
Infra CI's mc job has failed on every push since docker.io/minio/mc
started returning 'pull access denied, repository does not exist' — and
nobody heard, because the generated File-failure-issue step ran
`uv run` in a job that never installs uv ("uv: command not found",
swallowed by the trailing || true). Pin quay.io/minio/mc to a release
tag; the filer installs uv when it is missing.
127 lines
4.6 KiB
YAML
127 lines
4.6 KiB
YAML
# DO NOT EDIT — generated by gen_config.py from stack.toml
|
|
# Re-generate: uv run python dev/scripts/gen_config.py
|
|
|
|
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches: ["**"]
|
|
pull_request:
|
|
|
|
jobs:
|
|
lint:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: https://github.com/actions/checkout@v4
|
|
|
|
- name: Set up uv
|
|
run: curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
env:
|
|
UV_INSTALL_DIR: /usr/local/bin
|
|
|
|
- name: Install dependencies
|
|
run: uv sync --dev
|
|
|
|
- name: Ruff check
|
|
run: uv run ruff check src/ tests/ --output-format=concise
|
|
|
|
- name: Ruff format
|
|
run: uv run ruff format --check src/ tests/
|
|
|
|
- name: Validate generated config
|
|
run: uv run python dev/scripts/gen_config.py --check
|
|
|
|
test:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: https://github.com/actions/checkout@v4
|
|
|
|
- name: Set up uv
|
|
run: curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
env:
|
|
UV_INSTALL_DIR: /usr/local/bin
|
|
|
|
- name: Install dependencies
|
|
run: uv sync --dev
|
|
|
|
- name: Preinstall duckdb extensions
|
|
# tests/zot/test_duck.py runs INSTALL sqlite from every xdist
|
|
# worker; concurrent installs race the extension-file rename in
|
|
# ~/.duckdb ("Could not remove file ... sqlite_scanner", #515).
|
|
# Installing once up front makes the in-test INSTALL a no-op.
|
|
# ducklake: same race class, used by tests/aco DuckLakeContext.
|
|
run: uv run python -c "import duckdb; duckdb.connect().execute('INSTALL sqlite; INSTALL ducklake')"
|
|
|
|
- name: Pytest
|
|
# -n auto parallelizes across runner cores. Coverage combining
|
|
# is configured via [tool.coverage.run] parallel=true in
|
|
# pyproject.toml — without that the per-worker .coverage.* files
|
|
# don't merge reliably (see #388 for the prior revert).
|
|
run: uv run pytest tests/ -x --cov=src --cov-report=term-missing --cov-fail-under=99 -q -n auto
|
|
|
|
- name: File failure issue
|
|
if: failure()
|
|
env:
|
|
GITEA_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
|
|
run: |
|
|
# Jobs that never install uv (image builds, infra checks) still
|
|
# need it here — otherwise the filer dies with "uv: command not
|
|
# found" and the failure is never filed.
|
|
command -v uv >/dev/null 2>&1 || curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
export PATH="$HOME/.local/bin:$PATH"
|
|
uv sync --no-dev --quiet 2>/dev/null || true
|
|
uv run python -m api.diag.ci \
|
|
--workflow "CI" --job "test" \
|
|
--run "${{ github.run_number }}" \
|
|
--sha "${{ github.sha }}" \
|
|
--ref "${{ github.ref }}" || true
|
|
|
|
notebooks-smoke:
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- name: Checkout
|
|
uses: https://github.com/actions/checkout@v4
|
|
|
|
- name: Set up uv
|
|
run: curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
env:
|
|
UV_INSTALL_DIR: /usr/local/bin
|
|
|
|
- name: Install dependencies
|
|
run: uv sync --dev
|
|
|
|
- name: Stub aco.duckdb
|
|
# The checkout has no data volume; conf.connect.duckdb() opens
|
|
# data/aco.duckdb read-only and fails if it doesn't exist. An
|
|
# empty-but-valid database is enough for the ci-smoke notebooks
|
|
# (schema browsing over information_schema returns zero rows).
|
|
run: |
|
|
[ -f data/aco.duckdb ] || uv run python -c \
|
|
"import duckdb; duckdb.connect('data/aco.duckdb').close()"
|
|
|
|
- name: Run data-independent notebooks headless
|
|
# Executes the [ci_smoke] set from infra/marimo/nb-tests.toml via
|
|
# `marimo export session` and fails on any cell error. Runs on
|
|
# every push (not path-gated): notebooks import src/ modules, so
|
|
# src changes can break them too.
|
|
run: uv run python dev/scripts/nb_integration.py --set ci-smoke
|
|
|
|
- name: File failure issue
|
|
if: failure()
|
|
env:
|
|
GITEA_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
|
|
run: |
|
|
# Jobs that never install uv (image builds, infra checks) still
|
|
# need it here — otherwise the filer dies with "uv: command not
|
|
# found" and the failure is never filed.
|
|
command -v uv >/dev/null 2>&1 || curl -LsSf https://astral.sh/uv/install.sh | sh
|
|
export PATH="$HOME/.local/bin:$PATH"
|
|
uv sync --no-dev --quiet 2>/dev/null || true
|
|
uv run python -m api.diag.ci \
|
|
--workflow "CI" --job "notebooks-smoke" \
|
|
--run "${{ github.run_number }}" \
|
|
--sha "${{ github.sha }}" \
|
|
--ref "${{ github.ref }}" || true
|