科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件Build Monitor Automation(软件构建自动监控,提供一种Build监控的实现方式)

Build Monitor Automation(软件构建自动监控,提供一种Build监控的实现方式)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Build Monitor 软件构建 错误自动监控 Perl 提供一种Build监控的实现方式。

作者:孙振芳 来源:CSDN 2008年3月24日

关键字: 项目管理 软件 自动监控 实现方式

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共19页)

在我们进行项目的构建过程中,如果项目的构建时间较长,通常的情况是我们只能等到构建结束后才能知道构建是否成功,也就是我们的进一步的工作都要等到构建结束后才能继续,如果项目构建需要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:\BuildMonitor\

DEL %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

文笔仓促为谦,日后补充

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章