Repository navigation
59 lines (51 loc) · 2.09 KB
/
Copy pathdeploy.yml
File metadata and controls
59 lines (51 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
name: Deploy Python Client
on:
push:
branches:
- main
workflow_dispatch:
# 同一时间只跑一次部署,避免两次 push 交错重启服务
concurrency:
group: deploy
cancel-in-progress: false
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Pull and restart on server
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USERNAME }}
password: ${{ secrets.SERVER_PASSWORD }}
command_timeout: 10m
script: |
# python3.11 由 pyenv 管理;非交互式 SSH 不会执行 ~/.bashrc 里的 pyenv init,需手动加入 PATH
export PYENV_ROOT="/root/.pyenv"
export PATH="$PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH"
if ! command -v python3.11 > /dev/null; then
echo "python3.11 not found in PATH: $PATH"
exit 1
fi
echo "using $(command -v python3.11)"
set -e
cd /data/python-client
# 拉代码,并先安装新增依赖,避免 ModuleNotFoundError
git pull
python3.11 -m pip install -r requirements.txt
# 锚定命令行开头(argv[0] 以 python3.11 结尾),避免匹配到本脚本自身(其命令行以 bash 开头且包含下方启动命令);没有旧进程时不报错
pkill -f '^[^ ]*python3\.11 -u service\.py' || true
sleep 1
# setsid + 重定向 stdin,让服务脱离 SSH 会话,部署步骤结束后不会被一起关掉
setsid nohup python3.11 -u service.py > service.log 2>&1 < /dev/null &
# 健康检查:最多等 60 秒,失败时打印日志尾部并让本次部署标红
for i in $(seq 1 30); do
if curl -sf http://localhost:8000/health > /dev/null; then
echo "service.py is up"
exit 0
fi
sleep 2
done
echo "service.py failed to start, last log lines:"
tail -n 50 service.log
exit 1