无法在Jenkins管道中的“sh子句”中使用变量,原因可能是什么?

时间:2016-09-15 14:01:15

标签: groovy jenkins-pipeline

我正在写一个Jenkins管道。

我想用current directory/.gradle设置GRADLE_USER_HOME变量,所以我用pwd()函数填充cwd变量,该函数应返回当前工作目录。

stage 'Host preparation'
    cwd = pwd()
    withCredentials([ // Use Jenkins credentials ID of artifactory
      [$class: 'UsernamePasswordMultiBinding', credentialsId: artifactory_creds, usernameVariable: 'A_USER', passwordVariable: 'A_PASS'],
    ]){
    sh """
        export NDK_VER="r12b"
        export SDK_VER="r24.4.1"
        export GRADLE_USER_HOME='${cwd}/.gradle'
        echo "CWD OK"
        export NDK_DIR='$GRADLE_USER_HOME/android-ndk-$NDK_VER'
        export SDK_DIR='$GRADLE_USER_HOME/android-sdk-linux'
        export PATH='$PATH:$GRADLE_USER_HOME:$GRADLE_USER_HOME/android-ndk-$NDK_VER:$GRADLE_USER_HOME/android-sdk-linux'
        if [ ! -d $GRADLE_USER_HOME ]; then
            mkdir $GRADLE_USER_HOME
        fi

        if [ ! -f "$GRADLE_USER_HOME/android-sdk-${SDK_VER}-linux.tgz" ]; then
            curl -o "$GRADLE_USER_HOME/android-sdk-${SDK_VER}-linux.tgz" https://dl.google.com/android/android-sdk_$SDK_VER-linux.tgz
        fi

        if [ ! -f "$GRADLE_USER_HOME/android-ndk-${NDK_VER}-linux-x86_64.zip" ]; then # Checks if the sdk tarball exists on system
            curl -o "$GRADLE_USER_HOME/android-ndk-${NDK_VER}-linux-x86_64.zip" https://dl.google.com/android/repository/android-ndk-$NDK_VER-linux-x86_64.zip
        fi

        if [ ! -d "$GRADLE_USER_HOME/android-ndk-$NDK_VER" ]; then
            cd "$GRADLE_USER_HOME" && unzip -o "android-ndk-$NDK_VER-linux-x86_64.zip"
        fi
        if [ ! -d "$GRADLE_USER_HOME/android-sdk-linux" ]; then
            tar -xzf "$GRADLE_USER_HOME/android-sdk-${SDK_VER}-linux.tgz" -C $GRADLE_USER_HOME
            mkdir "$GRADLE_USER_HOME/android-sdk-linux/extras"
        fi

        echo "Installing updates"
        export SDK_TOOLS="${GRADLE_USER_HOME}/android-sdk-linux/tools"
        # Downloads the required SDK tools
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 2     # Android SDK Tools, revision 25.2.2 rc1
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 3     # Android SDK Platform-tools, revision 24.0.2
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 4     # Android SDK Build-tools, revision 24.0.2
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 6     # Android SDK Build-tools, revision 24
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 7     # Android SDK Build-tools, revision 23.0.3
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 8     # Android SDK Build-tools, revision 23.0.2
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 10    # Android SDK Build-tools, revision 23 (Obsolete)
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 30    # SDK Platform Android 7.0, API 24, revision 2
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 31    # SDK Platform Android 6.0, API 23, revision 3
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 53    # Android TV Intel x86 Atom System Image, Android API 24, revision 6
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 54    # Android Wear ARM EABI v7a System Image, Android API 24, revision 1
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 55    # Android Wear Intel x86 Atom System Image, Android API 24, revision 1
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 57    # ARM EABI v7a System Image, Android API 24, revision 6
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 58    # Intel x86 Atom_64 System Image, Android API 24, revision 6
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 59    # Intel x86 Atom System Image, Android API 24, revision 6
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 153   # Android Support Repository, revision 36
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 160   # Google Play services, revision 32
        # echo "y" | "${SDK_TOOLS}/android" update sdk -u -a -t 161   # Google Repository, revision 32

        # Downloads the constraint-layouts files from Artifactory
        wget --user=${A_USER} --password=${A_PASS} https://artifactory.company.net/android-tmp/m2repository.tar.gz -O -| tar zfxv - -C "${GRADLE_USER_HOME}/android-sdk-linux/extras/"
        """

但是当我运行构建时,我收到以下错误:

Entering stage Host preparation
Proceeding
[Pipeline] pwd
[Pipeline] withCredentials
[Pipeline] {
[Pipeline] }
[Pipeline] // withCredentials
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
groovy.lang.MissingPropertyException: No such property: GRADLE_USER_HOME for class: groovy.lang.Binding
    at groovy.lang.Binding.getVariable(Binding.java:63)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:224)
    at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:241)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:238)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:221)

对于调试问题,我创建了另一个构建并写道:

node {
    def cwd = pwd()
    stage 'itai'
    sh """
    echo '${cwd}'
    """
}

然后它工作,cwd变量填充当前工作目录。但是在我自己的构建中它不会......

我在管道的另一部分使用pwd()函数,它在那里工作,所以我不明白为什么它在这里不起作用,你能检查一下,看看你是否发现了这个问题?

2 个答案:

答案 0 :(得分:2)

当您在脚本中添加$something${something}时,groovy会将其扩展为变量...

所以当你放置:$GRADLE_USER_HOME时,groovy正试图从变量中扩展它...但你的groovy脚本中没有GRADLE_USER_HOME变量...

您要做的是将$GRADLE_USER_HOME输出到您的shell脚本中。

因此,只要不是Groovy处理它就需要转义$ ...

