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-07-part2 pull_request: types: [opened, synchronize, reopened] branches: - root-chapter-07-part2 env: CARGO_TERM_COLOR: always SQLX_VERSION: 0.8.0 SQLX_FEATURES: "rustls,postgres" APP_USER: app APP_USER_PWD: secret APP_DB_NAME: newsletter jobs: test: name: Test runs-on: ubuntu-latest # Service containers to run alongside the `test` container job services: postgres: # Docker Hub image image: postgres:14 env: POSTGRES_USER: postgres POSTGRES_PASSWORD: password POSTGRES_DB: postgres ports: - 5432:5432 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 v4 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@v4 # This GitHub Action installs a Rust toolchain using rustup. It is designed for one-line concise usage and good defaults. # It also takes care of caching intermediate build artifacts. - name: Install the Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 - 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: Create app user in Postgres run: | sudo apt-get install postgresql-client # Create the application user CREATE_QUERY="CREATE USER ${APP_USER} WITH PASSWORD '${APP_USER_PWD}';" PGPASSWORD="password" psql -U "postgres" -h "localhost" -c "${CREATE_QUERY}" # Grant create db privileges to the app user GRANT_QUERY="ALTER USER ${APP_USER} CREATEDB;" PGPASSWORD="password" psql -U "postgres" -h "localhost" -c "${GRANT_QUERY}" - name: Migrate database run: | SKIP_DOCKER=true ./scripts/init_db.sh - name: Run tests run: cargo test - name: Check that queries are fresh run: cargo sqlx prepare --workspace --check -- --all-targets # `fmt` container job fmt: name: Rustfmt runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install the Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: components: rustfmt - name: Enforce formatting run: cargo fmt --check clippy: name: Clippy runs-on: ubuntu-latest env: SQLX_OFFLINE: true steps: - uses: actions/checkout@v4 - name: Install the Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: components: clippy - 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 steps: - uses: actions/checkout@v4 - name: Install the Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@v1 with: components: llvm-tools-preview - name: Install sqlx-cli run: cargo install sqlx-cli --version=${{ env.SQLX_VERSION }} --features ${{ env.SQLX_FEATURES }} --no-default-features --locked - name: Create app user in Postgres run: | sudo apt-get install postgresql-client # Create the application user CREATE_QUERY="CREATE USER ${APP_USER} WITH PASSWORD '${APP_USER_PWD}';" PGPASSWORD="password" psql -U "postgres" -h "localhost" -c "${CREATE_QUERY}" # Grant create db privileges to the app user GRANT_QUERY="ALTER USER ${APP_USER} CREATEDB;" PGPASSWORD="password" psql -U "postgres" -h "localhost" -c "${GRANT_QUERY}" - name: Migrate database run: SKIP_DOCKER=true ./scripts/init_db.sh - name: Install cargo-llvm-cov uses: taiki-e/install-action@cargo-llvm-cov - name: Generate code coverage run: cargo llvm-cov --all-features --workspace --lcov --output-path lcov.info - name: Generate report run: cargo llvm-cov report --html --output-dir coverage - uses: actions/upload-artifact@v4 with: name: "Coverage report" path: coverage/