在使用 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, tenantdisplayName。我们需要保存这些信息。

配置服务主体权限

接下来,我们需要配置这个服务主体,使其能够访问我们的 Feed

  • 登录到 Azure DevOps。
  • 导航到 Organization Settings > Security > Service Principals
  • 找到我们刚创建的服务主体,点击 Manage permissions
  • Permissions 页面中,添加 Feed Contributor 角色到 MyCompanyFeed
使用服务主体进行访问

由于服务主体不能直接用于 pip 配置文件(如 pip.inipip.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 的场景。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