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 }}

基本的な手順は次の通りです。

  1. コードをチェックアウトする。
  2. nodeをインストール。その際にレジストリやスコープを指定。
  3. コードをビルド(bashでpackage.jsonのバージョンをタグに変換してるだけ)
  4. 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個ぐらいアイデアを出してくれるので、すごくいいですね。