name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1
jobs:
check-skip:
name: Check Skip
runs-on: ubuntu-latest
outputs:
should_skip: ${{ steps.check.outputs.should_skip }}
steps:
- name: Check if release PR
id: check
env:
COMMIT_MSG: ${{ github.event.head_commit.message }}
run: |
if [[ "${{ github.actor }}" == "github-actions[bot]" ]] || \
[[ "$COMMIT_MSG" == chore:\ release* ]]; then
echo "should_skip=true" >> $GITHUB_OUTPUT
echo "Skipping CI for release PR/commit"
else
echo "should_skip=false" >> $GITHUB_OUTPUT
fi
lint:
name: Lint
needs: check-skip
if: needs.check-skip.outputs.should_skip != 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@nightly
with:
components: rustfmt, clippy
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: nightly
save-if: ${{ github.ref == 'refs/heads/main' }}
- name: Check formatting
run: cargo fmt --all -- --check
- name: Run clippy
run: cargo clippy --all-features -- -D warnings
test:
name: Test
runs-on: ubuntu-latest
needs: [check-skip, lint]
if: needs.check-skip.outputs.should_skip != 'true'
steps:
- uses: actions/checkout@v4
- name: Get Rust version
id: rust-version
run: |
RUST_VERSION=$(grep '^rust-version = ' Cargo.toml | sed 's/rust-version = "\(.*\)"/\1/')
echo "version=$RUST_VERSION" >> $GITHUB_OUTPUT
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ steps.rust-version.outputs.version }}
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: msrv
save-if: ${{ github.ref == 'refs/heads/main' }}
- name: Start Postgres
run: |
docker compose up -d postgres
sleep 5
- name: Run tests
run: cargo test --workspace --features "rusqlite,libsql,postgres-sync,uuid,serde" -- --test-threads=1
- name: Run example
run: cargo run --example rusqlite --features "rusqlite,uuid,serde"
- name: Stop Postgres
run: docker compose down
test-turso:
name: Test (Turso - Experimental)
runs-on: ubuntu-latest
needs: [check-skip, lint]
if: needs.check-skip.outputs.should_skip != 'true'
continue-on-error: true
steps:
- uses: actions/checkout@v4
- name: Get Rust version
id: rust-version
run: |
RUST_VERSION=$(grep '^rust-version = ' Cargo.toml | sed 's/rust-version = "\(.*\)"/\1/')
echo "version=$RUST_VERSION" >> $GITHUB_OUTPUT
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
toolchain: ${{ steps.rust-version.outputs.version }}
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: msrv
save-if: ${{ github.ref == 'refs/heads/main' }}
- name: Run tests
id: test
run: |
mkdir -p test-output
cargo test --workspace --features "turso,uuid,serde" -- --test-threads=1 2>&1 | tee test-output/output.txt || true
if grep -q "FAILED" test-output/output.txt; then
echo "has_failures=true" >> $GITHUB_OUTPUT
echo "::warning::Turso tests failed (expected - turso is experimental)"
else
echo "has_failures=false" >> $GITHUB_OUTPUT
echo "::notice::Turso tests passed"
fi
- name: Upload failure logs
if: steps.test.outputs.has_failures == 'true'
uses: actions/upload-artifact@v4
with:
name: turso-test-logs
path: test-output/output.txt
retention-days: 7
docs:
name: Documentation
runs-on: ubuntu-latest
needs: [check-skip, lint]
if: needs.check-skip.outputs.should_skip != 'true'
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: stable
save-if: ${{ github.ref == 'refs/heads/main' }}
- name: Check documentation
run: cargo doc --all-features --no-deps
build-matrix:
name: Build (${{ matrix.rust }})
runs-on: ubuntu-latest
needs: [check-skip, lint]
if: needs.check-skip.outputs.should_skip != 'true'
strategy:
matrix:
rust: [stable, nightly]
steps:
- uses: actions/checkout@v4
- name: Install Rust ${{ matrix.rust }}
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: ${{ matrix.rust }}
save-if: ${{ github.ref == 'refs/heads/main' }}
- name: Build
run: cargo build --all-features
msrv:
name: MSRV Check
runs-on: ubuntu-latest
needs: [check-skip, lint]
if: needs.check-skip.outputs.should_skip != 'true'
steps:
- uses: actions/checkout@v4
- name: Get Rust version
id: rust-version
run: |
RUST_VERSION=$(grep '^rust-version = ' Cargo.toml | sed 's/rust-version = "\(.*\)"/\1/')
echo "version=$RUST_VERSION" >> $GITHUB_OUTPUT
- name: Install Rust (MSRV)
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ steps.rust-version.outputs.version }}
- name: Cache Rust dependencies
uses: Swatinem/rust-cache@v2
with:
shared-key: msrv
save-if: ${{ github.ref == 'refs/heads/main' }}
- name: Check MSRV
run: cargo check --all-features