詹金斯、Python 和根
我正在嘗試將 Python unittest 作為 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 使用者添加到根組,我可以讓 Python 執行。這在最壞的情況下看起來很危險,在最好的情況下看起來很糟糕。
我該如何進行?我是否將 Python 重新安裝到 /usr/local/lib?我是否在 /usr/lib 中更改 Python 組?我是否允許所有訪問/usr/lib/python2.7?
我正在使用帶有 Python 2.7.6 的 Ubuntu 14.04。還有一點需要考慮,我們正在編寫的 Python 程式碼是用於 QGIS 外掛的。這些也已以 root 身份安裝。我也應該為這些更改組嗎?
編輯:更多資訊。jenkins 使用者設置為系統使用者帳戶。這似乎促成了這個問題。我有一個能夠執行 Python 的普通帳戶 gups(因此可以訪問 /usr/lib/python2.7)。
/etc/組
jenkins:x:125: gups:x:1000:
/etc/passwd
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這似乎是一個合適的解決方案。我執行 virtualenv 在我的 jeknins 使用者的主目錄中創建一個環境。
sudo virtualenv --system-site-packages /var/lib/jenkins/_python
這不包括 /usr/lib/python2.7/dist-packages,這是一個問題。
EDIT4:詹金斯包資訊。
gups@gups-Satellite-U925t:~$ sudo dpkg -l | grep jenkins ii jenkins 1.650 all continuous integration system
在Ubuntu 論壇中的文章進行了一些額外的搜尋和一些幫助之後,我發現了解決方案。
正如thrig和Faheem Mitha所指出的,我的 python2.7 文件夾的權限實際上很時髦。
我把它們修好了。
sudo chmod 755 /usr/lib/python2.7 sudo find /usr/lib/python2.7 -type d -exec chmod 755 {} \; sudo find /usr/lib/python2.7/*.py -exec chmod 644 {} \;
我在這個 stackexchange文章中找到的。