PowerShell 原生 FTP 增量部署脚本,用于 GitLab CI/CD Pipeline。
脚本需要 PowerShell 5.1 或更高版本(Windows 自带):
# 检查 PowerShell 版本 $PSVersionTable.PSVersion
无需安装额外软件 - 脚本使用 PowerShell 内置的 System.Net.FtpWebRequest 类。
在 GitLab 项目的 Settings > CI/CD > Variables 中配置以下变量:
| 变量名 | 说明 | 是否加密 |
|---|---|---|
FTP_HOST | FTP 服务器地址(如:ftp.example.com) | 否 |
FTP_USER | FTP 用户名 | 否 |
FTP_PASS | FTP 密码 | ✅ 是(标记为 Protected) |
FTP_REMOTE_PATH | 远程部署路径(默认:/aib) | 否 |
重要提示:
FTP_PASS 必须标记为 Protected 和 Masked 以保护密码安全✅ Windows Runner → Linux FTP Server
✅ Windows Runner → Windows FTP Server
✅ 使用标准 FTP 协议,兼容所有 FTP 服务器
脚本在 Windows GitLab Runner 上运行,可以连接任何标准 FTP 服务器(Linux、Windows 等)。
如需在本地测试脚本,可手动运行:
.\scripts\deploy-ftp-incremental.ps1 ` -LocalPath "website" ` -RemotePath "/aib" ` -FtpHost "your-ftp-host.com" ` -FtpUser "your-username" ` -FtpPass "your-password"
参数说明:
-LocalPath: 本地构建产物目录(默认:website)-RemotePath: 远程服务器部署路径-FtpHost: FTP 服务器地址-FtpUser: FTP 登录用户名-FtpPass: FTP 登录密码脚本使用 PowerShell 原生的 System.Net.FtpWebRequest 类进行增量同步:
脚本只上传满足以下条件的文件:
# 使用 PowerShell 原生 FTP 类 [System.Net.FtpWebRequest]::Create($url) # 支持的 FTP 操作 - GetDateTimestamp: 获取文件修改时间 - GetFileSize: 获取文件大小 - UploadFile: 上传文件 - MakeDirectory: 创建目录
相比全量上传,增量同步可节省的时间:
| 改动规模 | 影响文件数 | 时间节省 | 示例场景 |
|---|---|---|---|
| 小改动 | 1-2 个文件 | ~90% | 修复文案错误、样式调整 |
| 中等改动 | 10-20 个文件 | ~70% | 新增页面、组件更新 |
| 大改动 | 50+ 文件 | ~50% | 框架升级、批量重构 |
| 全量构建 | 所有文件 | 0% | 首次部署、清空重建 |
实际测试数据(基于 100 个文件的项目):
PowerShell 5.1 or higher is required
解决方案:
# 升级 PowerShell(Windows) # 下载并安装最新版 PowerShell # https://github.com/PowerShell/PowerShell/releases
FTP command failed: The operation has timed out
解决方案:
Permission denied
解决方案:
Missing required FTP environment variables
解决方案: 在 GitLab 项目的 Settings > CI/CD > Variables 中添加:
FTP_HOSTFTP_USERFTP_PASS(标记为 Protected)Failed to upload [filename]
解决方案:
FTP_PASS 标记为 Protected 和 Masked脚本会输出详细的部署日志:
日志示例:
================================================ GitLab CI/CD - Incremental FTP Deployment ================================================ Configuration: Local path: website Remote path: /aib FTP host: ftp.example.com FTP user: deploy_user Starting synchronization... Sync mode: Remote (upload only) Criteria: File size and modification time Processing directory: /aib Uploading: index.html ✓ Uploaded: index.html - Skipped (unchanged): favicon.ico Uploading: assets/style.css ✓ Uploaded: assets/style.css ================================================ Deployment Summary ================================================ Uploaded files: 2 Skipped files: 1 Failed files: 0 Duration: 15.43 seconds ✓ Deployment completed successfully ================================================
部署失败时,按以下顺序检查:
v2.0 (2024-12-21): PowerShell 原生实现
v1.0 (2024-12-21): 初始版本