一键推送
版权
提示
本文是在 博主One 文章:《一键发布更新内容到 vdoing 网站》 基础上增加了自己实践过程的一些细节,转载无需和我联系,但请注明文章来源。如果侵权之处,请联系博主进行删除,谢谢~
场景
将打包好的文件一键推送都服务器目录,无需手动上传,方便快捷。
准备工作必须
切换到您项目的指定目录
bash#示例 [软件名]@[计算机名] [终端类型] [当前路径] ([Git分支]) [软件名]@[计算机名] [终端类型] /D/code/zhishiku/vitepress-theme-teek-hyde (dev) $ cd /d/code/teek-hyde [软件名]@[计算机名] [终端类型] /d/code/teek-hyde (main) #已成功切换到该路径以及对应的分支 $
创建
- 在项目根目录下创建
Shell
文件夹,并在Shell
文件夹下创建password.txt
、teek-run-build.sh
、teek-run-dev.sh
、teek.bat
、teek.sh
文件
bash
# 创建Shell文件夹
mkdir -p Shell
# 在Shell文件夹下创建password.txt文件
touch Shell/password.txt
# 在Shell文件夹下创建teek-run-build.sh文件
touch Shell/teek-run-build.sh
# 在Shell文件夹下创建teek-run-dev.sh文件
touch Shell/teek-run-dev.sh
# 在Shell文件夹下创建teek.bat文件
touch Shell/teek.bat
# 在Shell文件夹下创建teek.sh文件
touch Shell/teek.sh
password
- password.txt 文件用于存放 rsync 推送服务器密码,格式:
123456
teek-run-build
警告
请把/d/code/teek-hyde
路径换成你自己的实际路径
bash
cd /d/code/teek-hyde
pnpm docs:build
teek-run-dev
警告
请把/d/code/teek-hyde
路径换成你自己的实际路径
bash
cd /d/code/teek-hyde
pnpm docs:dev
teek.bat
提示
参数说明:
--password-file=
:指定包含 rsync 密码的文本文件路径(需用 600 权限保护)/cygdrive/d/
:Cygwin 环境下 Windows D 盘的路径映射- root@您云服务器 ip (需替换实际 IP)
::cmi-vue/
:rsync 服务模块路径(需替换实际模块名)
注意事项:
- 8730 端口需确保云服务器防火墙已放行,指定 rsync 服务监听的端口号。默认情况下,rsync 服务监听 873 端口
- 首次运行建议先加 --dry-run 参数模拟测试
请把/d/code/teek-hyde
路径换成你自己的实际路径
bash
echo Push winodws docusaurus static data to ecs...
rsync.exe -avPzruh --delete --port 8730 --password-file=/cygdrive/d/code/teek-hyde/Shell/password.txt
/cygdrive/d/code/teek-hyde/docs/.vitepress/dist root@您云服务器ip::cmi-kt-hyde
teek.sh
警告
请把/d/code/teek-hyde
路径换成你自己的实际路径
点我查看
bash
# 配置常量
REPO_DIR="/d/code/teek-hyde"
RED='\033[31m'; GREEN='\033[32m'; YELLOW='\033[33m'
CYAN='\033[36m'; BLUE='\033[34m'; MAGENTA='\033[35m'; NC='\033[0m'
# 新增计时函数
format_duration() {
local seconds=$1
local hours=$((seconds / 3600))
local minutes=$(( (seconds % 3600) / 60 ))
local secs=$((seconds % 60))
printf "%02d:%02d:%02d" $hours $minutes $secs
}
timestamp() {
date "+%Y-%m-%d %H:%M:%S"
}
git_ops() {
echo "[$(timestamp)] 开始同步仓库..." | tee /dev/fd/3
if ! git -C "$REPO_DIR" pull; then
error_handler "Git 拉取失败"
fi
if git -C "$REPO_DIR" diff-index --quiet HEAD --; then
echo -e "${YELLOW}[WARN] 没有检测到文件变更,跳过提交${NC}" # 移除tee管道
return
fi
git -C "$REPO_DIR" add -A
git -C "$REPO_DIR" commit -m"Automatic deployment: $(timestamp)"
if ! git -C "$REPO_DIR" push; then
echo -e "\033[31m[ERROR] Git 推送失败\033[0m" | tee /dev/fd/3
exit 1
fi
}
# 在主流程函数末尾添加清理调用
main_flow() {
# 新增依赖检查
if ! command -v git &> /dev/null; then
error_handler "Git 未安装"
fi
local start_time=$(date +%s)
echo "========== 开始部署 [$(timestamp)] =========="
git_ops
# 优化构建脚本调用
local build_script="$REPO_DIR/Shell/teek-run-build.sh"
[ ! -f "$build_script" ] && error_handler "构建脚本不存在: $build_script"
if ! "$build_script"; then
error_handler "构建失败"
fi
echo -e "\033[34m[INFO] 开始推送数据到服务器...\033[0m"
if ! /d/code/teek-hyde/Shell/teek.bat; then
echo -e "\033[31m[ERROR] Rsync 传输失败\033[0m"
exit 1
fi
echo -e "\n${GREEN}[SUCCESS] 部署完成!${NC}"
# 新增耗时统计
end_time=$(date +%s)
duration=$((end_time - start_time))
echo "总耗时: $(format_duration $duration)"
# 保持状态显示(移除tee管道)
echo -e "\n\033[35m***************************\033[0m"
echo -e "\033[34m本地仓库状态:\033[0m"
git -C "$REPO_DIR" status
echo -e "\n\033[34m远程仓库状态:\033[0m"
git -C "$REPO_DIR" remote -v
git -C "$REPO_DIR" branch -vv | grep '^\*'
echo -e "\033[35m***************************\033[0m"
}
# 修改主流程调用
trap 'error_handler "进程被中断"' SIGINT SIGTERM
main_flow
脚本
- 直接在 vscode 里
bash
控制台执行如下代码就好
警告
执行下面代码之前,请先把/d/code/teek-hyde
路径换成你自己的实际路径
sh
cat >>/etc/profile <<EOF
alias td="sh -x /d/code/teek-hyde/Shell/teek-run-dev.sh"
alias tb="sh -x /d/code/teek-hyde/Shell/teek-run-build.sh"
alias hxx="sh -x /d/code/teek-hyde/Shell/teek.sh"
alias gg="git -C /d/code/teek-hyde/ pull && git -C /d/code/teek-hyde/ add -A && git -C /d/code/teek-hyde/ commit -m'commit data' && git -C /d/code/teek-hyde/ push"
EOF
# 重新加载配置
source /etc/profile
拓展配置
- 控制台
bash
输入hxx
,此命令是自定义的,可以在 bash 控制台输入下面命令进行自定义
sh
vim /etc/profile
找到 hxx,改成自己的
sh
alias hxx="
A
sh -x /d/code/teek-hyde/shell/vdoing.sh
- 清除 /etc/profile 文件中的所有内容 truncate 命令可以调整文件的大小,将文件大小设置为 0 就相当于清空文件内容。执行以下命令:
sh
sudo truncate -s 0 /etc/profile
验证脚本
shell
source /etc/profile #控制台没有输出说明成功
tb # 测试别名是否生效
cat /etc/profile #或者直接查看是否生效
服务端配置
安装并启动 rsync 服务,详细查看:rsync 实现 windows 与 linux 数据备份同步
创建 rsyncd.conf 文件
shvim /etc/rsyncd.conf
填写
rsyncd.conf
文件配置sh[cmi-vue] # 同步的目标文件夹 path=/root/rsync/rsync-vue # rsync daemon 在传输前是否切换到指定的 path 目录下,并将其监禁在内,用于增加传输的安全性 use chroot=no # 指定最大的连接数 max connections=4 # yes 表示只读本地文件无法同步到服务器 read only=no # 客户端请求显示模块列表时,该模块是否显示出来 list=true # 服务运行时的用户 uid=root # 服务运行时的用户组 gid=root # 进行验证时的用户名,必须是系统存在的用户 auth users = root # 连接用户时的密码 secrets file=/etc/rsyncd.passwd # 允许的 ip hosts allow=*
接着在服务器
/root/rsync/rsync-vue
创建此文件夹,名称随意,但需要和前面保持一致~
shmkdir -p /root/rsync/rsync-vue
验证
- 在
bash
控制台输入hxx
,查看是否成功