Commit c3a9575c authored by Lin Jen-Shin's avatar Lin Jen-Shin

Merge branch 'allow-more-parallelization-for-static-analysis' into 'master'

Allow more parallelization for static analysis

See merge request gitlab-org/gitlab!32684
parents a457bfe8 3e06e5b7
...@@ -46,7 +46,8 @@ static-analysis: ...@@ -46,7 +46,8 @@ static-analysis:
stage: test stage: test
variables: variables:
SETUP_DB: "false" SETUP_DB: "false"
parallel: 2 ENABLE_SPRING: "1"
parallel: 4
script: script:
- scripts/static-analysis - scripts/static-analysis
cache: cache:
......
...@@ -5,103 +5,118 @@ require_relative '../lib/gitlab' ...@@ -5,103 +5,118 @@ require_relative '../lib/gitlab'
require_relative '../lib/gitlab/popen' require_relative '../lib/gitlab/popen'
require_relative '../lib/gitlab/popen/runner' require_relative '../lib/gitlab/popen/runner'
def emit_warnings(static_analysis) class StaticAnalysis
static_analysis.warned_results.each do |result| ALLOWED_WARNINGS = [
puts # https://github.com/browserslist/browserslist/blob/d0ec62eb48c41c218478cd3ac28684df051cc865/node.js#L329
puts "**** #{result.cmd.join(' ')} had the following warning(s):" # warns if caniuse-lite package is older than 6 months. Ignore this
puts # warning message so that GitLab backports don't fail.
puts result.stderr "Browserslist: caniuse-lite is outdated. Please run next command `yarn upgrade`"
puts ].freeze
end
end # `gettext:updated_check` and `gitlab:sidekiq:sidekiq_queues_yml:check` will fail on FOSS installations
# (e.g. gitlab-org/gitlab-foss) since they test against a single
# file that is generated by an EE installation, which can
# contain values that a FOSS installation won't find. To work
# around this we will only enable this task on EE installations.
TASKS_BY_DURATIONS_SECONDS_DESC = {
%w[bin/rake lint:haml] => 338,
(Gitlab.ee? ? %w[bin/rake gettext:updated_check] : nil) => 308,
# Most of the time, RuboCop finishes in 30 seconds, but sometimes it can take around 1200 seconds so we set a
# duration of 300 to lower the likelihood that it will run in the same job as another long task...
%w[bundle exec rubocop --parallel] => 300,
%w[yarn run eslint] => 197,
%w[yarn run prettier-all] => 124,
%w[bin/rake gettext:lint] => 96,
%w[bundle exec license_finder] => 49,
%w[bin/rake scss_lint] => 38,
%w[bin/rake lint:static_verification] => 22,
%w[bin/rake gitlab:sidekiq:all_queues_yml:check] => 13,
(Gitlab.ee? ? %w[bin/rake gitlab:sidekiq:sidekiq_queues_yml:check] : nil) => 13,
%w[bin/rake config_lint] => 11,
%w[yarn run stylelint] => 9,
%w[scripts/lint-conflicts.sh] => 0.59,
%w[yarn run block-dependencies] => 0.35,
%w[scripts/lint-rugged] => 0.23,
%w[scripts/gemfile_lock_changed.sh] => 0.02,
%w[scripts/frontend/check_no_partial_karma_jest.sh] => 0.01,
%w[scripts/lint-changelog-filenames] => 0.01
}.reject { |k| k.nil? }.sort_by { |a| -a[1] }.to_h.keys.freeze
def run_tasks!
tasks = tasks_to_run((ENV['CI_NODE_INDEX'] || 1).to_i, (ENV['CI_NODE_TOTAL'] || 1).to_i)
static_analysis = Gitlab::Popen::Runner.new
static_analysis.run(tasks) do |cmd, &run|
puts
puts "$ #{cmd.join(' ')}"
result = run.call
puts "==> Finished in #{result.duration} seconds"
puts
end
def emit_errors(static_analysis)
static_analysis.failed_results.each do |result|
puts puts
puts "**** #{result.cmd.join(' ')} failed with the following error(s):" puts '==================================================='
puts puts
puts result.stdout
puts result.stderr
puts puts
end
end
ALLOWED_WARNINGS = [ if static_analysis.all_success_and_clean?
# https://github.com/browserslist/browserslist/blob/d0ec62eb48c41c218478cd3ac28684df051cc865/node.js#L329 puts 'All static analyses passed successfully.'
# warns if caniuse-lite package is older than 6 months. Ignore this elsif static_analysis.all_success?
# warning message so that GitLab backports don't fail. puts 'All static analyses passed successfully, but we have warnings:'
"Browserslist: caniuse-lite is outdated. Please run next command `yarn upgrade`" puts
].freeze
def warning_count(static_analysis) emit_warnings(static_analysis)
static_analysis.warned_results
.count { |result| !ALLOWED_WARNINGS.include?(result.stderr.strip) }
end
def jobs_to_run(node_index, node_total) exit 2 if warning_count(static_analysis).nonzero?
all_tasks = [
%w[bin/rake lint:all],
%w[bundle exec license_finder],
%w[yarn run eslint],
%w[yarn run stylelint],
%w[yarn run prettier-all],
%w[yarn run block-dependencies],
%w[bundle exec rubocop --parallel],
%w[scripts/lint-conflicts.sh],
%w[scripts/lint-rugged],
%w[scripts/frontend/check_no_partial_karma_jest.sh],
%w[scripts/lint-changelog-filenames],
%w[scripts/gemfile_lock_changed.sh]
]
case node_total
when 1
all_tasks
when 2
rake_lint_all, *rest_jobs = all_tasks
case node_index
when 1
[rake_lint_all]
else else
rest_jobs puts 'Some static analyses failed:'
end
else
raise "Parallelization > 2 (currently set to #{node_total}) isn't supported yet!"
end
end
tasks = jobs_to_run((ENV['CI_NODE_INDEX'] || 1).to_i, (ENV['CI_NODE_TOTAL'] || 1).to_i)
static_analysis = Gitlab::Popen::Runner.new
static_analysis.run(tasks) do |cmd, &run| emit_warnings(static_analysis)
puts emit_errors(static_analysis)
puts "$ #{cmd.join(' ')}"
result = run.call exit 1
end
puts "==> Finished in #{result.duration} seconds" end
puts
end
puts def emit_warnings(static_analysis)
puts '===================================================' static_analysis.warned_results.each do |result|
puts puts
puts puts "**** #{result.cmd.join(' ')} had the following warning(s):"
puts
puts result.stderr
puts
end
end
if static_analysis.all_success_and_clean? def emit_errors(static_analysis)
puts 'All static analyses passed successfully.' static_analysis.failed_results.each do |result|
elsif static_analysis.all_success? puts
puts 'All static analyses passed successfully, but we have warnings:' puts "**** #{result.cmd.join(' ')} failed with the following error(s):"
puts puts
puts result.stdout
puts result.stderr
puts
end
end
emit_warnings(static_analysis) def warning_count(static_analysis)
static_analysis.warned_results
.count { |result| !ALLOWED_WARNINGS.include?(result.stderr.strip) }
end
exit 2 if warning_count(static_analysis).nonzero? def tasks_to_run(node_index, node_total)
else tasks = []
puts 'Some static analyses failed:' TASKS_BY_DURATIONS_SECONDS_DESC.each_with_index do |task, i|
tasks << task if i % node_total == (node_index - 1)
end
emit_warnings(static_analysis) tasks
emit_errors(static_analysis) end
end
exit 1 if $0 == __FILE__
StaticAnalysis.new.run_tasks!
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment