PublishOverSSH 插件使用指南:实现 Jenkins 到远程服务器的安全文件传输与命令执行
实际应用场景背景
在企业级 DevOps 实践中,经常需要将构建好的应用程序安全地部署到远程服务器,同时执行必要的运维命令。Publish Over SSH 插件提供了一种简单可靠的方式来实现 Jenkins 与远程服务器之间的安全连接,支持文件传输和命令执行,广泛应用于应用部署、配置管理和系统维护等场景。
概述
Publish Over SSH 是 Jenkins 的一款强大插件,允许在构建过程中通过 SSH 协议安全地连接到远程服务器,执行文件传输和命令执行操作。该插件简化了远程部署流程,提高了部署的可靠性与安全性,是现代 CI/CD 流水线中的重要组件。
安装与配置
重要提醒:备份 Jenkins
在安装任何插件之前,强烈建议备份 Jenkins 配置,以防插件安装导致 Jenkins 出现问题。由于安装插件后需要重启 Jenkins,因此备份是防止数据丢失的关键步骤。
备份方法:
- 备份 Jenkins 主目录(通常是 /var/lib/jenkins 或 /root/.jenkins)
- 或者使用 Jenkins 的备份插件进行系统备份
1. 插件安装
在 Jenkins 中安装 Publish Over SSH 插件:
方式一:在线安装
- 进入 "Manage Jenkins" → "Manage Plugins"
- 在 "Available" 标签页搜索 "Publish Over SSH"
- 选择插件并点击 "Install without restart"
方式二:离线安装(推荐)
如果在线无法找到插件,可以使用张师傅提供的插件文件进行离线安装:
- 下载插件文件:publish-over-ssh.hpi
- 进入 "Manage Jenkins" → "Manage Plugins" → "Advanced" 标签页
- 在 "Upload Plugin" 部分,点击 "Choose File" 选择下载的 .hpi 文件
- 点击 "Upload" 完成上传安装
- 安装完成后,重启 Jenkins 服务
注意:很多情况下在线可能查询不到此插件,张师傅提供了此插件的备份文件,确保您可以顺利完成安装。
2. 服务器配置
- 进入 "Manage Jenkins" → "Configure System"
- 找到 "Publish over SSH" 部分
- 配置 SSH 服务器信息:
SSH Servers:
Name: remote-server-name
Hostname: your-server-ip
Username: username
Remote Directory: /path/to/remote/directory
Advanced Settings:
- Use password authentication, or use a different key: [勾选]
- Passphrase / Password: [输入密码或密钥]
- Port: 22 (默认)
- Timeout (ms): 300000
- TCP No Delay: true

