我正在写一个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()函数,它在那里工作,所以我不明白为什么它在这里不起作用,你能检查一下,看看你是否发现了这个问题?
答案 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变量...