💭

GitHub ActionsでPR時にPythonのLinterとテストツールを実行したかった

2022/08/09に公開

mainブランチへのプルリク作成・同期時にPythonのLinter (flake8)とテストツール (pytest)を実行できるようにしました。エラー時は、GitHubのAnnotetionにエラー内容を表示、Slackに通知されるようにしました。
コードは、下記。

Slack通知は、ワークフロービルダーのWebhookを利用しています。そのため、新しいワークフロー公開し、取得したWebhook URLをGitHub ActionsのSecretに「SLACK_WEBHOOK_URL」という名前で保存しておく必要があります。

.github/workflows/python-lint-and-test.yml

name: Python Lint and Test

on:
  pull_request:
    types: [opened, synchronize]
    branches: ["main"]
    paths:
      - "**.py"

permissions:
  contents: read

jobs:
  lint-and-test:
    runs-on: ubuntu-20.04
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Set up Python 3.9
        uses: actions/setup-python@v3
        with:
          python-version: "3.9"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install flake8 pytest
      - name: Add problem matcher
        run: |
          echo "::add-matcher::.github/flake8_error.json"
          echo "::add-matcher::.github/flake8_warning.json"
      - name: Lint with flake8
        run: |
          flake8 . --max-complexity=10 --max-line-length=90
      - name: Test with pytest
        run: |
          pytest
      - name: Notify slack when job failed
        if: ${{ failure() }}
        uses: slackapi/slack-github-action@25e41412fd45a59ddd15477c38c78942ba97b50b
        with:
          payload: |
            {
              "url": "${{github.server_url}}/${{github.repository}}/actions/runs/${{github.run_id}}",
              "workflow": "${{github.workflow}}"
            }
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

.github/flake8_error.json

{
  "problemMatcher": [
    {
      "owner": "flake8-error",
      "severity": "error",
      "pattern": [
        {
          "regexp": "^([^:]+):(\\d+):(\\d+):\\s+(E\\d+\\s+.+)$",
          "file": 1,
          "line": 2,
          "column": 3,
          "message": 4
        }
      ]
    }
  ]
}

.github/flake8_warning.json

{
  "problemMatcher": [
    {
      "owner": "flake8-warning",
      "severity": "warning",
      "pattern": [
        {
          "regexp": "^([^:]+):(\\d+):(\\d+):\\s+(W\\d+\\s+.+)$",
          "file": 1,
          "line": 2,
          "column": 3,
          "message": 4
        }
      ]
    }
  ]
}

※最初のキー名を problemMatcher という名前にしないと正しく動作しないので注意

Discussion