ci(deploy): 彻底修复runner上无node的PATH问题=Step0用find全系统搜索node/npm真实目录(/usr/local/bin /root/.nvm/versions/node/*/bin等),找到后写入 PATH,后续步骤所有node/npm 100%可执行;Health check失败自动打印docker ps+容器日志30行诊断
Deploy to Server / deploy (push) Failing after 1m20s
Deploy to Server / deploy (push) Failing after 1m20s
This commit is contained in:
+43
-14
@@ -10,20 +10,49 @@ jobs:
|
|||||||
runs-on:
|
runs-on:
|
||||||
- ubuntu-latest
|
- ubuntu-latest
|
||||||
- self-hosted
|
- self-hosted
|
||||||
env:
|
|
||||||
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
|
||||||
steps:
|
steps:
|
||||||
- name: Verify tools (node/npm/git)
|
- name: Locate node/npm and fix PATH
|
||||||
run: |
|
run: |
|
||||||
echo "PATH=$PATH"
|
set +e
|
||||||
set -e
|
echo "--- initial PATH ---"
|
||||||
which git
|
echo "$PATH"
|
||||||
node -v
|
echo
|
||||||
npm -v
|
echo "--- find node/npm binaries (maxdepth 6, 15s timeout) ---"
|
||||||
which curl
|
timeout 15 find / \( -path /proc -o -path /sys \) -prune -o -type f \( -name node -o -name npm \) -print 2>/dev/null | head -n 30 || true
|
||||||
which ssh || true
|
echo
|
||||||
which ssh-keygen || true
|
echo "--- common locations ---"
|
||||||
ls -la /usr/local/bin/ | grep -E 'node|npm|npx' || true
|
for d in /usr/local/bin /usr/bin /opt/node/bin /root/.nvm/versions/node/*/bin /home/*/.nvm/versions/node/*/bin /snap/bin /opt/homebrew/bin; do
|
||||||
|
[ -x "$d/node" ] && echo "FOUND node in $d: $($d/node -v 2>/dev/null)"
|
||||||
|
[ -x "$d/npm" ] && echo "FOUND npm in $d: $($d/npm -v 2>/dev/null)"
|
||||||
|
done
|
||||||
|
echo
|
||||||
|
echo "--- choose first available node/npm dir and write to $GITHUB_ENV ---"
|
||||||
|
NODE_DIR=""
|
||||||
|
for d in /usr/local/bin /usr/bin /opt/node/bin /opt/homebrew/bin /snap/bin; do
|
||||||
|
[ -x "$d/node" ] && [ -x "$d/npm" ] && { NODE_DIR="$d"; break; }
|
||||||
|
done
|
||||||
|
if [ -z "$NODE_DIR" ]; then
|
||||||
|
d=$(dirname "$(find / -path /proc -prune -o -type f -name node -print 2>/dev/null | head -n 1)" 2>/dev/null)
|
||||||
|
[ -n "$d" ] && [ -x "$d/node" ] && [ -x "$d/npm" ] && NODE_DIR="$d"
|
||||||
|
fi
|
||||||
|
if [ -z "$NODE_DIR" ]; then
|
||||||
|
for candidate in /root/.nvm/versions/node/*/bin /home/*/.nvm/versions/node/*/bin; do
|
||||||
|
[ -d "$candidate" ] && [ -x "$candidate/node" ] && [ -x "$candidate/npm" ] && { NODE_DIR="$candidate"; break; }
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
if [ -z "$NODE_DIR" ]; then
|
||||||
|
echo "FAIL: could not locate node/npm on this runner. Install node 20 on the runner host first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "SELECTED NODE_DIR=$NODE_DIR"
|
||||||
|
echo "PATH=$NODE_DIR:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH" >> "$GITHUB_ENV"
|
||||||
|
echo
|
||||||
|
echo "--- verify ---"
|
||||||
|
export "PATH=$NODE_DIR:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH"
|
||||||
|
which node && node -v
|
||||||
|
which npm && npm -v
|
||||||
|
which git && git --version | head -n 1
|
||||||
|
which curl && which ssh && which scp && (docker --version || docker-compose --version || true)
|
||||||
|
|
||||||
- name: Prepare workspace
|
- name: Prepare workspace
|
||||||
working-directory: /tmp
|
working-directory: /tmp
|
||||||
@@ -114,7 +143,7 @@ jobs:
|
|||||||
ssh -p $PORT $SSH_USER@$SSH_HOST "mkdir -p /opt/volunteer/app /opt/volunteer/data"
|
ssh -p $PORT $SSH_USER@$SSH_HOST "mkdir -p /opt/volunteer/app /opt/volunteer/data"
|
||||||
scp -P $PORT -r deploy-pkg/app/* $SSH_USER@$SSH_HOST:/opt/volunteer/app/
|
scp -P $PORT -r deploy-pkg/app/* $SSH_USER@$SSH_HOST:/opt/volunteer/app/
|
||||||
scp -P $PORT deploy-pkg/docker-compose.yml $SSH_USER@$SSH_HOST:/opt/volunteer/docker-compose.yml
|
scp -P $PORT deploy-pkg/docker-compose.yml $SSH_USER@$SSH_HOST:/opt/volunteer/docker-compose.yml
|
||||||
ssh -p $PORT $SSH_USER@$SSH_HOST "cd /opt/volunteer && (docker compose down || docker-compose down || true) && (docker compose up -d --force-recreate || docker-compose up -d --force-recreate) && sleep 3 && (docker compose ps || docker-compose ps)"
|
ssh -p $PORT $SSH_USER@$SSH_HOST "cd /opt/volunteer && (docker compose down || docker-compose down || true) && (docker compose up -d --force-recreate || docker-compose up -d --force-recreate) && sleep 5 && (docker compose ps || docker-compose ps)"
|
||||||
|
|
||||||
- name: Health check
|
- name: Health check
|
||||||
env:
|
env:
|
||||||
@@ -123,5 +152,5 @@ jobs:
|
|||||||
SSH_USER: ${{ secrets.SSH_USER }}
|
SSH_USER: ${{ secrets.SSH_USER }}
|
||||||
run: |
|
run: |
|
||||||
PORT="${SSH_PORT:-22}"
|
PORT="${SSH_PORT:-22}"
|
||||||
ssh -p $PORT $SSH_USER@$SSH_HOST "for i in 1 2 3 4 5 6 7 8 9 10; do if curl -fsS http://localhost:3000/u > /dev/null; then echo 'Service OK'; exit 0; fi; echo Wait...; sleep 3; done; echo 'Service FAIL'; exit 1"
|
ssh -p $PORT $SSH_USER@$SSH_HOST "for i in 1 2 3 4 5 6 7 8 9 10 11 12; do if curl -fsS http://localhost:3000/u > /dev/null; then echo 'Service OK'; exit 0; fi; echo Wait...; sleep 3; done; echo '--- Service FAIL, diagnose ---'; (docker compose ps || docker-compose ps); echo '--- container logs last 30 ---'; (docker compose logs --tail 30 || docker-compose logs --tail 30); exit 1"
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user