Jenkins BUILD_LOG_REGEX(emailext 插件)不匹配多行(dotall)

Jenkins BUILD_LOG_REGEX ( emailext plugin ) does not match across multiple lines ( dotall )

背景

我正在尝试使用 emailext 插件提供的 BUILD_LOG_REGEX 环境变量来过滤构建日志。我的正则表达式假设匹配“init:”和“Total time”字符串之间的所有内容。我的正则表达式如下init:(.*?)Total\stime

Jenkins emailext代码如下

emailext( 
    body: "${BUILD_LOG_REGEX, regex=\"init:(.*?)Total\stime", maxMatches=10000000, showTruncatedLines=false, escapeHtml=true}",
    subject: 'Test Subject',
    mimeType: 'text/html',
    to: 'noname@gmail.com'
)

构建日志如下

Started by user Chris Maggiulli
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on EC2 (sis-account) - java-build-11 (sir-2viyb9qh) in /home/ec2-user/workspace/z_test/email-build-log
[Pipeline] {
[Pipeline] stage (checkout)
Using the ‘stage’ step without a block argument is deprecated
Entering stage checkout
Proceeding
[Pipeline] checkout
Using sole credentials awsjobs/****** (awsjobs-AD-User) in realm ‘<https://svn.int.excelsior.edu:443> Private’
Updating https://svn.int.excelsior.edu/svn/sis_dev2 at revision '2021-08-10T13:18:37.454 +0000' --quiet
[Pipeline] stage (build)
Using the ‘stage’ step without a block argument is deprecated
Entering stage build
Proceeding
At revision 27558

[Pipeline] dir
Running in /home/ec2-user/workspace/z_test/email-build-log/sis
[Pipeline] {
[Pipeline] sh
+ ant -Dsis.root=.. -Djava.home=/usr/lib/jvm/java-11-amazon-corretto.x86_64 -Djava.exec=/usr/lib/jvm/java-11-amazon-corretto.x86_64/bin/java make
Buildfile: /home/ec2-user/workspace/z_test/email-build-log/sis/build.xml

init:

compileSis:
     [copy] Copying 1 file to /home/ec2-user/workspace/z_test/email-build-log/sis/sis/WEB-INF/classes
     [copy] Copying 9 files to /home/ec2-user/workspace/z_test/email-build-log/sis/sis/WEB-INF/classes
    [javac] /home/ec2-user/workspace/z_test/email-build-log/sis/build.xml:108: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
    [javac] Compiling 3372 source files to /home/ec2-user/workspace/z_test/email-build-log/sis/sis/WEB-INF/classes
    [javac] warning: [options] bootstrap class path not set in conjunction with -source 7
    [javac] Note: Some input files use or override a deprecated API.
    [javac] Note: Recompile with -Xlint:deprecation for details.
    [javac] Note: Some input files use unchecked or unsafe operations.
    [javac] Note: Recompile with -Xlint:unchecked for details.
    [javac] 1 warning

createSisWar:
   [delete] Deleting: /home/ec2-user/workspace/z_test/email-build-log/deploy/tomcat/sis.war
      [war] Building war: /home/ec2-user/workspace/z_test/email-build-log/deploy/tomcat/sis.war

FullSisBuild:

make:
     [echo] build complete.

BUILD SUCCESSFUL
Total time: 25 seconds
[Pipeline] }
[Pipeline] // dir
[Pipeline] stage (email)
Using the ‘stage’ step without a block argument is deprecated
Entering stage email
Proceeding
[Pipeline] emailext
Sending email to: noname@gmail.com
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS

虽然这适用于几乎所有在线正则表达式测试器,但它不适用于 Jenkins。我相信这与 BUILD_LOG_REGEX 宏如何实现 dotall 有关,但我无法让它跨多行匹配。我意识到 BUILD_LOG_REGEX 是使用 java.util.regex.Pattern 实现的。有人可以帮助我吗?

尝试次数

我还尝试了以下正则表达式 init:(?s:.*)Total\stime 并尝试使用 BUILD_LOG_MULTILINE_REGEX (同时使用两个正则表达式),但两者 return 都不匹配。

解决方案BUILD_LOG_EXCERPT

我找到了一个使用 BUILD_LOG_EXCERPT 令牌的迂回解决方案。以下代码示例给出了我使用此令牌查找的结果。

emailext(
   subject: "compile-check failed for $APP",
   body: "${BUILD_LOG_EXCERPT, start=\"init:.*\", end=\"Total\stime.*\"}",
   replyTo: '$DEFAULT_REPLYTO',
   mimeType: 'text/html',
   recipientProviders: [culprits()],
   to: 'noone@gmail.com'
)

未转义的字符串是${BUILD_LOG_EXCERPT, start="init:.*", end="Total\stime.*"}

我仍然对使用 BUILD_LOG_REGEXBUILD_LOG_MULTILINE_REGEX

的解决方案感兴趣