GitHubのIssueからJIRAに移行したいプロジェクトがあり、そのために次のような手順を踏みました。
- GitHub CLIをインストールしセットアップする。
- GitHub CLIを使ってIssueをCSVに書き出す。
- 書き出したCSVをJIRAで読み込む。
GitHub CLIを使って取得したIssueはJSON形式になっています。このJSONをCSVに変換するには、GitHub CLIのオプションにJSONを加工・整形し、CSVで書き出すように指定します。このためにはJSONからCSVに整形する指示をjqフォーマットで書く必要があるのですが、この指示をChatGPTを使って対話的に作りました。
ちなみに、1と2については次の記事をご覧ください。
ストレートに質問する
まずは、やり方の流れを調べる意味でもChatGPTにストレートに質問してみました。
GitHubのコマンドラインツールであるghを使用してイシューを出力する方法を教えてください。デフォルトのオプションではOpen状態のものしか出力されません。Close状態のものも含まれるように指定してください。また、JIRAにImportさせることが可能な形式で出力する方法も教えてください。
プロンプト
ChatGPTの回答をまとめると、次のようなやり方を教えてくれました。
- GitHub CLIの
gh
を使用する。 - コマンドラインで操作する。
- リポジトリのディレクトリに移動する。
- 次のように
gh
を実行する。
% gh issue list --state all -L 1000 --json number,title,createdAt,state,labels -q 'map([.number, .title, .createdAt, .state, (.labels[] | .name) | join(",")]) | @csv' > issues.csv
しかし、この方法ではエラーになります。何度かエラー内容をChatGPTに入力し、解決を試みましたが成功しませんでした。やり方を変える必要があります。分かった事は次の通りです。
--json
オプションでイシューがJSONで出力される。-q
オプションで出力されるJSONを整形・加工し、CSVを作る方法がある。- ChatGPTが出力した方法は
-q
オプションに指定する整形・加工内容に問題がある。
整形・加工方法を調べる
筆者は-q
オプションに指定するJQフォーマットのことを知らなかったので、簡単な内容から徐々に最終的な整形方法を調べることにしました。
ディクショナリから値の配列を作るには
JSONのディクショナリから値の配列を作る方法を調べます。ChatGPTに以下を入力します。
jqを使ってJSONのディクショナリから値の配列を作るにはどうしたらよいですか?
プロンプト
これに対して、次のようなコマンドを得ることができました。
echo '{"key1": "value1", "key2": "value2", "key3": "value3"}' | jq 'map(. as $in | $in.value)'
ディクショナリの配列から値の配列の配列を作るには
GitHub CLIが出力するイシューはJSONのディクショナリの配列です。次はディクショナリの値の配列の配列を作る方法を調べます。ChatGPTに次のように入力します。
jqを使ってJSONのディクショナリの配列からディクショナリ毎に値の配列を作るにはどうしたらよいですか?つまり、最終的には値の配列の配列を作るという意味です。
プロンプト
これに対して、次のようなコマンドを得ることができました。
echo '[{"key1": "value1a", "key2": "value2a", "key3": "value3a"}, {"key1": "value1b", "key2": "value2b", "key3": "value3b"}]' | jq 'map(. | to_entries | map(.value))'
値の順序を指定するには
上記のコマンドで得られた配列は値の順序が分からないので、後々、CSVに変換した後に困ることになりそうです。そこで、値の順序を指定する方法を調べました。ChatGPTに次のように入力します。
ディクショナリから作成される配列について、値の順序をキーを使って指定して、順序を維持したディクショナリの値の配列の配列にしたいのですが、どうしたらよいですか?
プロンプト
これに対して、次のようなコマンドを得ることができました。
echo '[{"key1": "value1a", "key2": "value2a", "key3": "value3a"}, {"key1": "value1b", "key2": "value2b", "key3": "value3b"}]' | jq 'map([.key1, .key2, .key3])'
CSVに変換するためのコマンドを得る
これで任意の情報のディクショナリの配列から、値の配列の配列に変換するコマンドを作れました。ここまでの分かった事を元に、次のように最終的なコマンドを調べました。
次のコマンドは結果をJSONの配列の配列にしてissues.csvに書き込みます。これの-qオプションの値を変更して、csv形式になるように@csvを使って変更してください。
gh issue list –state all –json ‘number,title,body,state,createdAt,updatedAt’ -q ‘map([.number, .state, .createdAt, .updatedAt, .title, .body])’ > issues.csv
プロンプト
これに対して、次のようなコマンドを得ることができました。
gh issue list --state all --json 'number,title,body,state,createdAt,updatedAt' -q 'map([.number, .state, .createdAt, .updatedAt, .title, .body] | @csv) | join("\n")' > issues.csv
まとめ
ChatGPTとの対話を元に目的のコマンドを調べることができました。更にマイルストーンが抜けていたので追加したりといった微調整はありましたが、ChatGPTで調べたコマンドでイシューをCSVに書き出すことができました。
ChatGPTで一気にゴールに辿り着くことはできなくても、この記事のように段階を踏んでいくことでゴールに辿り着くことができます。この段階を踏むというのはChatGPTを使わなかったとしても、行うであろう手順です。自分自身が何を行っているのかを理解するという面でも、段階を踏むという手順は効率的だと思います。