在GitHub自托管Runner上连接Mongo Atlas时遇pymongo.InvalidURI错误
问题分析与解决方案
问题根源
从你打印的URI结果"***[connect_uri].mongodb.net"可以明确两个核心问题:
- URI被包裹在双引号中,导致Python的字符串替换逻辑无法匹配目标前缀
- URI本身缺少
mongodb+srv://前缀,使得replace("mongodb+srv://", ...)完全找不到替换目标,最终生成的连接字符串没有合法的URI协议头,触发InvalidURI错误
具体解决步骤
1. 修正GitHub Actions输出的URI格式
检查creates-ephemeral-env步骤的输出逻辑,确保mongodb_uri满足两个要求:
- 不带任何引号
- 完整包含
mongodb+srv://前缀(比如mongodb+srv://cluster0.example.mongodb.net/)
如果该步骤输出的URI自带引号,在设置输出时添加去引号处理:
- name: Generate MongoDB URI output id: create-env run: | # 假设你的原始URI存储在RAW_MONGODB_URI变量中 CLEAN_URI=$(echo $RAW_MONGODB_URI | tr -d '"') echo "mongodb_uri=$CLEAN_URI" >> $GITHUB_OUTPUT
2. 重构Python连接字符串生成逻辑
放弃依赖原URI前缀的替换方式,改用更可靠的拼接逻辑:
if __name__ == "__main__": # 确保URI前缀合法 base_uri = mongodb_uri.strip('"') # 先移除可能存在的引号 if not base_uri.startswith(("mongodb://", "mongodb+srv://")): base_uri = f"mongodb+srv://{base_uri}" # 移除URI中可能已有的认证信息,避免重复拼接 if "@" in base_uri: base_uri = base_uri.split("@", 1)[-1] # 拼接完整认证连接串 connection_string = f"mongodb+srv://{mongodb_username}:{mongodb_password}@{base_uri}" data_store = pymongo.MongoClient(connection_string)[mongodb_name]
3. 添加Action步骤调试
在GitHub Actions的Populate VectorDB步骤中添加调试输出,直接在日志中确认环境变量的实际值:
run: | cd database/scripts/populate_pinecone_db # 打印URI的原始值(仅用于调试,不要打印敏感信息) echo "DEBUG: MONGODB_URI value is: $MONGODB_URI" python3 -m venv venv source venv/bin/activate pip3 install -r requirements.txt python3 -u script.py
4. 验证依赖安装完整性
在pip安装后添加版本验证,确保pymongo正确安装:
pip3 show pymongo python3 -c "import pymongo; print('pymongo version:', pymongo.__version__)"
内容的提问来源于stack exchange,提问作者Bvnch
相关产品推荐
相关产品推荐

