【问题标题】:Enable branch protection rules in Github at the Organisation level在组织级别启用 Github 中的分支保护规则
【发布时间】:2019-06-10 21:11:41
【问题描述】:

是否可以在 Github 的组织级别启用分支保护规则,以便该组织的所有存储库都为应用的分支继承这些规则。现在,在每个 repo 的基础上为同一组分支启用这些相同的规则集确实很麻烦。

【问题讨论】:

    标签: github github-api branching-strategy


    【解决方案1】:

    我使用一个使用 GitHub API 的简单 ruby​​ 脚本让它工作:-

    require "json"
    require "logger"
    
    LOGGER = Logger.new(STDOUT)
    
    def run(cmd)
      LOGGER.debug("Running: #{cmd}")
      output = `#{cmd}`
      raise "Error: #{$?}" unless $?.success?
      output
    end
    
    
    def repos(page = 1, list = [])
      cmd = %Q{curl -s --user "user:pwd" https://github_url/api/v3/orgs/org_name/repos?page=#{page}}
      data = JSON.parse(run(cmd))
      list.concat(data)
      repos(page + 1, list) unless data.empty?
      list
    end
    
    repos.each do |repo|
      require 'net/http'
    require 'uri'
    require 'json'
    
    uri = URI.parse("https://github_url/api/v3/repos/org_name/#{repo["name"]}/branches/master/protection")
    request = Net::HTTP::Put.new(uri)
    request.basic_auth("user", "pwd")
    request["Accept"] = "application/vnd.github.luke-cage-preview+jso"
    request.body = JSON.dump({
      "required_status_checks" => {
        "strict" => true,
        "contexts" => [
          "continuous-integration/travis-ci"
        ]
      },
      "enforce_admins" => true,
      "required_pull_request_reviews" => {
        "dismiss_stale_reviews" => true
      },
      "restrictions" => nil
    })
    
    req_options = {
      use_ssl: uri.scheme == "https",
    }
    
    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end
    end

    【讨论】:

    • 我以这段代码为基础,做了一些调整,现在效果很好,谢谢 Ashley
    【解决方案2】:

    取自 @Ashley 的回答,稍作更新,稍作改动以反映当前 Github 的 API URL,并使用 GITHUB_ORGGITHUB_ACCESS_TOKEN 环境变量添加自定义。

    require "json"
    require "logger"
    
    $org = ENV["GITHUB_ORG"]
    $token = ENV["GITHUB_ACCESS_TOKEN"]
    
    LOGGER = Logger.new(STDOUT)
    
    def run(cmd)
      LOGGER.debug("Running: #{cmd}")
      output = `#{cmd}`
      raise "Error: #{$?}" unless $?.success?
      output
    end
    
    
    def repos(page = 1, list = [])
      cmd = %Q{curl -s -u dummy:#{$token} https://api.github.com/orgs/#{$org}/repos?page=#{page}}
      data = JSON.parse(run(cmd))
      list.concat(data)
      repos(page + 1, list) unless data.empty?
      list
    end
    
    repos.each do |repo|
    p(repo["name"])
      require 'net/http'
    require 'uri'
    require 'json'
    
    uri = URI.parse("https://api.github.com/repos/#{$org}/#{repo["name"]}/branches/master/protection")
    request = Net::HTTP::Put.new(uri)
    request.basic_auth("dummy", $token)
    request["Accept"] = "application/vnd.github.luke-cage-preview+jso"
    request.body = JSON.dump({
      "required_status_checks" => {
        "strict" => true,
        "contexts" => []
      },
      "enforce_admins" => true,
      "required_pull_request_reviews" => {
        "dismiss_stale_reviews" => true
      },
      "restrictions" => nil
    })
    
    req_options = {
      use_ssl: uri.scheme == "https",
    }
    
    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end
    p(response)
    end
    

    【讨论】:

      【解决方案3】:

      您应该尝试使用 Github API 的 update branch protection 端点和某种自动化流程,将分支保护规则应用于组织中的所有新分支。

      PUT /repos/:owner/:repo/branches/:branch/protection

      【讨论】:

      • 感谢您的回复。我可以使用 API 成功启用其中一个存储库中的一个分支的分支保护,但是如何使用它为所有存储库和每个存储库中的一组分支实现这一点。有什么建议吗?
      • 您可以使用GET /orgs/:org/repos 端点获取组织中的所有存储库,然后使用GET /repos/:owner/:repo/branches 获取该存储库的所有分支。然后,将其与 PUT /repos/:owner/:repo/branches/:branch/protection 结合使用,以保护您组织中所有 repos 的所有分支。这有意义吗?
      【解决方案4】:

      您可以为服务器端 git-hooks 使用集中式解决方案,例如 Datree.io。 它具有以下内置策略:

      1. Enforce branch protection 在所有当前和未来创建的 repos 上 - 防止 master 分支删除和强制推送。
      2. Enforce pull request flow 在所有 repos(包括未来创建的)的默认分支上 - 防止在没有拉取请求和检查的情况下直接提交到 master。

      该产品会主动更改现有存储库的 GitHub 设置,并强制执行未来创建的存储库的设置。

      免责声明:我是 Datree 的联合创始人之一

      【讨论】:

        猜你喜欢
        • 2021-12-05
        • 2021-10-05
        • 2022-07-08
        • 1970-01-01
        • 2017-07-27
        • 2019-05-05
        • 1970-01-01
        • 2022-10-06
        • 2022-01-13
        相关资源
        最近更新 更多