🌩️

GitHub Copilot クラウドエージェントで Aspire を起動できるようにする

に公開

GitHub Copilot クラウドエージェント (GitHub などのサーバーで動くコーディングエージェント) で Aspire アプリケーションを起動しようとするとそのままでは動作しないので、ここでは正常に起動できるようにする方法を説明します。

解決方法

先に解決方法を書いておくと、環境変数に設定が必要なので次のような Copilotクラウドエージェントのカスタムセットアップ用のワークフローを置いておくとよいです。

https://docs.github.com/ja/copilot/how-tos/use-copilot-agents/cloud-agent/customize-the-agent-environment

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 アクセスが無効になっていることにより通信できないという状況になっているようです。

https://github.com/microsoft/aspire/issues/4561

回避策

これを解消するには DCP を IPv4 で LISTEN するように構成します。具体的には環境変数 DCP_IP_VERSION_PREFERENCE を設定することで DCP が IPv4 で待ち受けるようになります。

DCP_IP_VERSION_PREFERENCE=IPv4

これを AGENTS.md などに記述するか、Copilot クラウドエージェントのカスタムセットアップステップで記述します。

https://docs.github.com/ja/copilot/how-tos/use-copilot-agents/cloud-agent/customize-the-agent-environment

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