Jenkins流水线 ssh-agent执行远端代码

[TOC]

个人很反对在Jenkins窗口里写构建代码,原因是这样做不能对代码做版本管理。但将构建代码做到版本管理后,也产生了另外的问题,在提交代码与Jenkins之前来回切换调试构建流程,这过程可谓非常繁琐!!幸亏流水线的出现的出现,解决了这两个痛点。

本文主要介绍ssh-agent在流水线中的运用。鉴于ssh-agent插件主页的操作说明不够详细,本人在配置时遇到一些问题,如不知从哪里配置Jenkins凭据ID在远端执行指令无效。如果没了解过Jenkins流水线脚本化代码,建议先简单阅读一下官网说明

配置ssh免密登录

ssh-agent插件实际是套用ssh登录,所以让ssh-agent正常工作必须先要配置好ssh环境。配置环境并不复杂且网上有大量可查资料,此处不再另述,或者参考这两篇文章如何在Ubuntu上开启SSH服务设置 SSH 通过密钥登录

配置Jenkins凭据ID

以下是ssh-agent官网插件主页的流水线操作样例

steps {
    sshagent(credentials: ['ssh-credentials-id']) {
        sh '''
            ssh user@example.com ...
        '''
    }
}

参数ssh-credentials-id是指什么?它是由Jenkins统一管理账号安全模块**Manage Credentials **,为每个credentials分配的credentials-id,ssh-agent有提到配置步骤,不过….

First you need to add some SSH Credentials to your instance: Jenkins | Manage Jenkins | Manage Credentials Note that only Private Key based credentials can be used.

我当时看完,还是愣没明白要什么配,按以上说明就没找到配置入口~_~!!此外,其中提到很重置的一点Note that only Private Key based credentials can be used.,是说ssh-agent只能用ssh密钥登录的方式,不能账号密码登录。 因此本文是基于Jenkins 2.354 重新梳理凭据ID的配置操作

这里有些信息,与上节配置ssh免密登录有关

  • ID选填,不填时自动生成
  • 描述选填
  • Username是远端用户目录~/.ssh/authorized_keys配置了本端公钥的用户名
  • Private key是本端私钥
  • passphrase是生成私钥时密码的密钥,如果当时Enter回车跳过了密码输入,则此处不需要填。

在远端执行指令

Jenkins声明式流程线中,需要在sh作用域内执行shell指令。先看看一个简单例子,以ssh登录后pwd打印用户目录路径为例

pipeline {
    agent any
    stages {
        stage ("test") {
            steps {
                sshagent(credentials: ['ssh-credentials-id']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no -tt YOUR_ACCOUT_NAME@REMOTE_ADDR
                        pwd
                    '''
                }
            }
        }
    }
}

然而pwd输出的结果是居然是本地路径,并非远端路径。因为sh的输入源依然是本地console。为了执行指令传到远端,需要用到<<EOF管道方法

pipeline {
    agent any
    stages {
        stage ("test") {
            steps {
                sshagent(credentials: ['ssh-credentials-id']) {
                    sh '''
                        ssh -o StrictHostKeyChecking=no -tt YOUR_ACCOUT_NAME@REMOTE_ADDR << EOF
                            pwd
                        exit
                    '''
                }
            }
        }
    }
}

scp双向传输文件

将本地test文件拷贝到远端用户目录,接着在远端修改test,回传本地

pipeline {
    agent any
    stages {
        stage ("test") {
            steps {
                sshagent(credentials: ['ssh-credentials-id']) {
                    sh '''
                        touch test && echo "1" > test
                        scp -rC ./test YOUR_ACCOUT_NAME@REMOTE_ADDR:/YOUR_ACCOUT_HOME/
                        ssh -o StrictHostKeyChecking=no -tt YOUR_ACCOUT_NAME@REMOTE_ADDR << EOF
                            echo "2" >> test
                        exit
                    '''
                    sh '''
                        scp -rC YOUR_ACCOUT_NAME@REMOTE_ADDR:/YOUR_ACCOUT_HOME/test ./
                        cat test
                    '''
                }
            }
        }
    }
}



原文:
https://lizijie.github.io/2022/07/17/Jenkins%E6%B5%81%E6%B0%B4%E7%BA%BF-ssh-agent%E6%89%A7%E8%A1%8C%E8%BF%9C%E7%AB%AF%E4%BB%A3%E7%A0%81.html
作者github:
https://github.com/lizijie

PREVIOUSSourceTree自定义菜单命令 重置本地Git代码到远端最新版本
NEXT整理常用linux命令