Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'rubocop/check_graceful_task.rb')
-rw-r--r--rubocop/check_graceful_task.rb83
1 files changed, 83 insertions, 0 deletions
diff --git a/rubocop/check_graceful_task.rb b/rubocop/check_graceful_task.rb
new file mode 100644
index 00000000000..7ae74e79e38
--- /dev/null
+++ b/rubocop/check_graceful_task.rb
@@ -0,0 +1,83 @@
+# frozen_string_literal: true
+
+require_relative 'formatter/graceful_formatter'
+require_relative '../lib/gitlab/popen'
+
+module RuboCop
+ class CheckGracefulTask
+ def initialize(output)
+ @output = output
+ end
+
+ def run(args)
+ options = %w[
+ --parallel
+ --format RuboCop::Formatter::GracefulFormatter
+ ]
+
+ available_cops = RuboCop::Cop::Registry.global.to_h
+
+ cop_names, paths = args.partition { available_cops.key?(_1) }
+
+ if cop_names.any?
+ list = cop_names.sort.join(',')
+ options.concat ['--only', list]
+ end
+
+ options.concat(paths)
+
+ puts <<~MSG
+ Running RuboCop in graceful mode:
+ rubocop #{options.join(' ')}
+
+ This might take a while...
+ MSG
+
+ status_orig = RuboCop::CLI.new.run(options)
+ status = RuboCop::Formatter::GracefulFormatter.adjusted_exit_status(status_orig)
+
+ # We had to adjust the status which means we have silenced offenses. Notify Slack!
+ notify_slack unless status_orig == status
+
+ status
+ end
+
+ private
+
+ def env_values(*keys)
+ env = ENV.slice(*keys)
+
+ missing_keys = keys - env.keys
+
+ if missing_keys.any?
+ puts "Missing ENV keys: #{missing_keys.join(', ')}"
+ return
+ end
+
+ env.values
+ end
+
+ def notify_slack
+ job_name, job_url, _ = env_values('CI_JOB_NAME', 'CI_JOB_URL', 'CI_SLACK_WEBHOOK_URL')
+
+ unless job_name
+ puts 'Skipping Slack notification.'
+ return
+ end
+
+ channel = 'f_rubocop'
+ message = ":warning: `#{job_name}` passed :green: but contained silenced offenses. See #{job_url}"
+ emoji = 'rubocop'
+ user_name = 'GitLab Bot'
+
+ puts "Notifying Slack ##{channel}."
+
+ _output, result = Gitlab::Popen.popen(['scripts/slack', channel, message, emoji, user_name])
+ puts "Failed to notify Slack channel ##{channel}." if result.nonzero?
+ end
+
+ def puts(...)
+ @output.puts(...)
+ end
+ end
+end