Super-Linter で JSCPD の ENOTDIR エラーが出たときの対処


はじめに

Super-Linter 便利ですよね!

かつては言語毎にlintの設定を GitHub Actions に一生懸命組み込んでいましたが、 Super-Linter が大概のものは勝手に見てくれます

しかし、新しく対応した linter に急に弾かれるようになったり、相反するルールを見るせいで弾かれたり、時々振り回されることもあります

先日、 Super-Linter を意気揚々と動かしたところ、以下のようなエラーが発生しました

2021-06-10 06:46:08 [ERROR]   Found errors in [jscpd] linter!
2021-06-10 06:46:08 [ERROR]   Error code: 1. Command output:
------
Error: ENOTDIR: not a directory, scandir '/github/workspace/.github/linters/.hadolint.yaml'
    at Object.readdirSync (node:fs:1048:3)
    at readdir (/node_modules/@nodelib/fs.scandir/out/providers/sync.js:39:31)
    at Object.read (/node_modules/@nodelib/fs.scandir/out/providers/sync.js:12:12)
    at SyncReader.scandirSync [as _scandir] (/node_modules/@nodelib/fs.scandir/out/index.js:17:17)
    at SyncReader._handleDirectory (/node_modules/@nodelib/fs.walk/out/readers/sync.js:28:34)
    at SyncReader._handleQueue (/node_modules/@nodelib/fs.walk/out/readers/sync.js:23:18)
    at SyncReader.read (/node_modules/@nodelib/fs.walk/out/readers/sync.js:15:14)
    at SyncProvider.read (/node_modules/@nodelib/fs.walk/out/providers/sync.js:11:29)
    at ReaderSync.walkSync [as _walkSync] (/node_modules/@nodelib/fs.walk/out/index.js:19:21)
    at ReaderSync.dynamic (/node_modules/fast-glob/out/readers/sync.js:13:21) {
  errno: -20,
  syscall: 'scandir',
  code: 'ENOTDIR',
  path: '/github/workspace/.github/linters/.hadolint.yaml'
}
------

jscpd め、、、

というわけで、対処した記録です

エラー原因

.hadolint.yaml は Dockerfile の linter である hadolint の設定ファイルです

hadolint をローカルで実行するときのため、この設定ファイルをプロジェクトのルートに配置しています

その上で、 Super-Linter からも参照できるように .github/linters/.hadolint.yaml にシンボリックリンクを貼りました

これで hadolint が通るはず、と思ったところ、上記エラーに逢いました

jscpd はコードの重複を探し出してくれます(ときどきコピペで jscpd に怒られます)

jscpd がシンボリックリンク自体を解析しようとしてエラーになったようです

Super-Linter の公式 Issue にもありますが、取り合ってもらえず閉じてますね

対処

というわけで、シンボリックリンクを置くのではなく、 Super-Linter の参照先を変えることにしました

Super-Linter 実行時の環境変数 LINTER_RULES_PATH. を指定します

      - name: Super Linter
        uses: github/super-linter@v3
        env:
          LINTER_RULES_PATH: .
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

これでプロジェクトのルート直下にある設定ファイルを参照できるようになります

公式がシンボリックリンクに対応してくれるまでは、こっちの対処しか使えません

どうしてもシンボリックリンクを使いたくなったら、、、その時はまた考えましょう

関連

設定ファイルの指定方法を解説してくれている記事です