5
votes

Activer les règles de protection des succursales dans Github au niveau de l'organisation

Est-il possible d'activer les règles de protection des branches au niveau de l'organisation dans Github afin que tous les référentiels faisant partie de cette organisation héritent de ces règles pour les branches appliquées. À l'heure actuelle, il est vraiment difficile d'activer ces mêmes règles sur une base par dépôt pour le même ensemble de branches.


0 commentaires

4 Réponses :



4
votes

Je l'ai fait fonctionner en utilisant un simple script ruby ​​qui utilise les API GitHub: -

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


1 commentaires

J'ai pris ce code comme base, j'ai fait quelques ajustements et maintenant cela fonctionne très bien, merci Ashley



0
votes

Vous pouvez utiliser une solution centralisée pour les git-hooks côté serveur comme Datree.io . Il a des politiques intégrées telles que:

  1. Appliquer la protection des branches sur tous les dépôts actuels et les futurs créés - empêcher la suppression de la branche principale et forcer le push.
  2. Appliquer le flux de demande d'extraction sur la branche par défaut pour tous les dépôts ( y compris les futures créations) - empêche les validations directes dans le master sans pull-request et vérifications.

Le produit modifie activement les paramètres GitHub pour les dépôts existants et applique les paramètres pour les futurs dépôts créés.

Clause de non-responsabilité: je suis l'un des cofondateurs de Datree


0 commentaires

1
votes

Tiré des réponses de @Ashley, mis à jour un peu, avec un léger changement pour refléter les URL de l'API Github actuelles et, personnalisation ajoutée à l'aide des variables d'environnement GITHUB_ORG et GITHUB_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


0 commentaires