如何在 shell 脚本中捕获 Gradle 退出代码?

问题描述 投票:0回答:2

我想捕获 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 任务的整个控制台输出。


请注意,示例脚本是一个更复杂脚本的简化,我需要捕获返回值。

bash shell gradle exit-code
2个回答
23
投票

退出状态为

$?
。命令替换捕获输出

./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

0
投票

这对我不起作用 - 至少对于 Gradle 8.5 - 尽管输出有效(

Process 'command '.../bin/java'' finished with non-zero exit value 64
),Gradle 不会从任务传播非零退出值并返回 1。

我对 GitLab 运行程序使用了此解决方法,通过标准输出传递有效的退出代码:

  1. 使用
    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
    }
}
  1. 在 shell 中执行任务并捕获值 - 使用
    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
© www.soinside.com 2019 - 2024. All rights reserved.