💨

actionlint を Node.js で実行する node-actionlint

2021/07/26に公開

Linda_ppさんが開発したactionlintというコマンドラインツールがあります。

https://github.com/rhysd/actionlint

これは GitHub Actions のワークフローファイルを静的に解析して、事前にわかる問題を指摘してくれるツールです。詳細については開発者である Linda_pp さんが書いたブログ記事を読むことをおすすめします。

https://rhysd.hatenablog.com/entry/2021/07/11/214313

私は GitHub Actions をよく使います。しかし、ワークフローファイルの記述を誤ってしまい、実際に動かしてから些細なミスに気がつくことがよくあります。これには非常にストレスを感じていました。

actionlint はこの問題を見事に解決してくれました。コマンドラインからactionlintと入力すれば、適切に問題を指摘してくれます。

作ったもの

https://github.com/sosukesuzuki/node-actionlint

課題

私は普段 Node.js を使って様々なものを開発しています。actionlint は Go で書かれており、Node.js プロジェクトに導入するのは少々困難でした。

バイナリが配布されているので、自分のローカルで実行するにはなんの問題もありません。

しかし、他のプロジェクト全体で他の開発者にも使うことを強制するのは難しいです。

CI に導入するのは容易でしたが、ローカルで npm run lint を実行してもエラーが出ないのに、CI ではエラーが出るというのはあまり親切ではありません。

そこで、他の JavaScript のためのツールと同じように npm で配布されていれば簡単だと考えました。Node.js を使ったプロジェクトであれば、明示的に新しい何かをインストールしてもらう必要はなく、npm iですべて済みます。

WebAssembly

actionlint には Playground があり、ウェブブラウザ上でその挙動を確認できます。

https://rhysd.github.io/actionlint/

どうやら、この Playground は Go で書かれた actionlint を WebAssembly にコンパイルしウェブブラウザで直接実行しているようです。

これが可能なら、同様の方法で Node.js でも実行することができます。

実装

上述のとおり、actionlint を WebAssembly にコンパイルして Node.js から実行します。

actionlint のコアロジックのみを WebAssembly として実装しました。なので、glob パターンの処理や、ワークフローファイルの読み込み、リント結果からのログの生成などは JavaScript 側で行っています。

使う

npm でインストールできます。

npm install node-actionlint
./node_modules/.bin/node-actionlint

引数なしで実行すると ./.github/workflows/*.yml を見て actionlint を実行します。第一引数に glob パターンを渡すとそこを見に行きます。

今の所素の設定で実行することしか考慮していないので、その他のオプションを渡すことはできません。万が一他の人が使うようになったら対応するかもしれませんが、私が使う分にはとりあえず問題はないだろうと思います。

実際に使ってみている

まず、私が管理している prettier/prettier-regression-testing というツールに導入してみました。ちゃんと動いているようで安心しました。

https://github.com/prettier/prettier-regression-testing/pull/67

次に、Prettier に導入してみました。

https://github.com/prettier/prettier/pull/11268

感想

actionlint はかなり便利なツールだと思います。

Node.js から実行できるようになってうれしいです。また、Go で書かれたコードを WebAssembly にコンパイルして JavaScript から実行するのは意外と簡単にできるということがわかりました。

Discussion