背景
最近开发过程中部署新的节点,由于pipeline(流水线)中没有相关配置,所以需要新增参数、脚本以及ssh免密登录配置
Jenkins流水线采用参数化构建,主要两个参数,一个是分支名: branch
,一个是部署环境(也就是节点ip): buildENV
步骤
1、新增节点参数
参数化构建中新增主机ip选项到buildENV
参数中
2、修改流水线脚本
复制原有节点的脚本,修改即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| node("master") { withEnv(['PATH+bin=/home/xiao/node-v10.15.3-linux-x64/bin/bin:/usr/local/bin:/usr/bin/:/bin']) { stage("拉取代码"){ echo "WORKSPACE:${WORKSPACE}" echo "JENKINS_HOME:${JENKINS_HOME}" echo "JOB_NAME:${JOB_NAME}" echo "WORKSPACE_TMP:${WORKSPACE_TMP}" echo "WORKSPACE:${WORKSPACE}" checkout( [ $class: 'GitSCM', branches: [[name: "*/${branch}"]], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [ [url: 'ssh://git@xx.xx/projectName.git'] ] ] ) } stage("代码编译"){ sh "npm run build" } stage("代码发布"){ def machine def IP if (env.buildENV == "11.11.11.11") { machine = "xiao@11.11.11.11" IP = "11.11.11.11" def path = "/opt/web/tengine/data"
sh "ssh ${IP} \"cd ${path} && rm -rf dist_bak && mv dist dist_bak\"" sh "scp -r ${WORKSPACE}/dist ${machine}:${path}" sh "ssh ${IP} \"cd ${path} && sh replace.sh\"" } else if (env.buildENV == "22.22.22.22") { // 新节点配置参考 machine = "xiao@22.22.22.22" IP = "22.22.22.22" def path = "/opt/web/tengine/data"
sh "ssh ${IP} \"cd ${path} && rm -rf dist_bak && mv dist dist_bak\"" sh "scp -r ${WORKSPACE}/dist ${machine}:${path}" sh "ssh ${IP} \"cd ${path} && sh replace.sh\"" } } } }
|
更多配置请参考:Jenkins CD SSH Pipeline
3、新增节点的ssh免密登录配置
最关键的一步,主要用于在执行 pipeline
脚本过程中,能够使用ssh
命令登录到目的主机上进行前端的一系列部署操作。
1. 沿用老节点的配置,不用生成新的rsa公私钥
2. 把 id_rsa.pub 添加到 新主机的 ~/.ssh/authorized_keys
文件里
登录到 Jenkins 主机
配置ssh免密登录新主机
1 2
| cd ~/.ssh/ ssh-copy-id -i id_rsa.pub u8@192.x.x.x
|
输入主机密码后,即可在目的主机的 ~/.ssh/authorized_keys
文件里查看到 Jenkins 主机上的 id_rsa.pub
- 重启Jenkins主机的 sshd 服务
1 2 3
| sudo systemctl restart sshd
或者: sudo service sshd restart
|
4、触发Jenkins 构建
问题及Reference
如果不是root用户,执行命令的时候可以在命令前加 sudo
SSH无密钥登陆 与 配置公钥后仍需要输入密码的解决方案
Linux主机之间ssh免密登录配置方法
使用sshpass命令来进行明文免密登录
使用代理服务器跳转连接远程Server