GitHubのPackage機能って使っていますか?
そこで起きた事件をご紹介します。
先に結論から
- Packages Storageが無課金のリミットに突入していた
- 削除するもUploadした総容量なので、解除は月跨ぎとなる
- 不要なバージョンは逐一消さないと面倒
- ポチポチGUIで設定しなきゃいけないと思ってたが
ghで一発でいけた
- ポチポチGUIで設定しなきゃいけないと思ってたが
背景
ぼくはGitHub Private Packageを頻繁に使用しています。
勿論要件によりますが、特に拘りがないケースはPrivate Packageで楽をしたいのです。
そのPackage(React製のUI Framework)で修正を入れたい際にVersion Upが失敗。
ビルドチェックを忘れたかな?と思ったので、GitHubを見てみることに。
npm error 403 403 Forbidden - PUT https://npm.pkg.github.com/[アカウント名]/[リポジトリ名] - Permission permission_denied: Account has reached its billing limit. Contact support or your organization admin to increase the quota. https://docs.github.com/en/github/setting-up-and-managing-billing-and-payments-on-github/about-billing-for-github-packages
npm error 403 In most cases, you or one of your dependencies are requesting
npm error 403 a package version that is forbidden by your security policy, or
npm error 403 on a server you do not have access to.
npm error A complete log of this run can be found in: /home/runner/.npm/_logs/2026-02-25T08_35_15_403Z-debug-0.log
Error: Process completed with exit code 1.
403?
そして気になるこの文言:Account has reached its billing limit.
ここでアカウントの無課金のリミットが解除されたと知ります。
そこでアカウントの請求関連のページに遷移してみます。
はい、完全にアウトですね。
しかし4日とはいえ、使用できないのは困ります。
出来る限りの対策を考えたいのがエンジニアである。
古いPackageを削除する
Packageを確認してみます。リポジトリ名からPackagesへと遷移します。
バージョンの一覧は下記のページで見ることができます。
https://github.com/[アカウント名]/[リポジトリ名]/pkgs/npm/[パッケージ名]/versions
一覧にしてみると大量のバージョンが…
Deleteボタンで削除できますが、大量にありすぎていちいち削除するのは面倒です。
gh cli(GitHub CLI)を使用する
どうやらAPIが提供されているらしいので、こちらの操作で一括削除ができそうです。
インストールはこちらでできます。対象のOSを選んでください。
ghで使用するトークンを発行
gh auth loginの実行時に選択するブラウザ経由のログインではどのみちPackageの操作などで弾かれてしまいます。
なので、こちらの画面からTokenを発行します。
スコープは下記を設定します。
- repo
-
white:packages
- read:packages
- delete:packages
-
admin:org
- write:org
- read:org
このような形で設定します。read:orgはorganizationのアカウントではなくても設定が必要です。理由としては
- orgのアカウントを参照
- 存在しなければ個人のアカウントを参照
といった形の挙動をとるため、orgのread権限がないと403で弾かれてしまいます。
Tokenを付与してログイン
無事にトークンが発行出来たら以下を実行します。
ぼくはWindowsなのでPowerShellで実行しています。
echo [TOKEN] | gh auth login --with-token
# [TOKEN]の箇所はgh_から始まるトークンを貼り付けます。
無事にログインできましたら以下のステップに実行します。
削除対象のデータ参照~削除実行
このような形で削除が可能です。
$versions = gh api --paginate /users/[アカウント名]/packages/npm/[パッケージ名]/versions | ConvertFrom-Json
$sorted = $versions | Sort-Object created_at -Descending
# 最新のバージョン以外を対象する
$targets = $sorted | Select-Object -Skip 1
foreach ($t in $targets) {
gh api --method DELETE /users/[アカウント名]/packages/npm/[パッケージ名]/versions/$($t.id)
}
このような形で実行します。
確認の際は
https://github.com/[アカウント名]/[リポジトリ名]/pkgs/npm/[パッケージ名]/versions
こちらの数が減っていればOKです。
今回は最新のバージョンのみ残すようにしていますが、最新の件数を調整したりなどはご自身で実施してください。変数$targetsでログを出して削除対象を確認したうえで実行してください。
さて結果は以下に…?
変わってないじゃあないかーーーーッ!!話が違うじゃあないかーーーーッ!!!
…と思いましたが、結論ぼくの勘違いです。
Included usage limits reset in 4 days.
含まれる使用制限は 4 日後にリセットされます。
めちゃくちゃバージョンアップしてたので制限超過になってただけでした。
しかし古いバージョン自体は削除したかったので、いい経験になりました。
無課金初期アバターのGitHubユーザーの皆は、こんなチョンボをしないようにッ!!
オブジェクティブグループではXの投稿も平日毎日行っています!
IT 関連の小ネタや便利技から、日常のアニメ・ゲーム布教なども幅広く投稿してるので、
ご興味のある方は是非フォロー・いいねをお願いします。

