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.
4 Réponses :
Vous devriez essayer d'utiliser la protection de branche de mise à jour un> point de terminaison avec une sorte de processus automatisé pour appliquer les règles de protection des succursales à toutes les nouvelles succursales de votre organisation.
PUT / repos /: propriétaire /: repo / branches /: branche / protection
Merci pour la réponse. Je pourrais utiliser l'API pour activer avec succès la protection des branches dans l'une des branches de l'un des dépôts, mais comment y parvenir pour tous les dépôts et un ensemble de branches dans chaque dépôt qui l'utilise. Aucune suggestion?
Vous pouvez utiliser le point de terminaison GET / orgs /: org / repos
pour obtenir tous les dépôts de votre organisation, puis utiliser GET / repos /: owner /: repo / branches
pour obtenir toutes les branches de ce repo. Ensuite, combinez cela avec PUT / repos /: owner /: repo / branches /: branch / protection
pour protéger toutes les branches de tous les dépôts de votre organisation. Cela a-t-il du sens?
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
J'ai pris ce code comme base, j'ai fait quelques ajustements et maintenant cela fonctionne très bien, merci Ashley
Vous pouvez utiliser une solution centralisée pour les git-hooks côté serveur comme Datree.io a >. Il a des politiques intégrées telles que:
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
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