【问题标题】:gradle shell script dockerfilegradle shell 脚本 dockerfile
【发布时间】:2021-10-18 18:59:03
【问题描述】:

在 dockerfile 中获取退出代码时遇到问题

RUN bash -c " \

if [ $FLAVOR = E2ETEST ] ; then \
  
  ./gradlew clean :app:testDevDebugUnitTest --tests abcTest;\
  ./gradlew clean :app:testDevDebugUnitTest --tests cdeTest -PtestType=\"e2e\" executeE2ETests; \
  ./gradlew clean :app:testDevDebugUnitTest --tests defTest ; \

flavor 来自 yaml 文件 我怎样才能获得 3 gradle 命令的退出代码

【问题讨论】:

  • 您需要提供一个最小的示例,以便我们重现您的结果。这里没有足够的细节来帮助你。尝试添加有关您需要帮助的问题的更多信息
  • 在 bash 中,您可以通过 $? 获取上一个命令的退出代码。例如:bash -c "exit 12"; echo $? 将打印 12

标签: bash shell gradle dockerfile


【解决方案1】:

bash 中,您可以通过$? 获取上一条命令的退出代码。例如:

bash -c "exit 12"; echo $?

将打印 12。

在您的情况下,您可以将退出代码保存到变量中,但是,由于 Dockerfile 的特殊性,在获取它们时可能会出现一些问题(您不能将它们导出到环境变量中以便在下一个 RUN 中使用)。根据您想如何使用它,例如,您可以将其写入文本文件,或在该脚本中执行某些操作:

RUN bash -c " \

if [ \"$FLAVOR\" = E2ETEST ] ; then \
  ./gradlew clean :app:testDevDebugUnitTest --tests abcTest; EX1=\"\$?\"; \
  ./gradlew clean :app:testDevDebugUnitTest --tests cdeTest -PtestType=\"e2e\" executeE2ETests; EX2=\"\$?\"; \
  ./gradlew clean :app:testDevDebugUnitTest --tests defTest; EX3=\"\$?\"; \
  echo \$EX1 \$EX2 \$EX3" > /tmp/exit_codes; \
fi"

另外,$FLAVOR 最好用括号括起来,因为如果 $FLAVOR 为空会产生错误。 $ 被转义,因为 docker 在解析过程中扩展了表达式。

如果您只需要检查命令是否成功,只需将; 替换为&&(如果任何命令以非零退出代码退出,则以下RUN 将失败):

RUN bash -c " \

if [ \"$FLAVOR\" = E2ETEST ] ; then \
  ./gradlew clean :app:testDevDebugUnitTest --tests abcTest && \
  ./gradlew clean :app:testDevDebugUnitTest --tests cdeTest -PtestType=\"e2e\" executeE2ETests && \
  ./gradlew clean :app:testDevDebugUnitTest --tests defTest; \
fi"

运行所有命令并在其中任何一个失败时获取退出代码 1

RUN bash -c " \

if [ \"$FLAVOR\" = E2ETEST ] ; then \
  ./gradlew clean :app:testDevDebugUnitTest --tests abcTest; EX1=\"\$?\"; \
  ./gradlew clean :app:testDevDebugUnitTest --tests cdeTest -PtestType=\"e2e\" executeE2ETests; EX2=\"\$?\"; \
  ./gradlew clean :app:testDevDebugUnitTest --tests defTest; EX3=\"\$?\"; \
  if [ $EX1 == 0 ] && [ $EX2 == 0 ] && [ $EX3 == 0 ]; then exit 0; else exit 1; fi; \
fi"

【讨论】:

  • 感谢塔拉斯的解释。我想执行所有 3 个 gradle 命令,如果任何命令失败,应该在最后退出 1。我能做些什么呢?
  • 添加了您要求的解决方案
  • 变量 EX1,EX2,EX3 来自哪里??
  • 哦,抱歉,忘记添加了。固定
  • bash:第 0 行:[: ==: 应为一元运算符。现在遇到这个问题,所以即使 gradle 构建成功,它也会退出 1
猜你喜欢
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-11-20
  • 2019-08-20
  • 1970-01-01
  • 2015-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多