遭遇した問題
mypyの結果がローカルマシンとCI (GitHub Actions)で異なる。
ローカルマシンではmypyがエラーを出すのに、CIでは素通りしてしまっていた。
GitHub Actions ワークフローの定義は次のような感じ。
on:
pull_request:
jobs:
test:
runs-on: [self-hosted, linux, x64]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Python
uses: actions/setup-python@v5
with:
python-version: "3.12"
cache: "pip"
- name: Type check with mypy
run: |
mypy --ignore-missing-imports src/**.py tests/**.py
環境
- Self-hosted runner (ubuntu 22.04)
- fish on Debian 12
- mypy 1.10.0
試したこと
- キャッシュ(
.mypy_cache)削除 - verbose logging (
-vオプション)
原因
verbose logging を有効化したところ、CIでは一部のソースファイルしか読んでいないことが判明した。
CIでは、src/直下およびtests/直下のファイルしか読み込んでいなかった。
ローカルマシンではfishを使っており、この環境ではsrc/以下とtests/以下の*.pyファイルを再帰的に読み込んでいた。
以上より、fishとbashの挙動の違いによるものと判定。
調べると、bashではglobstarオプションを有効化しないと**で再帰的な検索が有効とならないことが判明。
以下の修正で、期待の挙動をするようになった。
- name: Type check with mypy
run: |
shopt -s globstar
mypy --ignore-missing-imports src/**/*.py tests/**/*.py
まとめ
- bashで
**による再帰的検索を有効にするには、globstarオプションを設定する必要がある。 - fishとbashはかなり違うのでfishの結果を鵜吞みにしない!
参考