为何GitHub Actions无法连接MongoDB Atlas?
解决GitHub Actions连接MongoDB Atlas超时问题
问题诊断
本地运行爬取脚本完全正常,但通过GitHub Actions定时执行时触发pymongo.errors.ServerSelectionTimeoutError,核心原因是GitHub Actions的云Runner无法建立到MongoDB Atlas的连接,大概率是IP白名单限制或凭证配置问题导致。
解决方案
1. 配置MongoDB Atlas IP白名单,允许GitHub Actions访问
GitHub Actions的云Runner使用动态公网IP,无法提前固定。针对个人/测试项目,最简单的解决方式是将Atlas的IP访问规则设置为允许所有IP(生产环境建议使用静态IP或VPC对等连接):
- 登录MongoDB Atlas控制台,进入目标项目
- 左侧导航栏选择Network Access
- 点击Add IP Address,在弹出框中输入
0.0.0.0/0,备注GitHub Actions后保存设置
2. 移除脚本硬编码凭证,改用GitHub Secrets存储
脚本直接硬编码MongoDB凭证既不安全,也可能在Actions环境中出现配置错误:
修改Python脚本(scraping_daily.py)
# 替换原有的MongoClient初始化代码 import os from pymongo import MongoClient # 从环境变量读取凭证 mongo_username = os.getenv("MONGO_USERNAME") mongo_password = os.getenv("MONGO_PASSWORD") # 初始化连接并添加超时配置 client = MongoClient( f"mongodb+srv://{mongo_username}:{mongo_password}@project1.lpu4kvx.mongodb.net/?retryWrites=true&w=majority", serverSelectionTimeoutMS=30000 # 设为30秒超时,避免不必要的长等待 ) # 新增连接测试(可选,方便调试) try: client.admin.command('ping') print("MongoDB连接成功") except Exception as e: print(f"MongoDB连接失败: {str(e)}") raise
在GitHub仓库配置Secrets
- 打开目标GitHub仓库,进入Settings → Secrets and variables → Actions
- 点击New repository secret,分别创建两个Secret:
- 名称:
MONGO_USERNAME,值:你的MongoDB Atlas用户名 - 名称:
MONGO_PASSWORD,值:你的MongoDB Atlas密码
- 名称:
修改GitHub Actions配置(actions.yml)
在执行脚本步骤中注入环境变量,并修正脚本运行命令:
- name: execute the script run: python scraping_daily.py # 移除-m参数,直接运行脚本即可 env: MONGO_USERNAME: ${{ secrets.MONGO_USERNAME }} MONGO_PASSWORD: ${{ secrets.MONGO_PASSWORD }}
3. 优化脚本数据加载逻辑(可选)
本地测试时读取全量数据没问题,但Actions环境中若集合数据量较大,list(collection.find())会占用大量内存,建议只读取去重所需字段:
# 替换原有的加载数据代码 df = pd.DataFrame(collection.find({}, {"reviewId": 1, "userName": 1, "_id": 0}))
这样能减少数据传输量,提升脚本执行效率。
内容的提问来源于stack exchange,提问作者Mathew Darren Kusuma
相关产品推荐
相关产品推荐

