【问题标题】:JAVA_HOME: unbound variable while running a script in JenkinsJAVA_HOME:在 Jenkins 中运行脚本时未绑定的变量
【发布时间】:2020-01-22 10:32:13
【问题描述】:

构建脚本有以下几行:

if [ -z "$JAVA_HOME" ]; then
       export JAVA_HOME="$(dirname "$(dirname "$(readlink -e "$(type -p "javac")")")")"
       echo "JAVA_HOME=$JAVA_HOME"
 fi

放在 sh " " 中运行良好,但是放在 bash 文件中并在运行时抛出错误:

stage ('Build') {
      sh '''
                    if [ -z "$JAVA_HOME" ]; then
                    export JAVA_HOME="$(dirname "$(dirname "$(readlink -e "$(type -p "javac")")")")"
                    echo "JAVA_HOME=$JAVA_HOME"
                     fi
                    sudo bash ./build 
            '''       

}

控制台输出:

+ '[' -z /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64 ']'
+ sudo bash ./build
running: ./build 
+ trap '>&2 echo '\''ERR'\'' && exit -1' ERR
./build: line 10: JAVA_HOME: unbound variable

【问题讨论】:

  • 管道看起来不错,./build 中有什么?
  • build contains " if [ -z "$JAVA_HOME" ]; 然后 export JAVA_HOME="$(dirname "$(dirname "$(readlink -e "$(type -p "javac")" )")")" echo "JAVA_HOME=$JAVA_HOME" fi" 我只是将它从构建脚本中取出来表明它在外部运行良好,而不是在调用脚本时运行

标签: bash jenkins jenkins-pipeline devops jenkins-groovy


【解决方案1】:

我猜导出的变量没有传递给你正在生成的新的 bash 实例。

您可以在脚本顶部执行sudo su <myuser>

                    sudo su myuser
                    if [ -z "$JAVA_HOME" ]; then
                    export JAVA_HOME="$(dirname "$(dirname "$(readlink -e "$(type -p "javac")")")")"
                    echo "JAVA_HOME=$JAVA_HOME"
                     fi
                    ./build 

当然不建议在您的构建中使用 sudo。一个更好的选择是给詹金斯运行你的构建所需的权限

【讨论】:

  • 构建包含 ' if [ -z "$JAVA_HOME" ];然后 export JAVA_HOME="$(dirname "$(dirname "$(readlink -e "$(type -p "javac")")")")" echo "JAVA_HOME=$JAVA_HOME" fi' 我刚把它拿出来构建脚本以表明它在外部运行良好,而不是在调用脚本时运行。基本上 JAVA_HOME 没有传递给检查 $JAVA_HOME 的构建脚本,不确定我是否可以尝试注入变量,我也不确定如何将其注入 Pipeline 脚本。
  • 你试过我的解决方案了吗?要将变量环境注入整个管道,您可以使用 groovy:env.JAVA_HOME = "/java/path"
  • 是的,我确实尝试过切换用户,但结果是一样的,而且我尝试设置为 env,得到以下错误:env.JAVA_HOME=/usr/lib/jvm/java-1.8。 0-openjdk-1.8.0.232.b09-0.el7_7.x86_64 /var/lib/jenkins/workspace/int-ing@tmp/durable-d0344183/script.sh:第24行:env.JAVA_HOME=/usr/lib/ jvm/java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64:没有这样的文件或目录,但是这个目录确实存在!
【解决方案2】:

你很可能有这样的事情:

#!/bin/bash

set -euo pipefail

run_build_script

set 是一个内置命令,用于修改 shell 本身的行为。了解这些选项很重要。如果您碰巧设置了 u 选项,那么由于显而易见的原因,您会收到上述错误(见下文)。

e:如果任何命令返回非零退出状态,则立即退出脚本。
u:如果使用未定义的变量(例如 echo “$UNDEFINED_ENV_VAR”)。

o:pipefail 确保 Bash 管道(例如 cmd | othercmd)在任何命令失败时返回非零状态,而不是返回 管道中最后一条命令的退出状态。
x:在执行前展开并打印每个命令。有关详细信息,请参阅调试您的环境。

要解决这个问题,要么从 set 命令中删除 u 选项,要么只包装导致 set +u 和 set -u 之间错误的部分代码。

set +u
if [ -z "$JAVA_HOME" ]; then
       export JAVA_HOME="$(dirname "$(dirname "$(readlink -e "$(type -p "javac")")")")"
       echo "JAVA_HOME=$JAVA_HOME"
 fi
set -u

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多