githubのsuper linterで盛大にはまった

結論

masterにpushしない

理由

masterにpushした場合、master(push済み)とmasterにpushしたブランチを比較して差分を取り出す。 つまり、masterとmasterを比較して差分がないのでlinterが走らない。 VALIDATE_ALL_CODEBASEというフラグがある(default true)ので、それをtrueにすれば、masterにpushしてもlinterが走る。(全ファイルにlinterが実行されるのでおすすめできない。)

以下経緯

twitterをみてたらこんなのが流れてきた

https://twitter.com/github/status/1273678425123893249?s=21

!! super linter !!

名前がかっこいいので、絶対に週末に遊ぼうと決めていた

色々見てみると、どうやらいろんなlinterをまとめたgithub actionのようで、いろんなファイルに対応している

引用: https://github.com/github/super-linter/blob/master/README.md

Language Linter
Ansible ansible-lint
CSS stylelint
CoffeeScript coffeelint
Dockerfile dockerfilelint
Golang golangci-lint
JavaScript eslint standard js
JSON jsonlint
Markdown markdownlint
Perl perl
Python3 pylint
Ruby RuboCop
Shell Shellcheck
Terraform tflint
TypeScript eslint standard js
XML LibXML
YAML YamlLint
ENV dotenv-linter

JavaScriptあったのでやってみた。

以下ファイルを設定するだけで使える。

以下だと、masterにpushかprをした場合に実行される。

/.github/workflows/linter.yml

###########################
###########################
## Linter GitHub Actions ##
###########################
###########################
name: Lint Code Base

#
# Documentation:
# https://help.github.com/en/articles/workflow-syntax-for-github-actions
#

#############################
# Start the job on all push #
#############################
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

###############
# Set the Job #
###############
jobs:
  build:
    # Name the Job
    name: Lint Code Base
    # Set the agent to run on
    runs-on: ubuntu-latest

    ##################
    # Load all steps #
    ##################
    steps:
      ##########################
      # Checkout the code base #
      ##########################
      - name: Checkout Code
        uses: actions/checkout@v2

      ################################
      # Run Linter against code base #
      ################################
      - name: Lint Code Base
        uses: docker://github/super-linter:v2.1.1
        env:
          VALIDATE_ALL_CODEBASE: false

ymlファイルを作ったら、あとはテスト用のJavaScriptファイルを作成する。

const     github =                       'super-linter'
  console.log(github)

       function greeting(){
                                     return 'hello'
       }

    
   var greet = greeting

 console.log (                 greet   (    )   )

とりあえずこんだけ乱れていればなんか引っかかるだろうというファイルができた。これをpushする。

pushしたが、普通にpush成功してしまった。

push: Update lintTest.js · kajiri-sandbox/github-super-linter@5ebd05d · GitHub

f:id:kazuki_nakamura:20200621164531p:plain

ログを見ると、差分がないらしい。

super-linterのソースコードを確認した結果、DEFAULT_BRANCHとGITHUB_SHAを比較していることがわかった。

ソースコード引用: https://github.com/github/super-linter/blob/0517361f101868c6f3c357d1ca511dd4b6852418/lib/linter.sh#L1268

  RAW_FILE_ARRAY=($(cd "$GITHUB_WORKSPACE" || exit; git diff --name-only "$DEFAULT_BRANCH..$GITHUB_SHA" --diff-filter=d 2>&1))

つまり、

masterにhoge-branchをpush

hoge-branchが反映されたmasterとhoge-branchを比較

差分がないので、lintが実行されない。

という現象が起きていた。

なので、prをmasterにだすと、、、

pr: Update lintTest.js by kajirikajiri · Pull Request #1 · kajiri-sandbox/github-super-linter · GitHub

f:id:kazuki_nakamura:20200621164831p:plain

github-action: Update lintTest.js by kajirikajiri · Pull Request #1 · kajiri-sandbox/github-super-linter · GitHub

想定通り、lintが実行されてエラーが発生した。

めでたしめでたし

lint --fix しようとしたけど、やりかたわかんなかった。

以下テンプレートを持ってくればできそうな雰囲気を感じたが、オプション(eslintrcみたいな)しか設定できないっぽい。 --fixがcliしか対応していないようなので、これはできないと判断した。自分でlocalで --fixすればいいだけ。めんどうだけど

super-linter/TEMPLATES at master · github/super-linter · GitHub

以下参考リンク

github.com

github.blog

github.com