okuzawatsの日記

モバイルアプリケーション開発の沼💀

GitHub Actionsでyamlにlintをかける

書いている人

モバイルアプリケーションアーキテクトとして働いています。モバイルアプリケーションのアーキテクチャ、自動テスト、CI/CDに興味があります。


yamlのlinterとしてadrienverge/yamllint(以下、yamllintと呼ぶ)が広く使われています。また、yamllintをGitHub Actions上で実行し、GitHubのPull Requesetに指摘事項をコメントするためのactionとして、reviewdog/action-yamllint(以下、action-yamllintと呼ぶ)が存在します。

話としては「action-yamllintを使いましょう」で終わってしまうんですが、備忘のために使用例を示します。

まずはyamllintの設定用ファイルである、.yamllint を作成し、ルールを記述します。ルールの詳細については、yamllintのドキュメントを参照してください。また、このルールについては、GitHubActionsのCI/CDにyamllintを組み込んで作業の安全性を高めるを参考にして作成しました。

yaml-files:
  - '*.yaml'
  - '*.yml'

rules:
  braces:
    level: warning
    min-spaces-inside: 1
    max-spaces-inside: 1
  brackets:
    level: warning
    min-spaces-inside: 1
    max-spaces-inside: 1
  colons:
    level: warning
  commas:
    level: warning
  comments:
    level: warning
    min-spaces-from-content: 1
  comments-indentation: disable
  document-end: disable
  document-start: disable
  empty-lines: disable
  empty-values: disable
  hyphens: disable
  indentation:
    level: warning
    indent-sequences: consistent
  key-duplicates: enable
  key-ordering: disable
  line-length: disable
  new-line-at-end-of-file:
    level: warning
  new-lines: enable
  octal-values: disable
  quoted-strings:
    quote-type: double
  trailing-spaces: disable
  truthy: disable

次に、GitHub Actionsのワークフローを書いていきます。典型的な設定例だと思いますので、説明は割愛します。「TODO」としている箇所に、action-yamllintのステップを追加していきます。

name: "yamllint"

on:
  pull_request:
    branches:
      - "main"
    types: [ "opened", "synchronize" ]

jobs:
  yamllint:
    runs-on: "ubuntu-latest"
    steps:
      - name: "checkout"
        uses: "actions/checkout@v4"
      # TODO

action-yamllintのステップを追加します。TODOとしている箇所を以下のように置き換えます。

      - name: "review yaml format"
        uses: "reviewdog/action-yamllint@v1"
        with:
          github_token: "${{ secrets.GITHUB_TOKEN }}"
          reporter: "github-pr-review"
          level: "warning"
          yamllint_flags: "-c .yamllint ./.github/workflows/"
          fail_on_error: true

yamllint_flags に上述の .yamllint と対象となるyamlの置かれたパス(今回はGitHub Actionsのワークフローファイルの置かれるパス)を渡しています。

また、fail_on_errortrue に設定することで、yamlのlintにwarningがあった場合( level オプションで設定)にCIを失敗させています。GitHubActionsのCI/CDにyamllintを組み込んで作業の安全性を高めるでは、CIを失敗させるために他のactionと併用する方法が紹介されていますが、この fail_on_error オプションを利用することで、action-yamllintのみで完結させることができます。

お気付きでしょうか。上記のGitHub Actionsのワークフローのyamlについても、.yamllint に設定したルールでlintがかけられています。

元は、手癖で以下のようにyamlを書いていました。

name: yamllint

on:
  pull_request:
    branches:
      - "main"
    types: [opened, synchronize]

今回作成したGitHub Actionsのワークフローにより、上記のyamlについて以下のようなコメントがPull Requestに付けられ、yamlのlintエラーとなっている箇所が指摘されます。

GitHub Actionsにおいてyamllintとaction-yamllintを活用することで、yamlを健全な状態に保つことができるようになります。

References

  1. adrienverge/yamllint: A linter for YAML files.
  2. reviewdog/action-yamllint: Run yamllint with reviewdog
  3. GitHubActionsのCI/CDにyamllintを組み込んで作業の安全性を高める #YAML - Qiita

Related