diff --git a/doc/raketasks/web_hooks.md b/doc/raketasks/web_hooks.md new file mode 100644 index 0000000000000000000000000000000000000000..1ca5bacb9d104050c6317ce8e76a46759c6eca32 --- /dev/null +++ b/doc/raketasks/web_hooks.md @@ -0,0 +1,31 @@ +### Add a web hook for **ALL** projects: + + RAILS_ENV=production bundle exec rake gitlab:web_hook:add URL="http://example.com/hook" + + +### Add a web hook for projects in a given **NAMESPACE**: + + RAILS_ENV=production bundle exec rake gitlab:web_hook:add URL="http://example.com/hook" NAMESPACE=acme + + +### Remove a web hook from **ALL** projects using: + + RAILS_ENV=production bundle exec rake gitlab:web_hook:rm URL="http://example.com/hook" + + +### Remove a web hook from projects in a given **NAMESPACE**: + + RAILS_ENV=production bundle exec rake gitlab:web_hook:rm URL="http://example.com/hook" NAMESPACE=acme + + +### List **ALL** web hooks: + + RAILS_ENV=production bundle exec rake gitlab:web_hook:list + + +### List the web hooks from projects in a given **NAMESPACE**: + + RAILS_ENV=production bundle exec rake gitlab:web_hook:list NAMESPACE=/ + +> Note: `/` is the global namespace. + diff --git a/lib/tasks/gitlab/web_hook.rake b/lib/tasks/gitlab/web_hook.rake new file mode 100644 index 0000000000000000000000000000000000000000..f9f586db93c0c42ef56bb538bc7f78e2361754cf --- /dev/null +++ b/lib/tasks/gitlab/web_hook.rake @@ -0,0 +1,65 @@ +namespace :gitlab do + namespace :web_hook do + desc "GITLAB | Adds a web hook to the projects" + task :add => :environment do + web_hook_url = ENV['URL'] + namespace_path = ENV['NAMESPACE'] + + projects = find_projects(namespace_path) + + puts "Adding web hook '#{web_hook_url}' to:" + projects.find_each(batch_size: 1000) do |project| + print "- #{project.name} ... " + web_hook = project.hooks.new(url: web_hook_url) + if web_hook.save + puts "added".green + else + print "failed".red + puts " [#{web_hook.errors.full_messages.to_sentence}]" + end + end + end + + desc "GITLAB | Remove a web hook from the projects" + task :rm => :environment do + web_hook_url = ENV['URL'] + namespace_path = ENV['NAMESPACE'] + + projects = find_projects(namespace_path) + projects_ids = projects.pluck(:id) + + puts "Removing web hooks with the url '#{web_hook_url}' ... " + count = WebHook.where(url: web_hook_url, project_id: projects_ids, type: 'ProjectHook').delete_all + puts "#{count} web hooks were removed." + end + + desc "GITLAB | List web hooks" + task :list => :environment do + namespace_path = ENV['NAMESPACE'] + + projects = find_projects(namespace_path) + web_hooks = projects.all.map(&:hooks).flatten + web_hooks.each do |hook| + puts "#{hook.project.name.truncate(20).ljust(20)} -> #{hook.url}" + end + + puts "\n#{web_hooks.size} web hooks found." + end + end + + def find_projects(namespace_path) + if namespace_path.blank? + Project + elsif namespace_path == '/' + Project.where(namespace_id: nil) + else + namespace = Namespace.where(path: namespace_path).first + if namespace + Project.where(namespace_id: namespace.id) + else + puts "Namespace not found: #{namespace_path}".red + exit 2 + end + end + end +end