如何在Jenkinsfile中SSH到服务器

时间:2019-11-25 21:16:07

标签: jenkins ssh jenkins-pipeline

pipeline {
    agent any
    stages {
        stage('Build React Image') {
            steps {
                ...
            }
        }
        stage('Push React Image') {
            steps {
                ...
            }
        }
        stage('Build Backend Image') {
            steps {
                ...
            }
        }
        stage('Push Backend Image') {
            steps {
                ...
            }
        }
        def remote = [:]
        remote.name = '...'
        remote.host = '...'
        remote.user = '...'
        remote.password = '...'
        remote.allowAnyHosts = true
        stage('SSH into the server') {
            steps {
                writeFile file: 'abc.sh', text: 'ls -lrt'
                sshPut remote: remote, from: 'abc.sh', into: '.'
            }
        }
    }
}

我遵循了此页面上的文档:https://jenkins.io/doc/pipeline/steps/ssh-steps/,以Jenkinsfile的形式进入服务器。我的最终目标是将ssh放入服务器,从dockerhub中拉出,构建并安装它。

首先,我只想成功地将其切入。

这个Jenkinsfile给了我WorkflowScript: 61: Expected a stage @ line 61, column 9. def remote = [:]

不确定这样做是否正确。如果有一种更简单的方法可以通过SSH进入服务器并像我手动执行命令那样执行命令,那么也很高兴知道。

谢谢。

2 个答案:

答案 0 :(得分:0)

问题与插件无关,但与管道的声明性语法有关。当错误消息指出需要一个阶段并找到变量声明时。

管道必须包含阶段,阶段必须包含一个阶段。一个阶段必须走一步。...过去,我浪费大量时间试图遵守严格的声明式语法,但现在不惜一切代价避免使用它。

尝试下面的简化脚本管道。

stage('Build React Image') {
    echo "stage1"
}
stage('Push React Image') {
    echo "stage2"
}
stage('Build Backend Image') {
    echo "stage3"
}
stage('Push Backend Image') {
     echo "stage4"
}
def remote = [:]
remote.name = '...'
remote.host = '...'
remote.user = '...'
remote.password = '...'
remote.allowAnyHosts = true
stage('SSH into the server') {
    writeFile file: 'abc.sh', text: 'ls -lrt'
    sshPut remote: remote, from: 'abc.sh', into: '.'
}

答案 1 :(得分:0)

该错误由语句def remote = [:]和后续赋值在stage块之外引起。另外,由于声明性语法不直接在steps块内支持语句,因此您还需要将代码的那部分包装在script块内。

stage('SSH into the server') {
    steps {
        script {
            def remote = [:]
            remote.name = '...'
            remote.host = '...'
            remote.user = '...'
            remote.password = '...'
            remote.allowAnyHosts = true
            writeFile file: 'abc.sh', text: 'ls -lrt'
            sshPut remote: remote, from: 'abc.sh', into: '.'
        }
    }
}