Copilot SDKでGitLabのIssueを自動実装する方法

AI

はじめに

2026年1月14日に GitHub から公開された @github/copilot-sdk を使うと、Copilot をプログラムから呼び出して自律的にコードを書かせることができます。VS Code 上での補完やチャットとは異なり、SDK を介することでバッチ処理やCI/CDパイプラインなど、エディタの外でも Copilot を活用できるようになります。

今回はこの Copilot SDK の練習として、Docker コンテナ内で Copilot に GitLab の Issue を読み取らせ、実装からマージリクエスト(MR)の作成までを自動で行うツールを作ってみました。本記事ではSDK を使って何が嬉しいのか・Docker と組み合わせる利点について紹介します。

コードは以下のリポジトリで公開しています。

全体の仕組み

ツールの処理フローはシンプルです。

  1. GitLab API から対象の Issue を取得する
  2. 対象プロジェクトのリポジトリをクローンする
  3. フィーチャーブランチを作成する
  4. Copilot SDK を使って Issue の実装を行わせる
  5. 変更をコミット・プッシュする
  6. マージリクエストを自動作成する

Copilot SDK を使うメリット

生成AIの不確実性をプログラムのフローでカバーできる

チャット UI で Copilot に作業を依頼する場合、AI が「すべきでない操作」をしてしまうリスクを会話の中で抑えるしかありません。しかし SDK を使えば、AI の担当範囲をコードで明確に区切れます。

今回のツールでは、Copilot はあくまで「コードの実装」だけを担当し、git のコミットやプッシュはプログラム側で行います。たとえ Copilot が指示を無視してコミットしようとしても、プログラムは実行後の git の状態を検査し、未コミットの変更があれば自分でコミットするフォールバック処理を持っています。

Copilot の担当: ファイルの読み取り・書き込み・コマンド実行(実装のみ)
プログラムの担当: ブランチ作成  Copilot 実行  状態検証  コミット  プッシュ  MR 作成

生成 AI は確率的な存在であり、同じプロンプトでも毎回必ず同じ行動をとるとは限りません。SDK を使えばその不確実な部分を「プログラムのフロー」として吸収し、結果を安定させることができます。

操作権限をコードで制御できる

SDK では Copilot がファイル操作やコマンド実行をリクエストしてくるたびに、許可するかどうかをコールバックで制御できます。今回は開発のシンプルさを優先して approveAll(全許可)を使いましたが、本来は実行可能なコマンドをホワイトリストで絞ったり、特定のディレクトリ外への書き込みを禁止したりすることも可能です。チャット UI ではユーザーの設定に依存してしまう場合がありますが、SDK ならコードで明確に権限を管理できます。チームで運用する際も、どのエージェントがどの操作をできるかをコード上で一元管理できるのは大きなメリットかと思います。

処理を自動化・バッチ化できる

チャット UI はインタラクティブな用途に向いていますが、定期実行や複数件の一括処理には不向きです。SDK を使えば、Issue 番号を引数として渡すだけで一連のフローを無人で実行できます。CI/CD パイプラインに組み込めば、Issue が作成されたタイミングで自動的に実装ブランチを立てる、といった応用も考えられます。

Docker で実行するメリット

ホスト環境への影響がゼロ

Copilot がファイルの作成やコマンドの実行を行いますが、すべてコンテナ内に閉じているため、ホストの環境を汚す心配がありません。AI エージェントは予期しない操作をすることもあるため、この安全性は特に重要です。万が一問題が起きた場合でも、コンテナを停止・削除するだけで済みます。

並列実行が容易

複数の Issue を同時に実装させたい場合、コンテナ単位で並列起動するだけです。

docker run --rm -e ISSUE_IID=10 -e GITLAB_TOKEN=... gitlab-mr-automation &
docker run --rm -e ISSUE_IID=11 -e GITLAB_TOKEN=... gitlab-mr-automation &
docker run --rm -e ISSUE_IID=12 -e GITLAB_TOKEN=... gitlab-mr-automation &

各コンテナが独立したワークスペースを持つため、ファイルの競合を一切気にせず並列処理できます。ホスト環境で直接動かしていれば同時実行は難しいですが、コンテナなら自然とスケールします。

権限と環境を柔軟に使い分けられる

コンテナごとに異なる環境変数(トークンや権限スコープ、モデル指定など)を渡せるため、用途に応じてエージェントの設定を切り替えられます。たとえばレビュー専用エージェントには読み取りのみのトークンを渡し、実装エージェントには書き込み権限を付与するといった使い分けが簡単です。

実行例

前提として以下が必要です。

  • GitHub アカウントが Copilot サブスクリプションに加入していること
  • GitLab のパーソナルアクセストークンが apiread_repositorywrite_repository スコープで発行済みであること
  • Docker がインストールされていること

1. リポジトリをクローンします

bash  git clone https://github.com/shutils/gitlab-mr-automation.git

2. クローンしたディレクトリに移動します

bash  cd gitlab-mr-automation

3. Docker イメージをビルドします

bash  docker build -t gitlab-mr-automation .

4. 以下のコマンドを実行します(環境変数は適宜置き換えてください)

    docker run \
      -e GITLAB_TOKEN=glpat-xxxxxxxxxxxx \
      -e GITLAB_PROJECT_ID=mygroup/myproject \
      -e ISSUE_IID=42 \
      -e GITHUB_TOKEN=ghp_xxxxxxxxxxxx \
      -e TARGET_BRANCH=develop \
      gitlab-mr-automation

実行すると以下のような出力が得られます。

=== GitLab MR Automation ===
Project: mygroup/myproject  Issue IID: 42

[1/7] Fetching issue from GitLab...
  #42 ログイン画面にバリデーションを追加する
[2/7] Fetching project details...
[3/7] Preparing workspace...
  Cloning into /workspace/myproject...
[4/7] Creating feature branch...
  Branch: copilot/mr-42-1712678400000
[5/7] Running Copilot agent...
  [tool] readFile
  [tool] writeFile
  ...
[6/7] Committing changes...
  Committed successfully.
  Pushing branch to GitLab...
  Push complete.
[7/7] Creating Merge Request...

=== Done! ===
Merge Request #15: feat: ログイン画面にバリデーションを追加する
URL: https://gitlab.com/mygroup/myproject/-/merge_requests/15

Issue の取得から MR の作成まで、完全に自動で完了します。

まとめ

Copilot SDK の最大の魅力は、AI の不確実な部分をプログラムのフローで補完できる点です。チャット UI で人間が介在していた「判断」や「検証」の部分をコードで表現することで、AIの動作を安定した自動化フローに組み込めます。

また、Docker と組み合わせることで、ホスト環境への影響の排除・並列実行・権限管理といった運用上の課題も解決できます。

Copilot SDK の可能性はまだまだ広いので、ぜひ皆さんも色々と試してみてください。

コメント

タイトルとURLをコピーしました