我可以在 Azure DevOps 中设置默认安全和/或分支策略吗?

Posted

技术标签:

【中文标题】我可以在 Azure DevOps 中设置默认安全和/或分支策略吗?【英文标题】:Can I set default security and/or branch policies in Azure DevOps? 【发布时间】:2017-12-30 11:28:30 【问题描述】:

我们的 git 服务器使用 Visual Studio Team Services。每个 Azure DevOps 项目都托管一个或多个 git 存储库。我们有保持masterdevelop 分支锁定的惯例,但让其他分支保持不受限制。

我希望能够在项目级别应用我们的标准规则,并将它们作为其中所有存储库的默认值:

masterdevelop 应该让他们的安全拒绝 Force Push master 分支需要通过代码审查政策提出拉取请求

到目前为止,我发现的 only 选项是通过网络界面(甚至不是 API!)手动设置这些每个存储库。我们至少有 200 多个存储库,并且希望避免必须手动设置每个存储库并逐个分支。

如何按分支名称设置默认代码安全和代码策略?还是手动以外的方式?

【问题讨论】:

【参考方案1】: 要为跨团队项目(项目级)的多个 git 存储库设置最少审阅者的分支策略,您可以使用 REST API。详细步骤如下:

1. Get all git repositories 代表团队项目。

GET https://account.visualstudio.com/DefaultCollection/ProjectName/_apis/git/repositories?api-version=1.0

然后从输出中保存每个 git repo id 和名称。

2。通过 repo id 在代码中循环您在第 1 步中获得的存储库,并为每个主分支循环 create branch policy(假设这里的最少审阅者数量为 2)。

POST https://account.visualstudio.com/DefaultCollection/ProjectName/_apis/policy/configurations?api-version=2.0-preview

应用程序/json:


  "isEnabled": true,
  "isBlocking": true,
  "type": 
    "id": "fa4e907d-c16b-4a4c-9dfa-4906e5d171dd"
  ,
  "settings": 
                "minimumApproverCount": 2,
                "creatorVoteCounts": false,
                "allowDownvotes": false,
                "scope": [
                    
                        "refName": "refs/heads/master",
                        "matchKind": "Exact",
                        "repositoryId": "repo id"
                    
                ]
  

设置分支安全(强制推送为拒绝),目前没有REST API,我发了一个用户语音Set branch security by REST API,大家可以投票关注。

【讨论】:

要编写分支安全脚本,请参阅:jessehouwing.net/… 您还可以将repositoryId 设置为null 以将其应用于所有当前和未来的存储库。 您可以将分支过滤器设置为prefix,以配置所有功能分支或所有发布分支,只要您采用通用命名模式即可。见:jessehouwing.net/…【参考方案2】:

要编写存储库和分支安全性脚本,您可以使用 tfssecurity.exe 或新权限 REST API 或 Azure CLI。 All details in the following blog post:

对于具体的分支,在Token末尾添加/refs^heads^master/

摘录

如果您过去曾深入研究过 Azure DevOps 的安全内部,您会发现某些权限被授予个人或组,并且与令牌相关联。这个令牌通常由一个根对象和一堆 GUID 组成。例如,这是特定 Git 存储库的令牌:

repoV2/daec401a-49b6-4758-adb5-3f65fd3264e3/f59f38e0-e8c4-45d5-8dee-0d20e7ada1b7
^      ^                                    ^
|      |                                    |
|      |                                    -- The Git Repository
|      -- The Team Project Guid
|
-- The root object (Repositories)

我知道找到这些详细信息的最简单方法是捕获更改权限时发出的网络请求:

您可以在您喜欢的浏览器中使用 Web Developer 工具来查找您需要的令牌。 一旦理解了这一点,就很容易找到“团队项目中的所有存储库”令牌的令牌。只需在最后取下 Git Repository GUID:

repoV2/daec401a-49b6-4758-adb5-3f65fd3264e3b7/
^      ^                                    
|      |                                    
|      -- The Team Project Guid
|
-- The root object (Repositories)

并且,使用相同的推理,获取“项目集合/组织中的所有存储库”令牌的令牌。只需在最后取下 Team Project GUID:

repoV2/
^                                          
|
-- The root object (Repositories)

现在我们有了这个令牌,我们可以使用 tfssecurity 来设置组织级别的 git 权限:

tfssecurity /a+ "Git Repositories" repoV2/ "PullRequestBypassPolicy" adm: ALLOW /collection:https://dev.azure.com/org
            ^   ^                  ^       ^                         ^    ^
            |   |                  |       |                         |    -- Allow or Deny the permission 
            |   |                  |       |                         -- The Group (in this case "Project Collection Administrators")
            |   |                  |       -- The Permission we want to set
            |   |                  -- The Token we found above
            |   -- The Secuity Namespace
            -- Add  (a+) or Remove (a-) this permission

而且,正如您在下面看到的,这个技巧确实有效:)。

您可以使用相同的技术来保护分支。分支的令牌使用存储库的令牌作为基础并将分支添加到其中。因为/ 是标记分隔符,所以通过将/ 替换为^ 来转义分支引用。因此refs/heads/master 变为:refs^heads^master

repoV2/daec401a-49b6-4758-adb5-3f65fd3264e3/f59f38e0-e8c4-45d5-8dee-0d20e7ada1b7/refs^heads^master/
^      ^                                    ^                                    ^
|      |                                    |                                    |
|      |                                    |                                    -- The branch
|      |                                    -- The Git Repository
|      -- The Team Project Guid
|
-- The root object (Repositories)

【讨论】:

【参考方案3】:

通过最近的更新,您现在可以通过 UI 本身进行配置。

现在,管理员可以在特定分支或默认分支上设置策略 跨项目中的所有存储库分支。

只需转到“项目设置”=>“跨仓库策略”。

唯一需要注意的是,作为最近的更改,这仅适用于 Azure Devops 云服务,而不适用于 Azure Devops 服务器部署。所以如果你在服务器版本上,你可能需要等待一段时间。

您可以参考这个网址:https://docs.microsoft.com/en-us/azure/devops/release-notes/2019/repos/sprint-160-update

【讨论】:

以上是关于我可以在 Azure DevOps 中设置默认安全和/或分支策略吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Visual Studio 构建任务在 azure devops 中设置工作目录

Azure DevOps 在构建任务中设置内部版本号变量

如何在 Azure DevOps yaml 管道中设置 ENVIRONMENT 状态

Azure DevOps - 使用参数在 yaml 管道定义中设置路径触发器

如何在 azure 中设置安全的 Web 套接字

Azure Devops构建SSIS任务