在使用Jenkins做自动发布的时候用到了Python脚本,有两种方式:

  1. 一是直接通过Jenkins安装Python相关插件,然后在构建时直接执行Python脚本中的命令;
  2. 另外一种方式就是在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_namepip3 install package_name
    注意:如果使用默认的包源,安装会比较慢(服务器在国外);这里可以永久更换pip的包源。操作步骤如下:

    1. 打开文件夹,输入路径%appdata%后回车,进入的路径类似“C:UsersUserNameAppDataRoaming”;
    2. 新建文件夹“pip”并进入其中;
    3. 新建文件“pip.ini”并编辑,内容如下:

      [global]
      timeout = 6000
      index-url = http://mirrors.aliyun.com/pypi/simple/
      trusted-host = mirrors.aliyun.com
    4. 之后再通过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;

至此,Jenkins上配置的python脚本就可以顺利进行了。
如果遇到问题,可以先拆分以便排查,节约验证的等待时间。比如上面的Jenkins不识别python,可以把CMD命令配置为“python --version”,发现是路径问题,改为“C:WorkAppsPythonPython38-32python.exe --version”,再执行发现可以正常运行了,再继续验证后面的问题。
我的思路就是万不可被问题围殴,而是将其拆分,使其排成一列纵队,然后再如打怪通关,一关一关过(前提是大方向要先定下来,不然不辞劳苦的通关了,发现终点不是自己要的结果就尴尬了)。


Ably
603 声望44 粉丝

Let everything around us become better