概要
- graphql-schema-linterをGitHub 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と仲良くなろう。