npmをGitHub Actionでパブリッシュする
こんにちは。JavaScriptの便利なパッケージをプロジェクト横断で共有したい場合、npmjsを利用してオープンソースにすると話が早いですね。npmにはcomposerと違って名前空間のようなものがデフォルトでは存在しませんが、組織を作ってその下に紐づけることもできます。 @vivliostyle/coreとか@wordpress/hooksとか、そんな感じです。
タロスカイでは、WordPressプラグインを管理するとき、およそ次のようなデプロイ手法をとっています。
- WordPress公式ディレクトリに登録されているプラグインは、GitHub上でタグがついてチェック(PHPUnitやPHP_Codesniffer)が通ったら、GitHub Actionsでデプロイ。10upのアクションを利用。
- 諸事情で公式ディレクトリに登録されていないものはGitHub Actionでリリースビルドを作成し、GitHubのリリースに添付。ダウンロードしたzipを管理画面からアップロードして使う。
- プロジェクト専用のテーマはGitHub Actionsでデプロイ。mainブランチへのコミットはテストが通ったらステージング環境へ、タグ付けされたらプロダクション環境へ、といった感じ。
なんにせよ、「GitHub上でオッケーだったら公開される」「配布元のアカウントを気にする必要がない、鍵の共有とかアカウント作成とか不要」という状況になっています。これをnpmでも同じにしたい。
- GitHub上のメインブランチでは必ずテストを実行。
- テストが通り、なおかつタグが付いたらnpmjsにパブリッシュ。
上記を達成するためには、次のような感じのアクションを設定します。
release: name: Publish npm package needs: [ test ] runs-on: ubuntu-latest steps: - uses: actions/checkout@master - name: Install Node uses: actions/setup-node@v3 with: node-version: '18' registry-url: https://registry.npmjs.org always-auth: true scope: '@tarosky' - name: Build Package run: bash bin/build.sh ${{ github.ref }} - name: Publish package run: npm publish env: NODE_AUTH_TOKEN: ${{ secrets.NPMJS_TOKEN_TAROSKY }}
基本的な手順は次の通りです。
- コードをチェックアウトする。
- nodeをインストール。その際にレジストリやスコープを指定。
- コードをビルド(bashでpackage.jsonのバージョンをタグに変換してるだけ)
- GitHubのオーガニゼーションに登録したオーガニゼーション・シークレットでトークンを指定する。
これでnpmjsへの認証が通るので、無事パブリッシュできました。今後は追加の作業がなく「GitHubでオーケー」=「npmjsで公開されている」という状態が保てそうです。やったね!
実際のリポジトリでは「AWS Lambdaで使えるようにzipで固める」ということもやっているので、もうちょっと複雑ですが、アクションファイルも参考にしてください。s3にデプロイできるといいんですけどね。
なぜ@tarosky/farmhandを作ったか?
TaroskyではたくさんのWordPressプラグインを開発しているのですが、数が多すぎて把握しきれなくなってきました。ポリシーとしてはいろいろと考えられるのですが、色々試しているうちに「WordPressの現在の最新バージョンを取得してメジャーバージョンから3つ遅れたら自動でイシューを作成」というのをやってみることにしました。WordPress公式ディレクトリでは、直近3つのメジャーバージョンでテストされていないとGoogle検索から落ちる、という仕様があります。
もともとはGitHubの複数リポジトリを一括管理できるようにと作り始めましたが、その中に「WordPressの最新バージョンを取得」という関数が出来上がったので、これをGitHub Actionに組み込んでみました。その成果物がこちらのアクション。ちょっとシェル芸っぽくなってしまっているのですが、実際に動作しています。ボットによって作成されたイシューがこちら。もうちょっと簡単に使える仕組みを考えたいですね。カスタムアクションを作ればいいのかな?
ソフトウェアは外部要因(脆弱性の発見・依存ライブラリの変更)によって、「何もしなくても壊れた」に近い状態になることがあります。こうした状態を防ぐためにどうしたらいいかを現在模索中。dependabotのような仕組みが他にもあるといいなあ、などと考えています。また新しい試みがあったらシェアしますね。
名前はChatGPT考案
ところで、このライブラリ @tarosky/farmhand なのですが、いま話題のChatGPTに名前を考えてもらいました。”Farmhand”は「農園の働き手」という意味だそうです。「小作人」のようなイメージでしょうか。”Farmer” は農園のオーナーという含意があるとのこと。
「比喩的な名前にしたい」「食べ物が腐らないようにする職業をイメージした単語」という条件でぱぱっと10個ぐらいアイデアを出してくれるので、すごくいいですね。