Skip to content

一键推送

版权

提示

本文是在 博主One 文章:《一键发布更新内容到 vdoing 网站》 基础上增加了自己实践过程的一些细节,转载无需和我联系,但请注明文章来源。如果侵权之处,请联系博主进行删除,谢谢~

场景

将打包好的文件一键推送都服务器目录,无需手动上传,方便快捷。

准备工作必须

  • rsync 实现 windows 与 linux 数据备份同步

  • 切换到您项目的指定目录

    bash
    #示例 [软件名]@[计算机名] [终端类型] [当前路径] ([Git分支])
    
    [软件名]@[计算机名] [终端类型] /D/code/zhishiku/vitepress-theme-teek-hyde (dev)
    $ cd /d/code/teek-hyde
    
    [软件名]@[计算机名] [终端类型] /d/code/teek-hyde (main)   #已成功切换到该路径以及对应的分支
    $

创建

  • 在项目根目录下创建Shell文件夹,并在Shell文件夹下创建password.txtteek-run-build.shteek-run-dev.shteek.batteek.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 服务模块路径(需替换实际模块名)

注意事项:

  1. 8730 端口需确保云服务器防火墙已放行,指定 rsync 服务监听的端口号。默认情况下,rsync 服务监听 873 端口
  2. 首次运行建议先加 --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 文件

    sh
    vim /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创建此文件夹,名称随意,但需要和前面保持一致~

    sh
    mkdir -p /root/rsync/rsync-vue

验证

  • bash控制台输入hxx,查看是否成功
最近更新