name: Rust on: push: branches: [ main ] pull_request: types: [opened, reopened, synchronize] env: CARGO_TERM_COLOR: always jobs: pre_job: continue-on-error: true runs-on: ubuntu-latest # Map a step output to a job output outputs: should_skip: ${{ steps.skip_check.outputs.should_skip }} steps: - id: skip_check uses: fkirc/skip-duplicate-actions@master with: concurrent_skipping: 'outdated_runs' skip_after_successful_duplicate: 'true' paths_ignore: '["**/*.md", "**/docs/**", "example_configs/**", "*.sh"]' do_not_skip: '["workflow_dispatch", "schedule"]' cancel_others: true test: name: cargo test needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest steps: - name: Checkout sources uses: actions/checkout@v3 - uses: Swatinem/rust-cache@v1 - name: Build run: cargo build --verbose --workspace - name: Run tests run: cargo test --verbose --workspace - name: Generate GraphQL schema run: cargo run -- export_graphql_schema -o generated_schema.graphql - name: Check schema run: diff schema.graphql generated_schema.graphql || (echo "The schema file is out of date. Please run `./export_schema.sh`" && false) clippy: name: cargo clippy needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest steps: - name: Checkout sources uses: actions/checkout@v3 - name: Install nightly toolchain uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: nightly override: true components: rustfmt, clippy - uses: Swatinem/rust-cache@v1 - name: Run cargo clippy uses: actions-rs/cargo@v1 with: command: clippy args: --tests --all -- -D warnings format: name: cargo fmt needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' }} runs-on: ubuntu-latest steps: - name: Checkout sources uses: actions/checkout@v3 - name: Install nightly toolchain uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: nightly override: true components: rustfmt, clippy - uses: Swatinem/rust-cache@v1 - name: Run cargo fmt uses: actions-rs/cargo@v1 with: command: fmt args: --all -- --check coverage: name: Code coverage needs: pre_job if: ${{ needs.pre_job.outputs.should_skip != 'true' || (github.event_name == 'push' && github.ref == 'refs/heads/main') }} runs-on: ubuntu-latest steps: - name: Checkout sources uses: actions/checkout@v3 - name: Install Rust run: rustup toolchain install nightly --component llvm-tools-preview && rustup component add llvm-tools-preview --toolchain stable-x86_64-unknown-linux-gnu - uses: taiki-e/install-action@cargo-llvm-cov - uses: Swatinem/rust-cache@v1 - name: Generate code coverage for unit test run: cargo llvm-cov --workspace --no-report - name: Aggregate reports run: cargo llvm-cov --no-run --lcov --output-path lcov.info - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: files: lcov.info fail_ci_if_error: true