tasks/ci.rake in beaker-puppet-1.12.0 vs tasks/ci.rake in beaker-puppet-1.13.0

- old
+ new

@@ -1,10 +1,11 @@ require 'rake/clean' require 'pp' require 'yaml' require 'securerandom' require 'fileutils' +require 'tempfile' require 'beaker-hostgenerator' require 'beaker/dsl/install_utils' extend Beaker::DSL::InstallUtils REPO_CONFIGS_DIR = 'repo-configs' @@ -170,18 +171,32 @@ end end namespace :test do desc <<-EOS -Run the acceptance tests using puppet-agent (AIO) packages. +Run the acceptance tests using puppet-agent (AIO) packages, with or without +retrying failed tests one time. $ SHA=<full sha> bundle exec rake ci:test:aio +or + + $ SHA=<full sha> bundle exec rake ci:test:aio[RETRIES] + + SHA should be the full SHA for the puppet-agent package. + +RETRIES should be set to true to retry failed tests one time. It defaults +to false. EOS - task :aio => ['ci:check_env', 'ci:gen_hosts'] do - beaker_suite(:aio) + task :aio, [:retries] => ['ci:check_env', 'ci:gen_hosts'] do |t, args| + args.with_defaults(retries: false) + if args[:retries] + beaker_suite_retry(:aio) + else + beaker_suite(:aio) + end end desc <<-EOS Run the acceptance tests against puppet gem on various platforms, performing a basic smoke test. @@ -191,15 +206,17 @@ SHA should be the full SHA for the component. EOS task :gem => ['ci:check_env'] do beaker(:init, '--hosts', 'config/nodes/gem.yaml', '--options-file', 'config/gem/options.rb') beaker(:provision) - beaker(:exec, 'pre-suite', '--pre-suite', pre_suites(:gem)) - beaker(:exec, "#{File.dirname(__dir__)}/setup/gem/010_GemInstall.rb") - - preserve_hosts = ENV['OPTIONS'].include?('--preserve-hosts=always') if ENV['OPTIONS'] - beaker(:destroy) unless preserve_hosts + begin + beaker(:exec, 'pre-suite', '--preserve-state', '--pre-suite', pre_suites(:gem)) + beaker(:exec, "#{File.dirname(__dir__)}/setup/gem/010_GemInstall.rb") + ensure + preserve_hosts = ENV['OPTIONS'].include?('--preserve-hosts=always') if ENV['OPTIONS'] + beaker(:destroy) unless preserve_hosts + end end desc <<-EOS Run the acceptance tests against a git checkout. @@ -241,16 +258,43 @@ end def beaker_suite(type) beaker(:init, '--hosts', ENV['HOSTS'], '--options-file', "config/#{String(type)}/options.rb") beaker(:provision) - beaker(:exec, 'pre-suite', '--preserve-state', '--pre-suite', pre_suites(type)) - beaker(:exec, 'pre-suite', '--preserve-state') - beaker(:exec, ENV['TESTS']) - beaker(:exec, 'post-suite') - preserve_hosts = ENV['OPTIONS'].include?('--preserve-hosts=always') if ENV['OPTIONS'] - beaker(:destroy) unless preserve_hosts + begin + beaker(:exec, 'pre-suite', '--preserve-state', '--pre-suite', pre_suites(type)) + beaker(:exec, 'pre-suite', '--preserve-state') + beaker(:exec, ENV['TESTS']) + beaker(:exec, 'post-suite') + ensure + preserve_hosts = ENV['OPTIONS'].include?('--preserve-hosts=always') if ENV['OPTIONS'] + beaker(:destroy) unless preserve_hosts + end +end + +def beaker_suite_retry(type) + beaker(:init, '--hosts', ENV['HOSTS'], '--options-file', "config/#{String(type)}/options.rb") + beaker(:provision) + + begin + json_results_file = Tempfile.new + + beaker(:exec, 'pre-suite', '--preserve-state', '--pre-suite', pre_suites(type)) + beaker(:exec, 'pre-suite', '--preserve-state') + beaker(:exec, ENV['TESTS'], '--test-results-file', json_results_file.path) + rescue RuntimeError + tests_to_rerun = JSON.load(File.read(json_results_file.path)) + if tests_to_rerun.length > 0 + puts '*** Retrying the following:' + puts tests_to_rerun.map { |spec| " #{spec}" } + beaker(:exec, tests_to_rerun.map { |str| "#{str}" }.join(',') ) + end + ensure + beaker(:exec, 'post-suite') + preserve_hosts = ENV['OPTIONS'].include?('--preserve-hosts=always') if ENV['OPTIONS'] + beaker(:destroy) unless preserve_hosts + end end def pre_suites(type) beaker_root = Pathname.new(File.dirname(__dir__)).relative_path_from(Pathname.new(Dir.pwd))