遭遇した問題
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の結果を鵜吞みにしない!
参考