即:

    export NDK_DIR='\$GRADLE_USER_HOME/android-ndk-\$NDK_VER'

所有其他地方你不希望groovy处理$

答案 1 :(得分:2)

tim_yates是对的,你想在这里记住Groovy变量和shell变量都使用相同的" $"因此,您需要转义shell变量,这样它们就不会被解释为Groovy变量。

但是,在你的情况下,你有另一个解决方案:你也可以只定义你使用的shell变量...作为Groovy变量并将它们用作Groovy变量,从而避免每一次转义" {{1 }}"符号

示例:

$

请注意,这里我使用camelCase表示法来区分Groovy变量和shell变量,但当然你可以使用大写表示法。另外,您会注意stage 'Host preparation' def cwd = pwd() def ndkVer = "r12b" def sdkVer = "r24.4.1" def gradleUserHome = "${cwd}/.gradle" def sdkTools="$gradleUserHome/android-sdk-linux/tools" withCredentials([ // Use Jenkins credentials ID of artifactory [$class: 'UsernamePasswordMultiBinding', credentialsId: artifactory_creds, usernameVariable: 'A_USER', passwordVariable: 'A_PASS'], ]){ sh """ export NDK_VER=$ndkVer export SDK_VER=$sdkVer export GRADLE_USER_HOME=$gradleUserHome echo "CWD OK" export NDK_DIR='$gradleUserHome/android-ndk-$ndkVer' export SDK_DIR='$gradleUserHome/android-sdk-linux' export PATH='\$PATH:$gradleUserHome:$gradleUserHome/android-ndk-$ndkVer:$gradleUserHome/android-sdk-linux' if [ ! -d $gradleUserHome ]; then mkdir $gradleUserHome fi if [ ! -f "$gradleUserHome/android-sdk-$sdkVer-linux.tgz" ]; then curl -o "$gradleUserHome/android-sdk-$sdkVer-linux.tgz" https://dl.google.com/android/android-sdk_$sdkVer-linux.tgz fi if [ ! -f "$gradleUserHome/android-ndk-$ndkVer-linux-x86_64.zip" ]; then # Checks if the sdk tarball exists on system curl -o "$gradleUserHome/android-ndk-$ndkVer-linux-x86_64.zip" https://dl.google.com/android/repository/android-ndk-$ndkVer-linux-x86_64.zip fi if [ ! -d "$gradleUserHome/android-ndk-$ndkVer" ]; then cd "$gradleUserHome" && unzip -o "android-ndk-$ndkVer-linux-x86_64.zip" fi if [ ! -d "$gradleUserHome/android-sdk-linux" ]; then tar -xzf "$gradleUserHome/android-sdk-$sdkVer-linux.tgz" -C $gradleUserHome mkdir "$gradleUserHome/android-sdk-linux/extras" fi echo "Installing updates" export SDK_TOOLS="${gradleUserHome}/android-sdk-linux/tools" # Downloads the required SDK tools # echo "y" | "$sdkTools/android" update sdk -u -a -t 2 # Android SDK Tools, revision 25.2.2 rc1 # echo "y" | "$sdkTools/android" update sdk -u -a -t 3 # Android SDK Platform-tools, revision 24.0.2 # echo "y" | "$sdkTools/android" update sdk -u -a -t 4 # Android SDK Build-tools, revision 24.0.2 # echo "y" | "$sdkTools/android" update sdk -u -a -t 6 # Android SDK Build-tools, revision 24 # echo "y" | "$sdkTools/android" update sdk -u -a -t 7 # Android SDK Build-tools, revision 23.0.3 # echo "y" | "$sdkTools/android" update sdk -u -a -t 8 # Android SDK Build-tools, revision 23.0.2 # echo "y" | "$sdkTools/android" update sdk -u -a -t 10 # Android SDK Build-tools, revision 23 (Obsolete) # echo "y" | "$sdkTools/android" update sdk -u -a -t 30 # SDK Platform Android 7.0, API 24, revision 2 # echo "y" | "$sdkTools/android" update sdk -u -a -t 31 # SDK Platform Android 6.0, API 23, revision 3 # echo "y" | "$sdkTools/android" update sdk -u -a -t 53 # Android TV Intel x86 Atom System Image, Android API 24, revision 6 # echo "y" | "$sdkTools/android" update sdk -u -a -t 54 # Android Wear ARM EABI v7a System Image, Android API 24, revision 1 # echo "y" | "$sdkTools/android" update sdk -u -a -t 55 # Android Wear Intel x86 Atom System Image, Android API 24, revision 1 # echo "y" | "$sdkTools/android" update sdk -u -a -t 57 # ARM EABI v7a System Image, Android API 24, revision 6 # echo "y" | "$sdkTools/android" update sdk -u -a -t 58 # Intel x86 Atom_64 System Image, Android API 24, revision 6 # echo "y" | "$sdkTools/android" update sdk -u -a -t 59 # Intel x86 Atom System Image, Android API 24, revision 6 # echo "y" | "$sdkTools/android" update sdk -u -a -t 153 # Android Support Repository, revision 36 # echo "y" | "$sdkTools/android" update sdk -u -a -t 160 # Google Play services, revision 32 # echo "y" | "$sdkTools/android" update sdk -u -a -t 161 # Google Repository, revision 32 # Downloads the constraint-layouts files from Artifactory wget --user=${A_USER} --password=${A_PASS} https://artifactory.company.net/android-tmp/m2repository.tar.gz -O -| tar zfxv - -C "$gradleUserHome/android-sdk-linux/extras/" """ PATH='\$PATH:$gradleUserHome...转义为$PATH的{​​{1}},因为这次它是我们正在使用的shell变量...