最近项目有用到Azure DevOps
,虽然以前也有用过Github Actions
和AWS CodePipeline
,但都没实际去使用过RestAPI。
这回希望从Azure Functions
中直接去调用DevOps API
,因为DevOps的认证需要单独跟Microsoft Entra ID
关联才行,加上最轻松的PAT
方式在维护层面不方便,所以在此简单记录下通过Azure Functions Python 去做Managed ID方式的认证。
环境准备
- 为Azure Functions创建用户托管标识(Managed Identity)
- 在
Functions APP > 标识(ID) > 用户分配
中添加刚刚创建的用户托管标识 - 登录DevOps,在
组织设置(Organization Settings) > 用户
中添加创建的用户托管标识,并确保有足够的权限(Basic用户访问权限,另项目设置中也有权限设定需要注意) - 在Functions的
配置 > 应用程序设置
中添加Client ID
的环境变量,Client ID
可从用户托管标识的概述从复制
Functions调用DevOps
需要以下依赖包
azure-functions azure-identity azure-devops
获取Entra ID Access Token,scope填写默认scope固定值
from azure.identity import ManagedIdentityCredential scope = "499b84ac-1321-427f-aa17-267ca6975798/.default" credential = ManagedIdentityCredential(client_id=YOUR_CLIENT_ID) access_token = credential.get_token(scope)
创建连接
from azure.devops.connection import Connection from msrest.authentication import BasicTokenAuthentication creds = BasicTokenAuthentication({"access_token": access_token.token}) connection = Connection(base_url=f'https://dev.azure.com/{YOUR_ORGANIZATION}', creds=creds)
调用服务
pipeline_client = connection.clients.get_pipelines_client() run_params = { 'templateParameters': { 'KEY': 'VALUE' } } run = pipeline_client.run_pipeline(project="YOUR_PROJECT_NAME", pipeline_id="PIPELINE_ID", run_parameters=run_params)