Closed8

個人的 npm ライブラリ開発Tips 2025

nu0manu0ma

リリース方法

npmはOIDCを使用したリリースが可能であるので基本的にこれを使用すること

https://github.blog/changelog/2025-07-31-npm-trusted-publishing-with-oidc-is-generally-available/

リリース方法は semantic-releaseを使用したりしていたが、GHAを動かしてRelease PRを作成→マージでtag発行 + npm publish する方法を採用した。
下記に記載のやり方が、シンプルで制御もしやすかった

https://efcl.info/2025/09/07/npm-oidc/

少し変えたものが以下。
https://github.com/nu0ma/spanner-assert/blob/main/.github/workflows/create-release-pr.yaml

リリースPRが作成されるので、

マージするとReleaseのGHAが走る。
releaseのGHAの内容は以下。

https://github.com/nu0ma/spanner-assert/blob/main/.github/workflows/release.yaml

繰り返すがOIDCを使用しているため、npm_tokenは使用しない。

初回リリース

npmのOIDCはまだリリースされていないライブラリの場合は使用できないので、setup-npm-trusted-publishを使用するとnpmのページから設定ができるようになるので便利。

https://github.com/azu/setup-npm-trusted-publish

nu0manu0ma

GitHub Actions

セキュリティ

  • コミットハッシュでのバージョン指定必須。
    • pinactなどを使用して、pinすること。

https://github.com/suzuki-shunsuke/pinact

サプライチェーンアタックなどへの対策のため、GitHub Actionsのyamlの内容はlinterにかける

  • ghalintやzizmorを使用すること

https://github.com/suzuki-shunsuke/ghalint

https://github.com/zizmorcore/zizmor

actionlintとzizmorを回しているyamlの例
https://github.com/nu0ma/spanner-assert/blob/main/.github/workflows/actionlint.yaml
https://github.com/nu0ma/spanner-assert/blob/main/.github/workflows/zizmor.yaml

permissionは必ず設定すること

https://product.10x.co.jp/entry/2023/10/18/170930

linterを入れるとpermission未設定の場合は基本的落ちるようになるはず


そのほか設定

CIには同時実行数の制御を入れる

pushした前の状態のCIを回したいことはあまり無いのと、GHAの無料枠を無駄に食いつぶしたく無いため
https://github.com/nu0ma/spanner-assert/blob/c39c8d5f1703fef5226424cacc16973747cbeb3c/.github/workflows/ci.yaml#L8-L10

timeoutの設定

timeoutも必ず設定すること。こちらも前述の同じ理由
https://github.com/nu0ma/spanner-assert/blob/c39c8d5f1703fef5226424cacc16973747cbeb3c/.github/workflows/ci.yaml#L15

参考

https://tech.guitarrapc.com/entry/2025/04/05/235900

nu0manu0ma

pre-commitによる機密情報の誤commitを防ぐ

secretlintを使用してシークレットをGitHubにpushしないようにpre-commitで防ぐ。

https://github.com/nu0ma/spanner-assert/blob/c39c8d5f1703fef5226424cacc16973747cbeb3c/package.json#L44-L47

レポジトリに設定するかどうかは人によるが、最近はAIに書かせることも多いのでレポジトリに追加している。

参考
https://github.com/secretlint/secretlint#husky--lint-staged

nu0manu0ma

CodeQL

パブリックレポジトリの場合、CodeQLが無料使用できるので使用する

https://blog.jxck.io/entries/2025-09-03/nx-incidents.html#codeql

CodeQL を使うと、コード内の脆弱性やエラーを特定することができ、結果は GitHub 内で code scanning アラートとして表示される。要するに、パブリックなリポジトリなら、自動で AI によるセキュリティチェックを受けられるというものだ。
PR をレビューするために AI に課金する、といったことをしなくても、設定だけで GitHub が提供してくれる。パブリックリポジトリが対象のため、導入しない理由もなさそうだ。今回の攻撃も、これで防げた可能性は高いとされている。

実際使ってみても、たまにセキュリティ的に怪しいところをalertしてくれるので便利。

設定方法などは下記

https://techblog.ap-com.co.jp/entry/2025/05/30/100027

nu0manu0ma

renovateを使用した依存パッケージのアップデート

deprecatedになったライブラリや脆弱性が含まれるライブラリのアップデートを自動で行うためにrenovateを使用。dependabotでも良い、要は手動よりも自動化すること

サプライチェーンアタックに対応するために、minimumReleaseAge は1日以上を設定しておくこと
オートマージを行う場合はCIでのテストが必須なのでテストは整備しておく必要あり

毎回作るのも面倒なので、自分用のrenovate-configを作成した
https://github.com/nu0ma/renovate-config

使用側で設定はオーバーライドできるのである程度の融通は効く

nu0manu0ma

テスト

ライブラリの種類次第だが、end-to-endのテストをCIで回せるようにしておいた方が良い
AIに書かせた場合でも、テストを回せば一番外側から見た動作の検証が可能になるのは楽。不要なコードを削ぎ落としていく作業も楽になる。

spanner-assert だとTaskfileを使用してテストを作成したのが良かった

https://taskfile.dev/

Spanner Emulatorの起動を待ったり、seedを投入したりが1つのファイルで書けるので見通しも良い。

https://github.com/nu0ma/spanner-assert/blob/c39c8d5f1703fef5226424cacc16973747cbeb3c/Taskfile.yml#L1-L103

GoのツールであるtestfixturesにPRを送った際に、taskfileを使用したテストが整備されており非常に体験が良かったので真似した
https://github.com/go-testfixtures/testfixtures

nu0manu0ma

https://zenn.dev/azu/articles/ad168118524135#npmは"require-two-factor-authentication-and-disallow-tokens"を設定する

npmは"Require two-factor authentication and disallow tokens"を設定する
npmのRequire two-factor authentication and disallow tokensをパッケージに設定すると、公開にも2要素認証が必要になるため、npm tokenを使ったパッケージの公開はできなくできる

上記の対応を行う。
ライブラリを作成しpublishする側にも責任があるなーとつくづく思う最近

nu0manu0ma

開発時の便利なもの

pkg.pr.new

https://github.com/stackblitz-labs/pkg.pr.new

コミットごとにnpm i を使用して手元でライブラリの挙動を確かめることができるようになる。

npxコマンドを使用したテンプレート生成ライブラリを開発した際は非常に便利だった

rulesetのimport

(ツールではない)mainブランチへの直pushを防ぐrulesetなどをGitHubの設置画面から設定するが、毎回ぽちぽちしていた。ふとUIを眺めると以下のようにimportできるので一度設定すればそれを使用すれば良い。GitHubにあげておいてもいい。

sort-package-json

package.jsonをソートしてくれる。地味に便利。
https://www.npmjs.com/package/sort-package-json?activeTab=readme

publint

https://publint.dev/docs/

このスクラップは9日前にクローズされました