GitHub Actions の古いワークフローの実行履歴を削除したい。

手動で削除する方法

下記の公式ヘルプページに削除方法が記載されている。

Deleting a workflow run - GitHub Docs

自動で削除する方法

下記の公式ページではAPIを直接叩くBashスクリプトが紹介されている。

Using workflow run logs - GitHub Docs

$ ./delete-logs.sh REPOSITORY_NAME WORKFLOW_NAME
#!/usr/bin/env bash

# Delete all logs for a given workflow
# Usage: delete-logs.sh <repository> <workflow-name>

set -oe pipefail

REPOSITORY=$1
WORKFLOW_NAME=$2

# Validate arguments
if [[ -z "$REPOSITORY" ]]; then
  echo "Repository is required"
  exit 1
fi

if [[ -z "$WORKFLOW_NAME" ]]; then
  echo "Workflow name is required"
  exit 1
fi

echo "Getting all completed runs for workflow $WORKFLOW_NAME in $REPOSITORY"

RUNS=$(
  gh api \
    -H "Accept: application/vnd.github+json" \
    -H "X-GitHub-Api-Version: 2022-11-28" \
    "/repos/$REPOSITORY/actions/workflows/$WORKFLOW_NAME/runs" \
    --paginate \
    --jq '.workflow_runs[] | select(.conclusion != "") | .id'
)

echo "Found $(echo "$RUNS" | wc -l) completed runs for workflow $WORKFLOW_NAME"

# Delete logs for each run
for RUN in $RUNS; do
  echo "Deleting logs for run $RUN"
  gh api \
    --silent \
    --method DELETE \
    -H "Accept: application/vnd.github+json" \
    -H "X-GitHub-Api-Version: 2022-11-28" \
    "/repos/$REPOSITORY/actions/runs/$RUN/logs" || echo "Failed to delete logs for run $RUN"

  # Sleep for 100ms to avoid rate limiting
  sleep 0.1
done

gh を使って自動削除する

ghコマンドを使って削除する方法が簡単で良かった。

下記のように workflow-name を指定して最新100件をループさせて削除することができる。

for id in $(gh run list --workflow workflow-name --json databaseId --jq '.[].databaseId' --limit 100); do
  gh run delete $id
done