diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml index 6f1e77b..2c20102 100644 --- a/.gitea/workflows/deploy.yaml +++ b/.gitea/workflows/deploy.yaml @@ -32,7 +32,45 @@ jobs: PASS: "123quant-speed" TARGET_DIR: "/home/quant-speed/data/dev/ESP32_GDEY042T81_server" run: | - # 创建 expect 脚本 + # 创建一个 shell 脚本,包含所有需要在服务器上执行的逻辑 + # 这样可以避免在 expect 中处理复杂的条件判断和转义 + cat > remote_script.sh <<'EOS' + #!/bin/bash + + # 获取密码 + PASSWORD="$1" + + # 记录旧版本号 + OLD_HEAD=$(git rev-parse HEAD 2>/dev/null || echo "") + + # 尝试直接 git pull + echo "Pulling latest code..." + if ! git pull; then + echo "Git pull permission denied, trying with sudo..." + echo "$PASSWORD" | sudo -S git pull || { echo "Git pull failed"; exit 1; } + fi + + NEW_HEAD=$(git rev-parse HEAD) + + if [ "$OLD_HEAD" == "$NEW_HEAD" ]; then + echo "No changes detected, skipping deploy" + exit 0 + fi + + # 检查构建文件变动 + if git diff --name-only $OLD_HEAD $NEW_HEAD | grep -E 'Dockerfile|requirements.txt'; then + echo "Build files changed, rebuilding..." + echo "$PASSWORD" | sudo -S docker compose down --rmi local + echo "$PASSWORD" | sudo -S docker rmi epaper_server:latest || true + echo "$PASSWORD" | sudo -S docker compose up -d --build + else + echo "Only code changed, restarting container..." + echo "$PASSWORD" | sudo -S docker compose down + echo "$PASSWORD" | sudo -S docker compose up -d + fi + EOS + + # 创建 expect 脚本,只负责上传脚本和执行脚本 cat > deploy_script.exp </dev/null || echo '')\r" - - # 拉取代码 - 可能需要 sudo 权限或者目录权限问题 - send "echo 'Pulling latest code...'\r" - - # 尝试直接 git pull,如果失败则尝试 sudo git pull - # 但 sudo git pull 可能会因为 .git 目录的所有者问题而失败,或者需要输入密码 - # 最好的方式是确保当前用户对目录有写权限。 - # 既然用户提示 "Permission denied" 并且提到 "sudo",我们尝试在 git pull 前确保权限,或者用 sudo git pull - - # 先尝试修正权限 (需要 sudo) - send "echo '\$password' | sudo -S chown -R \$user:\$user \$target_dir\r" - - # 然后执行 git pull - send "git pull\r" - - # 检查拉取是否成功 + # 2. 上传脚本 + spawn scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null remote_script.sh \$user@\$host:\$target_dir/deploy.sh expect { - "Already up to date." { send "echo 'Code is up to date'\r" } - "Updating" { send "echo 'Code updated'\r" } - "Permission denied" { - puts "Git pull permission denied, trying with sudo..." - send "echo '\$password' | sudo -S git pull\r" - } - timeout { puts "Git pull timeout"; exit 1 } + "password:" { send "\$password\r" } + } + expect eof + + # 3. 执行脚本 + spawn ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -t \$user@\$host "cd \$target_dir && chmod +x deploy.sh && bash deploy.sh '\$password'" + expect { + "password:" { send "\$password\r" } } - # 获取新版本号 - send "NEW_HEAD=\\\$(git rev-parse HEAD)\r" - - # 判断是否需要构建 - send "if \\[ \\\"\\\$OLD_HEAD\\\" == \\\"\\\$NEW_HEAD\\\" \\]; then\r" - send " echo 'No changes detected, skipping deploy'\r" - send "else\r" - # 检查构建文件变动 - send " if git diff --name-only \\\$OLD_HEAD \\\$NEW_HEAD | grep -E 'Dockerfile|requirements.txt'; then\r" - send " echo 'Build files changed, rebuilding...'\r" - send " echo '\$password' | sudo -S docker compose down --rmi local\r" - send " echo '\$password' | sudo -S docker rmi epaper_server:latest || true\r" - send " echo '\$password' | sudo -S docker compose up -d --build\r" - send " else\r" - send " echo 'Only code changed, restarting container...'\r" - send " echo '\$password' | sudo -S docker compose down\r" - send " echo '\$password' | sudo -S docker compose up -d\r" - send " fi\r" - send "fi\r" - - # 退出 SSH - send "exit\r" + # 保持交互直到脚本执行完毕 expect eof EOF