服务公告
蓝易云cdn:sshPublisher示例
发布时间:2026-02-08 00:02
下面给你一个可直接落地的 sshPublisher 示例(Jenkins 的 Publish over SSH 插件),覆盖两种最常见场景:Pipeline(Jenkinsfile) 与 自由风格任务(Freestyle)。目标是做到:构建 → 传包 → 远程解压/重启 一条链闭环 ✅🙂
1)前置配置(全局一次性)

在 Jenkins:系统管理 → 系统配置(Configure System)→ Publish over SSH → SSH Servers 新增一台目标机:
- Name / Config Name:例如
prod-app-01(后续 Pipeline 里用这个名字引用) - Hostname / Port:目标服务器地址与端口(默认 22)
- Username:建议用专用发布账号(最小权限原则)
- Authentication:优先用 SSH 私钥(比密码更稳、更可审计)
- Test Configuration:测试连通,确保基础网络/权限没问题
企业落地建议:发布账号只给“上传目录+执行脚本”的权限,避免一把梭把生产机权限送出去(这不是谨慎,这是基本职业操守😄)。
2)Pipeline(Jenkinsfile)标准示例 ✅
Jenkinsfile 示例:上传构建产物并在远程发布
pipeline {
agent any
stages {
stage('Build') {
steps {
sh '''
mkdir -p dist
echo "hello" > dist/version.txt
tar -czf dist/app.tar.gz dist/
'''
}
}
stage('Deploy via SSH') {
steps {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'prod-app-01',
verbose: true,
transfers: [
sshTransfer(
sourceFiles: 'dist/app.tar.gz',
removePrefix: 'dist',
remoteDirectory: '/opt/apps/myapp/releases/${BUILD_NUMBER}',
cleanRemote: false,
execCommand: '''
set -e
mkdir -p /opt/apps/myapp/current
tar -xzf /opt/apps/myapp/releases/${BUILD_NUMBER}/app.tar.gz -C /opt/apps/myapp/current
systemctl restart myapp
systemctl is-active --quiet myapp
''',
execTimeout: 120000,
usePty: true
)
]
)
]
)
}
}
}
}
逐段解释(务实版)
① Build 阶段
mkdir -p dist:创建产物目录,避免目录不存在导致打包失败。echo "hello" > dist/version.txt:模拟生成构建文件(真实项目这里通常是编译/打包输出)。tar -czf dist/app.tar.gz dist/:把产物打成压缩包,便于传输与回滚(一个包就是一个版本)。
② Deploy via SSH 阶段(关键)
sshPublisher(...):插件提供的 Pipeline 步骤,用于“传文件 + 远程执行命令”。configName: 'prod-app-01':引用你在全局配置里建好的那台 SSH Server。verbose: true:输出更详细日志,排障时非常值钱(上线稳定后可关闭)。sourceFiles: 'dist/app.tar.gz':从工作区上传这个文件(相对路径)。removePrefix: 'dist':上传到远端时去掉本地路径前缀,避免远端出现多层dist/目录。remoteDirectory: '/opt/apps/myapp/releases/${BUILD_NUMBER}':远端落盘目录,按构建号分版本,天然支持回滚。📦execCommand: ''' ... ''':上传完成后在远端执行发布脚本:set -e:任一命令失败立刻退出,让发布“失败即失败”,别假装成功。mkdir -p ...:保证目录存在。tar -xzf ... -C ...:解压到 current 目录。systemctl restart myapp:重启服务。systemctl is-active --quiet myapp:健康检查,不健康就让流水线失败(这叫靠谱)。✅
execTimeout: 120000:远程命令超时(毫秒),2 分钟;避免卡死挂流水线。usePty: true:开启伪终端,解决某些 sudo / 终端依赖命令在非 tty 下无法执行的问题。
3)Freestyle(自由风格)示例(Post-build)
在任务配置里:Post-build Actions → Send files or execute commands over SSH
- SSH Server:选
prod-app-01 - Source files:
dist/app.tar.gz - Remove prefix:
dist - Remote directory:
/opt/apps/myapp/releases/${BUILD_NUMBER} - Exec command:同上面的
execCommand逻辑(解压、重启、健康检查)
**解释:**Freestyle 的字段含义与 Pipeline 基本一致,只是写法从“代码”变成“表单”。适合快速上手,但长期建议迁移到 Jenkinsfile,便于版本管理与审计。📌
4)最常见的两个坑(提前踩刹车🧯)
- 传了 0 个文件
通常是sourceFiles路径不对(相对工作区),或者打包产物没生成。建议在上传前加一步ls -al dist验证。 - 远程命令执行成功但服务没起来
一定要加systemctl is-active --quiet这类健康检查,让流水线替你“说真话”,别把风险留到用户侧。
这套配置的本质是:把部署当成产品交付流程,做到可追踪、可回滚、可验证。你会发现上线开始变得“像工程”,而不是“像祈祷”🙂✨
已经是第一篇啦!
下一篇: 服务器路由命令有哪些常用技巧?