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
ログを見ると、差分がないらしい。
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
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