GitHub Actions + reviewdogでtextlintを実行する

Blog

この記事では、文章校正ツールであるtextlintのチェックでエラーになったときの結果を、GitHubのPull Requestへコメントする設定について説明します。 textlintはGitHub Actionsを使って実行し、reviewdogを使ってPull Requestへコメントします。

reviewdogはGitHub Actionsで使えるDockerベースのPublic reviewdog actionsを公開しています。

しかしtextlint用のactionsはないので、この記事ではワークフローの定義ファイルを自作します。

動作を確認した環境

GitHub Actionsのワークフローの作成

  1. GitHub Actionsを設定するリポジトリを準備します。

  2. GitHub Actionsのワークフローの定義ファイルは.github/workflowsの下に置きます。この記事では、ワークフローの定義ファイルはreviewdog.ymlとしました。

    mkdir -p .github/workflows
    touch .github/workflows/reviewdog.yml
    
  3. .github/workflows/reviewdog.ymlのファイルの内容には、以下を記述します。

    name: 'Run textlint with reviewdog'
    on: [pull_request]
    jobs:
      textlint:
        runs-on: Ubuntu-latest
        container:
          image: node:current-alpine
          env:
            LEVEL: error
            FLAGS: src/
        steps:
          - uses: actions/checkout@v1
          - name: setup-reviewdog
            run: |
              mkdir -p $HOME/bin && wget -O - -q https://raw.githubusercontent.com/reviewdog/reviewdog/master/install.sh \
                | sh -s -- -b /usr/local/bin/ v0.9.13
              apk --update add git && \
                rm -rf /var/lib/apt/lists/*
          - name: installl-textlint
            run: |
              cd "$GITHUB_WORKSPACE"
              if [ ! -f "$(npm bin)/textlint" ]; then
                npm install
              fi
          - name: run-reviewdog
            env:
              REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }}
            run: |
              $(npm bin)/textlint -f checkstyle "${FLAGS:-'.'}" \
                | reviewdog -f=checkstyle -name="textlint" -diff="git diff ${{ github.event.pull_request.base.ref }}" -reporter=github-pr-review -level="${LEVEL}"
    
    • LEVELはreviewdogのエラーレベルを設定します。infowarningerrorを指定できます。
    • FLAGSはtextlintをかけたいMarkdownファイルがあるディレクトリを指定します。
    • ${{ secrets.GITHUB_TOKEN }}と記述すると、GitHub側が自動でGitHubトークンを作成します。このトークンは${{ secrets.GITHUB_TOKEN }}を使ったステップでのみ参照されます。

textlintの設定

textlintのルールプリセットはpreset-ja-technical-writingを使っています。

  1. 利用するnpmパッケージをpackage.jsonに追加します。

    npm init -y
    npm install -D textlint textlint-rule-preset-ja-technical-writing
    
  2. .textlintrcを作成し、次の内容を追記します。

    {
      "plugins": {
        "@textlint/markdown": {
          "extensions": [".md"]
        }
      },
      "rules": {
        "preset-ja-technical-writing": true
      }
    }
    

GitHubへの反映

作成したファイル群を定義ファイルをリモートにプッシュします。

git add .
git commit -m "Added: reviewdog workflow"
git push origin master

動作確認

わざとlintエラーになるファイルを作成し、別ブランチにpushしてプルリクを作ってみます。

  1. exampleブランチを作成し、src/example.mdとしてエラーになるファイルを作ります。

    git checkout -b example
    mkdir src
    touch src/example.md
    
  2. src/example.mdの内容はこんな感じです。

    # Example
    
    これはサンプルです。
    `src` ディレクトリ以下に textlint を実行したい Markdown ファイルを置きます。
    このディレクトリは `.github/workflows/reviewdog.yml``FLAGS` で変更することができます。
    
  3. リモートにpushします。

    git add src/example.md
    git commit -m "Added: error sample file"
    git push origin example
    
  4. GitHub.comの画面を開きます。masterブランチに対して、exampleをマージするプルリクを作成します。

  5. [Actions]タブを開きます。プルリクを作成すると、Actionsの実行ログを確認できます。

  6. lintエラーが発生している場合は、こんな風にプルリクに対してエラー内容がコメントされます。

参考