sagittarius 0.2.0

A fast, self-hosted DNS sinkhole in a single Rust binary
Documentation
name: CI

on:
  push:
    branches: [main]
  pull_request:

jobs:
  lint-and-test:
    name: Lint and test
    runs-on: ubuntu-latest
    # Compile-time sqlx queries are checked against the committed .sqlx/ offline
    # cache, so no database is needed to build or test. (The tests themselves
    # create ephemeral SQLite databases at runtime.)
    env:
      SQLX_OFFLINE: "true"

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable
        with:
          components: rustfmt, clippy

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Check formatting
        run: cargo fmt --all --check

      - name: Clippy
        run: cargo clippy --all-targets -- -D warnings

      - name: Tests
        run: cargo test

  sqlx-cache:
    name: sqlx offline cache is up to date
    runs-on: ubuntu-latest
    # This job verifies the committed .sqlx/ cache matches the current queries
    # and schema. It connects to a freshly-migrated database (no SQLX_OFFLINE),
    # so a query or migration change that wasn't followed by `cargo sqlx prepare`
    # fails here.
    env:
      DATABASE_URL: "sqlite://ci-dev.db"

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Install sqlx-cli
        uses: taiki-e/install-action@v2
        with:
          tool: sqlx-cli

      - name: Create and migrate the database
        run: |
          cargo sqlx database create
          cargo sqlx migrate run

      - name: Verify .sqlx offline cache is current
        run: cargo sqlx prepare --check -- --all-targets

  package:
    name: crate packages cleanly
    runs-on: ubuntu-latest
    # Catch packaging regressions (missing migrations / embedded assets /
    # license files, or a crate that won't build from its packaged tarball)
    # on every PR, long before a release tag triggers the real publish.
    env:
      SQLX_OFFLINE: "true"

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@stable

      - name: Cache dependencies
        uses: Swatinem/rust-cache@v2

      - name: Dry-run publish
        run: cargo publish --dry-run --locked