Jenkins + Python 项目集成记录

由于使用的一个第三方 Bot 最近服务器似乎不够稳定,决定自行搭建一个,通过 Jenkins 来集成,下面记录一下过程。

集成项目介绍

  • 集成项目: channel-helper-bot
  • Jenkins 版本: 2.258 (不重要)
  • Jenkins 插件:
    • GitHub plugin: 用于连接 GitHub
    • Git Parameter Plug-In: 用于选择分支
  • 系统环境: Python3

操作步骤

由于该项目需要修改配置文件,我这里先把配置文件写入 Jenkins 。

首页点击 Manage Jenkins,拉到下面选择 Managed files,新建一个配置文件,选择 Custom file,并填写ID。
图 1

按照项目要求,将 helper__const.py.sample 的内容复制进编辑区域,并修改相应的配置,并保存。
图 2

返回首页,建立一个 Freestyle project 的新项目,填写名称,进入下一步;
图 3

填写 Description;
勾选 GitHub项目 并填写项目URL;
勾选 This project is parameterized ,选择 Git Parameter ,Parameter Type 选 Branch or Tag,Default Value 填写 origin/master
图 4

Source Code Management 选择 Git 并同样填写 URL,Branches to build填写 $BRANCH
图 5

在 Build Environment 中勾选 Provide Configuration files,选择上面创建好的配置文件,并设置 Target 为 helper_const.py ,如果文件应该覆盖到其它地方,则应该设置对应的相对目录。
图 6

Build 中增加 Shell

1
2
3
4
5
6
7
8
9
10
11
BUILD_ID=DONTKILLME
python3 -m pip freeze > requirements.txt
python3 -m pip install -r requirements.txt

ps -ef | grep helper_main.py | grep -v grep && ps -ef | grep helper_main.py | grep -v grep | awk '{print $2}' | xargs kill -9

nohup python3 helper_main.py > out.log &
if [ $? = 0 ];then
sleep 30
tail -n 50 out.log
fi

第一句的作用为,构建结束后不杀死Python进程;
后面两句用于 pip 安装依赖;
接下来查找正在运行的主函数的线程并杀死;
接下来使用 nohup 执行 python 主函数并输出日志到 out.log;
如果上一条命令执行无误,则休眠 30 秒后打印最近 50 行的日志,检查运行是否有误。

保存后,构建 master 分支的代码,实现 bot 的正常运行。

现在为止,已经可以实现手动选择对应的 GitHub 分支来运行,并且后台不会杀死 python 进程,也不会让 Jenkins 一直保持构建状态。