第2.4章 远程部署scrapyd工程

scrapy自身工程的部署参考
第1.8章 scrapy之完整工程部署

这里要将的的通过jenkins来部署scrapyd,我有10台机器,如果一台台手工敲,费时费力。
jenkins安装参考第1.1章 自动化测试之jenkins安装,这里不赘述
1
1 安装jenkins插件
按照上图中核心的那几个插件,检查是否有遗漏
2 配置credentials
这个是访问远程ssh的账号,
1
2
3
4
5
只需要输入username和password即可
6
3 配置系统设置
3.1 主目录
jenkins的主目录,生成的文件都这个工作空间中。
1
3.2 Mask Passwords
2
3.3 JDK目录
这个是jenkins所需jdk的目录
3
3.4 SSH remote hosts
远程访问机器的配置,配置credentials中的账号密码,就是在这里用到的
4
3.5 Publish over SSH
文件上传的时候需要这个。
5
4 配置任务
第1.3章 自动化测试之jenkins与应用同台,这里已经介绍如何通过参数化构建工程。
爬虫的稍微简单的一些,就是把代码从svn中下载下来,然后上传到远程linux机器上就可以
4.1 文件上传
1
并不是所有的都是上面的配置,比如如果我自定义的插件,就是下面的风格
2
4.2 远程执行脚本
kill命令用nohup是因为不这样做,jenkins会抛出异常导致终止部署

sudo nohup kill -9 `ps -ef |grep scrapyd|awk '{print $2}' `  &
sleep 5
sudo /etc/init.d/scrapyd start

3
当然,也可以将这脚本写在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中
1
5 设置日志级别
1
2
构建工程后的日志如下
1
6 构建脚本
需要在命令行窗口执行一下svn,因访问的协议是https,它会让你选择对证书的信任程度.
1

# -*- 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 目录下,主目录也就是前面说的。
1

猜你喜欢

转载自blog.csdn.net/warrah/article/details/80771314
今日推荐