diff options
author | Douwe Maan <douwe@gitlab.com> | 2018-03-01 10:51:36 +0000 |
---|---|---|
committer | Douwe Maan <douwe@gitlab.com> | 2018-03-01 10:51:36 +0000 |
commit | 7aa9ec7aa11fee1de915a15c15b5ee164b2f51a4 (patch) | |
tree | 696fa6fb298a54561960c7e7d43e6a81173bf98b /lib | |
parent | bac9bb1866f47f0b1515b8705ea9eba1fa9b9ced (diff) | |
parent | a96ba41f229bd3606696e8e3a6500730e6cb8f63 (diff) | |
download | gitlab-ce-7aa9ec7aa11fee1de915a15c15b5ee164b2f51a4.tar.gz |
Merge branch 'dz-system-hooks-plugins' into 'master'
Add ability to use external plugins as system hooks
See merge request gitlab-org/gitlab-ce!17003
Diffstat (limited to 'lib')
-rw-r--r-- | lib/gitlab/plugin.rb | 26 | ||||
-rw-r--r-- | lib/gitlab/plugin_logger.rb | 7 | ||||
-rw-r--r-- | lib/tasks/plugins.rake | 16 |
3 files changed, 49 insertions, 0 deletions
diff --git a/lib/gitlab/plugin.rb b/lib/gitlab/plugin.rb new file mode 100644 index 00000000000..0d1cb16b378 --- /dev/null +++ b/lib/gitlab/plugin.rb @@ -0,0 +1,26 @@ +module Gitlab + module Plugin + def self.files + Dir.glob(Rails.root.join('plugins/*')).select do |entry| + File.file?(entry) + end + end + + def self.execute_all_async(data) + args = files.map { |file| [file, data] } + + PluginWorker.bulk_perform_async(args) + end + + def self.execute(file, data) + result = Gitlab::Popen.popen_with_detail([file]) do |stdin| + stdin.write(data.to_json) + end + + exit_status = result.status&.exitstatus + [exit_status.zero?, result.stderr] + rescue => e + [false, e.message] + end + end +end diff --git a/lib/gitlab/plugin_logger.rb b/lib/gitlab/plugin_logger.rb new file mode 100644 index 00000000000..c4f6ec3e21d --- /dev/null +++ b/lib/gitlab/plugin_logger.rb @@ -0,0 +1,7 @@ +module Gitlab + class PluginLogger < Gitlab::Logger + def self.file_name_noext + 'plugin' + end + end +end diff --git a/lib/tasks/plugins.rake b/lib/tasks/plugins.rake new file mode 100644 index 00000000000..e73dd7e68df --- /dev/null +++ b/lib/tasks/plugins.rake @@ -0,0 +1,16 @@ +namespace :plugins do + desc 'Validate existing plugins' + task validate: :environment do + puts 'Validating plugins from /plugins directory' + + Gitlab::Plugin.files.each do |file| + success, message = Gitlab::Plugin.execute(file, Gitlab::DataBuilder::Push::SAMPLE_DATA) + + if success + puts "* #{file} succeed (zero exit code)." + else + puts "* #{file} failure (non-zero exit code). #{message}" + end + end + end +end |