require 'rubygems' require 'bundler/setup' require 'rspec/core/rake_task' require 'fileutils' require 'rubocop/rake_task' require 'English' desc 'Show help' task :help do puts <<-EOF ## SPEC usage rake spec [spec=result_path] example rake spec # check all unit tests status rake spec spec=job # check spec/job_spec.rb status ## RUBOCOP usage rake rubocop [file=pattern] example rake rubocop file="lib/**/*.rb" # check all lib files EOF end RSpec::Core::RakeTask.new do |t| ENV['LKP_SRC'] ||= File.expand_path File.dirname(__FILE__).to_s puts "PWD = #{Dir.pwd}" puts "ENV['LKP_SRC'] = #{ENV['LKP_SRC']}" spec = ENV['spec'] || '*' t.pattern = "spec/**{,/*/**}/#{spec}_spec.rb" t.rspec_opts = "--example '#{ENV['example']}'" if ENV['example'] end if ENV['GENERATE_REPORTS'] == 'true' require 'ci/reporter/rake/rspec' task spec: 'ci:setup:rspec' end begin RuboCop::RakeTask.new(:rubocop) do |t| ruby_version = `ruby --version | grep -oE "[0-9]+\\.[0-9]+"`.chomp rubocop_config_file = ".rubocop.#{ruby_version}.yml" rubocop_config_file = '.rubocop.yml' unless File.size?(rubocop_config_file) t.options = ['-D', "-c#{rubocop_config_file}"] t.patterns = [ENV['file']] if ENV['file'] puts "PWD = #{Dir.pwd}" puts "rubocop.patterns = #{t.patterns}" puts "rubocop.options = #{t.options}" end rescue StandardError => e puts e end def bash(cmd) output = `bash -c #{Shellwords.escape(cmd)}` puts output unless output.empty? raise "bash exitstatus: #{$CHILD_STATUS.exitstatus}" unless $CHILD_STATUS.success? end desc 'Run syntax check' task :syntax do executables = `find -type f -executable ! -path "./.git*" ! -path "./vendor*" ! -size +100k`.split("\n").join(' ') bash "grep -s -l '^#!/.*ruby$' #{executables} | xargs -n1 ruby -c >/dev/null" bash "grep -s -l '^#!/.*bash$' #{executables} | xargs -n1 bash -n" bash "grep -s -l '^#!/bin/sh$' #{executables} | xargs -n1 dash -n" puts 'syntax OK' end desc 'Run shellcheck' task :shellcheck do executables = `find -type f -executable ! -path "./.git*" ! -path "./vendor*" ! -size +100k | xargs grep -s -l -e '^#!/.*bash$' -e '^#!/bin/sh$'`.split("\n").join(' ') format = ENV['format'] || 'tty' base_cmd = "shellcheck -S warning -f #{format}" base_cmd += " -i #{ENV['code']}" if ENV['code'] bash "#{base_cmd} #{executables}" puts 'shellcheck OK' end desc 'Run code check' task code: %i[syntax shellcheck rubocop spec] namespace :docker do desc 'Build docker image' task :build do # image is in the form of debian/buster raise "ENV['image'] can't be #{ENV['image'].inspect}" unless ENV['image'] bash "docker build . -f docker/#{ENV['image'].split('/').first}/Dockerfile -t lkp-tests/#{ENV['image']} --build-arg base_image=#{ENV['image'].sub('/', ':')}" end end