actionsに利用可能なlinterの存在チェックにも使えるsuper-linterを試してみた

GitHub Actions上で使えるlinterってどのくらいあるのかなーと検索して見つけたActionが、GitHub公式提供の、Actions上で利用確認がとれたlinter一覧にも使えるActionでした。
2021.09.30

ソースコードのlinterはなるだけ編集時に行っておきたいものですが、merge作業でうっかり衝突した時等、個別に見て回るのがなかなかしんどいケースもあります。そしてそんな時のためのごったにlinter Actionも存在します。

文字通りSuperなlinterです。GitHub公式が管理しており、サポートしている言語は計47。Web上で見かけるメジャーな言語は全てカバーしています。直近だとactionlintも含みます。さすがStar 7.2kといったところ。

サンプル中にあるpush時に使うのは少々辛いとは感じましたが、用途によっては便利に使えそうなので紹介してみます。

使い方

ブランチを対象に、正規表現にてファイルを指定し、環境変数にてlintしない言語を指定します。デフォルトで全部lintします。

---
name: Lint Code Base
on:
  pull_request:
    branches: [master, main]

jobs:
  build:
    name: Lint Code Base
    runs-on: ubuntu-latest
    steps:
      - name: Checkout Code
        uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - name: Lint Code Base
        uses: github/super-linter@v4
        env:
          VALIDATE_ALL_CODEBASE: false
          DEFAULT_BRANCH: master
          FILTER_REGEX_INCLUDE: '\.github/.*/.*\.yml'

Actionを実行すると以下のようなフォーマットで出力されます。

--------------------------------------------------------------------------------

                              /@@#///////@@/(@//@%/(@.@(       @@
                          @@//////////////////////////////#*  @@@
                        @////@//(///////////@@@@@///@//@/@**//@@(
                      @///////@///////////////@@@@    (           @,
                     @/(&/@////////////////////                     @
                    @////////////////////////@@                      @
                  @%////////(//////////%/////&@            @@       *,@           ______________
             @@@@@/@/#/////(&//////////////////                       .@         /              \
        *@@@@@.    .%///(//@//////////////////&.   .@@,                 @%      / Don't mind me  \
      @@%           .&@&&/@.@//&/////(//////////    @@@@@@@@@         .. &@    / I'm just looking \
    @@%               @@@@@   @&/////////////////#   @/       V  @@/ ,@@@ @   <  for some trash... |
@@@%                   @@@@        .%@@@@//////#@ @   @@         @     .,.     \__________________/
                                          @@@/@(  (@@@@% @/\      %
                                           @@@@(    .     .@@/\   #
                                             @                  %@%

--------------------------------------------------------------------------------
2021-09-29 15:08:24 [INFO]   ---------------------------------------------
2021-09-29 15:08:24 [INFO]   --- GitHub Actions Multi Language Linter ----
2021-09-29 15:08:24 [INFO]    - Image Creation Date:[]
2021-09-29 15:08:24 [INFO]    - Image Revision:[ec410c9131fbba3d1c4d315115e690fbd5ea7522]
2021-09-29 15:08:24 [INFO]    - Image Version:[ec410c9131fbba3d1c4d315115e690fbd5ea7522]
2021-09-29 15:08:24 [INFO]   ---------------------------------------------
2021-09-29 15:08:24 [INFO]   ---------------------------------------------
2021-09-29 15:08:24 [INFO]   The Super-Linter source code can be found at:
2021-09-29 15:08:24 [INFO]    - https://github.com/github/super-linter
2021-09-29 15:08:24 [INFO]   ---------------------------------------------
2021-09-29 15:08:24 [INFO]   --------------------------------------------
2021-09-29 15:08:24 [INFO]   Gathering GitHub information...
2021-09-29 15:08:24 [INFO]   Successfully found:[GITHUB_SHA], value:[xxxxxxxxxxxxxxxxxxxxxx]
2021-09-29 15:08:24 [INFO]   Successfully found:[GITHUB_WORKSPACE], value:[/github/workspace]
2021-09-29 15:08:24 [INFO]   Successfully found:[GITHUB_EVENT_PATH], value:[/github/workflow/event.json]
2021-09-29 15:08:24 [INFO]   Successfully found:[GITHUB_REPO], value:[workflow-test]
2021-09-29 15:08:24 [ERROR]   Failed to get [GITHUB_TOKEN]!
2021-09-29 15:08:24 [ERROR]   []
2021-09-29 15:08:24 [ERROR]   Please set a [GITHUB_TOKEN] from the main workflow environment to take advantage of multiple status reports!
2021-09-29 15:08:24 [INFO]   --------------------------------------------
2021-09-29 15:08:24 [INFO]   Gathering user validation information...
2021-09-29 15:08:24 [INFO]   - Only validating [new], or [edited] files in code base...
2021-09-29 15:08:30 [WARN]   No files were found in the GITHUB_WORKSPACE:[/github/workspace] to lint!
2021-09-29 15:08:30 [INFO]   ---------------------------------
2021-09-29 15:08:30 [INFO]   ------ File list to check: ------
2021-09-29 15:08:30 [INFO]   ---------------------------------
2021-09-29 15:08:30 [INFO]   ----------------------------------------------
2021-09-29 15:08:30 [INFO]   Successfully gathered list of files...
2021-09-29 15:08:33 [INFO]   ----------------------------------------------
2021-09-29 15:08:33 [INFO]   ----------------------------------------------
2021-09-29 15:08:33 [INFO]   The script has completed
2021-09-29 15:08:33 [INFO]   ----------------------------------------------
2021-09-29 15:08:33 [INFO]   ----------------------------------------------
2021-09-29 15:08:33 [NOTICE]   All file(s) linted successfully with no errors detected
2021-09-29 15:08:33 [INFO]   ----------------------------------------------

Action側でlint対象言語をカバーしてくれるため、利用者側の負担が増さないの人気の理由だと思われますが、ネックもあります。

実行ごとに1分30秒のセットアップ時間が掛かります。流石にpush毎に行うのは非常に時間が掛かりそうです。

あとがき

個別にlinter指定するのは中々手間だなと思い、もうちょっと手軽にできる手段はないかと探していたところ、GitHub公式にてメンテナンスしているごった煮linterへたどり着きました。基本は個別にlintを掛けるほうが効率がよいかもしれず、様々な事情で利用言語数が膨大になった時には適したlinterかもしれません。

また、直接使わずとも、このActionを参照することで求めるlinterが存在するかを手軽に確認できる、という使い方もあります。このActionの更新通知を受け取るようにしておくだけでも役立つかもしれません。