概要
GitHubCLIを使ってactionの履歴を一括削除する
条件
- Windows 11 Home
方針:GitHubCLIでアクション履歴をjsonで抽出、jqでIDを絞り込み、最後にGitHubCLIで削除する
インストール
ghとjqをインストールする
- gh : GitHubCLI(GitHubのコマンドAPI)
- jq : Jsonをコマンド制御するツール
ターミナルを起動し以下のコマンドを打つ。コマンドを打ったらターミナルを再起動する。
winget install --id GitHub.cli
winget install jqlang.jq
コマンドを実行する
その前にGitHubにログイン
Power ShellからGitHubログインのためにコマンドを実行し、画面に従って操作する。
gh auth login
? What account do you want to log into? [Use arrows to move, type to filter]
> GitHub.com ←こっちを選択
GitHub Enterprise Server
? What is your preferred protocol for Git opertions on this host? [Use arrows to move, type to filter]
> HTTPS ←こっちを選択
SSH
? Authenticate Git with your GitHub credentials? (Y/n) y
? How would you like to authenticate GitHub CLI? [Use arrows to move, type to filter]
> Login with a web browser ←こっちを選択
Paste an authentication token
First copy your one-time code: xxxxxxx(コードが表示される)
Press Enter to open github.com in your browser ...
Enterを押すとブラウザでGitHub.comのログイン画面に入る
表示されたコードを打ち込んで、ContinueするとAuthorizeするか聞いてくるのでAuthorize githubを選択
画面に表示されたコードを携帯のGitHubアプリから2段階認証したら認証完了
コマンドを実行してみる
以下のコマンドを実行する
gh api /repos/{owner名}/{repository名}/actions/workflows/{.ymlファイルの名前}/runs?per_page=10 `
| jq '.workflow_runs[].id' `
| % { gh api -X DELETE repos/{owner名}/{repository名}/actions/runs/$_ }
GitHubのデータをjsonで取り出す
指定の.ymlファイルのアクションのデータをjson形式で出力する。ページ数によって検出に失敗する場合があるのでper_pageの値を調整し取得できる数値にする。
gh api /repos/{owner名}/{repository名}/actions/workflows/{.ymlファイルの名前}/runs?per_page=10
jsonからIDを取得する
jqにてidを取り出す。
jq '.workflow_runs[].id'
ステータスによって選別する場合は以下のようにする。Windowsではダブルクォーテーション(")の前のにエスケープ文字(\)がないと解釈できずエラーが出てしまう。
jq '.workflow_runs[] | select(.status==\"completed\") | .id'
作成日時で選別する場合は以下の通り
jq '.workflow_runs[] | select(.created_at<=\"2024-06-01T00:00:00Z\") | .id'
IDを指定してアクションを削除する
最後にIDを指定してアクションを削除する。
% { gh api -X DELETE repos/{owner名}/{repository名}/actions/runs/$_ }
動作確認方法
以下のようにjqの処理までを実行するとIDの一覧が表示される。削除の前後に以下のコマンドを実行することで対象IDが削除されたことを確認できる。
gh api /repos/{owner名}/{repository名}/actions/workflows/{.ymlファイルの名前}/runs?per_page=10 `
| jq '.workflow_runs[] | select(.status==\"completed\") | .id'