如何通过GitHub Action将Python包上传至Azure Artifacts私有源
可以在GitHub Actions中配置twine凭证实现发布
完全可以通过GitHub Actions结合twine实现自动发布Python包到Azure Artifacts私有源,不需要依赖artifacts-keyring或者Azure Pipelines,以下是具体实现方案:
1. 准备Azure Artifacts凭证
- 在Azure DevOps中创建个人访问令牌(PAT),权限需勾选
Packaging下的「读取、写入、管理」权限 - 将该PAT存储到GitHub仓库的Secrets中,命名为
AZURE_ARTIFACTS_PAT;同时可以把Azure组织名、私有源名存为仓库变量(比如AZURE_ORG_NAME、AZURE_FEED_NAME),方便后续维护
2. 编写GitHub Actions Workflow
以下是完整的Workflow YAML示例,包含代码检出、Python环境配置、包构建、twine发布全流程:
name: Publish to Azure Artifacts on: push: tags: - 'v*' # 仅当推送版本标签时触发发布 workflow_dispatch: # 支持手动触发 jobs: publish: runs-on: ubuntu-latest steps: - name: 检出代码 uses: actions/checkout@v4 - name: 设置Python环境 uses: actions/setup-python@v5 with: python-version: '3.x' # 指定你的包兼容的Python版本 - name: 安装构建和发布依赖 run: | python -m pip install --upgrade pip pip install setuptools wheel twine build - name: 构建Python包 run: python -m build # 生成sdist和bdist_wheel格式的包 - name: 发布到Azure Artifacts私有源 env: TWINE_USERNAME: azureuser # Azure Artifacts要求用户名非空,可任意填写 TWINE_PASSWORD: ${{ secrets.AZURE_ARTIFACTS_PAT }} TWINE_REPOSITORY_URL: https://pkgs.dev.azure.com/${{ vars.AZURE_ORG_NAME }}/_packaging/${{ vars.AZURE_FEED_NAME }}/pypi/upload/ run: twine upload dist/*
关键细节说明
- 凭证配置:Azure Artifacts对twine的用户名无实际验证要求,只需填写非空字符串即可,密码直接使用之前创建的PAT
- 源URL格式:确保URL末尾包含
/upload/,否则twine会请求错误的端点 - 触发条件:示例中仅在推送版本标签时触发,你可以根据需求修改为
push: branches: [main]等其他触发规则 - 包构建:使用
python -m build是官方推荐的现代构建方式,替代传统的setup.py命令
可选:使用.pypirc文件配置
如果你更习惯用.pypirc管理仓库配置,可以在Workflow中动态生成该文件:
# 在发布步骤前添加以下步骤 - name: 创建.pypirc配置文件 run: | echo "[distutils]" >> ~/.pypirc echo "index-servers =" >> ~/.pypirc echo " azure-artifacts" >> ~/.pypirc echo "" >> ~/.pypirc echo "[azure-artifacts]" >> ~/.pypirc echo "repository = https://pkgs.dev.azure.com/${{ vars.AZURE_ORG_NAME }}/_packaging/${{ vars.AZURE_FEED_NAME }}/pypi/upload/" >> ~/.pypirc echo "username = azureuser" >> ~/.pypirc echo "password = ${{ secrets.AZURE_ARTIFACTS_PAT }}" >> ~/.pypirc # 发布步骤改为: - name: 发布到Azure Artifacts私有源 run: twine upload --repository azure-artifacts dist/*
内容的提问来源于stack exchange,提问作者Freddy L.
相关产品推荐
相关产品推荐

