[6/6] testbot/build: Improve the WineRun{Build,Reconfig}.pl error handling.
Francois Gouget
fgouget at codeweavers.com
Wed Mar 13 10:53:36 CDT 2013
Don't try to copy the generated executables in WineRunBuild.pl if the build failed.
Document what happens if we fail to take a new snapshot in WineRunReconfig.pl.
---
It's particularly nice not having an extra TestAgent error about being
unable to transfer a test executable when the real problem is that the
build failed.
testbot/bin/WineRunBuild.pl | 105 ++++++++++++++++++++--------------------
testbot/bin/WineRunReconfig.pl | 29 ++++++-----
2 files changed, 71 insertions(+), 63 deletions(-)
diff --git a/testbot/bin/WineRunBuild.pl b/testbot/bin/WineRunBuild.pl
index e7dfafd..f750a0b 100755
--- a/testbot/bin/WineRunBuild.pl
+++ b/testbot/bin/WineRunBuild.pl
@@ -198,29 +198,24 @@ my $TaskDir = "$StepDir/$TaskNo";
my $FullLogFileName = "$TaskDir/log";
my $FullErrFileName = "$TaskDir/err";
-my $BaseName;
-my $Run64 = !1;
+my ($Run64, $BaseName);
foreach my $OtherStep (@{$Job->Steps->GetItems()})
{
- if ($OtherStep->No != $StepNo)
+ next if ($OtherStep->No == $StepNo);
+
+ $Run64 = 1 if ($OtherStep->FileType eq "exe64");
+ my $OtherFileName = $OtherStep->FileName;
+ if ($OtherFileName =~ m/^([\w_\-]+)(|\.exe)_test(|64)\.exe$/)
{
- my $OtherFileName = $OtherStep->FileName;
- if ($OtherFileName =~ m/^([\w_\-]+)(|\.exe)_test(|64)\.exe$/)
+ if (defined $BaseName and $BaseName ne $1)
{
- if (defined $BaseName && $BaseName ne $1)
- {
- FatalError "$1 doesn't match previously found $BaseName\n",
- $FullErrFileName, $Job, $Task;
- }
- $BaseName = $1;
- if ($OtherStep->FileType eq "exe64")
- {
- $Run64 = 1;
- }
+ FatalError "$1 doesn't match previously found $BaseName\n",
+ $FullErrFileName, $Job, $Task;
}
+ $BaseName = $1;
}
}
-if (! defined($BaseName))
+if (!defined $BaseName)
{
FatalError "Can't determine base name\n", $FullErrFileName, $Job, $Task;
}
@@ -234,7 +229,7 @@ if ($VM->Status ne "idle" and $VM->Status ne "running")
}
$VM->Status('running');
my ($ErrProperty, $ErrMessage) = $VM->Save();
-if (defined($ErrMessage))
+if (defined $ErrMessage)
{
FatalError "Can't set VM status to running: $ErrMessage\n",
$FullErrFileName, $Job, $Task;
@@ -244,7 +239,7 @@ my $FileName = $Step->FileName;
if (!$TA->SendFile("$StepDir/$FileName", "staging/$FileName", 0))
{
$ErrMessage = $TA->GetLastError();
- FatalError "Can't copy patch to VM: $ErrMessage\n",
+ FatalError "Could not copy the patch to the VM: $ErrMessage\n",
$FullErrFileName, $Job, $Task;
}
my $Script = "#!/bin/sh\n" .
@@ -256,61 +251,67 @@ $Script .= " >>Build.log 2>&1\n";
if (!$TA->SendFileFromString($Script, "task", $TestAgent::SENDFILE_EXE))
{
$ErrMessage = $TA->GetLastError();
- FatalError "Can't send the script to VM: $ErrMessage\n",
+ FatalError "Can't send the build script to the VM: $ErrMessage\n",
$FullErrFileName, $Job, $Task;
}
my $Pid = $TA->Run(["./task"], 0);
if (!$Pid or !defined $TA->Wait($Pid, $Task->Timeout))
{
$ErrMessage = $TA->GetLastError();
+ # Try to grab the build log before reporting the failure
}
-
-if (defined($ErrMessage))
+my $NewStatus;
+if ($TA->GetFile("Build.log", $FullLogFileName))
{
- $TA->GetFile("Build.log", $FullLogFileName);
- ProcessLog($FullLogFileName, $FullErrFileName);
- FatalError "Failure running script in VM: $ErrMessage\n",
- $FullErrFileName, $Job, $Task;
+ $NewStatus = ProcessLog($FullLogFileName, $FullErrFileName);
}
-
-if (!$TA->GetFile("Build.log", $FullLogFileName))
+elsif (!defined $ErrMessage)
{
+ # This GetFile() error is the first one so report it
$ErrMessage = $TA->GetLastError();
- FatalError "Can't copy log from VM: $ErrMessage\n",
+ FatalError "Can't copy the build log from the VM: $ErrMessage\n",
+ $FullErrFileName, $Job, $Task;
+}
+if (defined $ErrMessage)
+{
+ # Now we can report the previous Run() / Wait() error
+ FatalError "Failure running the build script in the VM: $ErrMessage\n",
$FullErrFileName, $Job, $Task;
}
-my $NewStatus = ProcessLog($FullLogFileName, $FullErrFileName);
-foreach my $OtherStep (@{$Job->Steps->GetItems()})
+# Don't try copying the test executables if the build step failed
+if ($NewStatus eq "completed")
{
- if ($OtherStep->No != $StepNo)
+ foreach my $OtherStep (@{$Job->Steps->GetItems()})
{
+ next if ($OtherStep->No == $StepNo);
+
my $OtherFileName = $OtherStep->FileName;
- if ($OtherFileName =~ m/^[\w_\-]+(|\.exe)_test(|64)\.exe$/)
- {
- my $OtherStepDir = "$DataDir/jobs/$JobId/" . $OtherStep->No;
- mkdir $OtherStepDir;
+ next if ($OtherFileName !~ /^[\w_\-]+(?:|\.exe)_test(?:|64)\.exe$/);
- my $Bits = $OtherStep->FileType eq "exe64" ? "64" : "32";
- my $TestExecutable;
- if ($Step->FileType ne "patchprograms")
- {
- $TestExecutable = "build-mingw$Bits/dlls/$BaseName/tests/${BaseName}_test.exe";
- }
- else
- {
- $TestExecutable = "build-mingw$Bits/programs/$BaseName/tests/${BaseName}.exe_test.exe";
- }
- if (!$TA->GetFile($TestExecutable, "$OtherStepDir/$OtherFileName"))
- {
- $ErrMessage = $TA->GetLastError();
- FatalError "Can't copy generated executable from VM: $ErrMessage\n",
- $FullErrFileName, $Job, $Task;
- }
- chmod 0664, "$OtherStepDir/$OtherFileName";
+ my $OtherStepDir = "$DataDir/jobs/$JobId/" . $OtherStep->No;
+ mkdir $OtherStepDir;
+
+ my $Bits = $OtherStep->FileType eq "exe64" ? "64" : "32";
+ my $TestExecutable;
+ if ($Step->FileType ne "patchprograms")
+ {
+ $TestExecutable = "build-mingw$Bits/dlls/$BaseName/tests/${BaseName}_test.exe";
+ }
+ else
+ {
+ $TestExecutable = "build-mingw$Bits/programs/$BaseName/tests/${BaseName}.exe_test.exe";
}
+ if (!$TA->GetFile($TestExecutable, "$OtherStepDir/$OtherFileName"))
+ {
+ $ErrMessage = $TA->GetLastError();
+ FatalError "Can't copy the generated executable from the VM: $ErrMessage\n",
+ $FullErrFileName, $Job, $Task;
+ }
+ chmod 0664, "$OtherStepDir/$OtherFileName";
}
}
+
$TA->Disconnect();
$Task->Status($NewStatus);
diff --git a/testbot/bin/WineRunReconfig.pl b/testbot/bin/WineRunReconfig.pl
index 7460361..5d9d6b3 100755
--- a/testbot/bin/WineRunReconfig.pl
+++ b/testbot/bin/WineRunReconfig.pl
@@ -219,32 +219,36 @@ my $Script = "#!/bin/sh\n" .
if (!$TA->SendFileFromString($Script, "task", $TestAgent::SENDFILE_EXE))
{
$ErrMessage = $TA->GetLastError();
- FatalError "Can't send the script to VM: $ErrMessage\n",
+ FatalError "Can't send the script to the VM: $ErrMessage\n",
$FullErrFileName, $Job, $Task;
}
my $Pid = $TA->Run(["./task"], 0);
if (!$Pid or !defined $TA->Wait($Pid, $Task->Timeout))
{
$ErrMessage = $TA->GetLastError();
+ # Try to grab the reconfig log before reporting the failure
}
-
-if (defined($ErrMessage))
+my $NewStatus;
+if ($TA->GetFile("Reconfig.log", $FullLogFileName))
{
- $TA->GetFile("Reconfig.log", $FullLogFileName);
- ProcessLog($FullLogFileName, $FullErrFileName);
- FatalError "Failure running script in VM: $ErrMessage\n",
- $FullErrFileName, $Job, $Task;
+ $NewStatus = ProcessLog($FullLogFileName, $FullErrFileName);
}
-
-if (!$TA->GetFile("Reconfig.log", $FullLogFileName))
+elsif (!defined $ErrMessage)
{
+ # This GetFile() error is the first one so report it
$ErrMessage = $TA->GetLastError();
- FatalError "Can't copy log from VM: $ErrMessage\n",
+ FatalError "Can't copy the reconfig log from the VM: $ErrMessage\n",
+ $FullErrFileName, $Job, $Task;
+}
+if (defined $ErrMessage)
+{
+ # Now we can report the previous Run() / Wait() error
+ FatalError "Could not run the reconfig script in the VM: $ErrMessage\n",
$FullErrFileName, $Job, $Task;
}
+
$TA->Disconnect();
-my $NewStatus = ProcessLog($FullLogFileName, $FullErrFileName);
if ($NewStatus eq "completed")
{
$ErrMessage = $VM->RemoveSnapshot($VM->IdleSnapshot);
@@ -257,6 +261,9 @@ if ($NewStatus eq "completed")
$ErrMessage = $VM->CreateSnapshot($VM->IdleSnapshot);
if (defined($ErrMessage))
{
+ # Without the snapshot the VM is not usable anymore but FatalError() will
+ # just mark it as 'dirty'. It's only the next time it is used that the
+ # problem will be noticed and that it will be taken offline.
FatalError "Can't take snapshot: $ErrMessage\n",
$FullErrFileName, $Job, $Task;
}
--
1.7.10.4
More information about the wine-patches
mailing list