Loading tools/testing/ktest/ktest.pl +227 −94 Original line number Original line Diff line number Diff line Loading @@ -25,11 +25,13 @@ $opt{"POWEROFF_ON_SUCCESS"} = 0; $opt{"BUILD_OPTIONS"} = ""; $opt{"BUILD_OPTIONS"} = ""; my $version; my $version; my $install_mods; my $grub_number; my $grub_number; my $target; my $target; my $make; my $make; my $noclean; my $noclean; my $minconfig; my $in_bisect = 0; my $bisect_bad = ""; sub read_config { sub read_config { my ($config) = @_; my ($config) = @_; Loading @@ -52,9 +54,7 @@ sub read_config { close(IN); close(IN); } } sub doprint { sub logit { print @_; if (defined($opt{"LOG_FILE"})) { if (defined($opt{"LOG_FILE"})) { open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}"; open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}"; print OUT @_; print OUT @_; Loading @@ -62,6 +62,11 @@ sub doprint { } } } } sub doprint { print @_; logit @_; } sub dodie { sub dodie { doprint "CRITICAL FAILURE... ", @_; doprint "CRITICAL FAILURE... ", @_; Loading Loading @@ -96,7 +101,30 @@ sub run_command { doprint "SUCCESS\n"; doprint "SUCCESS\n"; } } return $failed; return !$failed; } sub get_grub_index { return if ($grub_number >= 0); doprint "Find grub menu ... "; $grub_number = -1; open(IN, "ssh $target cat /boot/grub/menu.lst |") or die "unable to get menu.lst"; while (<IN>) { if (/^\s*title\s+$opt{GRUB_MENU}\s*$/) { $grub_number++; last; } elsif (/^\s*title\s/) { $grub_number++; } } close(IN); die "Could not find '$opt{GRUB_MENU}' in /boot/grub/menu on $opt{MACHINE}" if ($grub_number < 0); doprint "$grub_number\n"; } } my $timeout = $opt{"TIMEOUT"}; my $timeout = $opt{"TIMEOUT"}; Loading Loading @@ -213,57 +241,74 @@ sub monitor { close(IN); close(IN); if (!$booted) { if (!$booted) { return 1 if (!$in_bisect); dodie "failed - never got a boot prompt.\n"; dodie "failed - never got a boot prompt.\n"; } } if ($bug) { if ($bug) { return 1 if (!$in_bisect); dodie "failed - got a bug report\n"; dodie "failed - got a bug report\n"; } } return 0; } } sub install { sub install { if (run_command "scp $opt{OUTPUT_DIR}/$opt{BUILD_TARGET} $target:$opt{TARGET_IMAGE}") { run_command "scp $opt{OUTPUT_DIR}/$opt{BUILD_TARGET} $target:$opt{TARGET_IMAGE}" or dodie "failed to copy image"; dodie "failed to copy image"; my $install_mods = 0; # should we process modules? $install_mods = 0; open(IN, "$opt{OUTPUT_DIR}/.config") or dodie("Can't read config file"); while (<IN>) { if (/CONFIG_MODULES(=y)?/) { $install_mods = 1 if (defined($1)); last; } } } close(IN); if (!$install_mods) { doprint "No modules needed\n"; return; } run_command "$make INSTALL_MOD_PATH=$opt{TMP_DIR} modules_install" or dodie "Failed to install modules"; if ($install_mods) { my $modlib = "/lib/modules/$version"; my $modlib = "/lib/modules/$version"; my $modtar = "autotest-mods.tar.bz2"; my $modtar = "autotest-mods.tar.bz2"; if (run_command "ssh $target rm -rf $modlib") { run_command "ssh $target rm -rf $modlib" or dodie "failed to remove old mods: $modlib"; dodie "failed to remove old mods: $modlib"; } # would be nice if scp -r did not follow symbolic links # would be nice if scp -r did not follow symbolic links if (run_command "cd $opt{TMP_DIR} && tar -cjf $modtar lib/modules/$version") { run_command "cd $opt{TMP_DIR} && tar -cjf $modtar lib/modules/$version" or dodie "making tarball"; dodie "making tarball"; } if (run_command "scp $opt{TMP_DIR}/$modtar $target:/tmp") { run_command "scp $opt{TMP_DIR}/$modtar $target:/tmp" or dodie "failed to copy modules"; dodie "failed to copy modules"; } unlink "$opt{TMP_DIR}/$modtar"; unlink "$opt{TMP_DIR}/$modtar"; if (run_command "ssh $target '(cd / && tar xf /tmp/$modtar)'") { run_command "ssh $target '(cd / && tar xf /tmp/$modtar)'" or dodie "failed to tar modules"; dodie "failed to tar modules"; } run_command "ssh $target rm -f /tmp/$modtar"; run_command "ssh $target rm -f /tmp/$modtar"; } } } sub build { sub build { my ($type) = @_; my ($type) = @_; my $defconfig = ""; my $defconfig = ""; my $append = ""; my $append = ""; if ($type =~ /^useconfig:(.*)/) { if ($type =~ /^useconfig:(.*)/) { if (run_command "cp $1 $opt{OUTPUT_DIR}/.config") { run_command "cp $1 $opt{OUTPUT_DIR}/.config" or dodie "could not copy $1 to .config"; dodie "could not copy $1 to .config"; } $type = "oldconfig"; $type = "oldconfig"; } } Loading @@ -274,58 +319,183 @@ sub build { # allow for empty configs # allow for empty configs run_command "touch $opt{OUTPUT_DIR}/.config"; run_command "touch $opt{OUTPUT_DIR}/.config"; if (run_command "mv $opt{OUTPUT_DIR}/.config $opt{OUTPUT_DIR}/config_temp") { run_command "mv $opt{OUTPUT_DIR}/.config $opt{OUTPUT_DIR}/config_temp" or dodie "moving .config"; dodie "moving .config"; } if (!$noclean && run_command "$make mrproper") { if (!$noclean && !run_command "$make mrproper") { dodie "make mrproper"; dodie "make mrproper"; } } if (run_command "mv $opt{OUTPUT_DIR}/config_temp $opt{OUTPUT_DIR}/.config") { run_command "mv $opt{OUTPUT_DIR}/config_temp $opt{OUTPUT_DIR}/.config" or dodie "moving config_temp"; dodie "moving config_temp"; } } elsif (!$noclean) { } elsif (!$noclean) { unlink "$opt{OUTPUT_DIR}/.config"; unlink "$opt{OUTPUT_DIR}/.config"; if (run_command "$make mrproper") { run_command "$make mrproper" or dodie "make mrproper"; dodie "make mrproper"; } } } # add something to distinguish this build # add something to distinguish this build open(OUT, "> $opt{OUTPUT_DIR}/localversion") or dodie("Can't make localversion file"); open(OUT, "> $opt{OUTPUT_DIR}/localversion") or dodie("Can't make localversion file"); print OUT "$opt{LOCALVERSION}\n"; print OUT "$opt{LOCALVERSION}\n"; close(OUT); close(OUT); if (defined($opt{"MIN_CONFIG"})) { if (defined($minconfig)) { $defconfig = "KCONFIG_ALLCONFIG=$opt{MIN_CONFIG}"; $defconfig = "KCONFIG_ALLCONFIG=$minconfig"; } } if (run_command "$defconfig $append $make $type") { run_command "$defconfig $append $make $type" or dodie "failed make config"; dodie "failed make config"; } if (run_command "$make $opt{BUILD_OPTIONS}") { if (!run_command "$make $opt{BUILD_OPTIONS}") { # bisect may need this to pass return 1 if ($in_bisect); dodie "failed build"; dodie "failed build"; } } return 0; } } sub reboot { sub reboot { # try to reboot normally # try to reboot normally if (run_command "ssh $target reboot") { if (!run_command "ssh $target reboot") { # nope? power cycle it. # nope? power cycle it. run_command "$opt{POWER_CYCLE}"; run_command "$opt{POWER_CYCLE}"; } } } } sub halt { sub halt { if ((run_command "ssh $target halt") or defined($opt{"POWER_OFF"})) { if (!run_command "ssh $target halt" or defined($opt{"POWER_OFF"})) { # nope? the zap it! # nope? the zap it! run_command "$opt{POWER_OFF}"; run_command "$opt{POWER_OFF}"; } } } } sub success { my ($i) = @_; doprint "\n\n*******************************************\n"; doprint "*******************************************\n"; doprint "** SUCCESS!!!! **\n"; doprint "*******************************************\n"; doprint "*******************************************\n"; if ($i != $opt{"NUM_BUILDS"}) { reboot; doprint "Sleeping $opt{SLEEP_TIME} seconds\n"; sleep "$opt{SLEEP_TIME}"; } } sub get_version { # get the release name doprint "$make kernelrelease ... "; $version = `$make kernelrelease | tail -1`; chomp($version); doprint "$version\n"; } sub run_bisect { my ($type) = @_; my $failed; my $result; my $output; my $ret; if (defined($minconfig)) { $failed = build "useconfig:$minconfig"; } else { # ?? no config to use? $failed = build "oldconfig"; } if ($type ne "build") { dodie "Failed on build" if $failed; # Now boot the box get_grub_index; get_version; install; $failed = monitor; if ($type ne "boot") { dodie "Failed on boot" if $failed; } } if ($failed) { $result = "bad"; } else { $result = "good"; } doprint "git bisect $result ... "; $output = `git bisect $result 2>&1`; $ret = $?; logit $output; if ($ret) { doprint "FAILED\n"; dodie "Failed to git bisect"; } doprint "SUCCESS\n"; if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\)) \[([[:xdigit:]]+)\]/) { doprint "$1 [$2]\n"; } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) { $bisect_bad = $1; doprint "Found bad commit... $1\n"; return 0; } return 1; } sub bisect { my ($i) = @_; my $result; die "BISECT_GOOD[$i] not defined\n" if (!defined($opt{"BISECT_GOOD[$i]"})); die "BISECT_BAD[$i] not defined\n" if (!defined($opt{"BISECT_BAD[$i]"})); die "BISECT_TYPE[$i] not defined\n" if (!defined($opt{"BISECT_TYPE[$i]"})); my $good = $opt{"BISECT_GOOD[$i]"}; my $bad = $opt{"BISECT_BAD[$i]"}; my $type = $opt{"BISECT_TYPE[$i]"}; $in_bisect = 1; run_command "git bisect start" or dodie "could not start bisect"; run_command "git bisect good $good" or dodie "could not set bisect good to $good"; run_command "git bisect bad $bad" or dodie "could not set bisect good to $bad"; do { $result = run_bisect $type; } while ($result); run_command "git bisect log" or dodie "could not capture git bisect log"; run_command "git bisect reset" or dodie "could not reset git bisect"; doprint "Bad commit was [$bisect_bad]\n"; $in_bisect = 0; success $i; } read_config $ARGV[0]; read_config $ARGV[0]; # mandatory configs # mandatory configs Loading @@ -346,22 +516,6 @@ $target = "$opt{SSH_USER}\@$opt{MACHINE}"; doprint "\n\nSTARTING AUTOMATED TESTS\n"; doprint "\n\nSTARTING AUTOMATED TESTS\n"; doprint "Find grub menu ... "; $grub_number = -1; open(IN, "ssh $target cat /boot/grub/menu.lst |") or die "unable to get menu.lst"; while (<IN>) { if (/^\s*title\s+$opt{GRUB_MENU}\s*$/) { $grub_number++; last; } elsif (/^\s*title\s/) { $grub_number++; } } close(IN); die "Could not find '$opt{GRUB_MENU}' in /boot/grub/menu on $opt{MACHINE}" if ($grub_number < 0); doprint "$grub_number\n"; $make = "$opt{MAKE_CMD} O=$opt{OUTPUT_DIR}"; $make = "$opt{MAKE_CMD} O=$opt{OUTPUT_DIR}"; Loading @@ -376,6 +530,14 @@ for (my $i = 1; $i <= $opt{"NUM_BUILDS"}; $i++) { $noclean = $opt{"BUILD_NOCLEAN"}; $noclean = $opt{"BUILD_NOCLEAN"}; } } if (defined($opt{"MIN_CONFIG[$i]"})) { $minconfig = $opt{"MIN_CONFIG[$i]"}; } elsif (defined($opt{"MIN_CONFIG"})) { $minconfig = $opt{"MIN_CONFIG"}; } else { undef $minconfig; } if (!defined($opt{$type})) { if (!defined($opt{$type})) { $opt{$type} = $opt{"DEFAULT_BUILD_TYPE"}; $opt{$type} = $opt{"DEFAULT_BUILD_TYPE"}; } } Loading @@ -383,49 +545,20 @@ for (my $i = 1; $i <= $opt{"NUM_BUILDS"}; $i++) { doprint "\n\n"; doprint "\n\n"; doprint "RUNNING TEST $i of $opt{NUM_BUILDS} with option $opt{$type}\n\n"; doprint "RUNNING TEST $i of $opt{NUM_BUILDS} with option $opt{$type}\n\n"; if ($opt{$type} ne "nobuild") { if ($opt{$type} eq "bisect") { build $opt{$type}; bisect $i; } next; # get the release name doprint "$make kernelrelease ... "; $version = `$make kernelrelease | tail -1`; chomp($version); doprint "$version\n"; # should we process modules? $install_mods = 0; open(IN, "$opt{OUTPUT_DIR}/.config") or dodie("Can't read config file"); while (<IN>) { if (/CONFIG_MODULES(=y)?/) { $install_mods = 1 if (defined($1)); last; } } } close(IN); if ($install_mods) { if ($opt{$type} ne "nobuild") { if (run_command "$make INSTALL_MOD_PATH=$opt{TMP_DIR} modules_install") { build $opt{$type}; dodie "Failed to install modules"; } } else { doprint "No modules needed\n"; } } get_grub_index; get_version; install; install; monitor; monitor; success $i; doprint "\n\n*******************************************\n"; doprint "*******************************************\n"; doprint "** SUCCESS!!!! **\n"; doprint "*******************************************\n"; doprint "*******************************************\n"; if ($i != $opt{"NUM_BUILDS"}) { reboot; sleep "$opt{SLEEP_TIME}"; } } } if ($opt{"POWEROFF_ON_SUCCESS"}) { if ($opt{"POWEROFF_ON_SUCCESS"}) { Loading Loading
tools/testing/ktest/ktest.pl +227 −94 Original line number Original line Diff line number Diff line Loading @@ -25,11 +25,13 @@ $opt{"POWEROFF_ON_SUCCESS"} = 0; $opt{"BUILD_OPTIONS"} = ""; $opt{"BUILD_OPTIONS"} = ""; my $version; my $version; my $install_mods; my $grub_number; my $grub_number; my $target; my $target; my $make; my $make; my $noclean; my $noclean; my $minconfig; my $in_bisect = 0; my $bisect_bad = ""; sub read_config { sub read_config { my ($config) = @_; my ($config) = @_; Loading @@ -52,9 +54,7 @@ sub read_config { close(IN); close(IN); } } sub doprint { sub logit { print @_; if (defined($opt{"LOG_FILE"})) { if (defined($opt{"LOG_FILE"})) { open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}"; open(OUT, ">> $opt{LOG_FILE}") or die "Can't write to $opt{LOG_FILE}"; print OUT @_; print OUT @_; Loading @@ -62,6 +62,11 @@ sub doprint { } } } } sub doprint { print @_; logit @_; } sub dodie { sub dodie { doprint "CRITICAL FAILURE... ", @_; doprint "CRITICAL FAILURE... ", @_; Loading Loading @@ -96,7 +101,30 @@ sub run_command { doprint "SUCCESS\n"; doprint "SUCCESS\n"; } } return $failed; return !$failed; } sub get_grub_index { return if ($grub_number >= 0); doprint "Find grub menu ... "; $grub_number = -1; open(IN, "ssh $target cat /boot/grub/menu.lst |") or die "unable to get menu.lst"; while (<IN>) { if (/^\s*title\s+$opt{GRUB_MENU}\s*$/) { $grub_number++; last; } elsif (/^\s*title\s/) { $grub_number++; } } close(IN); die "Could not find '$opt{GRUB_MENU}' in /boot/grub/menu on $opt{MACHINE}" if ($grub_number < 0); doprint "$grub_number\n"; } } my $timeout = $opt{"TIMEOUT"}; my $timeout = $opt{"TIMEOUT"}; Loading Loading @@ -213,57 +241,74 @@ sub monitor { close(IN); close(IN); if (!$booted) { if (!$booted) { return 1 if (!$in_bisect); dodie "failed - never got a boot prompt.\n"; dodie "failed - never got a boot prompt.\n"; } } if ($bug) { if ($bug) { return 1 if (!$in_bisect); dodie "failed - got a bug report\n"; dodie "failed - got a bug report\n"; } } return 0; } } sub install { sub install { if (run_command "scp $opt{OUTPUT_DIR}/$opt{BUILD_TARGET} $target:$opt{TARGET_IMAGE}") { run_command "scp $opt{OUTPUT_DIR}/$opt{BUILD_TARGET} $target:$opt{TARGET_IMAGE}" or dodie "failed to copy image"; dodie "failed to copy image"; my $install_mods = 0; # should we process modules? $install_mods = 0; open(IN, "$opt{OUTPUT_DIR}/.config") or dodie("Can't read config file"); while (<IN>) { if (/CONFIG_MODULES(=y)?/) { $install_mods = 1 if (defined($1)); last; } } } close(IN); if (!$install_mods) { doprint "No modules needed\n"; return; } run_command "$make INSTALL_MOD_PATH=$opt{TMP_DIR} modules_install" or dodie "Failed to install modules"; if ($install_mods) { my $modlib = "/lib/modules/$version"; my $modlib = "/lib/modules/$version"; my $modtar = "autotest-mods.tar.bz2"; my $modtar = "autotest-mods.tar.bz2"; if (run_command "ssh $target rm -rf $modlib") { run_command "ssh $target rm -rf $modlib" or dodie "failed to remove old mods: $modlib"; dodie "failed to remove old mods: $modlib"; } # would be nice if scp -r did not follow symbolic links # would be nice if scp -r did not follow symbolic links if (run_command "cd $opt{TMP_DIR} && tar -cjf $modtar lib/modules/$version") { run_command "cd $opt{TMP_DIR} && tar -cjf $modtar lib/modules/$version" or dodie "making tarball"; dodie "making tarball"; } if (run_command "scp $opt{TMP_DIR}/$modtar $target:/tmp") { run_command "scp $opt{TMP_DIR}/$modtar $target:/tmp" or dodie "failed to copy modules"; dodie "failed to copy modules"; } unlink "$opt{TMP_DIR}/$modtar"; unlink "$opt{TMP_DIR}/$modtar"; if (run_command "ssh $target '(cd / && tar xf /tmp/$modtar)'") { run_command "ssh $target '(cd / && tar xf /tmp/$modtar)'" or dodie "failed to tar modules"; dodie "failed to tar modules"; } run_command "ssh $target rm -f /tmp/$modtar"; run_command "ssh $target rm -f /tmp/$modtar"; } } } sub build { sub build { my ($type) = @_; my ($type) = @_; my $defconfig = ""; my $defconfig = ""; my $append = ""; my $append = ""; if ($type =~ /^useconfig:(.*)/) { if ($type =~ /^useconfig:(.*)/) { if (run_command "cp $1 $opt{OUTPUT_DIR}/.config") { run_command "cp $1 $opt{OUTPUT_DIR}/.config" or dodie "could not copy $1 to .config"; dodie "could not copy $1 to .config"; } $type = "oldconfig"; $type = "oldconfig"; } } Loading @@ -274,58 +319,183 @@ sub build { # allow for empty configs # allow for empty configs run_command "touch $opt{OUTPUT_DIR}/.config"; run_command "touch $opt{OUTPUT_DIR}/.config"; if (run_command "mv $opt{OUTPUT_DIR}/.config $opt{OUTPUT_DIR}/config_temp") { run_command "mv $opt{OUTPUT_DIR}/.config $opt{OUTPUT_DIR}/config_temp" or dodie "moving .config"; dodie "moving .config"; } if (!$noclean && run_command "$make mrproper") { if (!$noclean && !run_command "$make mrproper") { dodie "make mrproper"; dodie "make mrproper"; } } if (run_command "mv $opt{OUTPUT_DIR}/config_temp $opt{OUTPUT_DIR}/.config") { run_command "mv $opt{OUTPUT_DIR}/config_temp $opt{OUTPUT_DIR}/.config" or dodie "moving config_temp"; dodie "moving config_temp"; } } elsif (!$noclean) { } elsif (!$noclean) { unlink "$opt{OUTPUT_DIR}/.config"; unlink "$opt{OUTPUT_DIR}/.config"; if (run_command "$make mrproper") { run_command "$make mrproper" or dodie "make mrproper"; dodie "make mrproper"; } } } # add something to distinguish this build # add something to distinguish this build open(OUT, "> $opt{OUTPUT_DIR}/localversion") or dodie("Can't make localversion file"); open(OUT, "> $opt{OUTPUT_DIR}/localversion") or dodie("Can't make localversion file"); print OUT "$opt{LOCALVERSION}\n"; print OUT "$opt{LOCALVERSION}\n"; close(OUT); close(OUT); if (defined($opt{"MIN_CONFIG"})) { if (defined($minconfig)) { $defconfig = "KCONFIG_ALLCONFIG=$opt{MIN_CONFIG}"; $defconfig = "KCONFIG_ALLCONFIG=$minconfig"; } } if (run_command "$defconfig $append $make $type") { run_command "$defconfig $append $make $type" or dodie "failed make config"; dodie "failed make config"; } if (run_command "$make $opt{BUILD_OPTIONS}") { if (!run_command "$make $opt{BUILD_OPTIONS}") { # bisect may need this to pass return 1 if ($in_bisect); dodie "failed build"; dodie "failed build"; } } return 0; } } sub reboot { sub reboot { # try to reboot normally # try to reboot normally if (run_command "ssh $target reboot") { if (!run_command "ssh $target reboot") { # nope? power cycle it. # nope? power cycle it. run_command "$opt{POWER_CYCLE}"; run_command "$opt{POWER_CYCLE}"; } } } } sub halt { sub halt { if ((run_command "ssh $target halt") or defined($opt{"POWER_OFF"})) { if (!run_command "ssh $target halt" or defined($opt{"POWER_OFF"})) { # nope? the zap it! # nope? the zap it! run_command "$opt{POWER_OFF}"; run_command "$opt{POWER_OFF}"; } } } } sub success { my ($i) = @_; doprint "\n\n*******************************************\n"; doprint "*******************************************\n"; doprint "** SUCCESS!!!! **\n"; doprint "*******************************************\n"; doprint "*******************************************\n"; if ($i != $opt{"NUM_BUILDS"}) { reboot; doprint "Sleeping $opt{SLEEP_TIME} seconds\n"; sleep "$opt{SLEEP_TIME}"; } } sub get_version { # get the release name doprint "$make kernelrelease ... "; $version = `$make kernelrelease | tail -1`; chomp($version); doprint "$version\n"; } sub run_bisect { my ($type) = @_; my $failed; my $result; my $output; my $ret; if (defined($minconfig)) { $failed = build "useconfig:$minconfig"; } else { # ?? no config to use? $failed = build "oldconfig"; } if ($type ne "build") { dodie "Failed on build" if $failed; # Now boot the box get_grub_index; get_version; install; $failed = monitor; if ($type ne "boot") { dodie "Failed on boot" if $failed; } } if ($failed) { $result = "bad"; } else { $result = "good"; } doprint "git bisect $result ... "; $output = `git bisect $result 2>&1`; $ret = $?; logit $output; if ($ret) { doprint "FAILED\n"; dodie "Failed to git bisect"; } doprint "SUCCESS\n"; if ($output =~ m/^(Bisecting: .*\(roughly \d+ steps?\)) \[([[:xdigit:]]+)\]/) { doprint "$1 [$2]\n"; } elsif ($output =~ m/^([[:xdigit:]]+) is the first bad commit/) { $bisect_bad = $1; doprint "Found bad commit... $1\n"; return 0; } return 1; } sub bisect { my ($i) = @_; my $result; die "BISECT_GOOD[$i] not defined\n" if (!defined($opt{"BISECT_GOOD[$i]"})); die "BISECT_BAD[$i] not defined\n" if (!defined($opt{"BISECT_BAD[$i]"})); die "BISECT_TYPE[$i] not defined\n" if (!defined($opt{"BISECT_TYPE[$i]"})); my $good = $opt{"BISECT_GOOD[$i]"}; my $bad = $opt{"BISECT_BAD[$i]"}; my $type = $opt{"BISECT_TYPE[$i]"}; $in_bisect = 1; run_command "git bisect start" or dodie "could not start bisect"; run_command "git bisect good $good" or dodie "could not set bisect good to $good"; run_command "git bisect bad $bad" or dodie "could not set bisect good to $bad"; do { $result = run_bisect $type; } while ($result); run_command "git bisect log" or dodie "could not capture git bisect log"; run_command "git bisect reset" or dodie "could not reset git bisect"; doprint "Bad commit was [$bisect_bad]\n"; $in_bisect = 0; success $i; } read_config $ARGV[0]; read_config $ARGV[0]; # mandatory configs # mandatory configs Loading @@ -346,22 +516,6 @@ $target = "$opt{SSH_USER}\@$opt{MACHINE}"; doprint "\n\nSTARTING AUTOMATED TESTS\n"; doprint "\n\nSTARTING AUTOMATED TESTS\n"; doprint "Find grub menu ... "; $grub_number = -1; open(IN, "ssh $target cat /boot/grub/menu.lst |") or die "unable to get menu.lst"; while (<IN>) { if (/^\s*title\s+$opt{GRUB_MENU}\s*$/) { $grub_number++; last; } elsif (/^\s*title\s/) { $grub_number++; } } close(IN); die "Could not find '$opt{GRUB_MENU}' in /boot/grub/menu on $opt{MACHINE}" if ($grub_number < 0); doprint "$grub_number\n"; $make = "$opt{MAKE_CMD} O=$opt{OUTPUT_DIR}"; $make = "$opt{MAKE_CMD} O=$opt{OUTPUT_DIR}"; Loading @@ -376,6 +530,14 @@ for (my $i = 1; $i <= $opt{"NUM_BUILDS"}; $i++) { $noclean = $opt{"BUILD_NOCLEAN"}; $noclean = $opt{"BUILD_NOCLEAN"}; } } if (defined($opt{"MIN_CONFIG[$i]"})) { $minconfig = $opt{"MIN_CONFIG[$i]"}; } elsif (defined($opt{"MIN_CONFIG"})) { $minconfig = $opt{"MIN_CONFIG"}; } else { undef $minconfig; } if (!defined($opt{$type})) { if (!defined($opt{$type})) { $opt{$type} = $opt{"DEFAULT_BUILD_TYPE"}; $opt{$type} = $opt{"DEFAULT_BUILD_TYPE"}; } } Loading @@ -383,49 +545,20 @@ for (my $i = 1; $i <= $opt{"NUM_BUILDS"}; $i++) { doprint "\n\n"; doprint "\n\n"; doprint "RUNNING TEST $i of $opt{NUM_BUILDS} with option $opt{$type}\n\n"; doprint "RUNNING TEST $i of $opt{NUM_BUILDS} with option $opt{$type}\n\n"; if ($opt{$type} ne "nobuild") { if ($opt{$type} eq "bisect") { build $opt{$type}; bisect $i; } next; # get the release name doprint "$make kernelrelease ... "; $version = `$make kernelrelease | tail -1`; chomp($version); doprint "$version\n"; # should we process modules? $install_mods = 0; open(IN, "$opt{OUTPUT_DIR}/.config") or dodie("Can't read config file"); while (<IN>) { if (/CONFIG_MODULES(=y)?/) { $install_mods = 1 if (defined($1)); last; } } } close(IN); if ($install_mods) { if ($opt{$type} ne "nobuild") { if (run_command "$make INSTALL_MOD_PATH=$opt{TMP_DIR} modules_install") { build $opt{$type}; dodie "Failed to install modules"; } } else { doprint "No modules needed\n"; } } get_grub_index; get_version; install; install; monitor; monitor; success $i; doprint "\n\n*******************************************\n"; doprint "*******************************************\n"; doprint "** SUCCESS!!!! **\n"; doprint "*******************************************\n"; doprint "*******************************************\n"; if ($i != $opt{"NUM_BUILDS"}) { reboot; sleep "$opt{SLEEP_TIME}"; } } } if ($opt{"POWEROFF_ON_SUCCESS"}) { if ($opt{"POWEROFF_ON_SUCCESS"}) { Loading