这是一个轻量级的、基于 Alpine 的 Docker 镜像,它使用 rsync 通过 SSH 安全地同步文件。该镜像基于 drone-rsync 重新实现,专为 CI/CD 流水线(兼容 Drone CI, CNB 等平台的插件 API)设计,通过环境变量进行配置,实现自动化部署或文件分发。
rsync 进行高效的文件传输。include 和 exclude 规则,可自定义 rsync 和 ssh 参数。rsync 执行前后在远程主机上运行自定义脚本 (prescript, script)。--delete 选项,确保目标目录与源目录完全一致。id_rsa.pub) 添加到目标远程主机的 ~/.ssh/authorized_keys 文件中。可参考 CNB 插件市场中的 rsync 插件说明 编写流水线配置文件,然后 将 image 设置为当前仓库提供的镜像 docker.cnb.cool/rainy-nook/rsync-plugin,例如:
# .cnb.yml
main:
push:
- stages:
- name: rsync
image: docker.cnb.cool/rainy-nook/rsync-plugin
# 引用密钥仓库配置文件
imports: https://your-git.com/group/secret-repo/-/blob/main/env.yml
settings:
user: $LOGIN_USER
key: $PRIVATE_KEY
hosts:
- ip1
- ip2
source: ./dist/
target: ~/target/
# 以上为必填参数,以下为可选参数
port: 22
include:
- "app.tar.gz"
- "app.tar.gz.md5"
exclude:
- "*"
prescript:
- cd ~/packages
- md5sum -c app.tar.gz.md5
- tar -xf app.tar.gz -C ~/app
script:
- cd ~/packages
- md5sum -c app.tar.gz.md5
- tar -xf app.tar.gz -C ~/app
以下是所有可用的参数:
| 参数 | 是否必须 | 默认值 | 描述 |
|---|---|---|---|
hosts | 是 | (无) | 远程主机列表,多个主机用逗号 , 分隔。例如: host1.com,192.168.1.10。 |
key | 是 | (无) | 用于 SSH 认证的私钥内容。 |
target | 是 | (无) | 远程主机上的目标文件夹路径。例如: /var/www/my-app。 |
user | 否 | root | 用于登录远程主机的用户名。 |
port | 否 | 22 | 远程主机的 SSH 连接端口。 |
source | 否 | ./ | 要同步的源文件夹路径,相对于工作目录。 |
recursive | 否 | false | 是否递归同步子目录。设置为 true 时,会添加 -r 标志。 |
delete | 否 | false | 是否删除目标文件夹中存在但源文件夹中不存在的文件。 |
include | 否 | (空) | Rsync 的 include 规则列表,用逗号 , 分隔。 |
exclude | 否 | (空) | Rsync 的 exclude 规则列表,用逗号 , 分隔。例如: ".git/,*.log"。 |
args | 否 | (空) | 额外的 rsync 命令行参数。例如: "--checksum --no-times"。 |
prescript | 否 | (空) | 在 rsync 之前在远程主机上执行的命令。 |
script | 否 | (空) | 在 rsync 之后在远程主机上执行的命令。 |
log_level | 否 | quiet | SSH 的日志级别。可选值: quiet, verbose, debug, trace。 |
将当前目录的所有内容同步到一台服务器的 /opt/my-project 目录。
# 1. 准备私钥内容
KEY_CONTENT=$(cat ~/.ssh/id_rsa)
# 2. 运行 Docker 容器
docker run --rm -it \
-v "$(pwd):/workspace" \
-w /workspace \
-e PLUGIN_HOSTS="your_server_ip" \
-e PLUGIN_USER="deploy" \
-e PLUGIN_KEY="${KEY_CONTENT}" \
-e PLUGIN_TARGET="/opt/my-project" \
-e PLUGIN_RECURSIVE="true" \
docker.cnb.cool/rainy-nook/rsync-plugin
部署一个 Web 应用到两台服务器,同时排除不必要的文件,并在部署后重启服务。
server1.com 和 server2.com。--delete)。.git 目录和所有 .log 文件。systemctl restart my-app.service 命令。# 1. 准备私钥内容
KEY_CONTENT=$(cat ~/.ssh/id_rsa)
# 2. 运行 Docker 容器
docker run --rm -it \
-v "$(pwd)/build:/app/build" \
-w /app/build \
-e PLUGIN_HOSTS="server1.com,server2.com" \
-e PLUGIN_USER="deploy" \
-e PLUGIN_KEY="${KEY_CONTENT}" \
-e PLUGIN_TARGET="/var/www/my-app" \
-e PLUGIN_SOURCE="./" \
-e PLUGIN_RECURSIVE="true" \
-e PLUGIN_DELETE="true" \
-e PLUGIN_EXCLUDE=".git/,*.log" \
-e PLUGIN_ARGS="--checksum" \
-e PLUGIN_PRESCRIPT="mkdir -p /var/www/my-app" \
-e PLUGIN_SCRIPT='echo "Deployment complete! Restarting service..." && systemctl restart my-app.service' \
docker.cnb.cool/rainy-nook/rsync-plugin
注意: 在
PLUGIN_SCRIPT中,我们使用了单引号' '来包裹整个命令字符串,以防止!等特殊字符被本地 Shell 解释。
本插件要求将 SSH 私钥的内容直接作为环境变量 PLUGIN_KEY 的值传入。脚本会自动将这个字符串内容写入容器内的一个临时文件中 (~/.ssh/id_rsa),并设置正确的权限,供 ssh 和 rsync 命令使用。该临时文件会在容器退出时被自动清理。
在本地测试时,可以使用 $(cat path/to/your/key) 的方式来读取文件内容。在真实的 CI/CD 环境中,请务必使用平台自带的密钥管理功能。