使用 Jenkinsfile 构建 Jenkins 管道不会失败
Jenkins pipeline build using Jenkinsfile is not failing
我有一个 declarative 管道阶段,如下所示,
stage('build') {
steps {
echo currentBuild.result
script {
try {
bat 'ant -f xyz\build.xml'
} catch (err) {
echo "Caught: ${err}"
currentBuild.result = 'FAILURE'
}
}
echo currentBuild.result
}
}
我预计管道会失败,因为构建失败并显示以下消息。
BUILD FAILED
C:\...\build.xml:8: The following error occurred while executing this line:
C:\...\build.xml:156: The following error occurred while executing this line:
C:\...\build.xml:111: Problem creating jar: C:\...\xyz.war (The system cannot find the path specified) (and the archive is probably corrupt but I could not delete it)
currentBuild.result 我打印的时候都是空的。
蚂蚁叫错了吗?
为什么 return 状态没有被管道自动捕获?
ant call 可以不是 returning 失败状态吗?
我尝试了 catchError 而不是 try..catch,但仍然没有捕获到构建失败。
catchError {
bat 'ant -f xyz\build.xml'
}
解决方案是向 ant 调用添加 "call" 关键字,如下所示,这会将退出代码从 ant 传播到批处理调用。
stage('build') {
steps {
bat 'call ant -f xyz\build.xml'
}
}
还有另一种使用批处理脚本的解决方案,见下文,
- 詹金斯文件
stage('build') {
steps {
bat 'xyz\build.bat'
}
}
- build.bat
call ant -f "%CD%\xyz\build.xml"
echo ELVL: %ERRORLEVEL%
IF NOT %ERRORLEVEL% == 0 (
echo ABORT: %ERRORLEVEL%
call exit /b %ERRORLEVEL%
) ELSE (
echo PROCEED: %ERRORLEVEL%
)
在此build.bat中,如果不使用call关键字,则只会执行第一条命令,其余的将被忽略。我将其直接改编为管道中的 ant 调用并且它有效。
我有一个 declarative 管道阶段,如下所示,
stage('build') {
steps {
echo currentBuild.result
script {
try {
bat 'ant -f xyz\build.xml'
} catch (err) {
echo "Caught: ${err}"
currentBuild.result = 'FAILURE'
}
}
echo currentBuild.result
}
}
我预计管道会失败,因为构建失败并显示以下消息。
BUILD FAILED
C:\...\build.xml:8: The following error occurred while executing this line:
C:\...\build.xml:156: The following error occurred while executing this line:
C:\...\build.xml:111: Problem creating jar: C:\...\xyz.war (The system cannot find the path specified) (and the archive is probably corrupt but I could not delete it)
currentBuild.result 我打印的时候都是空的。
蚂蚁叫错了吗?
为什么 return 状态没有被管道自动捕获?
ant call 可以不是 returning 失败状态吗?
我尝试了 catchError 而不是 try..catch,但仍然没有捕获到构建失败。
catchError {
bat 'ant -f xyz\build.xml'
}
解决方案是向 ant 调用添加 "call" 关键字,如下所示,这会将退出代码从 ant 传播到批处理调用。
stage('build') {
steps {
bat 'call ant -f xyz\build.xml'
}
}
还有另一种使用批处理脚本的解决方案,见下文,
- 詹金斯文件
stage('build') {
steps {
bat 'xyz\build.bat'
}
}
- build.bat
call ant -f "%CD%\xyz\build.xml"
echo ELVL: %ERRORLEVEL%
IF NOT %ERRORLEVEL% == 0 (
echo ABORT: %ERRORLEVEL%
call exit /b %ERRORLEVEL%
) ELSE (
echo PROCEED: %ERRORLEVEL%
)
在此build.bat中,如果不使用call关键字,则只会执行第一条命令,其余的将被忽略。我将其直接改编为管道中的 ant 调用并且它有效。