被Jenkins坑过的日子

被Jenkins坑过的日子

    • 前言
        • 环境
        • 场景
    • 坑来了
        • No1 、Jenkins 里直接写Scrapy、Pip 等命令出现Command not found 错误.
        • No2、 在构建的脚本里执行引入了第三方框架的`Python` 文件,出现ImportError: No module named ** 错误.
        • No3、 Jenkins 使用GIT 插件后使用clone 代码,SSH Key问题
        • Ending

前言

环境

MacOS

场景

使用Python 抓取一个JS 动态渲染的页面,使用到了Scrapy、Scrapy-Splash 框架,运用了Doker 容器。

坑来了

No1 、Jenkins 里直接写Scrapy、Pip 等命令出现Command not found 错误.

**案件分析:**先看看Jenkins 的环境变量,进入Jenkins 首页 -> Mange Jenkins -> System Information, 找到Environment Variables (环境变量)表格,在表格里找到PATH的值,默认是/usr/bin:/bin:/usr/sbin:/sbin, 再看看你的pipscrapy 安装在哪的?

$ 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 填写PATHValue 填写/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin, (没有尝试只填写/usr/local/bin会怎样,有钻研精神的同学可以试试)。

No2、 在构建的脚本里执行引入了第三方框架的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天没找到同款条件下的同款问题,更没有同款答案了。我尝试了

  • 升级Jenkins
  • 卸载重装twisted
  • 增加PYTHONPATH
  • 增加PATH

都没解决,最终我直接把程序放在桌面上,通过在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 标签,把daemonstaff 替换掉

找到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 的用户群组和用户名称改成电脑平时使用的账号,可以避免很多未知的坑

No3、 Jenkins 使用GIT 插件后使用clone 代码,SSH Key问题

案件分析: 在Jenkins 里使用git 出现权限问题,你可能记得你明明已经配好了SSH Key 的公钥,而且在本地shell 命令使用git clone ** 也没问题,为什么Jenkins 里就不行了。

解决办法: 用电脑本机的.ssh 文件替换掉Jenkins 目录下的.ssh 文件, 没错!又是因为Jenkins 有自己的一套私钥、公钥。

Ending

这是第一次在平台正正经经的写经验输出,有更好的解决思路、办法,欢迎留言抨击,共同成长。

再说说写的过程中,怎么碰到的问题,怎么去分析,怎么去解决。特别是怎么去分析可能在解决问题之后会觉得解决的思路很傻,但是在没有外力帮助的情况下,自己是怎么去解决的,记录下来后。

转过身来看,嗯!这就是成长!

你可能感兴趣的:(成长记)