This commit is contained in:
@@ -32,7 +32,45 @@ jobs:
|
|||||||
PASS: "123quant-speed"
|
PASS: "123quant-speed"
|
||||||
TARGET_DIR: "/home/quant-speed/data/dev/ESP32_GDEY042T81_server"
|
TARGET_DIR: "/home/quant-speed/data/dev/ESP32_GDEY042T81_server"
|
||||||
run: |
|
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 <<EOF
|
cat > deploy_script.exp <<EOF
|
||||||
#!/usr/bin/expect -f
|
#!/usr/bin/expect -f
|
||||||
|
|
||||||
@@ -42,68 +80,28 @@ jobs:
|
|||||||
set password "$PASS"
|
set password "$PASS"
|
||||||
set target_dir "$TARGET_DIR"
|
set target_dir "$TARGET_DIR"
|
||||||
|
|
||||||
spawn ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \$user@\$host "bash -s"
|
# 1. SSH 连接并创建目录
|
||||||
|
spawn ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \$user@\$host "mkdir -p \$target_dir"
|
||||||
expect {
|
expect {
|
||||||
"yes/no" { send "yes\r"; exp_continue }
|
"yes/no" { send "yes\r"; exp_continue }
|
||||||
"password:" { send "\$password\r" }
|
"password:" { send "\$password\r" }
|
||||||
}
|
}
|
||||||
|
expect eof
|
||||||
|
|
||||||
# 发送远程命令
|
# 2. 上传脚本
|
||||||
# 注意:这里的 EOF 结束符不能缩进
|
spawn scp -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null remote_script.sh \$user@\$host:\$target_dir/deploy.sh
|
||||||
send "mkdir -p \$target_dir\r"
|
|
||||||
send "cd \$target_dir\r"
|
|
||||||
|
|
||||||
# 记录旧版本号
|
|
||||||
send "OLD_HEAD=\\\$(git rev-parse HEAD 2>/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"
|
|
||||||
|
|
||||||
# 检查拉取是否成功
|
|
||||||
expect {
|
expect {
|
||||||
"Already up to date." { send "echo 'Code is up to date'\r" }
|
"password:" { send "\$password\r" }
|
||||||
"Updating" { send "echo 'Code updated'\r" }
|
}
|
||||||
"Permission denied" {
|
expect eof
|
||||||
puts "Git pull permission denied, trying with sudo..."
|
|
||||||
send "echo '\$password' | sudo -S git pull\r"
|
# 3. 执行脚本
|
||||||
}
|
spawn ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -t \$user@\$host "cd \$target_dir && chmod +x deploy.sh && bash deploy.sh '\$password'"
|
||||||
timeout { puts "Git pull timeout"; exit 1 }
|
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
|
expect eof
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user