diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..c633e34 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,173 @@ +name: CI + +on: + pull_request: + branches: ["*"] + push: + branches: ["main", "master"] + +env: + CARGO_TERM_COLOR: always + MIX_ENV: test + +jobs: + rust-checks: + name: Rust Checks + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + rust: [stable] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ matrix.rust }} + components: rustfmt, clippy + + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + native/libsqlex/target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Check Rust formatting + run: cargo fmt --check --manifest-path native/libsqlex/Cargo.toml + + - name: Run Clippy + run: cargo clippy --manifest-path native/libsqlex/Cargo.toml --all-targets --all-features + # Note: Currently not treating warnings as errors due to await_holding_lock warnings + # These should be addressed in a future PR by using async-aware Mutex types + + - name: Run Rust tests + run: cargo test --manifest-path native/libsqlex/Cargo.toml --all-features + + elixir-tests: + name: Elixir ${{ matrix.elixir }} / OTP ${{ matrix.otp }} / ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + elixir: ['1.18.0', '1.17.0'] + otp: ['27.0', '26.2'] + exclude: + # OTP 27 requires Elixir 1.17+ + - elixir: '1.16.0' + otp: '27.0' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + with: + toolchain: stable + + - name: Cache Rust dependencies + uses: actions/cache@v4 + with: + path: | + ~/.cargo/bin/ + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + native/libsqlex/target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo- + + - name: Set up Elixir + uses: erlef/setup-beam@v1 + with: + elixir-version: ${{ matrix.elixir }} + otp-version: ${{ matrix.otp }} + + - name: Cache Mix dependencies + uses: actions/cache@v4 + with: + path: | + deps + _build + key: ${{ runner.os }}-mix-${{ matrix.elixir }}-${{ matrix.otp }}-${{ hashFiles('**/mix.lock') }} + restore-keys: | + ${{ runner.os }}-mix-${{ matrix.elixir }}-${{ matrix.otp }}- + + - name: Install Mix dependencies + run: mix deps.get + + - name: Check Elixir formatting + run: mix format --check-formatted + + - name: Compile (warnings as errors) + run: mix compile --warnings-as-errors + + - name: Run Elixir tests + run: mix test + + integration-test: + name: Integration Tests + runs-on: ubuntu-latest + needs: [rust-checks, elixir-tests] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Rust + uses: dtolnay/rust-toolchain@stable + + - name: Set up Elixir + uses: erlef/setup-beam@v1 + with: + elixir-version: '1.18.0' + otp-version: '27.0' + + - name: Cache dependencies + uses: actions/cache@v4 + with: + path: | + deps + _build + ~/.cargo + native/libsqlex/target/ + key: ${{ runner.os }}-integration-${{ hashFiles('**/mix.lock', '**/Cargo.lock') }} + + - name: Install dependencies + run: mix deps.get + + - name: Compile project + run: mix compile + + - name: Run full test suite + run: mix test --trace + + all-checks-pass: + name: All Checks Pass + runs-on: ubuntu-latest + needs: [rust-checks, elixir-tests, integration-test] + if: always() + + steps: + - name: Check if all jobs passed + run: | + if [ "${{ needs.rust-checks.result }}" != "success" ] || \ + [ "${{ needs.elixir-tests.result }}" != "success" ] || \ + [ "${{ needs.integration-test.result }}" != "success" ]; then + echo "One or more checks failed" + exit 1 + fi + echo "All checks passed successfully!"