配置参数详解
| 参数 | 含义 | 说明 | 默认值 |
|---|---|---|---|
| Name | 服务器名称 | 在 Jenkinsfile 中通过 configName 引用的标识符 | - |
| Hostname | 主机地址 | 远程服务器 IP 地址或域名 | - |
| Username | 用户名 | 用于连接远程服务器的用户名 | - |
| Remote Directory | 远程目录 | SSH 连接后的默认工作目录,作为文件传输的根目录 | - |
| Passphrase / Password | 密码/密钥 | SSH 认证凭据,可使用密码或密钥文件 | - |
| Port | 端口号 | SSH 服务监听的端口号 | 22 |
| Timeout (ms) | 超时时间 | SSH 连接超时时间(毫秒) | 300000 |
Jenkinsfile 编写实践
基础用法示例
pipeline {
agent any
stages {
stage('远程操作') {
steps {
script {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'remote-server-name', // 对应配置的服务器名称
transfers: [
sshTransfer(
cleanRemote: false, // 是否清理远程目录
excludes: '', // 排除的文件模式
execCommand: '''
# 在远程服务器执行的命令
pwd
ls -la
date
''',
execTimeout: 120000, // 命令执行超时(毫秒)
flatten: false, // 是否扁平化目录结构
makeEmptyDirs: false, // 是否创建空目录
noDefaultExcludes: false, // 是否排除默认模式
patternSeparator: '[, ]+', // 模式分隔符
remoteDirectory: '/tmp', // 远程目标目录
remoteDirectorySDF: false, // 目录是否使用日期格式
removePrefix: "", // 移除的路径前缀
sourceFiles: "dist/**" // 要传输的源文件
)
],
usePromotionTimestamp: false, // 是否使用推广时间戳
useWorkspaceInPromotion: false, // 推广时是否使用工作区
verbose: true // 详细输出
)
]
)
}
}
}
}
}
实际部署示例
以下是一个通用的部署场景的 Jenkinsfile 示例,展示了如何使用 Publish Over SSH 进行远程部署:
pipeline {
agent any
stages {
stage('远程部署') {
steps {
script {
sshPublisher(
publishers: [
sshPublisherDesc(
configName: 'remote-server-name', // 必须与Jenkins系统配置中的服务器名称一致
transfers: [
sshTransfer(
cleanRemote: false, // 是否在传输前清空远程目录
excludes: '', // 排除的文件模式,如'.git,**/*.log'
execCommand: """
# execCommand 参数详解:
# - 作用:在文件传输完成后,在远程服务器上执行指定的命令
# - 使用场景:启动应用、重启服务、执行部署脚本等
# - 格式:可以是单行或多行命令,多行命令使用三重引号包围
# - 注意:命令会在 remoteDirectory 目录下执行
cd ${env.remoteDirectory} && \\
export APP_IMAGE=${env.APP_IMAGE} && \\
docker-compose -f docker-compose.yaml -p my-project up -d --force-recreate my-app
""",
execTimeout: 120000, // 命令执行超时时间(毫秒)
flatten: false, // 是否扁平化目录结构
makeEmptyDirs: false, // 是否创建空目录
noDefaultExcludes: false, // 是否排除默认模式
patternSeparator: '[, ]+', // 模式分隔符,用于分隔 sourceFiles 或 excludes 中的多个模式
remoteDirectory: "$env.remoteDirectory", // 传输到远程服务器的目标目录
remoteDirectorySDF: false, // 目录是否使用日期格式
removePrefix: "", // 移除的路径前缀
sourceFiles: "target/*.jar,dist/**" // 要传输的源文件,支持Ant风格通配符
)
],
usePromotionTimestamp: false, // 是否使用推广时间戳
useWorkspaceInPromotion: false, // 推广时是否使用工作区
verbose: true // 详细输出,便于调试
)
]
)
}
}
}
}
}
参数详细说明
以下是 Publish Over SSH 插件中各个参数的详细解释:
1. configName
- 含义: 对应在 Jenkins 系统配置中定义的 SSH 服务器名称
- 作用: 用于指定要连接的远程服务器配置,必须与系统配置中的服务器名称完全匹配
- 示例: 'remote-server-name'
2. cleanRemote
- 含义: 是否在传输前清空远程目录
- 可选值: true/false
- 作用: 当设置为 true 时,在文件传输前会先清空远程目标目录
- 注意: 使用时需谨慎,避免意外删除重要文件
3. execCommand
- 含义: 在远程服务器上执行的命令
- 作用: 允许在文件传输完成后执行一系列命令,如启动服务、重启进程等
- 格式: 可以是单行或多行命令,多行命令建议使用三重引号包围
- 示例:
execCommand: '''
cd /app
echo "Starting application..."
systemctl restart myapp
'''
4. execTimeout
- 含义: 命令执行的超时时间
- 单位: 毫秒
- 作用: 控制远程命令执行的最大等待时间,超过此时间将终止命令执行
- 推荐值: 根据命令复杂度设置,一般为 60000-300000(1-5分钟)
5. remoteDirectory
- 含义: 文件传输的目标远程目录
- 作用: 指定文件传输到远程服务器的具体路径
- 特点: 相对于服务器配置中设定的远程目录
6. sourceFiles
- 含义: 要传输的源文件路径模式
- 作用: 定义哪些文件需要传输到远程服务器
- 格式: 支持 Ant 风格的通配符模式
- 示例: 'dist/**', 'target/.jar', 'config/'
7. excludes
- 含义: 排除的文件模式
- 作用: 指定不需要传输的文件或目录
- 格式: 逗号分隔的多个排除模式
- 示例: '.git,/*.log,/temp/*'
8. flatten
- 含义: 是否扁平化目录结构
- 可选值: true/false
- 作用: 当设置为 true 时,忽略源文件的目录结构,将所有文件传输到同一目录
9. makeEmptyDirs
- 含义: 是否创建空目录
- 可选值: true/false
- 作用: 当设置为 true 时,即使目录为空也会被创建
10. noDefaultExcludes
- 含义: 是否排除默认模式
- 可选值: true/false
- 作用: 控制是否应用默认的排除规则(如 .gitignore 文件中的规则)
11. patternSeparator
- 含义: 模式分隔符
- 作用: 定义多个文件模式之间的分隔符
- 默认值: '[, ]+'(支持逗号和空格分隔)
- 说明: 这个参数控制 sourceFiles、excludes 等多个模式值之间的分隔符。例如,当有多个源文件模式如 'src/, lib/, config/**' 时,使用 patternSeparator 来识别各模式的边界
12. remoteDirectorySDF
- 含义: 目录是否使用日期格式
- 可选值: true/false
- 作用: 当设置为 true 时,remoteDirectory 支持日期格式化
13. removePrefix
- 含义: 移除的路径前缀
- 作用: 在传输文件时移除指定的路径前缀
- 示例: 如果源文件路径为 'dist/app/main.js',removePrefix 设置为 'dist/',则文件会被传输到 remoteDirectory/app/main.js
14. usePromotionTimestamp
- 含义: 是否使用推广时间戳
- 可选值: true/false
- 作用: 在推广构建时是否使用时间戳创建子目录
15. useWorkspaceInPromotion
- 含义: 推广时是否使用工作区
- 可选值: true/false
- 作用: 控制推广构建时的行为
16. verbose
- 含义: 详细输出
- 可选值: true/false
- 作用: 当设置为 true 时,输出更详细的传输日志,便于调试
最佳实践建议
1. 安全性考虑
- 使用 SSH 密钥而非密码进行认证
- 限制远程用户权限,遵循最小权限原则
- 定期更换认证凭据
2. 错误处理
- 设置合理的超时时间
- 在远程命令中添加错误检查逻辑
- 使用 verbose 模式进行调试
3. 性能优化
- 合理设置文件传输过滤规则
- 避免不必要的文件传输
- 使用适当的并发连接数
常见问题及解决方案
问题1: 连接超时
解决方案:
- 检查网络连通性
- 增加超时时间设置
- 确认防火墙规则
问题2: 权限不足
解决方案:
- 验证 SSH 用户权限
- 检查目标目录权限
- 确认 SELinux/AppArmor 配置
问题3: 文件传输失败
解决方案:
- 检查磁盘空间
- 验证路径是否存在
- 调整传输参数
与其他工具对比
| 特性 | Publish Over SSH | SSH Agent | Ansible | Fabric |
|---|---|---|---|---|
| 配置复杂度 | 低 | 低 | 中 | 高 |
| 安全性 | 高 | 高 | 高 | 中 |
| 跨平台支持 | 良好 | 良好 | 优秀 | 良好 |
| 集成便利性 | 优秀 | 优秀 | 中 | 中 |
SEO 关键词融入
Publish Over SSH、Jenkins 远程部署、SSH 自动化、Jenkins CI/CD、远程服务器管理、自动化部署、SSH 文件传输、Jenkins 插件、DevOps 自动化、安全部署
总结
Publish Over SSH 插件是 Jenkins 生态系统中不可或缺的组件,为 CI/CD 流水线提供了可靠的远程操作能力。通过合理配置和使用,可以实现高效、安全的应用部署和系统管理。掌握该插件的使用方法对于 DevOps 工程师来说至关重要,能够显著提升部署效率和系统可靠性。
评论区