リンクをコピーしました

はじめに

昨年にyfinance-jp-screener というリポジトリを作りました。
わが投資術を読んで、「じゃあこれをやってみよう。」と思って作成したものです。
米国株データにも対応させようとして、Github Actionsをマトリックスを使って並列処理できるようにしていたところ、次のようなエラーが出ました。

Failed to CreateArtifact: Artifact storage quota has been hit. Unable to upload any new artifacts.

プライベートリポジトリでテストしていたため、無料プランのアーティファクトストレージ容量に達してしまったようです。
アーティファクト(成果物)を削除する必要があるのですが、今後もぶつかることがあると思うのでまとめておこうと思います。

GitHub Actions のストレージ料金体制

プラン別の無料枠

プライベートのリポでは、プランごとに次の無料枠があります(公式ドキュメント より)。

プランアーティファクトストレージ実行分数/月キャッシュ
GitHub Free500 MB2,000 分10 GB
GitHub Pro1 GB3,000 分10 GB
GitHub Team2 GB3,000 分10 GB
GitHub Enterprise Cloud50 GB50,000 分10 GB

チェックポイント:

  • アーティファクト・キャッシュ・GitHub Packages のストレージは共通は、アカウントで共通
  • パブリック では GitHub Hosted Runner の利用は無料
  • ストレージ使用量は 6〜12 時間ごとに再計算されるため、削除しても少し待つ必要がありそうです

容量超過時の具体的な対策

1. Web から手動でアーティファクトを削除する

すぐに容量を空けたい場合は、ブラウザ から直接削除できます。

  1. リポジトリの Actions タブを開く
  2. 左側で該当のワークフローを選ぶ
  3. 実行履歴から対象の Run をクリック
  4. 右側の Artifacts 一覧で、各アーティファクト右の ゴミ箱アイコン をクリックして削除

アーティファクト削除の画面

少数のアーティファクトならこれで十分だと思います。

2. 古いアーティファクトをまとめて削除する(c-hive/gha-remove-artifacts)

アーティファクトが大量にあるときは、自動削除用の Action が便利でした。

c-hive/gha-remove-artifacts を使うと、指定した期間より古いアーティファクトを一括削除できます。

.github/workflows/remove-old-artifacts.yml を次の内容で作成して push します。

name: Remove old artifacts

on:
  # スケジュール実行(コメントアウト中)
  # schedule:
  # 毎日午前1時に実行
  # - cron: '0 1 * * *'

  # 手動トリガー
  workflow_dispatch:
    # 手動実行時に指定できるインプット変数
    inputs:
      artifact_age:
        description: "アーティファクト削除の期限(例: 5 days, 1 month, 2 years)"
        required: false
        default: "1 month"
        type: string

      skip_tags:
        description: "タグ付きリリースのアーティファクトをスキップするか"
        required: false
        default: "false"
        type: choice
        options:
          - "true"
          - "false"

      skip_recent:
        description: "最新N個のアーティファクトをスキップ(0で無効化)"
        required: false
        default: "5"
        type: string

jobs:
  remove-old-artifacts:
    runs-on: ubuntu-latest
    timeout-minutes: 10

    # GitHub Actions API へのアクセス権限を付与
    # プライベートリポジトリでの実行に必要
    permissions:
      actions: write

    steps:
      # ステップ1: 古いアーティファクトを削除
      - name: Remove old artifacts
        uses: c-hive/gha-remove-artifacts@v1
        with:
          # アーティファクト削除期限
          # 手動実行時はユーザー入力値、未指定時はデフォルト値を使用
          age: ${{ github.event.inputs.artifact_age || '1 month' }}

          # オプション: タグ付きリリースのアーティファクトをスキップするか
          skip-tags: ${{ github.event.inputs.skip_tags || 'false' }}

          # オプション: 最新N個のアーティファクトをスキップ
          # skip_recent が '0' なら空文字列(インプット無効化)、そうでなければ値を使用
          skip-recent: ${{ github.event.inputs.skip_recent != '0' && github.event.inputs.skip_recent || '' }}

注意: すでにストレージ枠が一杯で新規アップロードができない場合、このワークフローも動かないことがあります。その場合は 手動で Web から削除するか、次の act によるローカル実行を検討してください。

3. act でローカルから削除する(ストレージが埋まっているとき)

ストレージが完全に埋まっているか、実行時間のリミットなどに達している場合などで、GitHub Actions が動かせない場合は、actローカル環境 から gha-remove-artifacts を実行する方法があります。

手順(macOS)

  1. act をインストール: brew install act
  2. Personal Access Token(PAT)を作成
    Settings → Developer settings → Personal access tokens → Fine-grained tokens で、act-token のような名前でトークンを発行します。
    リポジトリへのアクセス権限(Actions: Read and write)を付与してください。

PAT 作成画面

権限と適当レポの指定

  1. 上記の remove-old-artifacts.yml を作成して push しておく
  2. 次のコマンドでローカル実行:
act push --job remove-old-artifacts -s GITHUB_TOKEN=発行したPAT
  1. 変数を渡して、実行:
    事前に以下のようなjsonを用意しておいて、
    .github/events/remove-old-artifacts-dispatch.json
{
  "inputs": {
    "artifact_age": "5 months",
    "skip_tags": "false",
    "skip_recent": "0"
  }
}
act workflow_dispatch \
  -e .github/events/remove-old-artifacts-dispatch.json \
  --job remove-old-artifacts \
  --container-architecture linux/amd64 \
  -s GITHUB_TOKEN=あなたのPAT

ここについてはAppleシリコン系の方のみ必要だと思います

--container-architecture linux/amd64

予防策

アーティファクトのデフォルト保持期間は 90 日なので短くすれば、長期的なストレージ肥大を抑えられます。

  1. リポジトリの SettingsActionsGeneral
  2. Artifact and log retention で保持日数を変更(例: 14 日)

この設定はこれから作成されるアーティファクトにのみ適用されるのでご注意を。
既存分は上記の手動削除や Action で削除する必要があります。

まとめ

状況おすすめ
数個だけ消したいWeb から手動削除
定期的に古いものを消したいc-hive/gha-remove-artifacts を cron で実行
一気に全削除したいc-hive/gha-remove-artifacts を 数年単位で指定して実行
GHA が動かせない場合act でローカルから gha-remove-artifacts 実行

データ収集ワークフローでは、アーティファクトが溜まりやすいので、最初から retention-days を短くするか、定期的な削除ワークフローを入れて置くかなどの予防策が大事だなぁ〜と思いました。

関連リンク