MacOS
使用Python 抓取一个JS 动态渲染的页面,使用到了Scrapy、Scrapy-Splash 框架,运用了Doker 容器。
**案件分析:**先看看Jenkins 的环境变量,进入Jenkins 首页 -> Mange Jenkins
-> System Information
, 找到Environment Variables
(环境变量)表格,在表格里找到PATH
的值,默认是/usr/bin:/bin:/usr/sbin:/sbin
, 再看看你的pip
、scrapy
安装在哪的?
$ which pip
/usr/local/bin/pip
$ which scrapy
/usr/local/bin/scrapy
So. Why command not found? Because may be it.
**解决办法:**就是给Jenkins 修改环境变量,我尝试到的办法是在Configura System
-> Global properties
里勾上Environment variables
增加键值对Name
填写PATH
, Value
填写/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
, (没有尝试只填写/usr/local/bin会怎样,有钻研精神的同学可以试试)。
Python
文件,出现ImportError: No module named ** 错误.案件分析: 我这个爬虫的执行文件里内容如下
main.py
#!/usr/bin python
# -*- coding: utf-8 -*-
# @Time : 2018/11/29 15:58
# @Author : Mars
from scrapy import cmdline
cmdline.execute(['scrapy', 'crawl', '此处为爬虫入口程序名'])
在Terminal 执行python main.py
完全没问题,但部署到Jenkins 上就出现了如下错误
$ /bin/sh -xe /Users/Shared/Jenkins/tmp/jenkins4266129241674795365.sh
+ python main.py
Traceback (most recent call last):
File "main.py", line 20, in
from scrapy import cmdline
File "/Library/Python/2.7/site-packages/scrapy/__init__.py", line 27, in
from . import _monkeypatches
File "/Library/Python/2.7/site-packages/scrapy/_monkeypatches.py", line 20, in
import twisted.persisted.styles # NOQA
ImportError: No module named twisted.persisted.styles
别怀疑你的twisted
包是不是有问题,网上找了2、3天没找到同款条件下的同款问题,更没有同款答案了。我尝试了
twisted
都没解决,最终我直接把程序放在桌面上,通过在Jenkins 里写一段
cd /Users/Mars/Documents
构建Jenkins 的时候又报错了
$ /bin/sh -xe /Users/Shared/Jenkins/tmp/jenkins3643154797228771836.sh
+ cd /Users/Mars/Documents
/Users/Shared/Jenkins/tmp/jenkins3643154797228771836.sh: line 2: cd: /Users/gatscm2/Documents: Permission denied
Permission denied
没权限,这时候我恍然大明白, 马上在Jenkins 的shell 脚本里敲下两个英文字母id
再构建一下。
$ /bin/sh -xe /Users/Shared/Jenkins/tmp/jenkins4686859629267551489.sh
+ id
uid=267(jenkins) gid=267(jenkins) egid=1(daemon) groups=267(jenkins),12(everyone),20(staff),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),702(com.apple.sharepoint.group.2),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),101(com.apple.access_screensharing-disabled),102(com.apple.access_ssh-disabled)
这下终于通了,原来Jenkins 系统里的所有操作都是以电脑用户Jenkins 的身份操作的,所以为什么会各种找不到module的情况出现。找到问题源头了,接下来解决问题。
解决办法: 更改Jenkins 系统执行时的身份
#停止Jenkins
$ sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
# 修改group 和user
$ sudo vim +1 +/daemon +’s/daemon/staff/’ +/daemon +’s/daemon/Mars’ +wq org.jenkins-ci.plist
# 修改之前文件的归属权限
$ sudo chown -R Mars:staff /Users/Shared/Jenkins/
$ sudo chown -R Mars:staff /var/log/jenkins
# 开始Jenkins
$ sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
第二步也可以直接打开文件修改,
找到key 标签为GroupName
对应的string 标签,把daemon
用staff
替换掉
找到key 标签为UserName
对应的string 标签,把daemon
用你电脑平常使用的用user name 替换掉
验证是否修改成功,再用id
命令试试
$ /bin/sh -xe /Users/Shared/Jenkins/tmp/jenkins1779228406794725443.sh
+ id
uid=502(Mars) gid=20(staff) groups=20(staff),702(com.apple.sharepoint.group.2),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),101(com.apple.access_screensharing-disabled),102(com.apple.access_ssh-disabled)
好了,问题解决了。此处建议把Jenkins 的用户群组和用户名称改成电脑平时使用的账号,可以避免很多未知的坑
案件分析: 在Jenkins 里使用git 出现权限问题,你可能记得你明明已经配好了SSH Key 的公钥,而且在本地shell 命令使用git clone **
也没问题,为什么Jenkins 里就不行了。
解决办法: 用电脑本机的.ssh
文件替换掉Jenkins 目录下的.ssh
文件, 没错!又是因为Jenkins 有自己的一套私钥、公钥。
这是第一次在平台正正经经的写经验输出,有更好的解决思路、办法,欢迎留言抨击,共同成长。
再说说写的过程中,怎么碰到的问题,怎么去分析,怎么去解决。特别是怎么去分析可能在解决问题之后会觉得解决的思路很傻,但是在没有外力帮助的情况下,自己是怎么去解决的,记录下来后。
转过身来看,嗯!这就是成长!