Azure DevOps
用一次 Microsoft 登录连接 Azure DevOps 组织,在 Azure Repos 中工作,并由 Pull Request 和评论触发 Agent。
Azure DevOps 集成让 Agent 在 Azure Repos 中工作:一个 Git 仓库可以作为 Agent 的工作区或附加仓库;Agent 也可以监视一个仓库,让 Pull Request 和评论成为会话。Agent 在 Pull Request 的评论线程中回复,可以提交带投票的正式评审,并把运行状态写成 Pull Request 状态。
支持 Azure DevOps Services(dev.azure.com),不支持 Azure DevOps Server、TFVC 仓库和 SSH 远程地址。
AgentConnect 在 Azure DevOps 中以每个组织一个身份行事:AgentConnect 应用,在你的 Microsoft Entra 租户中表现为一个服务主体。所有 Agent 做的一切——克隆、推送、评论、评审、状态——都记在这个应用名下。
开始之前
- 一个 Microsoft 工作或学校账户:它是该 Azure DevOps 组织的 Project Collection Administrator,并且是组织所在 Microsoft Entra 租户的成员或来宾。个人 Microsoft 账户无法连接。
- 使用 Azure DevOps 的 Agent 运行在**你自己运行的 Daemon** 上,执行策略为 Host 或 Sandbox(
srt)。AgentConnect Cloud 的托管会话、Kubernetes Daemon 池和 VM 策略目前还无法访问 Azure DevOps,在那里启动的会话会被拒绝并给出原因。
连接 Azure DevOps
组织在集成 → 代码托管平台 → Azure DevOps → 使用 Microsoft 连接中连接一次。
-
用上面的管理员账户登录。如果租户要求管理员批准,由 Microsoft Entra 管理员为 AgentConnect 应用授予一次同意,然后重新登录。
-
选择组织。 AgentConnect 列出你的账户所属的 Azure DevOps 组织。如果组织所在的租户不是你登录的租户,会引导你到那个租户重新登录。
-
选择项目。 勾选 Agent 需要的项目。新勾选的项目默认为写并允许触发器:
选项 给应用的权限 读 Agent 可以克隆和读取,但不能推送(项目的 Readers)。 写 还可以推送和创建 Pull Request(Contributors)。 允许触发器 Pull Request 可以启动 Agent(项目的 Service Hook 权限)。 所有项目会把同样的选项授予每个项目,包括以后新建的项目,新项目不用再来这里勾选。只有 Project Collection Administrator 能打开它。
随后 AgentConnect 以 Basic 访问级别把应用加入组织(占用一个付费许可证),加入你选择的组,并检查它能看到仓库。
只授予 Agent 需要的项目。应用能访问它所在的组允许的一切,它的令牌在整个组织内有效;把每个 Agent 限制在自己仓库内的是 AgentConnect(见访问由 Daemon 控制)。
不是 Project Collection Administrator 的 Project Administrator 无法以 Basic 访问级别添加应用。这时 AgentConnect 会给出一份清单:由 Project Collection Administrator 在组织设置 → 用户中以 Basic 访问级别添加这个应用(按客户端 ID 查找),然后你在卡片上继续。
管理项目访问
卡片上的管理项目访问会再走一次同样的登录,并显示应用当前的权限。应用后 Azure DevOps 会与页面一致:取消勾选项目或所有项目、改为读或取消允许触发器,都会收回对应权限。
使用自己的应用
改用自己的应用会连接一个在你自己租户中注册的应用:填入组织、租户 ID、客户端 ID 和客户端密码。请自行把这个应用的服务主体加入组织(Basic)和项目组。如果要用触发,还要为它授予项目 Service Hook 的查看订阅和编辑订阅权限。
仓库
仓库在第一次被用到时加入组织:把它选为 Agent 的工作区、添加为附加仓库,或在触发器中选中它。选择器列出应用能看到的所有仓库。
每个 Agent 对每个仓库有读或写权限。写权限需要项目上的写;如果应用无法推送到某个仓库,以写权限把它设为工作区会在保存时被拒绝。
有触发器的仓库会显示最近一次事件的时间;需要处理时显示标记:
| 标记 | 怎么做 |
|---|---|
| 触发器待验证 | 无需处理,收到第一个事件后消失。 |
| 未允许触发器 | 在管理项目访问中为该项目打开允许触发器。 |
仓库行上的钥匙图标用来轮换 Azure DevOps 签名投递所用的密钥。旧密钥在 36 小时内仍然有效,已排队的投递仍能送达。
访问由 Daemon 控制
Azure DevOps 无法签发只限一个仓库或只读的令牌,所以令牌从不进入 Agent 的会话:Git 和 Azure CLI 通过 Daemon 的凭证代理访问 Azure DevOps,代理只为 Agent 自己的仓库出示真实令牌,并拒绝低于写权限的推送和 API 写操作。
装有 azure-devops 扩展的 Azure CLI 在会话中可以照常使用——az repos show、az repos pr create、az repos pr update 等。AgentConnect 不负责安装:请在 Daemon 主机上安装 Azure CLI 和这个扩展。会暴露其他仓库的列表操作,例如 az repos list,或不带 --repository 列出 Pull Request,会被拒绝。
Agent 还有三个不需要 CLI 的工具:azureDevOpsPullRequest(创建、编辑、完成、放弃、重新激活 Pull Request,以及标签)、azureDevOpsComment(评论线程和回复)和 readAzureDevOpsPullRequest。它们创建的 Pull Request 会带上 Agent 的署名。
监视仓库
在 Agent 上:集成 → 添加集成 → Azure DevOps。
仓库必须已经是 Agent 的工作区或附加仓库之一,并且它所在的项目已允许触发器。选择 Agent 对 Pull Request 的响应时机:
- opened——Pull Request 被创建时。
- any update——创建,加上新提交、重新打开 Pull Request,以及评论。
- @-mention——只在 Pull Request 的描述或评论中以
@<agent-name>提到这个 Agent 时。
无论选哪种时机,把 AgentConnect 应用加为 Pull Request 的评审者都会请求一次评审。Azure DevOps 的评审者选择器只列出人,所以这个请求要通过 REST API 或 az repos pr reviewer add 发出。
AgentConnect 会自己创建和维护仓库的 Service Hook——触发器需要的每类事件一个——并在最后一个触发器移除后删除它们。监视同一个仓库的多个 Agent 共用这些 Service Hook。
谁可以触发 Agent
事件发生时,AgentConnect 会检查引发事件的人能否向仓库贡献:从 Azure DevOps 读取这个人自己的权限,以及他所在的每个组的权限。不能推送到仓库的人不会启动 Agent。对于评审请求和重新打开的 Pull Request,检查的是 Pull Request 的作者。编辑评论和点赞不会开始新一轮。
应用自己的评论不会触发 Agent。应用在同一仓库中创建的 Pull Request 仍会进入评审,这样一个 Agent 就能评审另一个 Agent 的工作;应用推送到 Pull Request 的提交和其他人的一样,算作一次新的修订。
Agent 会做什么
每个符合条件的事件都会在 Agent 的 Daemon 上开启一个会话,会话出现在会话中,并链接回 Pull Request。
- 回复——在触发这一轮的线程中回复,或在 Pull Request 上开一个新线程。这一轮开始时,触发它的评论会被点赞。
- 评审——在触发器上选择了评审格式后,新打开的 Pull Request、新提交或评审请求会得到一次正式评审:每条行内评论一个线程(多行范围仍是范围)、一个总结线程,以及一次投票——批准时为 Approved(10),要求修改时为 Waiting for author(−5)。只有评论的评审不改变投票。提及 Agent 会在该线程中得到回复,而不是正式评审。
- 运行状态——一个名为
agentconnect/<agent-name>的 Pull Request 状态,链接到控制台中的会话。只有管理员在分支策略中把它设为必需的状态检查时,它才会阻止完成 Pull Request。
要让 Agent 在 Pull Request 上再运行一次:在会话中发消息、推送新提交,或提到这个 Agent。
所有 Agent 都以同一个应用的身份行事,所以在一个 Pull Request 上只有一票:最近的一次评审决定它。每个 Agent 自己的结论保留在它的总结线程和它的状态中。
断开连接
断开连接会删除 AgentConnect 的 Service Hook 并释放连接,Agent 随即停止在这些仓库上工作。要从 Azure DevOps 中彻底移除应用,请在组织设置 → 用户中移除它;如有需要,再在 Microsoft Entra 中删除它的企业应用。
自托管部署
上面的内容在 AgentConnect OSS 上同样适用。运维人员只需配置一次部署的 Microsoft 应用,并把控制台的 Azure DevOps 连接页面再添加为一个重定向 URI:见 Microsoft Teams 部署应用。没有部署应用时,组织可以使用自己的应用。