在我们进行项目的构建过程中,如果项目的构建时间较长,通常的情况是我们只能等到构建结束后才能知道构建是否成功,也就是我们的进一步的工作都要等到构建结束后才能继续,如果项目构建需要1个小时,我们就需要等待1个小时,如果需要n个小时.... 通常项目的构建过程中会将build log输出到一个log文件中,通常这个文件是编译器直接写入的,也就是说这个文件中的信息是较为实时的,当然我们可以不断地人为的去查看log文件中的信息,检查是否出错。较好一点的情况是我们把这个log文件发布与Intranet上,这样大家都可以看到build的情况,但这毕竟还是有些不方便,我个人觉得理想的情况应该是这样:
1. 能够自动识别错误
2. 当出现Build Error时,第一时间自动通知相关人员,通知的方式可以是Email,消息通知,SMS等
3. 系统中可能存在一些可以忽略的Error信息,对于这些信息的出现,作为非错误处理
4. 普通的build log中信息较为繁杂,难以找到错误信息,应对build log进行一定的整理,以更友好的方式展现出来。
我们采用如下方式来实现上述想法
1. 当Build启动时,伴随着一个Build Monitor也将启动,
2. 每隔一段时间(时间间隔可以人为设定),自动检测错误一次
3. 采用Perl脚本通过正则表达来实现错误的检测,采用Commandline来实现间隔检测
4. 系统能够定义一些可忽略的错误,即这些错误可不视为错误处理
5. 根据build log中的格式,当出现错误的时候,提炼出最有意义的信息,存成将之存成文件,并停止监控,是否停止构建,视项目情况而定
6. 将提炼出来的信息发送给相关人员
附:错误检测脚本Perl
#Written by Sun Zhenfang 20060515
sub CompareErrFiles($$)
{
my @Standard=`type $_[0]`;
my @General=`type $_[1]`;
my $GeneralError;
my $StandardError;
if(scalar(@Standard)<scalar(@General))
{
return 0;
}
else
{
for($i=0;$i<@General;$i++)
{
$iGeneral = rindex($General[$i],"\\");
$iStandard = rindex($Standard[$i],"\\");
if($iGeneral eq '-1' and $iStandard eq '-1')
{
if($General[$i]=~/.*\s([1-9]+[0-9]*)\serror.*([1-9]+[0-9]*)\swarning.*/i)
{
$GeneralError=$1;
if($Standard[$i]=~/.*\s([1-9]+[0-9]*)\serror.*([1-9]+[0-9]*)\swarning.*/i)
{
$StandardError=$1;
if($GeneralError!=$StandardError)
{
return 0;
}
}
else
{
return 0;
}
}
else
{
if(substr($General[$i],5) ne substr($Standard[$i],5))
{
return 0;
}
}
}
elsif($iGeneral*$iStandard>0)#They are same to include {
if(substr($General[$i],$iGeneral) ne substr($Standard[$i],$iStandard))
{
return 0;
}
}
else#One include \,and other does not include {
return 0;
}
}
}
return 1;
}
$LogFile=$ARGV[0]; #Build log file
$ErrFle=$ARGV[1]; #Output error file
$StandardErrorFile=$ARGV[2]; #Standard error file
system('del '.$ErrFle.' /F');
@lines=`type $LogFile`;
my $i;
my $j;
my $k;
my $ErrCnt;
for($i=0;$i<@lines;$i++)
{
if($lines[$i]=~/.*\s([1-9]+[0-9]*)\serror.*/i)
{
$ErrCnt=$1;
$j=0;
$k=0;
while($j<=$ErrCnt)
{
chop($lines[$i-$k]);
if($lines[$i-$k]=~/.*error.*/i)
{
push(@errs,$lines[$i-$k]);
$j++;
}
$k++;
}
}
}
@errs = reverse @errs;
open(OUTFILE, ">".$ErrFle);
print OUTFILE join("\n",@errs);
close OUTFILE;
if(CompareErrFiles($StandardErrorFile,$ErrFle))
{
system('del '.$ErrFle.' /F');
}
附:定时检测,该段脚本调用Perl脚本探测错误, 并通过BLAT工具发送Email通知
REM Written by Sun Zhenfang 20060516
REM Baseline Name - %1
REM Baseline Source Path - %2
CD C:
CD C:\BuildMonitorDEL %1.email /F
DEL %1.err /F
:WAIT
@SLEEP 120
IF NOT EXIST %2bld.log GOTO WAIT
IF EXIST %2errs.txt GOTO STOP
@PERL DetectError.pl %2bld.log %1.err %1.stderr
IF EXIST %1.err GOTO ERR
GOTO WAIT
:ERR
@DEL %1.email /F
@COPY header.txt+%1.err+footer.txt %1.email
@BLAT %1.email -tf C:\Bld_Start\bldmonitor.lst -subject "%COMPUTERNAME% BUILD MONITOR - %1 Error Information"
:STOP
EXIT
文笔仓促为谦,日后补充