在 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 -6 或 ping6,你很可能会收到 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
代码解析
- 安装 WARP:我们使用了 Cloudflare 最新的官方软件源和 GPG 密钥,确保安装过程的稳定性和未来兼容性。
- 注册与智能连接:
- 使用
warp-cli registration new进行注册,这是新版客户端的正确命令。 --accept-tos标志用于非交互式地接受服务条款。- 最关键的是,我们不再是盲目地
sleep 5,而是实现了一个智能等待循环。它会主动尝试通过 IPv6 访问一个外部服务,最多等待 1 分钟,直到确认连接成功后才继续。这大大提高了工作流的健壮性。
- 使用
- 验证与测试:在确认 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 地址,ping6 和 curl -6 都大功告成!
总结
通过将 Cloudflare WARP 的安装、连接和验证逻辑整合到单个 GitHub Actions job 中,我们成功地为 CI/CD 流程解锁了 IPv6 访问能力。这个方案不仅解决了核心问题,还通过智能等待循环和最新的官方指令,确保了流程的稳定性和可靠性。
现在,你可以自信地在你的自动化测试中拥抱 IPv6,确保你的应用在未来互联网中同样出色!

浙公网安备 33010602011771号