.jpg)
CI Transfer 是一款专为云端自动化构建产物分发与部署场景设计的工具,极大简化了 CI/CD 流程中跨主机文件传输与远程部署的复杂度。它支持多种目标环境、灵活命令执行,并可无缝集成到 Github Action 等主流 CI 平台,助力高效 DevOps 实践。
1. 真实痛点驱动的工具演进
在 CI/CD 自动化部署场景下,开发者常常面临如下痛点:
- 构建产物分发繁琐:CI 产物需要分发到多台虚拟机或云服务器,传统 scp/rsync 方案配置复杂,安全性和易用性难以兼顾。
- 远程命令执行不统一:部署前后常需执行一系列命令(如清理旧文件、重启服务),但 ssh 脚本难以维护,出错率高。
- 多环境适配难:有时还需将产物同步到对象存储归档(如 阿里云 OSS),传统工具支持有限,流程割裂。
- 安全合规要求高:敏感信息(如服务器密码、密钥)需安全管理,手动传递风险大。
早期方案
最初,团队采用 scp/ssh 手动执行 shell 脚本以部署服务,但很快遇到以下问题:
- 操作繁琐,需要手动登录远程主机并执行部署脚本,密钥泄露风险大。
- 部署流程不透明,无法审计,没有记录日志,出错难以追踪。
- 产物归档存储需要手动下载并上传到对象存储,流程割裂,自动化程度低。
工具化演进
为解决上述问题,团队开发了 CI Transfer(ci-transfer)工具,核心思路如下:
- 多种分发部署场景:单一工具支持本地文件上传、远程命令执行、对象存储上传。
- 灵活丰富参数支持:支持自定义端口、预处理命令、后置命令、目标路径。
- 多平台单一二进制:无需依赖繁杂环境,下载即用,极简部署。
- CI 平台无缝集成:支持 Github Action 等主流平台,敏感信息通过 Secret 管理。
2. 当前架构的核心优点
极简分发与部署
- 单一命令行工具,支持本地到远程主机/对象存储的高效传输。
- 支持递归上传文件夹,自动适配目标路径规则。
- 预处理与后置命令灵活配置,满足复杂部署流程。
安全合规
- 敏感信息通过 CI Secret 管理,避免明文泄露。
- 支持自定义端口、账号密码,兼容多种网络环境。
多平台适配
- 支持 Linux、macOS 和 Windows 等多种云端平台调用。
- 支持 OSS 等主流对象存储,参数灵活,适配多云场景。
易于集成与维护
- Github Action 等 CI 平台一键集成,自动化程度高。
- 单一二进制文件,无需额外依赖,部署极简。
3. 典型使用场景与示例
在 Github Action 中分发产物并远程部署
以将构建产物传输到虚拟机并执行命令为例:
./ci-transfer --source ./large_file.zip --destination user:password@192.168.1.100:/remote/path/ --port 2222 --precommands "df -h" --commands "echo 'Transfer complete!'"
在 Github Action 中集成示例:
- name: Run ci-transfer
env:
DESTINATION: ${{ secrets.DESTINATION }}
run: |
wget https://github.com/corkine/ci-transfer/releases/latest/download/ci-transfer
chmod +x ci-transfer
./ci-transfer -s target/x86_64-unknown-linux-musl/release/calibre-api -d "$DESTINATION" --precommands "rm -f /root/calibre-web/calibre-api" -c "/root/calibre-web/deploy.sh"
上传产物到 OSS
可使用 --oss-destination
参数将文件上传至 OSS,传入内容为 JSON 格式字符串或 Base64 编码字符串。例如:
{
"oss_bucket": "my-bucket",
"oss_endpoint": "oss-cn-beijing.aliyuncs.com",
"key_secret": "your-secret-key",
"key_id": "your-access-key-id",
"path": "/path/to/oss/",
"override_existing": true
}
--source
为文件夹时,递归上传到path
下。--source
为文件,path
以/
结尾则上传到该目录,否则视为目标文件名。
在 Github Action 中集成示例:
- name: Run ci-transfer
shell: pwsh
env:
OSS_DESTINATION: ${{ secrets.OSS_DESTINATION }}
run: |
Invoke-WebRequest -Uri https://github.com/corkine/ci-transfer/releases/latest/download/ci-transfer.exe -OutFile ci-transfer.exe
$short_sha = "${{ github.sha }}".Substring(0, 8)
$new_filename = "$short_sha.zip"
Copy-Item -Path windows-build.zip -Destination $new_filename
./ci-transfer.exe -s $new_filename --oss-destination "$env:OSS_DESTINATION"
4. 总结
CI Transfer(ci-transfer)以极简、弹性、安全为核心,彻底简化了云端构建产物的分发与部署流程。无论是本地到远程主机,还是同步到对象存储,都能一条命令高效完成。通过与 CI 平台的无缝集成,极大提升了自动化部署的效率与安全性,是现代 DevOps 流程中不可或缺的利器。