近期线上出现一个bug,研发的小伙伴把测试环境的地址写死到代码中,在上线前忘记修改,导致线上发布的代码中使用了测试环境地址。
开发过程中虽然有各种规范制度,但是难免有粗心,与其责备不如通过技术手段将问题进行避免。
为了达到上述需求,初步想通过以下步骤来实现代码关键字自动扫描告警。
- Python安装
- Git安装
- GitPython安装
- 定时任务配置(方案一:crontab 方案二:APScheduler)
- git代码获取
- 关键词扫描
- 邮件告警
#安装python的依赖包 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel gcc #下载Python安装包,版本号:Python-3.7.1.tgz(在/opt下创建目录Python3) wget https://www.python.org/ftp/python/3.7.1/Python-3.7.1.tgz #解压安装包 tar -zxvf Python-3.8.1.tgz #指定python3安装目录 ./configure --prefix=/usr/local/python3 #编译&安装 make && make install #创建软连接,将自定目录管理到指定目录 ln -s /usr/local/python3/bin/python3 /usr/bin/python3 ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 #添加环境变量 vi /etc/profile export PATH=/usr/local/python3/bin:$PATH source /etc/profile #至此Python3安装完毕,通过命令验证
Git安装 #下载git安装包,版本号:2.21.0 wget https://github.com/git/git/archive/v2.21.0.tar.gz #解压 tar -zxvf v2.21.0.tar.gz #安装 make prefix=/usr/local/git install #添加环境变量 vi /etc/profile export PATH=/usr/local/git/bin:$PATH source /etc/profile #至此Python3安装完毕,通过命令验证
GitPython3安装 #可以采用在线安装 pip3 install GitPython #但是我这里由于网络限制无法在线安装,只能采用手动安装 #下载依赖包,下载地址https://pypi.org/,可以根据关键字smmap、gitdb进行检索下载 smmap-3.0.4.tar.gz gitdb-4.0.5.tar.gz #安装 tar -zxvf smmap-3.0.4.tar.gz cd smmap-3.0.4 python3 setup.py install tar -zxvf gitdb-4.0.5.tar.gz cd gitdb-4.0.5 python3 setup.py install tar -zxvf GitPython-3.1.2 cd GitPython-3.1.2 python3 setup.py install #安装完毕后,可以写一个demo.py进行验证 复制代码 from git.repo import Repo import os demo_git_path = '/opt/workspace/demo' #定义本地目录 Repo.clone_from('http://git.***.com/demo/demo_git.git',to_path=demo_git_path, branch='master') 复制代码 #最终代码库将克隆到本地目录(执行前将demo.py赋权) python3 demo.py
linux下配置定时任务 #定时任务采用linux的crontab来实现 #编辑定时任务 crontab -e * * * * * python3 /opt/python3-workspace/demo.py /opt/python3-workspace/logs/demo.log #前五个是时间指令,分钟(0-59)小时(0-28)日期(1-31)月份(1-12)星期几(0-6,其中0代表星期日) #python3 是具体执行的指令 后面跟的是执行的脚本 在后面跟的是日志 #编辑保存后会立即执行 #查看当前正在运行的任务,本案例中已临时注释# crontab -l
原计划使用linux的crontab进行任务调度,但是在执行GitPython命令时遇到两个问题,即
问题一:在crontab中无法调用GitPython命令,解决方案,在crontab中增加GitPython的路径
主要内容是在crontab中增加如下代码,至此第问题一可以解决
SHELL=/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/git/bin:/root/bin MAILTO=root HOME=/
问题二:在crontab中执行GitPython命令时,无法读取linux记录的账号密码,导致自动任务始终无法检出代码,由于该问题一直未解决,因此决定采用python的定时任务调度解决该问题,具体见下文
APScheduler安装 #这里由于网络限制无法在线安装,只能采用手动安装 #下载依赖包,下载地址https://pypi.org/,可以根据关键字pytz、six、tzlocal进行检索下载 pytz-2020.1.tar.gz six-1.14.0.tar.gz tzlocal-2.1.tar.gz APScheduler-3.6.3.tar.gz #安装tzlocal tar -zxvf tzlocal-2.1.tar.gz cd tzlocal-2.1 python3 setup.py install #安装six tar -zxvf six-1.14.0.tar.gz cd six-1.14.0 python3 setup.py install #安装pytz tar -zxvf pytz-2020.1.tar.gz cd pytz-2020.1 python3 setup.py install #安装APScheduler tar -zxvf APScheduler-3.6.3.tar.gz cd APScheduler-3.6.3 python3 setup.py install 至次APScheduler安装完毕,写个demo验证下:
git代码获取 通过Repo.clone_from获取远程代码仓库,指定master分支,将远程代码库clone到本地/opt/workspace/demo目录下, 如果当前目录不为空,则通过shutil.rmtree()进行级联删除
关键词扫描 利用os组件,实现对指定目录进行递归扫描,将符合要求的文件扩展名.css .js .ftl .properties等文件进行逐行扫描 关键词扫描其实就是利用正则表达式,对要扫描的关键词进行匹配,如果匹配成功则将目标文件名称放入到异常文件列表 详细代码如下: import os import re project_git_path = '/opt/workspace/demo' cssnum = 0 jsnum = 0 ftlnum = 0 fileList = [] pattern = re.compile(r'.test.com') def analysiFile(pathFilename): #print('文件名:', filename) fo = open(pathFilename, 'r', encoding='UTF-8') for line in fo.readlines(): match = pattern.search(line) if match: if(fileList.count(filename) == 0): fileList.append(filename); #循环打印目录下的所有文件 for parentdir, dirname, filenames in os.walk(project_git_path): for filename in filenames: if os.path.splitext(filename)[1] == '.css': #分析具体文件 analysiFile(parentdir + '\\' + filename) if os.path.splitext(filename)[1] == '.js': #分析具体文件 analysiFile(parentdir + '\\' + filename) if os.path.splitext(filename)[1] == '.ftl': #分析具体文件 analysiFile(parentdir + '\\' + filename) if os.path.splitext(filename)[1] == '.properties': #分析具体文件 analysiFile(parentdir + '\\' + filename) for item in fileList: print('命中文件:', item) print('共计:', len(fileList))
邮件告警 邮件告警即通过smtp服务将上述匹配出来的异常文件列表,发送给对应系统负责人 详细代码如下: import smtplib from email.mime.text import MIMEText from email.header import Header # 第三方 SMTP 服务 mail_host = "smtp.****.com" # 设置服务器 mail_user = "*****@****.com" # 用户名 mail_pass = "*****" # 口令 sender = '*****@****.com' receivers = ['***@***.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱 message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8') message['From'] = Header("Python自动化检查", 'utf-8') message['To'] = Header("系统负责人", 'utf-8') subject = '某系统近2个月版本内网域名检查结果' message['Subject'] = Header(subject, 'utf-8') try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtpObj.login(mail_user, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print "邮件发送成功" except smtplib.SMTPException: print "Error: 无法发送邮件"
至此,该项目所需要的所有模块均已开发完毕,最后只需要根据自己的实际需求将上述各个模块组合在一起运行即可
由于本人是python初学者,代码基本是按照顺序执行的方式进行设计的,以能实现最终目的为主,为对代码结构、性能等合理性做出特别考虑
最后利用nohup命令,实现最终脚本的后台运行
总结
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 【雨果唱片】中国管弦乐《鹿回头》WAV
- APM亚流新世代《一起冒险》[FLAC/分轨][106.77MB]
- 崔健《飞狗》律冻文化[WAV+CUE][1.1G]
- 罗志祥《舞状元 (Explicit)》[320K/MP3][66.77MB]
- 尤雅.1997-幽雅精粹2CD【南方】【WAV+CUE】
- 张惠妹.2007-STAR(引进版)【EMI百代】【WAV+CUE】
- 群星.2008-LOVE情歌集VOL.8【正东】【WAV+CUE】
- 罗志祥《舞状元 (Explicit)》[FLAC/分轨][360.76MB]
- Tank《我不伟大,至少我能改变我。》[320K/MP3][160.41MB]
- Tank《我不伟大,至少我能改变我。》[FLAC/分轨][236.89MB]
- CD圣经推荐-夏韶声《谙2》SACD-ISO
- 钟镇涛-《百分百钟镇涛》首批限量版SACD-ISO
- 群星《继续微笑致敬许冠杰》[低速原抓WAV+CUE]
- 潘秀琼.2003-国语难忘金曲珍藏集【皇星全音】【WAV+CUE】
- 林东松.1997-2039玫瑰事件【宝丽金】【WAV+CUE】