| name: Lintcheck |
| |
| on: |
| pull_request: |
| paths-ignore: |
| - 'book/**' |
| - 'util/**' |
| - 'tests/**' |
| - '*.md' |
| |
| env: |
| RUST_BACKTRACE: 1 |
| CARGO_INCREMENTAL: 0 |
| |
| concurrency: |
| # For a given workflow, if we push to the same PR, cancel all previous builds on that PR. |
| group: "${{ github.workflow }}-${{ github.event.pull_request.number}}" |
| cancel-in-progress: true |
| |
| jobs: |
| # Runs lintcheck on the PR's target branch and stores the results as an artifact |
| base: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - name: Checkout |
| uses: actions/checkout@v6 |
| with: |
| fetch-depth: 2 |
| # Unsetting this would make so that any malicious package could get our Github Token |
| persist-credentials: false |
| |
| # HEAD is the generated merge commit `refs/pull/N/merge` between the PR and `master`, `HEAD^` |
| # being the commit from `master` that is the base of the merge |
| - name: Checkout base |
| run: git checkout HEAD^ |
| |
| # Use the lintcheck from the PR to generate the JSON in case the PR modifies lintcheck in some |
| # way |
| - name: Checkout current lintcheck |
| run: | |
| rm -rf lintcheck |
| git checkout ${{ github.sha }} -- lintcheck |
| |
| - name: Cache lintcheck bin |
| id: cache-lintcheck-bin |
| uses: actions/cache@v4 |
| with: |
| path: target/debug/lintcheck |
| key: lintcheck-bin-${{ hashfiles('lintcheck/**') }} |
| |
| - name: Build lintcheck |
| if: steps.cache-lintcheck-bin.outputs.cache-hit != 'true' |
| run: cargo build --manifest-path=lintcheck/Cargo.toml |
| |
| - name: Create cache key |
| id: key |
| run: echo "key=lintcheck-base-${{ hashfiles('lintcheck/**') }}-$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT" |
| |
| - name: Cache results JSON |
| id: cache-json |
| uses: actions/cache@v4 |
| with: |
| path: lintcheck-logs/ci_crates_logs.json |
| key: ${{ steps.key.outputs.key }} |
| |
| - name: Run lintcheck |
| if: steps.cache-json.outputs.cache-hit != 'true' |
| run: env CLIPPY_CONF_DIR="$PWD/lintcheck/ci-config" ./target/debug/lintcheck --format json --all-lints --crates-toml ./lintcheck/ci_crates.toml |
| |
| - name: Upload base JSON |
| uses: actions/upload-artifact@v4 |
| with: |
| name: base |
| path: lintcheck-logs/ci_crates_logs.json |
| |
| # Runs lintcheck on the PR and stores the results as an artifact |
| head: |
| runs-on: ubuntu-latest |
| |
| steps: |
| - name: Checkout |
| uses: actions/checkout@v6 |
| with: |
| # Unsetting this would make so that any malicious package could get our Github Token |
| persist-credentials: false |
| |
| - name: Cache lintcheck bin |
| id: cache-lintcheck-bin |
| uses: actions/cache@v4 |
| with: |
| path: target/debug/lintcheck |
| key: lintcheck-bin-${{ hashfiles('lintcheck/**') }} |
| |
| - name: Build lintcheck |
| if: steps.cache-lintcheck-bin.outputs.cache-hit != 'true' |
| run: cargo build --manifest-path=lintcheck/Cargo.toml |
| |
| - name: Run lintcheck |
| run: env CLIPPY_CONF_DIR="$PWD/lintcheck/ci-config" ./target/debug/lintcheck --format json --all-lints --crates-toml ./lintcheck/ci_crates.toml |
| |
| - name: Upload head JSON |
| uses: actions/upload-artifact@v4 |
| with: |
| name: head |
| path: lintcheck-logs/ci_crates_logs.json |
| |
| # Retrieves the head and base JSON results and prints the diff to the GH actions step summary |
| diff: |
| runs-on: ubuntu-latest |
| |
| needs: [base, head] |
| |
| steps: |
| - name: Checkout |
| uses: actions/checkout@v6 |
| with: |
| # Unsetting this would make so that any malicious package could get our Github Token |
| persist-credentials: false |
| |
| - name: Restore lintcheck bin |
| uses: actions/cache/restore@v4 |
| with: |
| path: target/debug/lintcheck |
| key: lintcheck-bin-${{ hashfiles('lintcheck/**') }} |
| fail-on-cache-miss: true |
| |
| - name: Download JSON |
| uses: actions/download-artifact@v5 |
| |
| - name: Store PR number |
| run: echo ${{ github.event.pull_request.number }} > pr.txt |
| |
| - name: Diff results |
| # GH's summery has a maximum size of 1MiB: |
| # https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/workflow-commands-for-github-actions#step-isolation-and-limits |
| # We upload the full diff as an artifact in case it's truncated |
| run: | |
| ./target/debug/lintcheck diff {base,head}/ci_crates_logs.json --truncate | head -c 1M > $GITHUB_STEP_SUMMARY |
| ./target/debug/lintcheck diff {base,head}/ci_crates_logs.json --write-summary summary.json > full_diff.md |
| |
| - name: Upload full diff |
| uses: actions/upload-artifact@v4 |
| with: |
| name: full_diff |
| path: full_diff.md |
| |
| - name: Upload summary |
| uses: actions/upload-artifact@v4 |
| with: |
| name: summary |
| path: | |
| summary.json |
| pr.txt |