Jenkins管道中的多行bash命令

时间:2017-06-30 08:43:30

标签: linux bash jenkins

我的Jenkinsfile中有以下sh命令,它不起作用,因为它试图执行最后一个“DATA”作为命令。 如果我将最后一个“DATA”移动到该行的开头,它可以工作,但不如我想要的那么漂亮。 在这种情况下,有没有办法解决这个问题?

    sh """
        sshpass -p 'password' ssh -o StrictHostKeyChecking=no appsadm@$backup_registry <<DATA
        sudo /etc/init.d/docker stop || true
        sudo yum remove -y docker-engine.x86_64
        sudo rm -fr /var/lib/docker /var/log/docker
        sudo rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm || true
        sudo yum update -y
        sudo yum -y install docker-io
        sudo sed -i 's#other_args=.*#other_args="--insecure-registry $official_registry:5000"#g' /etc/sysconfig/docker
        sudo /etc/init.d/docker start
        DATA
        """

3 个答案:

答案 0 :(得分:6)

我知道这是一个老问题,但我在某个时候碰到了这个问题,最终最终使用了stripIndent()

steps {
    echo 'Deploying....'
    sh """
    ssh somewhere <<EOF
    cd somewhere
    do some more stuff
    EOF
    """.stripIndent()
}

这样你仍然可以保留缩进和格式

答案 1 :(得分:3)

因为<<DATA指定here-doc <<-DATA的结尾会抑制前导标签而不是空格

cat <<-DATA
    hello
<tab>DATA

另一种选择是在标记

中添加空格
cat << "    DATA"
    hello
    DATA

答案 2 :(得分:1)

编辑:我们不需要使用EOF,只需将分号放在多行shell脚本的语句末尾即可,如下所示

sh """ if [ -d /opt/tomcat/apache-tomcat-8.5.38/webapps/ROOT ] ;
       then ;
            ssh $USERNAME@$DEV_HOSTNAME 'sudo rm -rf /opt/tomcat/apache-tomcat-8.5.38/webapps/ROOT' ;
            echo 'ROOT directory deleted successfully' ;
       fi ;
"""