name: CI on: # push: # branches: [] pull_request: branches: [develop, experimental] # Avoid running the same CI multiple times for the same PR concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: # Job 1: Check markdown files markdown: name: Markdown Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 - name: Lint Markdown files uses: DavidAnson/markdownlint-cli2-action@28a7e8bdb81fd8ad675883de92c758ab78e0ce10 # v24 with: globs: '**/*.md' # Job 2: Check code style (very fast) style: name: Format & Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 - name: Install Nightly Rust uses: dtolnay/rust-toolchain@3c5f7ea28cd621ae0bf5283f0e981fb97b8a7af9 with: toolchain: nightly-2026-05-01 components: rustfmt, clippy - name: Check Formatting # This now works with cargo +nightly fmt run: make fmt-check - name: Check workspace architecture run: make architecture-check - name: Lint with Clippy run: make lint - name: Validate native Docker workspace skeleton run: docker build --target workspace-skeleton -f docker/Dockerfile . - name: Validate cross Docker workspace skeleton run: docker build --target rust-toolchain -f docker/cross.Dockerfile . docs: name: Documentation Build runs-on: ubuntu-latest steps: - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 - name: Install mdBook uses: taiki-e/install-action@9114bf4d891761788c546334fd37538eae1bf8b3 # v2 with: tool: mdbook - name: Build documentation run: make docs frontend: name: Frontend Build runs-on: ubuntu-latest steps: - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 - name: Install Rust Tools uses: taiki-e/install-action@9114bf4d891761788c546334fd37538eae1bf8b3 # v2 with: tool: trunk,wasm-bindgen-cli,mdbook - name: Install Stable Rust uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable with: targets: wasm32-unknown-unknown - name: Rust Cache uses: Swatinem/rust-cache@49a0bdc70d2e1b713ca9e2869b211fcce03d3c1c # v2 with: cache-targets: "true" - name: Install wasm tools 128 run: | chmod +x ./bin/install_wasm_tools.sh WASM_TOOLS_BIN="$(./bin/install_wasm_tools.sh 128)" echo "${WASM_TOOLS_BIN}" >> "$GITHUB_PATH" - name: Build frontend with wasm-opt run: | chmod +x ./bin/build_docs.sh ./bin/build_fe.sh ./bin/build_fe.sh release windows: name: Windows Build runs-on: windows-latest permissions: contents: read steps: - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 with: persist-credentials: false - name: Install Stable Rust uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable - name: Rust Cache uses: Swatinem/rust-cache@49a0bdc70d2e1b713ca9e2869b211fcce03d3c1c # v2 # Non-test code only. `--all-targets` would additionally compile the # test modules, ~10 of which still use ungated `std::os::unix` # (alias_repository, xtream_repository, bplustree/v3/publish, # iptv/stalker/client, api_utils, api/model/download, setup_api). # Widening this step means gating those first; the recording module # tree is already `--all-targets`-clean on Windows. - name: Check Windows build run: cargo check --package tuliprox # Job 3: Build and Test (takes longer) test: name: Build & Test runs-on: ubuntu-latest steps: - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 - name: Install Stable Rust uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable - name: Rust Cache # This magic step saves compiled dependencies between runs uses: Swatinem/rust-cache@49a0bdc70d2e1b713ca9e2869b211fcce03d3c1c # v2 - name: Run Tests run: make test admission: name: Admission & Provider Lifecycle runs-on: ubuntu-latest steps: - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 - name: Install Stable Rust uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable - name: Rust Cache uses: Swatinem/rust-cache@49a0bdc70d2e1b713ca9e2869b211fcce03d3c1c # v2 - name: Verify admission and provider lifecycle invariants run: make admission-test testkit: name: Testkit Unit & E2E Scenarios runs-on: ubuntu-latest steps: - uses: actions/checkout@fbc6f3992d24b796d5a048ff273f7fcc4a7b6c09 # v5.1.0 - name: Install Stable Rust uses: dtolnay/rust-toolchain@6bed0761d98439e5a578e2877258200ad565ba87 # stable - name: Rust Cache uses: Swatinem/rust-cache@49a0bdc70d2e1b713ca9e2869b211fcce03d3c1c # v2 - name: Run Testkit Unit Tests run: make testkit-test - name: Run Testkit E2E Scenarios run: make testkit-e2e - name: Upload Testkit Reports if: always() uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: testkit-report path: testkit-report/