如果nmake在批处理期间失败,则返回错误并发送电子邮件

算法

我正在尝试创建批处理,以在Windows下实现Nightly build。我设法在发行版中进行编译,并通过脚本自动调试生成。

但是,现在我想在编译期间出现错误时得到通知,如果失败则需要返回电子邮件。这提出了以下问题:

我会返回错误nmake吗?还是批次本身失败了?

如果是这样,我如何在文本文件或电子邮件中返回此错误?

我在àWindows Server 2012下运行,并使用任务计划程序进行自动化。这是我的批次(已编辑)

@echo on
echo[
set rel=release
@echo ####### COMPILATION CORE (DEBUG / x86) #######
echo[
cd C:\Users\mea\Documents\Repos\corealpi\cmake\nmake
@echo ####### delete cache  #######
rm -R *
@echo ####### Generation of Makefile  #######
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
cmake -DCMAKE_BUILD_TYPE=Debug -G"NMake Makefiles" ../
if %errorlevel% neq 0 goto mailcmaked 

@echo ####### compilation of core  #######
echo[
nmake
if %errorlevel% neq 0 goto mailnmaked
pause

@echo ####### COMPILATION CORE(RELEASE / x86) #######
echo[
cd C:\Users\mea\Documents\Repos\corealpi\cmake\nmake
@echo ####### Suppression du CACHE  #######
rm -R *
@echo ####### Generation of Makefile  #######
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"
cmake -DCMAKE_BUILD_TYPE=Release -G"NMake Makefiles" ../
if %ERRORLEVEL% neq 0 goto mailcmaker

@echo ####### Compilation of CORE  #######
echo[
>"..\log\buildRel.log" nmake
if %errorlevel% neq 0 goto mailnmaker
pause

:mailcmaked
echo Error!
sendEmail -f [email protected] -t [email protected] -m "cmake debug failed" -s 192.168.x.x
exit 1

:mailnmaked
echo Error!
sendEmail -f [email protected] -t [email protected] -m "nmake debug failed" -s 192.168.x.x
exit 1

:mailcmaker
sendEmail -f [email protected] -t [email protected] -m "cmake release failed" -s 192.168.x.x
exit 1

:mailnmaker
grep -Eo '.{0,20}error.{0,100}' ..\log\buildRel.log > ..\log\mailBuild.txt
sendEmail -f [email protected] -u "build failed" -t [email protected] -m "nmake release failed" -a ..\log\mailBuild.txt -s 192.168.x.x
exit 1

编辑

我从您的示例中编辑了脚本绘图的灵感,现在效果很好(仅适用于当前:mailnmaker部分)。我用grep命令组织输出。

对于邮件问题,我只安装了sendEmail并将其放在我的Windows PATH中就可以了。

谢谢您的帮助。

红色的

首先,没有可用的本地命令可让您发送电子邮件。您可以使用Windows脚本(VBScript或JScript)来编写脚本CDO.Message将Windows脚本宿主合并到批处理脚本中的最简单的方法是使用混合脚本

您可以使用条件执行来触发发送电子邮件功能(如果存在)cmakenmake以非零状态退出。

这是一个入门的示例框架。请注意,这未经测试,可能已损坏。但无论如何,它至少应该为您提供一个起点。

(另请注意,我更换了rm -R *与原生Windows命令,并输出cmakenmake被重定向到%temp%\build.log包含到,如果需要的电子邮件。如果你想回显到控制台以及输出,你可能会使用tee -a,如果您有Cygwin的或安装了gnuwin32或类似产品;或者可能包含此脚本模仿。)

@if (@CodeSection == @Batch) @then

@echo on
echo[

@echo ####### COMPILATION CORE (DEBUG / x86) #######
call :make Debug || exit /b %ERRORLEVEL%

@echo ####### COMPILATION CORE(RELEASE / x86) #######
call :make Release || exit /b %ERRORLEVEL%

goto :EOF

:::::::::::::::::::::::::::::::::::::::::::::::::::::::
:make <Release|Debug>
:::::::::::::::::::::::::::::::::::::::::::::::::::::::

echo[
cd /d C:\Users\mea\Documents\Repos\corealpi\cmake\nmake
@echo ####### delete cache  #######
for /d %%I in (*) do rmdir /q /s "%%~I"
del /q /y *
@echo ####### Makefile  #######
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat"

:: use conditional execution to send an email if cmake exits non-zero
>"%temp%\build.log" cmake -DCMAKE_BUILD_TYPE=%1 -G"NMake Makefiles" ../ || (
    call :sendmail cmake %1 %ERRORLEVEL%
    exit /b %ERRORLEVEL%
)

@echo ####### compilation of core (debug/x86)  #######
echo[
:: use conditional execution to send an email if nmake exits non-zero
>"%temp%\build.log" nmake || (
    call :sendmail nmake %1 %ERRORLEVEL%
    exit /b %ERRORLEVEL%
)
goto :EOF

:::::::::::::::::::::::::::::::::::::::::::::::::::::::
:sendmail <name> <buildtype> <errorlevel>
:::::::::::::::::::::::::::::::::::::::::::::::::::::::

cscript /nologo /e:JScript "%~f0" "%~1" "%~2" "%~3" "%temp%\build.log"
exit /b %~3

:::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: end batch / begin JScript
:::::::::::::::::::::::::::::::::::::::::::::::::::::::
@end

var buildstep = WSH.Arguments(0),
    buildtype = WSH.Arguments(1),
    errorlevel = WSH.Arguments(2),
    buildlog = WSH.Arguments(3),
    oSH = WSH.CreateObject('WScript.Shell'),
    fso = WSH.CreateObject('Scripting.FileSystemObject');

function SendEMail(config) {
    try {
        var oMsg = WSH.CreateObject("CDO.Message");
        for (var i in config) oMsg[i] = config[i];
        oMsg.Send();
    }
    catch(e) {
        var profile = oSH.Environment('Process')('USERPROFILE'),
            alert = fso.CreateTextFile(profile + '\\Desktop\\builderr.log', 1);

        alert.WriteLine(buildstep + ' build type ' + buildtype
            + ' failed.  Email failed.  Everything is broken.  I give up.');

        alert.WriteLine(getLog(20));
        alert.Close();
    }
}

function getLog(lines) {
        log = fso.OpenTextFile(buildlog, 1),
        contents = [];

    while (!log.AtEndOfStream) {
        contents.push(log.ReadLine());
        if (contents.length > lines) contents.shift();
    }
    log.Close();
    return contents.join('\n');
}

SendEMail({
    From: "[email protected]",
    To: "[email protected]",
    Subject: "Build failed",
    TextBody: buildstep + " build type " + buildtype
        + " failed with error code " + errorlevel
        + '\n\nLast 20 lines of messages from ' + buildlog + ':\n\n' + getLog(20)
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用批处理文件发送电子邮件

来自分类Dev

Python,运行测试,如果失败则发送电子邮件

来自分类Dev

PHPMailer返回ajax错误,但仍发送电子邮件

来自分类Dev

Java Jar文件从批处理文件运行时不发送电子邮件?

来自分类Dev

当批处理作业状态更改为正在执行时,如何发送电子邮件警报?

来自分类Dev

Elastalert过滤日志级别并发送电子邮件

来自分类Dev

比较日期并发送电子邮件

来自分类Dev

汇总 SSIS 中的列并发送电子邮件

来自分类Dev

Azure LogicApp 运行 webjob 并发送电子邮件

来自分类Dev

Mule 3.5.0-如何在处理过程中引发异常时将文件移动到“失败”目录并发送电子邮件

来自分类Dev

在发送电子邮件到Firestore期间出现不受支持的类型错误

来自分类Dev

Rails Action Mailer并返回状态200(如果已发送电子邮件)

来自分类Dev

如果我使用django发送电子邮件,nginx返回404

来自分类Dev

操作邮件程序错误以发送电子邮件

来自分类Dev

使用Go / TLS发送电子邮件会导致“远程错误:握手失败”响应

来自分类Dev

使用 sendgrid 发送电子邮件失败,出现 500 内部错误

来自分类Dev

Powershell如果成功或出现错误,请发送电子邮件

来自分类Dev

在Heroku上使用nodemailer发送电子邮件失败

来自分类Dev

当人偶运行失败时发送电子邮件通知

来自分类Dev

Smartsheet通过API发送电子邮件失败

来自分类Dev

在ASP网络中发送电子邮件异步失败

来自分类Dev

发送电子邮件失败,有异常吗?

来自分类Dev

发送电子邮件时外来字母失败

来自分类Dev

当人偶运行失败时发送电子邮件通知

来自分类Dev

快速处理错误发送电子邮件到不存在的地址

来自分类Dev

如果满足条件,请更新收集并发送电子邮件|| Mongo Node.js

来自分类Dev

Powershell脚本以启动服务(如果已停止),请等待几分钟并发送电子邮件通知

来自分类Dev

Powershell脚本重新启动Windows Service(如果它已关闭)并发送电子邮件

来自分类Dev

如果磁盘空间超过则发送电子邮件

Related 相关文章

  1. 1

    使用批处理文件发送电子邮件

  2. 2

    Python,运行测试,如果失败则发送电子邮件

  3. 3

    PHPMailer返回ajax错误,但仍发送电子邮件

  4. 4

    Java Jar文件从批处理文件运行时不发送电子邮件?

  5. 5

    当批处理作业状态更改为正在执行时,如何发送电子邮件警报?

  6. 6

    Elastalert过滤日志级别并发送电子邮件

  7. 7

    比较日期并发送电子邮件

  8. 8

    汇总 SSIS 中的列并发送电子邮件

  9. 9

    Azure LogicApp 运行 webjob 并发送电子邮件

  10. 10

    Mule 3.5.0-如何在处理过程中引发异常时将文件移动到“失败”目录并发送电子邮件

  11. 11

    在发送电子邮件到Firestore期间出现不受支持的类型错误

  12. 12

    Rails Action Mailer并返回状态200(如果已发送电子邮件)

  13. 13

    如果我使用django发送电子邮件,nginx返回404

  14. 14

    操作邮件程序错误以发送电子邮件

  15. 15

    使用Go / TLS发送电子邮件会导致“远程错误:握手失败”响应

  16. 16

    使用 sendgrid 发送电子邮件失败,出现 500 内部错误

  17. 17

    Powershell如果成功或出现错误,请发送电子邮件

  18. 18

    在Heroku上使用nodemailer发送电子邮件失败

  19. 19

    当人偶运行失败时发送电子邮件通知

  20. 20

    Smartsheet通过API发送电子邮件失败

  21. 21

    在ASP网络中发送电子邮件异步失败

  22. 22

    发送电子邮件失败,有异常吗?

  23. 23

    发送电子邮件时外来字母失败

  24. 24

    当人偶运行失败时发送电子邮件通知

  25. 25

    快速处理错误发送电子邮件到不存在的地址

  26. 26

    如果满足条件,请更新收集并发送电子邮件|| Mongo Node.js

  27. 27

    Powershell脚本以启动服务(如果已停止),请等待几分钟并发送电子邮件通知

  28. 28

    Powershell脚本重新启动Windows Service(如果它已关闭)并发送电子邮件

  29. 29

    如果磁盘空间超过则发送电子邮件

热门标签

归档