在Jenkinsfile中远程执行命令

13

我正在尝试通过SSH连接到远程主机,然后在远程主机的Shell中执行特定命令。以下是我的管道代码。

pipeline {
    agent any
    environment {
        // comment added
         APPLICATION = 'app'
         ENVIRONMENT = 'dev'
         MAINTAINER_NAME = 'jenkins'
         MAINTAINER_EMAIL = 'jenkins@email.com'
    }
    stages {
         stage('clone repository') {
             steps {
                 // cloning repo
                 checkout scm
             }
         }
         stage('Build Image') {
             steps {
                 script {
                     sshagent(credentials : ['jenkins-pem']) {
                        sh "echo pwd"
                        sh 'ssh -t -t ubuntu@xx.xxx.xx.xx -o StrictHostKeyChecking=no'
                        sh "echo pwd"
                        sh 'sudo -i -u root'
                        sh 'cd /opt/docker/web'
                        sh 'echo pwd'
                    }
                 }
             }
         }
     }
}

但是在运行此作业时,它成功地执行了 sh 'ssh -t -t ubuntu@xx.xxx.xx.xx -o StrictHostKeyChecking=no',但它停在那里并没有执行任何进一步的命令。我想在远程主机的shell内执行在ssh命令后面编写的命令。感谢您提供任何帮助。


1
Jenkins执行sh命令并返回结果。这意味着ssh命令在远程主机上运行,而下一个echo pwd命令在本地运行。 - Prikkeldraad
1
@Prikkeldraad,在Jenkinsfile中有没有一种远程运行命令的方式? - Shoaib Iqbal
4个回答

10
我解决了这个问题。
script 
{
    sh """ssh -tt login@host << EOF 
    your command
    exit
    EOF"""
}

9
我会尝试这样做: ```html

我会尝试这样做:

```
sshagent(credentials : ['jenkins-pem']) {
  sh "echo pwd"
  sh 'ssh -t -t ubuntu@xx.xxx.xx.xx -o StrictHostKeyChecking=no "echo pwd && sudo -i -u root && cd /opt/docker/web && echo pwd"'
}

1
谢谢你的回答,但它仍然无法工作。它甚至没有执行ssh命令。 - Shoaib Iqbal
我一直在寻找的答案,一个可行的解决方案。谢谢。 - Tanino

2
    stage("DEPLOY CONTAINER"){
        steps {
            script {
                    sh """
                    #!/bin/bash
                    sudo ssh -i /path/path/keyname.pem username@serverip << EOF
                    sudo bash /opt/filename.sh
                    exit 0
                    << EOF
                    """
                }
        }
    }

#!/bin/bash在ssh命令之前的原因是什么?以及sudo ssh? - syncerror
只有这个对我起作用。 - Benjamin Ini

1

有一种更好的方法可以使用SSH在远程上运行命令。我知道这是一个晚回答,但我刚刚探索了这个东西,所以想分享一下,这将帮助其他人轻松解决这个问题。

我刚刚发现这个链接对于如何使用SSH在远程上运行多个命令非常有用。而且,我们可以根据上面博客中提到的条件来有条件地运行多个命令。 通过阅读它,我找到了语法:

ssh username@hostname "command1; command2;commandN"

那么,如何在Jenkins流水线中使用SSH在远程主机上运行命令呢?

以下是解决方案:

pipeline {
  agent any
  environment {
    /*
     define your command in variable
     */
    remoteCommands =
      """java --version;
    java --version;
    java --version """
  }
  stages {
    stage('Login to remote host') {
      steps {
        sshagent(['ubnt-creds']) {
          /*
              Provide variable as argument in ssh command
          */
          sh 'ssh -tt username@hostanem $remoteCommands'
        }
      }
    }
  }
}

首先,你可以选择定义一个变量,将所有的命令用分号;隔开,然后将其作为参数传递给命令。
另一种方法是,你也可以直接将命令传递给ssh命令: sh "ssh -tt username@hostname 'command1;command2;commandN'" 我已经在我的代码中使用过它,效果非常好! 在这里查看输出结果 学得愉快 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接