运行 shell Jenkinsfile 中 ssh 会话中的脚本

Run shell script inside ssh session inside Jenkinsfile

我正在尝试 运行 一个完整的脚本,而 ssh 会话是实时的,而不是单个命令。

这是我当前的代码:

sh "ssh -tt -o StrictHostKeyChecking=no ubuntu@IPV4_DNS uptime"
sh "ssh -v ubuntu@IPV4_DNS docker pull X:${BUILD_NUMBER}"
sh "ssh -v ubuntu@IPV4_DNS docker rm -f test"
sh "ssh -v ubuntu@IPV4_DNS docker run --name=test -d -p 3000:3000X:${BUILD_NUMBER}"

想要的代码是这样的,但是下面的不起作用:*

sh "ssh -tt -o StrictHostKeyChecking=no ubuntu@IPV4_DNS uptime"
sh ''' ssh -v ubuntu@IPV4_DNS docker pull X:${BUILD_NUMBER}
       && docker rm -f test && docker run --name=test -d -p 3000:3000X:${BUILD_NUMBER} 
'''
ssh something here && something else && another one

ssh 会话中运行 something here,并在本地运行 something elseanother one。您想要添加引号以将整个命令行传递给 ssh.

sh "ssh -tt -o StrictHostKeyChecking=no ubuntu@IPV4_DNS uptime"
sh """ssh -v ubuntu@IPV4_DNS 'docker pull X:${BUILD_NUMBER} &&
    docker rm -f test &&
    docker run --name=test -d -p "3000:3000X:${BUILD_NUMBER}"'
"""

假设您希望 Jenkins 为您扩展 ${BUILD_NUMBER},我改用三重双引号而不是三重单引号。

最初的问题问的是 Bash,但郑重声明,您是 运行 sh,而不是 Bash。如果你想在 Jenkinsfile 中使用 Bash 特性,你可以在命令的第一行添加一个 shebang #!/usr/bin/env bash 或类似的。但这里没有必要;所有这些命令都简单而完整 POSIX。 (也许另见 Difference between sh and bash