我想捕获 Gradle 任务的 返回代码。这是一个执行任务的小 bash 脚本draft:
#!/bin/bash
gradlew_return_code=`./gradlew assembleDebug`
echo ">>> $gradlew_return_code"
if [ "$gradlew_return_code" -eq "0" ]; then
echo "Gradle task succeeded."
else
echo "Gradle task failed."
fi
该脚本不存储返回值,而是存储 Gradle 任务的整个控制台输出。
请注意,示例脚本是一个更复杂脚本的简化,我需要捕获返回值。
退出状态为
$?
。命令替换捕获输出。
./gradlew assembleDebug; gradlew_return_code=$?
...或者,如果您需要与
set -e
兼容(我强烈建议不要使用):
gradlew_return_code=0
./gradlew assembleDebug || gradlew_return_code=$?
...或者,如果您需要同时捕获两者:
gradlew_output=$(./gradlew assembleDebug); gradlew_return_code=$?
if (( gradlew_return_code != 0 )); then
echo "Grade failed with exit status $gradlew_return_code" >&2
echo "and output: $gradlew_output" >&2
fi
请注意,我确实建议将捕获与调用放在同一行 - 这可以避免修改,例如添加调试命令以在捕获之前修改返回代码。
但是,您根本不需要在这里捕获它:
if
shell 中的语句对它们所包含的命令的退出状态进行操作,因此您不必放置检查捕获的退出状态的测试操作,而是可以将命令本身位于 if
的 COMMAND 部分:
if ./gradlew assembleDebug; then
echo "Gradle task succeeded" >&2
else
echo "Gradle task failed" >&2
fi
这对我不起作用 - 至少对于 Gradle 8.5 - 尽管输出有效(
Process 'command '.../bin/java'' finished with non-zero exit value 64
),Gradle 不会从任务传播非零退出值并返回 1。
我对 GitLab 运行程序使用了此解决方法,通过标准输出传递有效的退出代码:
ignoreExitValue true
使任务成功,尽管有退出代码并打印真正的退出值:tasks.register('someTask', JavaExec) {
description 'Some task with unusual exit codes'
mainClass = 'script'
classpath = sourceSets.main.runtimeClasspath
// Gradle will ignore non-zero exit value and print it at the end of execution for script to capture
ignoreExitValue true
doLast {
println executionResult.get().exitValue
}
}
tee
将流传播到标准输出和变量。EXIT_CODE=$(gradle -q someTask | tee /dev/tty | tail -n 1 )
使用
tee /dev/tty
对于 GitLab 运行程序执行不起作用,因此我设法通过流式传输文件描述符来解决该问题。
{ EXIT_CODE=$(gradle -q someTask | tee /dev/fd/3 | tail -n 1 ); } 3>&1
echo $EXIT_CODE