name: Rust on: # NB: this differs from the book's project! # These settings allow us to run this specific CI pipeline for PRs against # this specific branch (a.k.a. book chapter). push: branches: - root-chapter-10-part2 pull_request: types: [opened, synchronize, reopened] branches: - root-chapter-10-part2 env: CARGO_TERM_COLOR: always SQLX_VERSION: 0.8.0 SQLX_FEATURES: "rustls,postgres" jobs: test: name: Test runs-on: ubuntu-latest services: postgres: # Docker Hub image image: postgres:14 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: postgres ports: - 5432:5432 redis: image: redis:7 ports: - 6379:6379 steps: # Downloads a copy of the code in your repository before running CI tests - name: Check out repository code # The uses keyword specifies that this step will run v3 of the actions/checkout action. # This is an action that checks out your repository onto the runner, allowing you to run scripts or other actions against your code (such as build and test tools). # You should use the checkout action any time your workflow will run against the repository's code. uses: actions/checkout@v3 # This GitHub Action installs a Rust toolchain using rustup. It is designed for one-line concise usage and good defaults. - name: Install the Rust toolchain uses: dtolnay/rust-toolchain@stable # A GitHub Action that implements smart caching for rust/cargo projects with sensible defaults. - name: Rust Cache Action uses: Swatinem/rust-cache@v2 with: key: sqlx-${{ env.SQLX_VERSION }} - name: Install sqlx-cli run: cargo install sqlx-cli --version=${{ env.SQLX_VERSION }} --features ${{ env.SQLX_FEATURES }} --no-default-features --locked # The --locked flag can be used to force Cargo to use the packaged Cargo.lock file if it is available. # This may be useful for ensuring reproducible builds, to use the exact same set of dependencies that were available when the package was published. # It may also be useful if a newer version of a dependency is published that no longer builds on your system, or has other problems - name: Install postgresql-client run: sudo apt-get update && sudo apt-get install postgresql-client -y - name: Migrate database run: | sudo apt-get install libpq-dev -y SKIP_DOCKER=true ./scripts/init_db.sh - name: Check sqlx-data.json is up-to-date run: | cargo sqlx prepare --workspace --check - name: Run tests run: cargo test fmt: name: Rustfmt runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - uses: dtolnay/rust-toolchain@stable with: components: rustfmt - name: Enforce formatting run: cargo fmt --check clippy: name: Clippy runs-on: ubuntu-latest services: postgres: image: postgres:14 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: postgres ports: - 5432:5432 steps: - uses: actions/checkout@v3 - uses: dtolnay/rust-toolchain@stable with: components: clippy - uses: Swatinem/rust-cache@v2 with: key: sqlx-${{ env.SQLX_VERSION }} - name: Install sqlx-cli run: cargo install sqlx-cli --version=${{ env.SQLX_VERSION }} --features ${{ env.SQLX_FEATURES }} --no-default-features --locked - name: Install postgresql-client run: sudo apt-get update && sudo apt-get install postgresql-client -y - name: Migrate database run: | sudo apt-get install libpq-dev -y SKIP_DOCKER=true ./scripts/init_db.sh - name: Linting run: cargo clippy -- -D warnings coverage: name: Code coverage runs-on: ubuntu-latest services: postgres: image: postgres:14 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: postgres ports: - 5432:5432 redis: image: redis:7 ports: - 6379:6379 steps: - name: Checkout repository uses: actions/checkout@v3 - uses: dtolnay/rust-toolchain@stable - name: Install libpq run: sudo apt-get update && sudo apt-get install postgresql-client -y - uses: Swatinem/rust-cache@v2 with: key: sqlx-${{ env.SQLX_VERSION }} - name: Install tarpaulin run: cargo install cargo-tarpaulin - name: Install sqlx-cli run: cargo install sqlx-cli --version=${{ env.SQLX_VERSION }} --features ${{ env.SQLX_FEATURES }} --no-default-features --locked - name: Migrate database run: SKIP_DOCKER=true ./scripts/init_db.sh - name: Generate code coverage run: cargo tarpaulin --verbose --workspace