scrapy自身工程的部署参考
第1.8章 scrapy之完整工程部署
这里要将的的通过jenkins来部署scrapyd,我有10台机器,如果一台台手工敲,费时费力。
jenkins安装参考第1.1章 自动化测试之jenkins安装,这里不赘述
1 安装jenkins插件
按照上图中核心的那几个插件,检查是否有遗漏
2 配置credentials
这个是访问远程ssh的账号,
只需要输入username和password即可
3 配置系统设置
3.1 主目录
jenkins的主目录,生成的文件都这个工作空间中。
3.2 Mask Passwords
3.3 JDK目录
这个是jenkins所需jdk的目录
3.4 SSH remote hosts
远程访问机器的配置,配置credentials中的账号密码,就是在这里用到的
3.5 Publish over SSH
文件上传的时候需要这个。
4 配置任务
第1.3章 自动化测试之jenkins与应用同台,这里已经介绍如何通过参数化构建工程。
爬虫的稍微简单的一些,就是把代码从svn中下载下来,然后上传到远程linux机器上就可以
4.1 文件上传
并不是所有的都是上面的配置,比如如果我自定义的插件,就是下面的风格
4.2 远程执行脚本
kill命令用nohup是因为不这样做,jenkins会抛出异常导致终止部署
sudo nohup kill -9 `ps -ef |grep scrapyd|awk '{print $2}' ` &
sleep 5
sudo /etc/init.d/scrapyd start
当然,也可以将这脚本写在linux服务器上,执行注意这个文件在远程登录用户的根目录,vi einfo-start.sh
,内容如下:
sudo kill -9 `ps -ef |grep scrapyd|awk '{print $2}' `
sleep 1
sudo /etc/init.d/scrapyd start
sleep 1
cd /home/test/spiders/einfo
sudo /root/.pyenv/versions/3.6.5/bin/scrapyd-deploy -p einfo
保存成功后,执行chmod +x einfo-start.sh
执行scrapyd-deploy可能会报错,因为sudo的环境变量跟test的不一致,解决的办法是
sudo su -
visudo
上面的命令会打开/etc/sudoers,将/usr/local/bin添加进去更改会即可生效。
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
接着在jenkins中
5 设置日志级别
构建工程后的日志如下
6 构建脚本
需要在命令行窗口执行一下svn,因访问的协议是https,它会让你选择对证书的信任程度.
# -*- coding: utf-8 -*-
from command import execute
import util
import os
import sys
COMMAMD_SVN_LIST = 'svn list '
COMMAMD_SVN_EXPORT = 'svn export --force '
COMMAMD_SVN_IMPORT = 'svn import -m -F '
COMMAMD_SVN_AUTHORIZATION = ' --username test --password 123456'
COMMAMD_PYTHON_BUILD = 'python setup.py sdist bdist_egg'
EXPORT_CODE_SUCCESS = '已导出版本'
UPLOAD_SUCCESS = '提交后的版本为'
COMPRESS_SUCCESS = '正在添加'
'''
编译spider
'''
class Build:
def __init__(self):
paramList = util.getParamList()
self.project_name = paramList[1]
self.project_list = paramList[2]
self.svn_code_repository = paramList[3]
self.svn_upload_repository = paramList[4]
self.svn_username = paramList[5]
self.svn_password = paramList[6]
self.svn_auth = ' --username ' + self.svn_username + ' --password ' + self.svn_password
self.workspace = os.getcwd()
self.conf_dir = util.getConfDir(self.project_name)
self.spiders = paramList[8]
print(self.spiders)
def getConfList(self):
print('conf dir: ' + self.conf_dir)
return os.listdir(self.conf_dir)
def exportCode2Local(self):
exportResult = False
print('export project')
project = self.project_list
if self.spiders == 'ALL':
# 全部的代码
result = execute(COMMAMD_SVN_EXPORT + util.myUrlJoin(self.svn_code_repository, project) + self.svn_auth)
print(result)
if not util.executeResult(EXPORT_CODE_SUCCESS, result):
return False
else:
exportResult = True
else:
spider_list = util.getCommaSepratedList(self.spiders)
for spider in spider_list:
pass
return exportResult
def getDetsConfFileThroughWar(self, conf):
project_folder = os.path.join(self.project_name,self.project_name)
# print(project_folder)
for fpathe,dirs,fs in os.walk(project_folder):
for f in fs:
if(conf == f):
return(os.path.join(fpathe,f))
return ''
def modifyConfig(self):
print(' in modifyConfig')
confList = self.getConfList()
print(confList)
for conf in confList:
dest = self.getDetsConfFileThroughWar(conf)
if(not len(dest) == 0):
# print('copy ' + os.path.join(self.conf_dir, conf) + ' ' + dest + ' ' +'/Y')
execute('copy ' + os.path.join(self.conf_dir, conf) + ' ' + dest + ' ' +'/Y')
print(dest)
def pypiBuild(self):
buildResult = False
for project in self.project_list:
command = COMMAMD_PYTHON_BUILD
print('build ' + project + ' start')
os.chdir(os.path.join(self.workspace, project))
print('plugin path is {}'.format(os.path))
result = execute(command)
for r in result:
print(r)
print('build ' + project + ' end')
os.chdir(os.path.join(self.workspace, project)+'\\dist')
relativeFileList = os.listdir(os.getcwd())
fileListStr = util.list2Str(relativeFileList)
print(fileListStr)
def startWork(self):
#step1: export code from svn
exportResult = self.exportCode2Local()
if exportResult == False:
print('export fail')
sys.exit(1)
else:
print('export success')
# modify config
self.modifyConfig()
#step2: upload code to svn baseline
#step3: python build
# self.pypiBuild()
#step4: update egg to svn
if __name__ == '__main__':
build = Build()
build.startWork()
注意替换文件放到workspace/conf 目录下,主目录也就是前面说的。