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
5 设置日志级别
构建工程后的日志如下
6 构建脚本
# -*- 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 目录下,主目录也就是前面说的。
文章来源: 第2.2章 远程部署scrapyd工程