使用Poetry在CI/CD任务中发布Python包到GitLab仓库遇401未授权错误
GitLab CI Poetry推包401未授权问题排查与解决
针对你遇到的401错误,结合GitLab SaaS环境和Poetry 1.8.3的场景,按以下步骤排查修复:
1. 启用项目级CI作业令牌的包访问权限
进入你的项目设置:
- 打开项目 → 点击左侧菜单「设置」→「CI/CD」
- 找到「令牌权限」区域,勾选「允许作业令牌访问包注册表」
- 保存设置后重新运行作业
(你之前找的组令牌设置是另一种场景,这里不需要组令牌,只需要项目级的这个开关)
2. 在CI作业中显式声明权限范围
GitLab 15.7及之后的SaaS版本,CI_JOB_TOKEN默认权限受限,必须在.gitlab-ci.yml的作业块中添加permissions配置,明确授予包写入权限:
publish: stage: publish image: python:3.12 script: - # 你的Poetry配置和发布命令 permissions: packages: write contents: read # 若作业需要拉取代码或依赖,需添加此项
3. 验证Poetry配置的准确性
在作业的script中添加调试命令,确认配置是否正确加载:
- poetry config --list # 输出所有Poetry配置,检查gitlab仓库地址和http-basic信息 - echo "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi" # 验证仓库URL是否正确
另外,若CI_JOB_TOKEN包含特殊字符,需用引号包裹变量避免解析错误:
- poetry config http-basic.gitlab gitlab-ci-token "$CI_JOB_TOKEN"
4. 检查包版本是否重复
GitLab包注册表不允许重复发布同一版本的包,若目标版本已存在,会返回401(错误提示不明确)。解决方法:
- 前往项目左侧菜单「包」→「包注册表」,检查是否有相同版本的包
- 若存在,删除旧版本或修改
pyproject.toml中的版本号后重新发布
内容的提问来源于stack exchange,提问作者geudrik
相关产品推荐
相关产品推荐

