こんにちは、エンジニアの仁木です。
先日、Classi株式会社様の「リードタイムを測るシェルスクリプトを作ってチームの振り返り会を活発にした話」という記事の投稿がXで流れてきたので読んだのですが、面白い取り組みだなと感じました。
自社のプロジェクト管理にも取り入れることで、何か得られるものがあるかなと思い、
記事にあるコードを参考にして簡単なスクリプトを作成してみたので、ブログで紹介したいと思います。
最初に作成物です。
GitHubに公開したので、下記URLから確認できます。
export-issues-to-csv
https://github.com/ToshitakaNiki/export-issues-to-csv
GitHubの各リポジトリに登録されているIssueから、前日にクローズされたIssueを取得し、CSVで出力します。
Issueは作成されてからクローズされるまでの期間(リードタイム)を計測し、CSVに出力されるようになっています。
※最終的に1日毎に定期実行してDBに保存できれば、と考えているので前日にクローズされたIssueのみが出力されるようにしています。
大まかな流れは以下の通りです。
GitHub CLIではGitHubのAPIが使えます。
APIはREST APIと Graph QLとがあり、今回はGraphQLを利用しています。
GitHub CLIとGraphQLは今回始めて利用しました。
GitHub CLIではログインやアクセストークンなどの認証まわりで苦戦し、
GraphQLでは基本的なクエリの書き方や、検索時の条件の指定に苦戦しました。
検索のクエリでは、最初は全然Issueを取得できなかったのですが、is:issue
の条件を追加するとあっさり取得できたり‥
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
# 検索クエリ search_query="repo:${ORGANIZATION_NAME}/${REPOSITORIES[i]} is:issue is:closed sort:updated-desc closed:${YESTERDAY}" # Issueを取得 gh api graphql -f query=' query ($search_query: String!) { search(type: ISSUE, first: 100, query: $search_query) { nodes { ... on Issue { id title url repository { name } assignees(first: 10) { nodes { login } } createdAt closedAt } } } }' -f search_query="$search_query" >search_result.json |
取得までできると、あとはスムーズにできました。
リクエスト時のクエリに、欲しいフィールドを追記して、必要なデータだけを取得できるので、こういう所はGraphQLは便利だなと思いました。
ログインやアクセストークンの認証はGitHubページの **Fine-grained personal access tokens** ページでトークンを生成し、そのトークンを使ってgh auth login
でログインします。
自身のアカウント上のリポジトリであれは、上記のトークン生成だけで良いのですが、組織アカウントのリポジトリの場合だと、組織側の設定画面でアクセストークンの認証ポリシーの設定が追加で必要でした。
Organization の個人用アクセス トークン ポリシーを設定する
jsonファイルに保存したIssueのデータは最後にJSで加工しCSVに出力しています。
日付のフォーマットやCSV形式への変換・出力はパッケージを利用したので、サクッと書けました。
特にCSVフォーマットの変換は csv-stringify というパッケージがあり、オブジェクトを渡すとそのままCSVとして出力できるフォーマットに変換してくれて便利でした。
プロジェクトの管理や運用はまだまだ社内でもノウハウを貯めていきたいので、他社さんの事例など参考にして取り入れていきたいです。
今回のスクリプトは、実際の出力手順はリポジトリのreadmeに記載しているので、興味のある人は自身のリポジトリを使って試してみてください。