端到端Karate测试失败:GitHub无法连接AWS中的数据库
问题分析
本地连接VPN能正常运行数据库验证测试,但GitHub Actions的Ubuntu Runner无法建立JDBC连接,核心原因是GitHub Runner所在的公网环境未被AWS SQL Server的安全组/网络ACL允许访问,或者数据库本身部署在AWS私有网络内,公网无法直接触达。
解决方案
以下是几种可行的解决思路:
1. 为GitHub Runner IP段开放数据库访问权限
- 获取GitHub官方公布的Runner出口IP范围(该列表会定期更新,需同步维护)。
- 在AWS控制台的SQL Server安全组中添加入站规则,允许这些IP段访问数据库的JDBC端口(默认1433)。
2. 在工作流中临时建立AWS VPN连接
通过在GitHub Actions步骤中添加AWS VPN连接,让Runner接入AWS私有网络:
- name: Install VPN dependencies run: sudo apt-get install -y openvpn - name: Connect to AWS VPN env: VPN_CONFIG: ${{ secrets.AWS_VPN_OVPN_CONFIG }} VPN_USER: ${{ secrets.VPN_USERNAME }} VPN_PASSWORD: ${{ secrets.VPN_PASSWORD }} run: | echo "$VPN_CONFIG" > aws-vpn.ovpn # 后台启动VPN连接 sudo openvpn --config aws-vpn.ovpn --auth-user-pass <(echo -e "$VPN_USER\n$VPN_PASSWORD") --daemon # 等待连接稳定 sleep 15
3. 使用AWS私有网络内的自托管Runner
将GitHub Runner部署在AWS私有网络的EC2实例上,让Runner与SQL Server处于同一网络环境:
- 在AWS EC2实例中配置GitHub自托管Runner,确保实例所在子网能访问SQL Server。
- 修改工作流指定使用该自托管Runner:
jobs: build: runs-on: [self-hosted, aws-private-subnet-runner]
4. 验证环境变量传递正确性
虽然本地运行正常,仍需确认GitHub Secrets中的数据库参数是否正确传递:
- name: Validate DB parameters run: | echo "DB URL prefix: ${TEST_URL:0:20}..." # 仅打印前缀避免敏感信息泄露 echo "DB Username: $TEST_USERNAME"
5. 确认JDBC驱动依赖
确保Gradle配置中包含SQL Server JDBC驱动,且适配Java 17版本:
// build.gradle 中的依赖配置 dependencies { testImplementation 'com.microsoft.sqlserver:mssql-jdbc:12.4.2.jre17' }
临时调试步骤
在工作流中添加端口连通性测试,快速定位网络问题:
- name: Test DB port connectivity run: | sudo apt-get install -y telnet # 从TEST_URL中提取数据库主机和端口 DB_HOST=$(echo $TEST_URL | awk -F'//' '{print $2}' | awk -F':' '{print $1}') DB_PORT=$(echo $TEST_URL | awk -F':' '{print $3}' | awk -F'/' '{print $1}') telnet $DB_HOST $DB_PORT
如果telnet连接失败,优先排查AWS安全组、网络ACL的入站规则配置。
内容的提问来源于stack exchange,提问作者Kavi
相关产品推荐
相关产品推荐

