workflow: produce a diff of the mypy errors before/after a PR

A new job now runs on PRs. It will automatically run mypy on the target
branch and on the source branch. It will generate a diff of the errors,
showing the new ones and showing the ones that have been fixed.

It will also show a summary with the number of errors before/after the
PR.

Because we have so many false positive, it makes no sense to mark this
job red. So we always make it green (unless mypy can't run).

As for now, it's up to developers to go check if any new error is
introduced.

If a line that used to produce a mypy error gets moved, it will be
reported as:

 * a fixed error
 * a newly introduced error

This is suboptimal and ideally we should have a way to detect moves.

Signed-off-by: Olivier Gayot <olivier.gayot@canonical.com>
This commit is contained in:
Olivier Gayot 2023-05-16 10:57:20 +02:00
parent 02bfe89c93
commit 5bf3f6a818
1 changed files with 39 additions and 0 deletions

View File

@ -30,3 +30,42 @@ jobs:
- uses: actions/checkout@v2
- name: lint
run: sudo ./scripts/test-in-lxd.sh ${{ matrix.image }} "make lint"
static-typing:
# In this job, we compare the output of mypy before and after the PR.
if: github.event_name == 'pull_request'
runs-on: ubuntu-22.04
steps:
- name: Install mypy and typeshed
run: sudo apt-get install -y python3-mypy python3-typeshed
- name: Checkout the pull request branch
uses: actions/checkout@v3
with:
# When no ref is specified, a merge commit (from PR branch to target
# branch) will be checked out. Use the last commit of the PR branch
# instead.
ref: ${{ github.event.pull_request.head.sha }}
# By default, no ancestors of the specified revision will be checked
# out (see shallow repositories). Let's fetch just enough revisions
# so that, later, we can access the most recent common ancestor.
# If it does not work, we can set fetch-depth: 0
fetch-depth: $(( ${{ github.event.pull_request.commits }} + 1 ))
- name: Run mypy on pull request branch
run: python3 -m mypy --ignore-missing-imports --check-untyped-defs subiquity subiquitycore system_setup console_conf scripts/replay-curtin-log.py | tee /tmp/mypy-head.out
- name: Determine base commit (most recent common ancestor)
id: determine_base_commit
run: |
ancestor=$(git merge-base -- \
"${{ github.event.pull_request.base.sha }}" \
"${{ github.event.pull_request.head.sha }}")
echo "base_commit=$ancestor" >> "$GITHUB_OUTPUT"
- name: Checkout the base commit (most recent common ancestor)
uses: actions/checkout@v3
with:
ref: ${{ steps.determine_base_commit.outputs.base_commit }}
- run: git show
- name: Run mypy on base commit
run: python3 -m mypy --ignore-missing-imports --check-untyped-defs subiquity subiquitycore system_setup console_conf scripts/replay-curtin-log.py | tee /tmp/mypy-base.out
- name: Produce the diff between the two mypy runs
run: diff --color=always --unified=0 /tmp/mypy-base.out /tmp/mypy-head.out
continue-on-error: true