00.png

最近项目有用到Azure DevOps,虽然以前也有用过Github ActionsAWS CodePipeline,但都没实际去使用过RestAPI。
这回希望从Azure Functions中直接去调用DevOps API,因为DevOps的认证需要单独跟Microsoft Entra ID关联才行,加上最轻松的PAT方式在维护层面不方便,所以在此简单记录下通过Azure Functions Python 去做Managed ID方式的认证。

环境准备

  1. 为Azure Functions创建用户托管标识(Managed Identity)
    01.png
  2. Functions APP > 标识(ID) > 用户分配中添加刚刚创建的用户托管标识
  3. 登录DevOps,在组织设置(Organization Settings) > 用户中添加创建的用户托管标识,并确保有足够的权限(Basic用户访问权限,另项目设置中也有权限设定需要注意)
  4. 在Functions的配置 > 应用程序设置中添加Client ID的环境变量,Client ID可从用户托管标识的概述从复制

Functions调用DevOps

  1. 需要以下依赖包

    azure-functions
    azure-identity
    azure-devops
  2. 获取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)
  3. 创建连接

    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)
  4. 调用服务

    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)

添加新评论