Azure DevOps 中的 Python 库访问:无用户依赖的解决方案
·
在使用 Azure DevOps 时,如果你创建了一个包含 Python 库的 Feed,并希望在没有特定用户依赖的情况下访问这个库,你可能会遇到一些挑战。让我们通过一个实例来探讨如何解决这个问题。
问题背景
假设我们有一个名为 MyCompanyFeed 的私有 Feed,其中包含了我们公司开发的多个 Python 库。这些库需要在公司的多个服务器上使用,但这些服务器不属于任何特定的用户,因此传统的个人访问令牌(PAT)方法并不适用。
解决方案
1. 使用 Service Principal
虽然我们不能为服务主体(Service Principal)直接创建个人访问令牌,但我们可以通过以下步骤来实现:
创建服务主体
首先,我们需要创建一个服务主体。这个服务主体将用于代表我们访问 Azure DevOps。
az ad sp create-for-rbac --name "MyPythonLibraryAccessSP"
这将输出一个 JSON 对象,包含了 appId, password, tenant 和 displayName。我们需要保存这些信息。
配置服务主体权限
接下来,我们需要配置这个服务主体,使其能够访问我们的 Feed:
- 登录到 Azure DevOps。
- 导航到
Organization Settings>Security>Service Principals。 - 找到我们刚创建的服务主体,点击
Manage permissions。 - 在
Permissions页面中,添加Feed Contributor角色到MyCompanyFeed。
使用服务主体进行访问
由于服务主体不能直接用于 pip 配置文件(如 pip.ini 或 pip.conf),我们需要另一种方法来访问 Feed。我们可以使用 Azure DevOps 的 Build Service 账户来获取一个可用于 pip 的访问令牌:
- 在 Azure DevOps 中创建一个 Pipeline。
- 使用
$(system.accesstoken)获取一个Build Service的访问令牌。 - 将这个令牌作为环境变量传递给服务器的
pip配置文件。
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.x'
- script: |
echo "##vso[task.setvariable variable=PIP_EXTRA_INDEX_URL]$(pip_index_url)"
env:
pip_index_url: 'https://$(system.accesstoken)@pkgs.dev.azure.com/$(System.TeamFoundationCollectionUri)/_packaging/MyCompanyFeed/pypi/simple/'
- script: |
python -m pip install -r requirements.txt
在服务器上,我们可以设置 PIP_EXTRA_INDEX_URL 环境变量来使用这个令牌:
export PIP_EXTRA_INDEX_URL=https://$(system.accesstoken)@pkgs.dev.azure.com/$(System.TeamFoundationCollectionUri)/_packaging/MyCompanyFeed/pypi/simple/
2. 其他考虑
- 安全性:确保服务主体和访问令牌的安全性,定期更新密码或令牌。
- 权限管理:细致管理服务主体的权限,仅授予必要的访问权限。
- CI/CD 集成:利用 CI/CD 系统来管理和更新这些访问令牌,减少手动操作的风险。
通过这种方法,我们可以实现无用户依赖的访问控制,同时保持库的私密性和安全性。这种解决方案不仅适用于服务器环境,还可以应用于其他需要访问私有 Feed 的场景。
更多推荐
所有评论(0)