发布于 

jpom自动化构建python项目

构建列表配置

这是配置,因为代码结构和jpom必须要有个产物目录,所以拉下代码后新建了个目录放进去

1
mkdir -p code && shopt -s dotglob && mv ./* ./code/
1
code

脚本

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
# !/bin/bash

APP_DIR="/data/apps/ai"
BIN_DIR="$APP_DIR"
LOG_DIR="$APP_DIR/logs"
LOG_FILE="$LOG_DIR/info.log"
NEW_PRO="code"

feishu_webhook2="https://open.feishu.cn/open-apis/bot/v2/hook/xxx"

export TZ="Asia/Shanghai"

mkdir -p $BIN_DIR $LOG_DIR


# 推送到飞书
function push_to_feishu() {

content="$1"

cur_datetime=$(date +"%Y-%m-%d %H:%M:%S")


message="状态:${content}\n"
message+="时间:${cur_datetime}"

read -r -d '' json_payload <<EOF
{
"msg_type": "text",
"content": {
"text": "${message}"
}
}
EOF

echo ">>> JSON Payload: ${json_payload}"


response2=$(curl -H "Content-Type: application/json" -X POST -d "${json_payload}" "${feishu_webhook2}")
echo ">>> 飞书响应2: ${response2} <<<"
}



cleanup_logs() {
push_to_feishu "正在清理 15 天前的日志..."
echo "正在清理 15 天前的日志..." >> $LOG_FILE
find $LOG_DIR -type f -mtime +15 -exec rm -f {} \;
push_to_feishu "日志清理完成..."
echo "日志清理完成。" >> $LOG_FILE
}

# 停止老服务函数
stop_old_service() {
echo "尝试停止旧服务..." | tee -a "$LOG_FILE"
push_to_feishu "尝试停止旧服务..."

old_pids=$(ps -ef | grep "$APP_DIR/$NEW_PRO/main.py" | grep -v grep | grep -v nohup | awk '{print $2}')

if [ -n "$old_pids" ]; then
echo "发现旧进程 PID: $old_pids,正在终止..." | tee -a "$LOG_FILE"
kill $old_pids
sleep 2
# 确认是否成功终止
for pid in $old_pids; do
if ps -p $pid > /dev/null; then
echo "进程 $pid 未能终止,强制杀掉..." | tee -a "$LOG_FILE"
kill -9 $pid
fi
done
push_to_feishu "旧服务已停止"
else
echo "未找到旧服务进程,无需停止。" | tee -a "$LOG_FILE"
push_to_feishu "未找到旧服务进程"
fi
}

# 主逻辑
echo "======== AI服务开始 $(date) ========" > $LOG_FILE
BUILD_JAR_PATH=$(pwd)
cd $APP_DIR || { echo "目录 $APP_DIR 不存在!" >> $LOG_FILE; exit 1; }
rm -rf $APP_DIR/$NEW_PRO
mv $BUILD_JAR_PATH/$NEW_PRO $BIN_DIR/ > $LOG_FILE 2>&1
status=$?
if [ $status -eq 0 ]; then
push_to_feishu "项目打包成功"
else
push_to_feishu "项目包处理失败,状态码:$status"
fi

# 检查并安装依赖
PYTHON_EXEC="/usr/bin/python3.10"

REQ_FILE="$BIN_DIR/$NEW_PRO/requirements.txt"

if [ -f "$REQ_FILE" ]; then
echo "检测到 requirements.txt,开始安装依赖..." | tee -a "$LOG_FILE"
push_to_feishu "开始安装 Python 依赖..."

$PYTHON_EXEC -m ensurepip --upgrade 2>&1 | tee -a "$LOG_FILE"
$PYTHON_EXEC -m pip install --upgrade pip 2>&1 | tee -a "$LOG_FILE"
$PYTHON_EXEC -m pip install -r "$REQ_FILE" 2>&1 | tee -a "$LOG_FILE"
status=${PIPESTATUS[0]} # 从 pipe 中正确获取 pip install 的退出状态

if [ $status -eq 0 ]; then
echo "依赖安装完成" | tee -a "$LOG_FILE"
push_to_feishu "依赖安装完成"
else
echo "依赖安装失败,状态码:$status" | tee -a "$LOG_FILE"
push_to_feishu "依赖安装失败,状态码:$status"
exit 1
fi
else
echo "未找到 requirements.txt,跳过依赖安装" | tee -a "$LOG_FILE"
push_to_feishu "未找到 requirements.txt,跳过依赖安装"
fi

# 停止旧服务
stop_old_service

MAIN_SCRIPT="$BIN_DIR/$NEW_PRO/main.py"
RUN_LOG="$LOG_DIR/run.log"

if [ -f "$MAIN_SCRIPT" ]; then
nohup $PYTHON_EXEC "$MAIN_SCRIPT" >> "$RUN_LOG" 2>&1 &
push_to_feishu "Python 项目已启动: $MAIN_SCRIPT"
echo "Python 项目已启动 PID=$!" >> $LOG_FILE
else
push_to_feishu "Python 启动失败,未找到 $MAIN_SCRIPT"
echo "未找到主程序:$MAIN_SCRIPT" >> $LOG_FILE
exit 1
fi

cleanup_logs
push_to_feishu "AI服务部署完成..."
echo "======== AI服务部署完成 $(date) ========" >> $LOG_FILE

脚本安装依赖报错可以直接到服务器执行下面语句,可以查看具体报错原因

1
/usr/bin/python3.10 -m pip install -r /data/apps/ai/dist/requirements.txt

示例

1
2
root@kremail-dev:/data/apps/ai/code# /usr/bin/python3.10 -m pip install -r /data/apps/ai/code/test_env
/usr/bin/python3.10: No module named pip

这里发现是没有安装pip

1
2
wget https://bootstrap.pypa.io/get-pip.py
sudo /usr/bin/python3.10 get-pip.py

这一步会直接安装 pip 到 Python 3.10 的路径下

安装python

  1. 更新系统并安装必要工具

    1
    2
    sudo apt update
    sudo apt install software-properties-common -y
  2. 添加 deadsnakes PPA

    1
    sudo add-apt-repository ppa:deadsnakes/ppa -y
  3. 再次更新包列表

    1
    sudo apt update
  4. 安装 Python 3.10

    1
    sudo apt install python3.10 -y
  5. 验证版本

    1
    python3.10 --version