在 GitHub Actions 中解锁 IPv6:使用 Cloudflare WARP 完全指南

当然!恭喜你成功解决了这个问题!这是一个非常棒的实践,值得写一篇博客来分享给其他可能遇到同样困扰的开发者。

下面我为你草拟了一篇博客文章,它详细介绍了问题背景、解决方案的演进过程(包括你遇到的两个job的坑)、最终的完美方案,并附上了你成功的日志作为证明。


在 GitHub Actions 中解锁 IPv6:使用 Cloudflare WARP 完全指南

你的应用是否已经为下一代互联网做好了准备?随着 IPv6 的普及,确保你的服务在纯 IPv6 环境下正常工作变得越来越重要。然而,当你想在 CI/CD 流程中自动化测试这一点时,可能会遇到一个棘手的障碍:GitHub Actions 的默认运行环境只提供 IPv4 网络

但别担心,本文将向你展示如何利用 Cloudflare WARP,为你的 GitHub Actions 工作流注入强大的 IPv6 访问能力,让你的自动化测试覆盖更全面。

问题:GitHub Actions 的 IPv6 短板

在 GitHub Actions 的 ubuntu-latest 虚拟机中执行 curl -6ping6,你很可能会收到 Network is unreachable 的错误。这是因为 GitHub 提供的 runner 默认没有配置公网 IPv6 路由。这对于需要测试 IPv6 连接、访问 IPv6-only API 或验证双栈兼容性的项目来说,是一个巨大的挑战。

解决方案:Cloudflare WARP

Cloudflare WARP 是一个现代、快速且安全的 (虛抳抟鼡網絡) 服务。它最吸引人的特性之一是,它能为客户端设备提供一个完整的 IPv6 网络栈,即使设备本身所在的网络不支持 IPv6。这正是我们需要的!我们可以将 WARP 客户端安装到 Actions 的 runner 中,让它为我们的测试任务提供 IPv6 出口。

常见的误区:多 Job 方案的陷阱

在探索解决方案时,一个很自然的想法是:创建一个可复用的工作流,用一个 job 设置好 WARP,然后将 IPv6 地址作为输出传递给另一个执行测试的 job。

# ❌ 错误的思路
jobs:
  setup-ipv6:
    # ... 安装并连接 WARP
    outputs:
      ipv6_address: ${{ steps.verify.outputs.ipv6_address }}

  run-tests:
    needs: setup-ipv6
    # ... 尝试使用 ${{ needs.setup-ipv6.outputs.ipv6_address }}

这个方案行不通! 原因在于 GitHub Actions 的核心机制:每个 job 都在一个完全独立、全新的虚拟机中运行。当 setup-ipv6 job 完成后,它的虚拟机(连同上面安装的 WARP 和网络配置)会被立即销毁。run-tests job 在一台全新的、没有 IPv6 连接的机器上启动,它只能接收到一个字符串形式的 IPv6 地址,却无法真正使用它。

终极方案:单 Job 工作流

正确的做法是将所有步骤——安装、连接、验证和测试——都放在同一个 job 中。这样,网络配置和测试任务就在同一个环境中执行,确保了状态的连续性。

下面是我们最终成功的、健壮的 GitHub Actions 工作流文件。

完整的 .github/workflows/test-ipv6.yml 文件

