在工作中,需要用Jenkins调度执行shell脚本,同时需要发送邮件通知执行情况。其中比较特殊的一个需求是邮件中显示shell脚本执行结果。


前提条件:jinkens集成工具已安装了邮件插件,https://plugins.jenkins.io/email-ext  GitHub地址:https://github.com/jenkinsci/email-ext-plugin


使用Jenkins默认的邮件配置,邮件内容中显示的是最近一次构建console输出的内容的一个链接,不能满足要求;考虑Jenkins可以支持jelly和groovy组建html模板邮件,是否可以将shell脚本的输出放置到邮件模板中。通过参考以下文章和一番尝试终于搞定了。

参考文章:

http://blog.csdn.net/wangmuming/article/details/22925509

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html  java正则


实现的基本思路是 通过邮件模板变量${BUILD_LOG_MULTILINE_REGEX} 正则匹配来实现,同时匹配中的部分为html片段


具体配置:

1.邮件内容配置



2:邮件模板

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>adx商品竞价系数调整:${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次运行日志</title>
</head>

<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
    offset="0">
    <table width="95%" cellpadding="0" cellspacing="0"
        style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
        <tr>
            <td>(本邮件是程序自动下发的,请勿回复!)</td>
        </tr>
        <tr>
            <td><h2>
                    <font color="#0000FF">构建结果 - ${BUILD_STATUS}</font>
                </h2></td>
        </tr>
        <tr>
            <td><br />
            <b><font color="#0B610B">构建信息</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <tr>
            <td>
                <ul>
                    <li>项目名称 : ${PROJECT_NAME}</li>
                    <li>构建编号 : 第${BUILD_NUMBER}次构建</li>
                    <li>触发原因: ${CAUSE}</li>
                    <li>构建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
                </ul>
            </td>
        </tr>
        <tr>
            <td><b><font color="#0B610B">执行调整的广告位列表:</font></b>
            <hr size="2" width="100%" align="center" /></td>
        </tr>
        <!-- <tr>
            <td>Test Logs (if test has ran): <a
                href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>
                <br />
            <br />
            </td>
        </tr> -->
        <tr>
            <td>
                <!--<textarea cols="80" rows="30" readonly="readonly" style="font-family: Courier New">
                    ${BUILD_LOG, maxLines=100}
                    </textarea>-->
                    <!--${BUILD_LOG, maxLines=100,escapeHtml=true}-->
                    ${BUILD_LOG_MULTILINE_REGEX,showTruncatedLines="false",regex="<tr>([\\s\\S\\u4E00-\\u9FA5]*)<\\/tr>",escapeHtml="false"} 
            </td>

        </tr>
        <tr>
            <td><b><font color="#0B610B">构建日志:</font></b>
        </tr>
        <tr>
             <td>
                    ${BUILD_LOG, maxLines=100,escapeHtml="false"}
             </td>   
        </tr>
    </table>
</body>
</html>


其中  ${BUILD_LOG_MULTILINE_REGEX,showTruncatedLines="false",regex="<tr>([\\s\\S\\u4E00-\\u9FA5]*)<\\/tr>",escapeHtml="false"}

用来匹配<tr>...</tr>的内容显示在邮件中。


3.shell中输出用于在邮件中显示的内容,这里对结果整理为一个文件通过AWK格式化为邮件中的html片段,awk 脚本如下:

function btd(v){
    print "<td style=\"border:1px solid;width=60px\"><b>"v"</b></td>"
}
BEGIN{
    print "<tr>"
    btd("date");
    btd("ad_traffic_type");
    btd("posid");
    btd("income");
    btd("cost");
    btd("roa");
    btd("amp");
    btd("old_bid");
    btd("new_bid");
    print "</tr>"
}
{
 if (match(wlist,$3)){   
    print "<tr>";
    btd($1);
    btd($2);
    btd($3);
    btd($4);
    btd($5);
    btd($6);
    btd($7);
    btd($8);
    btd($9);
    print "</tr>";
}
}


awk 调用方式:
awk -F"\t" -v wlist=$white_list -f $dir/awk_out.awk ${wkdir}/bidamp_full_$dt


最终邮件效果如下:




Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