🤖

GitHubのDiscussionsをCLIから操作する

2023/07/19に公開

備忘メモです。

ZustandのGitHub Discussionsが増えすぎて、何が回答待ちなのか分かりにくくなったので、古いやつをクローズしようと思いました。しかし、600件以上あるので手で処理するのは骨が折れます。そこで、機械的に古いやつをクローズしてしまうことにしました。

ボットはないものかと思いましたが、Discussions自体が新しめの機能なのか見つからず(もしご存じでしたら教えてください)、GitHub CLIを使うことにしました。しかし、GitHub CLIではDiscussioinsはサポート外となっています。 https://github.com/cli/cli/issues/5659

幸い、上記issueにGraphQL APIを使う方法が紹介されています。 https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions を参照したところ、クローズのAPIが載っていませんでしたが、こちらに載ってました。 https://docs.github.com/en/graphql/reference/mutations#closediscussion

最初に、対象のDiscussionsをクエリします。Discussionsオブジェクトでは、すでにクローズ済みかなどの指定ができません。 https://docs.github.com/en/graphql/guides/using-the-graphql-api-for-discussions#repositorydiscussions そこで、汎用的なsearchを使うことにしました。 https://docs.github.com/en/graphql/reference/queries#search

以下、手順です。

最初に用意したgraphqlファイルがこちらです。

search_discussions.graphql
fragment discussion on Discussion {
	number
	id
}
query {
	search(
		first: 25,
		type: DISCUSSION,
		query: "repo:pmndrs/zustand is:open is:answered updated:<2022-07-19"
	) {
		discussionCount
		nodes {
			...discussion
		}
	}
}

これを実行して、ひとまずファイルに保存します。

gh api graphql -F query=@search_discussions.graphql > output.json

次に、mutation用のgraphqlファイルを作ります。

(echo 'mutation {' && jq -r '[.data.search.nodes[]]|map("close"+(.number|tostring)+": closeDiscussion(input: { discussionId: \""+.id+"\", reason: RESOLVED }) { discussion { number } }")|.[]' output.json && echo '}') > close_discussions.graphql

出来上がったファイルは次のようになります。

close_discussions.graphql
mutation {
	close1: closeDiscussion(input: { discussionId: "id1", reason: RESOLVED }) { discussion { number } }
	close2: closeDiscussion(input: { discussionId: "id2", reason: RESOLVED }) { discussion { number } }
}

最後に、それを実行します。

gh api graphql -F query=@close_discussions.graphql

以上で、完了。あとは、 query をいじったり、 reason をいじったりして微修正しましょう。

Discussion