name: CI with IPv6 via WARP

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:
  test-with-ipv6:
    # 所有步骤都在同一个 job 中运行
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4

    - name: Install Cloudflare WARP
      run: |
        # 检测操作系统类型
        . /etc/os-release
        OS=$ID

        if [[ "$OS" == "ubuntu" || "$OS" == "debian" ]]; then
          echo "--- Installing for Debian/Ubuntu ---"
          sudo apt-get update
          sudo apt-get install -y curl gpg lsb-release
          # 使用最新的官方 GPG 密钥和仓库
          curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg
          echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list
          sudo apt-get update && sudo apt-get install -y cloudflare-warp
        # ... (可以在此处添加对其他发行版的支持)
        else
          echo "Unsupported OS: $OS"
          exit 1
        fi

    - name: Register and connect to WARP
      run: |
        echo "--- Registering WARP client ---"
        # 使用最新的子命令 'registration new' 并接受服务条款
        sudo warp-cli --accept-tos registration new

        echo "--- Connecting to WARP ---"
        sudo warp-cli --accept-tos connect

        # 初始化循环变量
        MAX_ATTEMPTS=6  # 60 seconds / 10 seconds per attempt
        ATTEMPT=1

        echo "--- Waiting for IPv6 connectivity (max 1 minute) ---"

        while [ $ATTEMPT -le $MAX_ATTEMPTS ]; do
          echo "Attempt $ATTEMPT/$MAX_ATTEMPTS: Pinging https://ipv6.test-ipv6.com/ via IPv6..."
          
          if curl -6 -sL -o /dev/null https://ipv6.test-ipv6.com/; then
            echo "✅ IPv6 connectivity is successful!"
            echo "WARP is ready."
            break
          fi

          echo "❌ Attempt $ATTEMPT failed. Waiting for 10 seconds..."
          sleep 10
          ATTEMPT=$((ATTEMPT + 1))
        done

        if [ $ATTEMPT -gt $MAX_ATTEMPTS ]; then
          echo "❌ Error: Failed to establish IPv6 connectivity after 1 minute."
          echo "--- WARP Status for Debugging ---"
          sudo warp-cli --accept-tos status
          exit 1
        fi

    - name: Verify IPv6 Connection and run tests
      run: |
        echo "--- WARP Status ---"
        sudo warp-cli --accept-tos status
        
        echo "--- Checking public IPv6 address ---"
        IPV6_ADDR=$(curl -6 -s https://ifconfig.co)
        echo "Detected IPv6 Address: $IPV6_ADDR"
        
        echo "--- Pinging an IPv6 address ---"
        ping6 -c 4 ipv6.google.com

        echo "======================================================"
        echo "Now you can run your tests that require IPv6 access."
        echo "======================================================"
        
        # 在这里执行你真正需要 IPv6 的测试命令
        # 例如,这个命令现在应该会成功
        curl -6 -v -I https://ipv6.test-ipv6.com/
        
        # 例如: npm run test-ipv6
        # 例如: python my_test_script.py

代码解析

  1. 安装 WARP:我们使用了 Cloudflare 最新的官方软件源和 GPG 密钥,确保安装过程的稳定性和未来兼容性。
  2. 注册与智能连接
    • 使用 warp-cli registration new 进行注册,这是新版客户端的正确命令。
    • --accept-tos 标志用于非交互式地接受服务条款。
    • 最关键的是,我们不再是盲目地 sleep 5,而是实现了一个智能等待循环。它会主动尝试通过 IPv6 访问一个外部服务,最多等待 1 分钟,直到确认连接成功后才继续。这大大提高了工作流的健壮性。
  3. 验证与测试:在确认 WARP 连接成功后,我们进行了一系列验证,并为你预留了执行实际测试命令的位置。

见证成果:成功日志

当你运行上述工作流后,你将看到类似下面这样的成功日志,它清晰地证明了 IPv6 已经在你的 CI/CD 环境中畅通无阻:

Run echo "--- WARP Status ---"
--- WARP Status ---
Status update: Connected
Network: healthy
--- Checking public IPv6 address ---
Detected IPv6 Address: 2a09:bac1:7681:5e78::10:508
--- Pinging an IPv6 address ---
PING ipv6.google.com (2607:f8b0:4004:c19::71) 56 data bytes
64 bytes from bk-in-f113.1e100.net (2607:f8b0:4004:c19::71): icmp_seq=1 ttl=106 time=8.49 ms
...
--- ipv6.google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
...
======================================================
Now you can run your tests that require IPv6 access.
======================================================
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
...
*   Trying [2600:3c03::f03c:94ff:fef6:a3ae]:443...
* Connected to ipv6.test-ipv6.com (2600:3c03::f03c:94ff:fef6:a3ae) port 443
...
> HEAD / HTTP/1.1
...
< HTTP/1.1 200 OK
...

看!状态是 Connected,我们获得了 IPv6 地址,ping6curl -6 都大功告成!

总结

通过将 Cloudflare WARP 的安装、连接和验证逻辑整合到单个 GitHub Actions job 中,我们成功地为 CI/CD 流程解锁了 IPv6 访问能力。这个方案不仅解决了核心问题,还通过智能等待循环和最新的官方指令,确保了流程的稳定性和可靠性。

现在,你可以自信地在你的自动化测试中拥抱 IPv6,确保你的应用在未来互联网中同样出色!

posted @ 2025-12-08 22:19  masx200  阅读(41)  评论(0)    收藏  举报