我正在尝试将 Python 单元测试作为 Jenkins 构建的一部分运行。我的构建失败如下:
+ export PYTHONPATH=/usr/lib/python2.7:/usr/lib/python2.7/dist-packages:/var/lib/jenkins/jobs/GUPS_Unit_Tests/workspace/python/plugins:/var/lib/jenkins/jobs/GUPS_Unit_Tests/workspace/:/usr/share/qgis/python:/usr/share/qgis/python/plugins:/var/lib/jenkins/.qgis2/python/plugins:/var/lib/jenkins/jobs/GUPS_Unit_Tests/workspace/gupsutest
+ export PYTHONHOME=/usr
+ cd gupsutest
+ python -m unittest discover
ImportError: No module named site
事实证明这是一个文件权限问题。 Python安装在/usr/lib/python2.7,当然它是root拥有的。
-rwxrwxr-- 1 root root 20388 Jun 22 2015 site.py
-rwxrwxr-- 1 root root 19727 Feb 2 07:45 site.pyc
如果我将 jenkins 用户添加到 root 组,我就可以运行 Python。这在最坏的情况下看起来很危险,在最好的情况下看起来很糟糕。
我该如何继续?我需要将 Python 重新安装到 /usr/local/lib 吗?我是否需要更改 /usr/lib 中 Python 的组?我是否允许对 /usr/lib/python2.7 的所有访问?
我使用 Ubuntu 14.04 和 Python 2.7.6。还有一点需要考虑,我们正在编写的 Python 代码是用于 QGIS 插件的。这些也已以 root 身份安装。我也应该为这些更改组吗?
编辑:更多信息。 jenkins 用户被设置为系统用户帐户。这似乎加剧了这个问题。我有一个普通帐户gups,它能够运行Python(因此可以访问/usr/lib/python2.7)。
/etc/组
jenkins:x:125:
gups:x:1000:
/etc/密码
jenkins:x:116:125:Jenkins,,,:/var/lib/jenkins:/bin/bash
gups:x:1000:1000:GUPS Buildmaster,,,:/home/gups:/bin/bash
EDIT2:python 文件夹权限之间有趣的区别。不知道为什么 python3.4 和 python2.7 不同。
gups@gups-xxxxxxxxxx:~$ ls -la /usr/lib | grep python
-rw-r--r-- 1 root root 68232 Jan 16 20:42 libqgispython.so.2.8.6
drwxrwxr-- 26 root root 12288 Feb 12 08:03 python2.7
drwxr-xr-x 3 root root 4096 Feb 23 2014 python3
drwxr-xr-x 33 root root 20480 Feb 4 05:16 python3.4
drwxr-xr-x 2 root root 4096 Feb 3 08:02 python-tz
EDIT3:我一直在研究虚拟环境这似乎是一个合适的解决方案。我运行 virtualenv 在我的 jeknins 用户的主目录中创建一个环境。
sudo virtualenv --system-site-packages /var/lib/jenkins/_python
这不包括 /usr/lib/python2.7/dist-packages,这是一个问题。
编辑4:詹金斯包信息。
gups@gups-Satellite-U925t:~$ sudo dpkg -l | grep jenkins
ii jenkins 1.650 all continuous integration system