塀の備忘録

上伊那ぼたん描いてます

graphql-schema-linterの静的解析をGitHub Actionsで利用する

概要

  • graphql-schema-linterGitHub Actionsで実行し、特定の配下に存在する.graphqlファイルの静的解析を行う。
  • PR差分を静的解析の対象とするためにreviewdogを利用する。

動機

RESTを採用していた前職の現場と異なり、現職の現場ではGraphQLがクエリ言語として採用されていた。

ただ、GraphQLの作法に疎い自分としては、静的解析の力を借りたかったので、localやActionsで上記linterを実行することにした。

YAMLファイル

.github/workflows ディレクトリに今回のlinter用のファイルを新規作成する。

name: graphql-schema-linter
on:
  pull_request:
    paths:
      - "**/*.graphql"

jobs:
  graphql-schema-linter:
    runs-on: ubuntu-latest
    name: runner / graphql-schema-linter
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Setup Node.js
        uses: actions/setup-node@v3
        with:
          node-version: "16"
      - name: Setup reviewdog
        uses: reviewdog/action-setup@v1
        with:
          reviewdog_version: latest
      - name: Lint graphQL schema
        env:
          REVIEWDOG_GITHUB_API_TOKEN: ${{ github.token }}
          BASEPATH: ${{ github.workspace }}
        run: >-
          npx graphql-schema-linter "**/*.graphql" --format compact | reviewdog -efm="%f:%l:%c %m" -reporter=github-pr-review -filter-mode=diff_context

綺麗な書き方ではないが、こんな感じで動作するはず。環境変数はよしなに。

上記では.graphqlファイルの変更差分がpull requestされたら、.graphqlファイルすべてを静的解析した上で、結果をformatterにかけてreviewdogに食わせている。

graphql-schema-linterのデフォルト出力のformatは、

5:1 The object type `QueryRoot` is missing a description.  types-have-descriptions

みたいな感じで、このままではreviewdogに食わせられない。

-format compact オプションをつけてやれば自作のformatterスクリプトなどを介さずとも %f:%l:%c %m 形式で解析結果を吐けるため、reviewdogにはこの形式で入力してやる。

app/schema.graphql:5:1 The object type `QueryRoot` is missing a description. (types-have-descriptions)

reviewdogのオプションを -reporter=github-pr-review 指定することで、PRに解析結果をコメントしてくれる。

おわりに

GraphQLと仲良くなろう。