Mypyの結果をGitHubでコメントしてくれるActionを作った


Mypyの結果をGitHubでコメントしてくれるGitHub Action(s)を作ったので、その使用方法と、GitHub Actionを作る過程などのメモです。
https://github.com/marketplace/actions/mypy-action

※もともとflake8を同様の形式で実行するものがあったので、それを参考に作成しています。
https://github.com/marketplace/actions/flake8-action

実行結果イメージ:

使用方法

flake8と併用する場合、以下のようなymlを作成して適当な場所に配置します。
例えば.github/workflows/lint.ymlに配置します。

name: Lint

on:
  push:
    paths:
      - '*.py'

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - name: Setup Python
        uses: actions/setup-python@v1
        with:
          python-version: 3.8
          architecture: x64
      - name: Checkout
        uses: actions/checkout@v1
      - name: Install flake8
        run: pip install flake8
      - name: Install mypy
        run: pip install mypy
      - name: Run flake8
        uses: suo/flake8-github-action@releases/v1
        with:
          checkName: 'lint'   # NOTE: this needs to be the same as the job name
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        if: ${{ always() }}
      - name: Run mypy
        uses: sasanquaneuf/mypy-github-action@releases/v1
        with:
          checkName: 'lint'   # NOTE: this needs to be the same as the job name
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        if: ${{ always() }}

この設定の場合、*.pyに変更があった場合に限りflake8とmypyを実行し、エラーがあった場合にはコメントしてくれます。
併用した場合のコメントイメージは以下のようになります。

作成の過程

モチベーション

flake8/mypyを実行するGitHub Actionを探してみたところ、flake8ではコメントをつけてくれるそれっぽいものがあったので、mypyでも同じものを作ることにしました。

リポジトリの作成

参考にしたのは
https://github.com/suo/flake8-github-action#readme
ですが、GitHubの画面左上に「generated from actions/typescript-action」と書いてあったので、このテンプレートを元にリポジトリを作成しました。

dependabotのPRのマージ

テンプレートから作ったリポジトリですが、いきなりdependabotからPRが来ていたので、テストが壊れていなさそうなものについては試しにマージしてみます。(こんな軽い気持ちでマージしてよいのかという問題もあるのですが、今回はまだ誰も使い始めていないので、初回という事で試しにマージしてみました。)
※「Bump eslint-plugin-github from 4.1.1 to 4.3.0」のi18nのエラーについては、一旦ignoreする設定を組み込んだものの、マージを忘れていたので一旦そのままにしています。

実装

リポジトリをcloneするとmain.tsがあるので、flake8-github-actionの内容を参考にmain.tsの内容を書き換えます。

不要なコードの削除

サンプルの不要なwait.tsとそのテストを削除します。

README.mdとaction.ymlの書き換え

README.mdとaction.ymlの内容を適当な内容に書き換えます。

GitHubの画面からリリース(タグ)を作成

上記の内容を反映してGitHubにpushすると、GitHubのリポジトリの画面上にマーケットプレイスにリリースするかというリンクが表示されているので、そこからリリースを作成する画面に移動し、リリースを作成します。

他のリポジトリで参照して実行できることの確認

他のリポジトリで、flake8-github-actionと同様にmypy-github-actionを参照して動作することを確認します。

感想

GitHub Action(s)はだいぶ簡単に作れるんだなと思いました。
上記の手順についても、実際には「pushした後にリリースの画面でのメッセージによってaction.ymlの設定に気付く」というような事もあり、親切な画面になっているんだなと感じました。
個人的には、よく使っているCircle CIに対する不満は特にないのですが、GitHub上のコメントとしてflake8/mypyの結果を簡単に出せるのは、人によっては便利かなと思いました(flake8/mypyの結果はもともと行数とか出ているので、調べようと思えば簡単に調べられるものではありますが...)