name: Lintcheck on: pull_request 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@v4 with: fetch-depth: 2 # 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: ./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@v4 - 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: ./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@v4 - 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@v4 - name: Diff results # GH's summery has a maximum size of 1024k: # https://docs.github.com/actions/using-workflows/workflow-commands-for-github-actions#adding-a-markdown-summary # That's why we first log to file and then to the summary and logs run: | ./target/debug/lintcheck diff {base,head}/ci_crates_logs.json --truncate >> truncated_diff.md head -c 1024000 truncated_diff.md >> $GITHUB_STEP_SUMMARY cat truncated_diff.md ./target/debug/lintcheck diff {base,head}/ci_crates_logs.json >> full_diff.md - name: Upload full diff uses: actions/upload-artifact@v4 with: name: diff if-no-files-found: ignore path: | full_diff.md truncated_diff.md