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 流程中不可或缺的利器。

有类似需求?联系微信 CorkineMa免费获取建议和报价折扣。