はじめに
前回は、GitHub Copilotの機能について広く浅く記載し、その中のCLIでCopilotを使う方法を実際に試してみました。
今回はGitHub Copilot コーディングエージェントを使い、IssueからCopilotにコードを生成してもらう方法を試してみました。
Copilot コーディングエージェントとは
Copilit コーディングエージェントは、GitHub Actionsの環境で独立して動作し、人間の開発者と同じようにタスクを処理することができます。
Copilot コーディングエージェントでできること
Copilot コーディングエージェントは、以下のような作業を処理することができます。
- バグの修正
- 段階的に新機能を開発する
- テストのカバレッジを向上させる
- ドキュメントを更新する
- リファクタリング
どのようにして作業を指示するか
Copilot コーディングエージェントには、様々な方法で作業を依頼することができます。
例えば以下のような方法です。
- Issueを書いてCopilotをアサインする
- チャットでプロンプトを入力する
- PRのコメントでCopilotにメンションする
- GitHub CLIのコマンドを実行する
従来のAIアシスタントを使った場合との違い
Copilot コーディングエージェントと従来のAIアシスタントとの大きな違いは、実行する環境です。
従来のAIアシスタントはローカル上で動作し、開発者との対話を繰り返すことにより、タスクを処理します。
一方、Copilot コーディングエージェントはGitHub Actions上の一時的な環境で完全に独立して動作します。
また、従来のAIアシスタントでは、ブランチの作成、コミット、PRの作成などの定型作業が発生しますが、Copilot コーディングエージェントでは、コミットからPRの作成までを自動的に行なってくれるため、効率的に開発を進めることができます。
Copilot コーディングエージェントを使用する条件
Copilot コーディングエージェントは、GitHub Copilot Pro、GitHub Copilot Pro+、GitHub Copilot Business、GitHub Copilot Enterpriseプランで使用できます。
料金について
Copilot コーディングエージェントを使う際に発生するコストは、GitHub Actionsを実行した分単位の時間とCopilotのプレミアムリクエストによります。
これらは、自分の持っている月間使用枠内で追加料金を払わずに使用することができます。
詳しくは、GitHub Copilot ライセンスをご覧ください。
セキュリティ保護
Copilot コーディングエージェントには、セキュリティ保護のための組み込み機能があります。
例えば以下のような機能です。
- セキュリティ問題の検出と対応
- 機密情報の検出
- GitHub Advisory Databaseに対するマルウェアアドバイザリ、およびCVSS評価
詳しくは、こちらをご覧ください。
Issueを書いてコードを生成する
それでは、実際にCopilot コーディングエージェントにコードを生成してもらいます。
下準備として、Goのプロジェクトを作成し、
cmd/calccli/main.go
に空のmain関数を定義したファイルだけをPushしておきます。
Issueを作成してCopilotをアサインする
まず初めに、Issueにを立ててやりたいことを簡単に書いておきます。
そして、Copilotをアサインするとこのようなモーダルが表示されます。
ここでは、Baseブランチ等の基本的な情報の他に、CustomAgentや任意のプロンプトを記述することもできまが、今回は特に指定せずにCopilotをアサインします。
すると、GitHub Actions上に環境が構築され、Copilot コーディングエージェントがコードの生成を開始します。
チャットからセッションを見てみると、Copilot コーディングエージェントがステップを踏んで動作しているのが見れます。
変更のサマリやコードの差分を見ることもできます。
コードが生成され、実際に動作検証が通ると、PRがDraftの状態で作成されています。
PRをレビューする
このPRに対して変更してほしい部分があれば、Copilotにメンションしてコメントを書きます(レビューコメントを書いただけでは修正が行われませんでした)
Copilotが修正したコード
最後に、Copilotが実際に修正したコードを記載します。
| 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 27 28 29 | package main import ( "fmt" "os" "strconv" ) func main() { if len(os.Args) != 3 { fmt.Fprintf(os.Stderr, "Usage: %s <multiplicand> <multiplier>\n", os.Args[0]) os.Exit(1) } multiplicand, err := strconv.ParseFloat(os.Args[1], 64) if err != nil { fmt.Fprintf(os.Stderr, "Error: multiplicand must be a number\n") os.Exit(1) } multiplier, err := strconv.ParseFloat(os.Args[2], 64) if err != nil { fmt.Fprintf(os.Stderr, "Error: multiplier must be a number\n") os.Exit(1) } result := multiplicand * multiplier fmt.Printf("%g * %g = %g\n", multiplicand, multiplier, result) } |
実行結果
| 1 2 3 | % go run cmd/calccli/main.go 12 34 12 * 34 = 408 |
さいごに
Copilot コーディングエージェントを使って、Issueからコードを生成するところを試してみました。
Issueの内容がとてもシンプルだったため、初回の実行でおおよそ思った通りのコードが生成されたのですが、追加する変数名から後続の処理まで予想して、指示していない内容までコード化されていたのは想定外でした。
今後は、より複雑なタスクの実行やカスタムエージェント、プロンプトについても試して見たいと思います。