GitHub Copilot クラウドエージェントで Aspire を起動できるようにする
GitHub Copilot クラウドエージェント (GitHub などのサーバーで動くコーディングエージェント) で Aspire アプリケーションを起動しようとするとそのままでは動作しないので、ここでは正常に起動できるようにする方法を説明します。
解決方法
先に解決方法を書いておくと、環境変数に設定が必要なので次のような Copilotクラウドエージェントのカスタムセットアップ用のワークフローを置いておくとよいです。
name: "Copilot Setup Steps"
on:
workflow_dispatch:
push:
paths:
- .github/workflows/copilot-setup-steps.yml
pull_request:
paths:
- .github/workflows/copilot-setup-steps.yml
jobs:
copilot-setup-steps:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- name: Set DCP_IP_VERSION_PREFERENCE
run: echo "DCP_IP_VERSION_PREFERENCE=IPv4" >> "$GITHUB_ENV"
- name: Install Aspire CLI
run: |
curl -sSL https://aspire.dev/install.sh | bash
echo "$HOME/.aspire/bin" >> "$GITHUB_PATH"
- name: Trust dev certificates
run: |
echo "SSL_CERT_DIR=$HOME/.aspnet/dev-certs/trust" >> "$GITHUB_ENV"
dotnet dev-certs https --trust
発生する問題
GitHub のサーバーで動作する GitHub Copilot クラウドエージェントが動作する環境は GitHub Actions の Hosted-runner に制限がかかった特殊な環境です。
そのため普通に Aspire の AppHost を起動しようとすると次のようなエラーが発生して起動に失敗します。
crit: Aspire.Hosting.Dcp.DcpExecutor[0]
Watch task over Kubernetes Executable resources terminated unexpectedly.
System.Net.Http.HttpRequestException: No data available ([::1]:42721)
---> System.Net.Sockets.SocketException (61): No data available
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.CreateException(SocketError error, Boolean forAsyncThrow)
at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ConnectAsync(Socket socket, CancellationToken cancellationToken)
at System.Net.Sockets.Socket.ConnectAsync(EndPoint remoteEP, CancellationToken cancellationToken)
at System.Net.Http.HttpConnectionPool.ConnectToTcpHostAsync(String host, Int32 port, HttpRequestMessage initialRequest, Boolean async, CancellationToken cancellationToken)
at System.Runtime.CompilerServices.AsyncMethodBuilderCore.Start[TStateMachine](TStateMachine& stateMachine)
--
Hosting failed to start
これは Aspire AppHost が DCP (Developer Control Plane) と通信できないためにエラーとなっている状態です。
原因
この問題の原因はクラウドエージェントの環境では環境変数 DOTNET_SYSTEM_NET_DISABLEIPV6 が設定されていることによります。
例えばローカルの開発環境で DOTNET_SYSTEM_NET_DISABLEIPV6=1 を設定して aspire run あるいは AppHost を dotnet run で起動すると同様に失敗します。
これは DCP は別プロセスで .NET ではないので ::1 で LISTEN していて、 .NET 側が IPv6 アクセスが無効になっていることにより通信できないという状況になっているようです。
回避策
これを解消するには DCP を IPv4 で LISTEN するように構成します。具体的には環境変数 DCP_IP_VERSION_PREFERENCE を設定することで DCP が IPv4 で待ち受けるようになります。
DCP_IP_VERSION_PREFERENCE=IPv4
これを AGENTS.md などに記述するか、Copilot クラウドエージェントのカスタムセットアップステップで記述します。
jobs:
copilot-setup-steps:
steps:
- name: Set DCP_IP_VERSION_PREFERENCE
run: echo "DCP_IP_VERSION_PREFERENCE=IPv4" >> "$GITHUB_ENV"
おまけ: クラウドエージェントのカスタマイズ
最初に書いたワークフローのサンプルで含めていましたが、Aspire CLI の設定と開発向け証明書の信頼を入れておくとベターです。
jobs:
copilot-setup-steps:
steps:
- name: Install Aspire CLI
run: |
curl -sSL https://aspire.dev/install.sh | bash
echo "$HOME/.aspire/bin" >> "$GITHUB_PATH"
- name: Trust dev certificates
run: |
echo "SSL_CERT_DIR=$HOME/.aspnet/dev-certs/trust" >> "$GITHUB_ENV"
dotnet dev-certs https --trust
Discussion