服务公告
蓝易云cdn:jenkins教程
发布时间:2026-02-02 00:01
下面给你一套可直接落地的 Jenkins sshPublisher(Publish Over SSH)示例:从“全局配好 SSH 目标机”到“Pipeline 一键推包 + 远程重启”。🚀
(sshPublisher 属于 Publish Over SSH 插件能力,支持传文件 + 执行远程命令。(Jenkins Plugins))
1)前置条件(别跳过这一步)

- Jenkins 版本:截至 2026-01,Publish Over SSH 插件主页显示当前版本要求 Jenkins 2.479.1+。(Jenkins Plugins)
- 认证方式:推荐“密钥认证”(更稳定、可审计),插件也支持用户名密码或公钥认证。(Jenkins Plugins)
2)生成密钥并授权远端(部署账号建议独立)🛡️
# 1) 在 Jenkins 执行机(Controller 或跑任务的 Agent)生成密钥
ssh-keygen -t ed25519 -C "jenkins-deploy" -f ~/.ssh/jenkins_deploy -N ""
# 2) 把公钥写入远端部署用户的 authorized_keys(示例用户 deploy)
cat ~/.ssh/jenkins_deploy.pub | ssh deploy@10.0.0.12 'mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys'
解释(逐行讲清楚):
ssh-keygen ... -t ed25519:生成更现代的密钥类型,性能好、长度短。-f ~/.ssh/jenkins_deploy:指定私钥文件名,避免覆盖默认密钥。- 第二段
cat ... | ssh ...:把公钥追加到远端authorized_keys,并顺手把目录权限修正确保 SSH 不拒绝登录(权限不对是最常见坑之一)。
3)Jenkins 全局配置(一次配置,所有任务复用)✅
路径:Manage Jenkins → Configure System → Publish over SSH → SSH Servers → Add
这里的
Name很关键:后面 Pipeline 里会用configName精确引用它。(Jenkins)
4)Pipeline:sshPublisher 最小可用示例(传包 + 重启)🚀
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn -q -DskipTests package'
}
}
stage('Deploy') {
steps {
sshPublisher(
failOnError: true,
publishers: [
sshPublisherDesc(
configName: 'prod-app-01',
verbose: true,
transfers: [
sshTransfer(
sourceFiles: 'target/*.jar',
removePrefix: 'target',
remoteDirectory: "releases/${env.BUILD_NUMBER}",
execCommand: """
set -e
ln -sfn /opt/app/releases/${env.BUILD_NUMBER} /opt/app/current
sudo systemctl restart myapp
"""
)
]
)
]
)
}
}
}
}
解释(把关键参数讲透):
sh 'mvn ... package':构建产物(示例是target/*.jar)。你也可以替换成前端打包、Go build 等。sshPublisher(...):核心发布步骤;failOnError: true表示发布失败就让构建直接失败(交付口径更“硬”,适合生产)。(Jenkins)configName: 'prod-app-01':绑定你在“全局配置”里定义的 SSH Server。(Jenkins)sourceFiles: 'target/*.jar':要上传的文件,支持 Ant 风格匹配。(Jenkins)removePrefix: 'target':上传时去掉本地路径前缀,让远端目录结构更干净(否则可能把target/整个带过去)。(Jenkins)remoteDirectory: "releases/${env.BUILD_NUMBER}":在远端基准目录下创建版本目录,天然具备“可回滚”结构(把current指向旧版本即可)。(Jenkins)execCommand:文件传完后执行命令;set -e让脚本任何一步失败都立即退出,避免“半成功半失败”的灰色状态。(Jenkins)
⚠️ 非常容易踩的点:Remote Directory 更偏向“传文件路径基准”,执行命令不一定在该目录下运行,所以建议命令里用绝对路径或显式 cd。(groups.google.com)
5)两条实战建议(让交付更像企业级)
- 最小权限 + 可审计:deploy 用户只给必要目录写权限;重启服务用 sudo 且只放行
systemctl restart myapp(避免把服务器变成“公共遥控器”😄)。 - 网络复杂时:如果 Agent 到目标机网络不通,但 Controller 能通,可考虑
alwaysPublishFromMaster让文件经由 Controller 中转(代价是链路更长、耗时更高)。(Jenkins)
如果你告诉我:你部署的是 Spring Boot / Node / PHP / Go 哪一种、以及远端是 systemd / pm2 / docker compose 哪套,我可以把 execCommand 改成更稳的“停旧起新 + 健康检查 + 失败自动回滚”版本。
已经是第一篇啦!
下一篇: 服务器路由命令有哪些常用技巧?