actionlint を Node.js で実行する node-actionlint
Linda_ppさんが開発したactionlintというコマンドラインツールがあります。
これは GitHub Actions のワークフローファイルを静的に解析して、事前にわかる問題を指摘してくれるツールです。詳細については開発者である Linda_pp さんが書いたブログ記事を読むことをおすすめします。
私は GitHub Actions をよく使います。しかし、ワークフローファイルの記述を誤ってしまい、実際に動かしてから些細なミスに気がつくことがよくあります。これには非常にストレスを感じていました。
actionlint はこの問題を見事に解決してくれました。コマンドラインからactionlint
と入力すれば、適切に問題を指摘してくれます。
作ったもの
課題
私は普段 Node.js を使って様々なものを開発しています。actionlint は Go で書かれており、Node.js プロジェクトに導入するのは少々困難でした。
バイナリが配布されているので、自分のローカルで実行するにはなんの問題もありません。
しかし、他のプロジェクト全体で他の開発者にも使うことを強制するのは難しいです。
CI に導入するのは容易でしたが、ローカルで npm run lint
を実行してもエラーが出ないのに、CI ではエラーが出るというのはあまり親切ではありません。
そこで、他の JavaScript のためのツールと同じように npm で配布されていれば簡単だと考えました。Node.js を使ったプロジェクトであれば、明示的に新しい何かをインストールしてもらう必要はなく、npm i
ですべて済みます。
WebAssembly
actionlint には Playground があり、ウェブブラウザ上でその挙動を確認できます。
どうやら、この 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 というツールに導入してみました。ちゃんと動いているようで安心しました。
次に、Prettier に導入してみました。
感想
actionlint はかなり便利なツールだと思います。
Node.js から実行できるようになってうれしいです。また、Go で書かれたコードを WebAssembly にコンパイルして JavaScript から実行するのは意外と簡単にできるということがわかりました。
Discussion