Github Actions部署至FTP服务器失败问题求助
我来帮你梳理下可能的原因和解决办法——之前我在GitHub Actions部署FTP的时候也遇到过类似的超时问题,大概率是环境差异或者网络限制导致的:
1. 强制启用FTP被动模式
GitHub Actions运行在云环境中,FTP默认的**主动模式(PORT)**很容易被防火墙拦截:主动模式需要你的FTP服务器主动连接GitHub Actions runner的随机端口,而云环境通常会严格限制入站连接。
你可以在lftp命令里强制开启被动模式,同时增加超时和重试参数来应对短暂网络波动:
unbuffer lftp -c "debug; set ftp:ssl-allow false; set ssl:verify-certificate false; set ftp:passive-mode true; set net:timeout 30; set net:max-retries 3; open -u username,${{ secrets.PASSWORD }} ftpservername.com; mirror -R -v locfolder remote/remotefolder"
这里的net:timeout设置连接超时时间为30秒,net:max-retries允许最多3次重试,能有效降低偶然超时的概率。
2. 检查服务器是否屏蔽GitHub Actions的IP段
有些FTP服务器会设置IP白名单,或者直接屏蔽云服务商的IP段(GitHub Actions的runner IP属于微软Azure)。虽然你本地能正常连接,但GitHub的公网IP可能不在服务器的允许列表里。
你可以先在GitHub Actions里测试基础连通性,确认是否是IP拦截:
- name: Test FTP Connectivity run: | ping -c 3 ftpservername.com telnet ftpservername.com 21
如果telnet返回Connection timed out,基本可以确定是服务器拦截了GitHub的IP。这种情况你需要联系服务器管理员,请求将GitHub Actions的IP段加入白名单(GitHub会定期更新官方IP范围,管理员可以在GitHub官方文档中查询)。
3. 尝试切换到SFTP(如果服务器支持)
SFTP基于SSH协议,通常比传统FTP更稳定,而且云环境对SSH的网络限制更少。如果你的服务器支持SFTP,可以改用SFTP部署:
用lftp连接SFTP:
unbuffer lftp -c "set sftp:auto-confirm true; open sftp://username:${{ secrets.PASSWORD }}@ftpservername.com; mirror -R -v locfolder remote/remotefolder"
直接用sftp命令:
- name: SFTP Deploy run: | echo "put -r locfolder/* remote/remotefolder/" | sftp -o StrictHostKeyChecking=no username:${{ secrets.PASSWORD }}@ftpservername.com
4. 尝试显式启用FTPS(如果服务器支持)
有些服务器默认要求使用FTPS(加密FTP),即使你设置了ftp:ssl-allow false,也可能导致连接异常。可以尝试显式开启SSL保护:
unbuffer lftp -c "debug; set ssl:verify-certificate false; set ftp:ssl-protect-data true; set ftp:passive-mode true; open -u username,${{ secrets.PASSWORD }} ftps://ftpservername.com:21; mirror -R -v locfolder remote/remotefolder"
如果是隐式FTPS,端口通常是990,把上面的21替换成990即可。
5. 切换GitHub Actions Runner环境
偶尔GitHub Actions的runner节点网络可能出现临时波动,你可以尝试切换runner的操作系统版本,比如从ubuntu-latest改成ubuntu-22.04或者windows-latest,不同节点的网络环境可能有所差异。
内容的提问来源于stack exchange,提问作者Dinac23

