Jenkins 声明式管道 ssh 代理插件

Nur*_*hun 5 ssh sudo jenkins jenkins-plugins jenkins-pipeline

我正在尝试使用 sshagent 插件部署到远程服务器。

当使用下面的语法时,我得到

pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                sshagent(['nginx-ec2']) {
                    // some block
                    sh "ssh -o StrictHostKeyChecking=no ubuntu@<host_ip>"
                    sh "whoami"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

获取输出:

[Pipeline] sh (hide)
+ whoami
jenkins
Run Code Online (Sandbox Code Playgroud)

虽然我希望使用提供的凭据在远程服务器上运行脚本!

所以,我必须这样运行

pipeline {
    agent any
    stages {
        stage('Deploy') {
            steps {
                sshagent(['nginx-ec2']) {
                    // some block
                    sh "ssh -o StrictHostKeyChecking=no -l ubuntu <host_ip> 'whoami && \
                    sudo apt update  && sudo apt install -y docker.io && \
                    sudo usermod -aG docker ubuntu && \
                    source .bashrc && \
                    docker run -d nginx'"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

是否有任何“干净”的方法可以使用 ubuntu 而不是 jenkins 用户在远程服务器上运行脚本?

编辑:

我知道我需要在 ssh 命令下运行它,而不是作为单独的 sh 脚本,否则它将作为 jenkins 运行,并且我可以按照下面的脚本方式执行此操作。

这就是为什么我问是否有更好的方法以声明性方式编写它。

node {
   stage('Deploy'){
     def dockerRun = "whoami && \
            sudo apt update  && sudo apt install -y docker.io && \
            sudo usermod -aG docker ubuntu && \
            source .bashrc && \
            docker run -d nginx "
            
     sshagent(['nginx-ec2']) {
       sh "ssh -o StrictHostKeyChecking=no ubuntu@<host_ip> '${dockerRun}' "
     }
   }
}
Run Code Online (Sandbox Code Playgroud)

谢谢,

Von*_*onC 2

如前所述,您应该选择一个引用正确远程用户名的凭据,如SSH 代理 Jenkins 插件中所示:

https://cdn.jsdelivr.net/gh/jenkinsci/ssh-agent-plugin@master/docs/images/Screen_Shot_2012-10-26_at_12.25.04.png

node {
  sshagent (credentials: ['deploy-dev']) {
    sh 'ssh -o StrictHostKeyChecking=no -l cloudbees 192.168.1.106 uname -a'
  }
}
Run Code Online (Sandbox Code Playgroud)

另外,我只会执行一个脚本,该脚本包含您想要远程执行的所有命令序列。