在使用Jenkins做自动发布的时候用到了Python脚本,有两种方式:
- 一是直接通过Jenkins安装Python相关插件,然后在构建时直接执行Python脚本中的命令;
- 另外一种方式就是在Jenkins服务器上安装脚本对应的Python版本,然后在Jenkins页面配置CMD命令执行Python脚本,如python xxx.py;
因为Jenkins上安装的Python插件不知道对应Python的什么版本,这里选择了第二种方式,即在Jenkins服务器上安装Python。
中间也是各种折腾,遇到了几个问题:
- 编码问题;
- python不识别的问题;
- 找不到依赖的问题;
这里不着急解释这些问题是如何解决的。因为都是姿势不对导致的。这里说一下正确的姿势。
这里用到的软件版本:
名称 | 版本 |
---|---|
系统 | Windows Server 2012 R2 Datacenter |
Jenkins | 2.204.1(Manage Jenkins下的关于Jenkins可查版本) |
Python | python-3.8.1 32位(官方各版本下载地址) |
pip | 19.2.3(安装python时选中一起安装的) |
接下来要注意的事项:
- 保证编写的脚本对应的python版本和Jenkins上安装的python版本是兼容的,最好一致(以免某些语法或依赖不兼容);
- 安装python时注意安装路径,最好不要使用中文和其他特殊字符,以免后面被特殊对待,出现各种不可预知的问题;
- 安装时选中安装pip和ADD TO PATH,如果没有,自行下载安装pip,并手动为python和pip添加环境变量,保证通过cmd命令查看二者的版本时是正确的;如下图:
- 编写好的python脚本放置的路径同样不要包含中文和其他特俗字符,上面提到的编码问题就很可能是路径中包含了中文(这里令我浪费时间去了解更改python的默认编码,最后还是更换了脚本路径就好了);
- 保证在Jenkins服务器上直接通过命令行运行脚本的结果正常(这里如果有问题,Jenkins上执行肯定也有问题);
-
如果上面的步骤提示找不到某些依赖,把python下的Script也加入到环境变量,然后通过命令行安装对应的依赖包,
pip install package_name
或pip3 install package_name
;
注意:如果使用默认的包源,安装会比较慢(服务器在国外);这里可以永久更换pip的包源。操作步骤如下:- 打开文件夹,输入路径
%appdata%
后回车,进入的路径类似“C:UsersUserNameAppDataRoaming”; - 新建文件夹“pip”并进入其中;
-
新建文件“pip.ini”并编辑,内容如下:
[global] timeout = 6000 index-url = http://mirrors.aliyun.com/pypi/simple/ trusted-host = mirrors.aliyun.com
- 之后再通过pip或pip3进行安装就会快很多;
- 打开文件夹,输入路径
-
以上的步骤都正常了,就可以在Jenkins上执行CMD命令了,这里需要注意的是无论是python还是脚本都要使用全路径,或者先定位到脚本所在的目录下;如
python的安装路径为“C:WorkAppsPythonPython38-32”
脚本路径为“E:jenkins_pythonwait_run.py”- 直接执行CMD命令:
C:\WorkApps\Python\Python38-32\python.exe E:\jenkins_python\wait_run.py
- 或者先定位到脚本所在的目录,再执行对应的CMD命令:
E: && cd E:\jenkins_python\wait_run.py && C:\WorkApps\Python\Python38-32\python.exe wait_run.py
如果上面不适用python的全路径,就很可能会报错——上面提到的“python不识别”。注意:这里不是因为Jenkins对python的版本不兼容引起的,而是python.exe不在Jenkins执行用户的PATH里面,故而即使配置了PATH,Jenkins还是找不到python;
- 直接执行CMD命令:
至此,Jenkins上配置的python脚本就可以顺利进行了。
如果遇到问题,可以先拆分以便排查,节约验证的等待时间。比如上面的Jenkins不识别python,可以把CMD命令配置为“python --version”,发现是路径问题,改为“C:WorkAppsPythonPython38-32python.exe --version”,再执行发现可以正常运行了,再继续验证后面的问题。
我的思路就是万不可被问题围殴,而是将其拆分,使其排成一列纵队,然后再如打怪通关,一关一关过(前提是大方向要先定下来,不然不辞劳苦的通关了,发现终点不是自己要的结果就尴尬了)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。