背景
我在腾讯云买了一个小服务器
在它上面搭建了调度的Jenkins
并在codeChina上新建了一个Python Web项目
现在我想实现的是
从①~④是无限的循环,如果不使用Jenkins,我的流程会非常的复杂.会变成
写代码>>ssh
连接服务器>>cd
到项目目录>>pkill
进程>>rm -rf
目录>>git clone
项目>>Python运行
整个过程十分的冗长,甚至建了一个专门的sh文件,每次sh example.sh
来批量运行从cd到python运行的项目,但是还是异常的复杂.sh文件也要经常修改.这时候还是觉得Jenkins无比的好,在我push代码后,它只要一键运行,就可以完成我从ssh到python运行的这么多步骤,还可以在console记录所有过程,简直太强大了
问题
最大的问题在于,步骤过于复杂,简直就不像一个BI应该做的事情
尝试过sh办法
新建一个sh文件,内容如下
pkill -9 -f main.py
rm -rf python_web
git clone https://xxx # 项目url
nohup python python_web.py # 关闭终端后不被打断的运行
然后每次
ssh root@111.222.333.444
cd /www/python
sh exam.sh
太麻烦了!!!
尝试过paramiko办法
写一段Python代码,好几十行的那种
import paramiko
ssh = ...
...
有个问题,在git clone的时候老是要求输入密码,我write进去也无法解决问题.还有每次更新py都要重新上传上去,真的麻烦!!还没有log
尝试过宝塔Python项目管理器
优点是有log
缺点可就太明显了
- git clone还是要手动
- 要每次重新配置模块,因为每次配置项目文件夹都会被删除
- 根本无法用到requirements.txt文件夹,不管放在哪都检测不到
很麻烦!!
Jenkins的38次失败经验
最终还是得Jenkins,但是也不容易,我在这里尝试过37次失败
给大家总结一下经验和血与泪的教训
- Git项目凭证问题
ERROR: Error cloning remote repo 'origin'
需要给机器生成密钥,粘贴公钥到Git平台,这个过程完成了如果还是没有权限拉取,可以参考👇
- 查看命令是否选择有问题
Cannot run program "cmd" (in directory...
发现是这里选择了习惯的执行Windows批处理命令
,应该改成执行shell
- Python模块缺失问题
+ python pyweb/main.py
Traceback (most recent call last):
File "pyweb/main.py", line 2, in <module>
import tornado.httpserver
ImportError: No module named tornado.httpserver
这里是遇到过最麻烦的问题,查了很多方案,都说Jenkins会在Workspace下新建一个虚拟目录,所以Python环境也是虚拟的,没有安装模块.但是之前在本地机跑的时候,并没有出现这个问题.最后发现问题可能在于
- Python的执行路径问题
- Linux上默认安装多版本的Python问题
- 执行文件的路径问题
具体下面会细讲
-
Python + Py执行文件服务器绝对路径
python /www/python/pyweb/main.py
抛出同上的模块缺失错误 -
Python + Py执行文件Jenkins绝对路径
python /var/lib/jenkins/workspace/gittest/pyweb/main.py
找不到文件的错误can't open file '/var/lib/jenkins/workspace/gittest/python_web_linux/pyweb/main.py': [Errno 2] No such file or directory
-
Python + Py执行文件相对路径
python pyweb/main.py
抛出同上的模块缺失错误 -
Python绝对路径 + Py执行文件服务器绝对路径
/root/.pyenv/shims/python /www/python/pyweb/main.py
抛出同上的模块缺失错误 -
Python绝对路径 + Py执行文件Jenkins绝对路径
/root/.pyenv/shims/python /var/lib/jenkins/workspace/gittest/pyweb/main.py
抛出同上的模块缺失错误can't open file '/var/lib/jenkins/workspace/gittest/python_web_linux/pyweb/main.py': [Errno 2] No such file or directory
-
Python绝对路径 + Py执行文件相对路径
/root/.pyenv/shims/python pyweb/main.py
抛出同上的模块缺失错误
- Python版本问题
通过where python
,which python
发现有很多个版本的Python共存,所以尝试了
在上面这句报错如下后python3 pyweb/main.py
我将上面6中相对x绝对(2x3)种组合全部尝试了,一样的报错,然后我尝试了python3: command not found
-
python3.7 pyweb/main.py
-
python3.8 pyweb/main.py
都是一样的
command not found
错误
-
- 尝试pip
然后我想,既然你没有模块,那我pip安装不就好了
然后这么写
pip install tornado
pip install pymysql
python pyweb/main.py
报错
commond not found
pip3 install tornado
/root/.pyenv/shims/pip install tornado
pip install pyweb/requirements.txt
pip3 install pyweb/requirements.txt
/root/.pyenv/shims/pip3 install pyweb/requirements
上面都报错commond not found
/www/server/panel/pyenv/bin/pip install -r pyweb/requirements.txt
这里报错开始有些眉目了Requirement already satisfied
- 尝试通过运行Python paramiko文件解决问题
结果给我报错
ImportError: No module named paramiko
- 直接在命令行写git pull origin master
结果被拒了
Permission denied (publickey)
最终命令行
在尝试之后,通过排列组合,发现有些确实是会被执行到的
所以卸载了python3.8,专心使用3.7
在命令行写
/www/server/panel/pyenv/bin/python pyweb/main.py
执行成功
最终版的完整配置
-
指定节点为Linux
-
指定Git目录
先创建密钥对并粘贴,然后写入项目地址
-
写命令行
后续每次修改完代码,push到仓库之后,直接在这一键运行!还可以查看完整记录~
美滋滋