Jenkinsfile:美元符号后的非法字符串体字符;解决方案:要么转义文字美元符号“ \ $ 5”,要么将值表达式括起来

时间:2019-04-01 11:33:11

标签: jenkins jenkins-pipeline

我的管道在Jenkinsfile的sh“”“元素处失败。知道哪里出错了吗?

.

错误消息是:

    stage('Install dependencies') {
                when { expression { return params.dependencies } } }
        steps {
            sh """
              apt-get update
                            apt-get install -y openssh-server net-tools inetutils-ping python-pip rubygems
                            apt-get install -y \
                                apt-transport-https \
                                ca-certificates \
                                curl \
                                gnupg2 \
                                software-properties-common

                            curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

                            add-apt-repository \
                               "deb [arch=amd64] https://download.docker.com/linux/debian \
                               $(lsb_release -cs) \
                               stable"

                            apt-get update
                            apt-get install -y docker-ce docker-ce-cli containerd.io
                            curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
                            chmod +x /usr/local/bin/docker-compose
                            gem install serverspec pygmy
            """
        }
    }

2 个答案:

答案 0 :(得分:7)

如果要使用groovy的字符串插值,可以保留双引号,但必须在子外壳表达式中转义美元符号,因为groovy不知道如何处理美元符号后的圆括号:

更改:

$(lsb_release -cs)

收件人:

\$(lsb_release -cs)

我注意到错误消息指示错误的行。就我而言:

sh """
   echo "message: ${env.MESSAGE}" # <-- error message points here
   pwd
   echo "ls: $(ls)" <-- this line has the problem
"""

在错误消息指示的行之后的 中查找第一个美元符号。

答案 1 :(得分:1)

用双引号"""替换双引号'''

sh '''
    apt-get update 
    //...
'''

只要Groovy在双引号中看到$,就会将此字符串视为GString并使用string interpolation。但是,在您的情况下,插值的上下文中不使用字符$,它会失败。另外,您可以转义\$,但是切换到单引号字符串更有意义。