部署方案一 使用 Publish Over SSH 插件部署项目
方案概述
Jenkins 构建完成后,通过 Publish Over SSH 插件将构建产物(dist 目录)传输到远程服务器,实现自动部署。
Jenkins 构建 → npm install → npm build → dist 产物 → SSH 传输 → 远程服务器
text
适用场景:前端静态项目、Nginx 静态资源托管。
安装 Publish Over SSH 插件
- 进入 Manage Jenkins → Plugins → Available plugins
- 搜索 Publish Over SSH
- 安装插件,重启 Jenkins
全局 SSH 服务器配置
配置入口
Manage Jenkins → System Configuration → 滚动到底部找到 Publish over SSH
添加 SSH Server
点击 SSH Servers → Add:
| 配置项 | 示例值 | 说明 |
|---|---|---|
| Name | centos-199 | 服务器别名 |
| Hostname | 192.168.31.199 | 服务器 IP 地址 |
| Username | root | SSH 登录用户名 |
| Remote Directory | /home | 默认远程目录(必须存在) |
差异化传输选项
勾选 Avoid sending files that have not changed:
- 仅传输有变化的文件
- 减少不必要的网络传输
- 加快部署速度
高级配置(密钥认证)
展开 Advanced 按钮进行密钥认证配置:
使用密钥方式(推荐)
- 在 Key 文本框中粘贴私钥内容
- 在远程服务器的
~/.ssh/authorized_keys中添加对应公钥
# 在 Jenkins 服务器上生成密钥对(如已有可复用)
ssh-keygen -t rsa -b 4096 -f ~/.ssh/deploy_key
# 复制私钥内容(粘贴到 Jenkins 配置中)
cat ~/.ssh/deploy_key
# 复制公钥到远程服务器
# 在远程服务器上执行:
mkdir -p ~/.ssh
echo "公钥内容" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
bash
使用密码方式
勾选 Use password authentication, or use a different key,填入密码即可。
关闭 Exec 命令(可选)
如果暂时不需要执行远程命令,可以关闭:
Advanced → 勾选 Disable Exec
后续需要执行远程命令时,回到此配置取消勾选即可。
端口配置
根据实际 SSH 端口设置(默认 22),点击保存。
项目中配置 SSH 部署
添加构建后步骤
- 进入项目的 Configure 页面
- 滚动到 Post-build Actions(构建后操作)
- 点击 Add post-build action
- 选择 Send files or execute commands over SSH
Transfer 配置
| 配置项 | 值 | 说明 |
|---|---|---|
| SSH Server | 选择配置的服务器 | 如 centos-199 |
| Transfer Set → Source files | dist/** | 要传输的文件(相对于 workspace) |
| Remote directory | frontend | 远程目标目录(相对于全局配置的路径) |
| Exec command | 留空或 ls -la | 传输后执行的命令 |
路径拼接规则
最终文件传输到远程的路径为:
全局 Remote Directory + 项目 Remote Directory
= /home + /frontend
= /home/frontend/
text
传输路径配置详解
目录层级问题
如果全局配置了 /home 作为 Remote Directory,项目配置了 frontend:
远程目录结构:
/home/ ← 全局配置
└── frontend/ ← 项目配置
└── dist/ ← 传输的文件
├── index.html
└── assets/
text
避免路径嵌套问题
如果不想在全局目录下再创建子目录,可以直接在项目配置中使用绝对路径前缀:
Remote directory: /frontend
text
或者将全局 Remote Directory 设为 /,项目配置设为 home/frontend。
验证部署
构建测试
- 点击 Build Now
- 查看控制台输出,确认传输成功:
SSH: Connecting from host [jenkins-server]
SSH: Connecting with configuration [centos-199] ...
SSH: Disconnecting configuration [centos-199] ...
SSH: Transferred 16 file(s)
Build step 'Send files or execute commands over SSH' changed build result to SUCCESS
text
远程服务器验证
# SSH 登录到远程服务器
ssh root@192.168.31.199
# 检查传输的文件
ls -la /home/frontend/dist/
bash
完整部署流程总结
Jenkins Pipeline
┌──────────────────────────────────────────────┐
│ 1. GitLab Webhook 触发构建 │
│ ↓ │
│ 2. 拉取源码 │
│ ↓ │
│ 3. Node.js 环境:pnpm install │
│ ↓ │
│ 4. Node.js 环境:pnpm build │
│ ↓ │
│ 5. Publish Over SSH:传输 dist/** 到远程服务器 │
│ ↓ │
│ 6. 远程服务器验证文件 │
└──────────────────────────────────────────────┘
text
配置检查清单
| 序号 | 检查项 | 状态 |
|---|---|---|
| 1 | Publish Over SSH 插件已安装 | ☐ |
| 2 | SSH Server 全局配置已完成 | ☐ |
| 3 | 密钥/密码认证已配置 | ☐ |
| 4 | 远程服务器 Remote Directory 存在 | ☐ |
| 5 | 勾选了 Avoid sending unchanged files | ☐ |
| 6 | 项目中添加了 Send files over SSH 步骤 | ☐ |
| 7 | Source files 设置为 dist/** | ☐ |
| 8 | Remote directory 路径正确 | ☐ |
| 9 | 构建测试成功 | ☐ |
| 10 | 远程服务器文件已验证 | ☐ |
注意事项
- 远程目录必须预先存在:如果目录不存在,传输会失败
- 密钥权限:
authorized_keys文件权限必须为 600,.ssh目录权限为 700 - 文件覆盖:同名文件会被覆盖,建议使用版本目录或备份策略
- Exec 命令:如需执行远程命令(如重启 Nginx),确保 Disable Exec 选项未勾选
- 传输大文件:对于大量静态资源,考虑使用压缩传输或增量同步方案
↑