在失败了37次之后 我终于在Jenkins上成功运行CodeChina的基于Python的Git项目

Posted 但老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在失败了37次之后 我终于在Jenkins上成功运行CodeChina的基于Python的Git项目相关的知识,希望对你有一定的参考价值。

背景

我在腾讯云买了一个小服务器

从零建设BI系统的第一步从购买一个服务器开始

在它上面搭建了调度的Jenkins

腾讯云服务器CentOS安装Jenkins

并在codeChina上新建了一个Python Web项目

配置了公钥后仍然无法连接git的问题

现在我想实现的是

①在我的电脑上写好项目代码
👇
②push到Git仓库
👇
③Git clone到服务器的Linux上
👇
④Python运行我的项目.py

从①~④是无限的循环,如果不使用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	# 关闭终端后不被打断的运行

然后每次

  1. ssh root@111.222.333.444
  2. cd /www/python
  3. 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平台,这个过程完成了如果还是没有权限拉取,可以参考👇

配置了公钥后仍然无法连接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
    
    在上面这句报错如下后
    python3: command not found
    
    我将上面6中相对x绝对(2x3)种组合全部尝试了,一样的报错,然后我尝试了
    • 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

执行成功


最终版的完整配置

  1. 指定节点为Linux

  2. 指定Git目录
    先创建密钥对并粘贴,然后写入项目地址

  3. 写命令行

后续每次修改完代码,push到仓库之后,直接在这一键运行!还可以查看完整记录~
美滋滋

以上是关于在失败了37次之后 我终于在Jenkins上成功运行CodeChina的基于Python的Git项目的主要内容,如果未能解决你的问题,请参考以下文章

我需要一些插件,它可以在成功完成竹子作业后触发 jenkins 构建

在 jenkins 上测试失败但在本地运行

微信卡券领用

Jenkins持续集成——安装配置

在颤振中构建应用程序 2 次后构建失败

即使 ROBOCOPY 命令在 BAT 脚本中成功执行,JENKINS 作业也会失败