近期线上出现一个bug,研发的小伙伴把测试环境的地址写死到代码中,在上线前忘记修改,导致线上发布的代码中使用了测试环境地址。

开发过程中虽然有各种规范制度,但是难免有粗心,与其责备不如通过技术手段将问题进行避免。

为了达到上述需求,初步想通过以下步骤来实现代码关键字自动扫描告警。

  1. Python安装
  2. Git安装
  3. GitPython安装
  4. 定时任务配置(方案一:crontab   方案二:APScheduler)
  5. git代码获取
  6. 关键词扫描
  7. 邮件告警
#安装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命令,实现最终脚本的后台运行

  #文章中的安装包,如果有需要可以站内信联系

通过Python扫描代码关键字并进行预警的更多相关文章

  1. python flake8 代码扫描

    一.介绍 Flake8 是由Python官方发布的一款辅助检测Python代码是否规范的工具,flake8是下面三个工具的封装: PyFlakes Pep8 NedBatchelder's McCab ...

  2. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  3. Python中的关键字的用法

    Python有哪些关键字 -Python常用的关键字 and, del, from, not, while, as, elif, global, or, with, assert, else, if, ...

  4. python扫描proxy并获取可用代理ip列表

    mac或linux下可以work的代码如下: # coding=utf-8 import requests import re from bs4 import BeautifulSoup as bs ...

  5. 《大话设计模式》Python版代码实现

    上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的 ...

  6. Python 的with关键字

    Python 的with关键字 看别人的代码时,with关键字经常会出现,博主决定梳理一下with以及python中上下文(context)的概念 1. 上下文管理器概念 Context Manage ...

  7. Python基础代码1

    Python基础代码 import keyword#Python中关键字 print(keyword.kwlist) ['False', 'None', 'True', 'and', 'as', 'a ...

  8. Python一行代码

    1:Python一行代码画出爱心 print]+(y*-)**-(x**(y*<= ,)]),-,-)]) 2:终端路径切换到某文件夹下,键入: python -m SimpleHTTPServ ...

  9. python爬虫代码

    原创python爬虫代码 主要用到urllib2.BeautifulSoup模块 #encoding=utf-8 import re import requests import urllib2 im ...

随机推荐

  1. Docker虚拟化管理:30分钟教你学会用Docker

    关于Docker的官方介绍网上太多了我就不贴了,就实际体验来说Docker可以极大的简化环境搭建及服务部署的操作流程,大大降低部署的时间成本,解放你的双手. 本文不会深入讲解Docker底层架构及运行 ...

  2. 【Linux常见命令】dos2unix命令,unix2dos命令

    我们都知道.打回车键就是换行的意思. 在不同系统下打回车键效果是不同的: MAC OS下:dakdhih \r LINUX下:dakdhih \n DOS\WINDOWS下:dakdhih \r\n ...

  3. React-Native iOS真机调试(新版)

    2019独角兽企业重金招聘Python工程师标准>>> React-Native iOS真机调试 看到网上很多以前的文章 找到两种方法 一 修改AppDelegate 把URL的替换 ...

  4. Aurora: 来自 Amazon 的高性能的企业级关系数据库,兼容 MySQL

    近日,在美国召开的AWS re:Invent云计算大会上,Amazon高级副总裁安迪·杰西发布了企业级关系数据库Aurora.Aurora是一个面向Amazon RDS(关系数据库服务).兼容MySQ ...

  5. 数据库SQL语言从入门到精通--Part 2--MySQL安装

    数据库从入门到精通合集(超详细,学习数据库必看) 首先给出的简单安装方式,文末给出标准的安装方式. 第一步下载我的压缩包 链接:https://pan.baidu.com/s/1EE40dU0j2U1 ...

  6. codeforce 270B Multithreading

    B. Multithreading Emuskald is addicted to Codeforces, and keeps refreshing the main page not to miss ...

  7. CF1335E Three Blocks Palindrome

    就是我这个菜鸡,赛时写出了 E2 的做法,但是算错复杂度,导致以为自己的做法只能AC E1,就没交到 E2 上,然后赛后秒A..... 题意 定义一种字串为形如:\([\underbrace{a, a ...

  8. Python编程求解第1天1分钱之后每天两倍持续一个月的等比数列问题

    一.问题 问题1 场景:如果你未来的丈母娘要求你,第1天给她1分钱,第2天给2分钱,第3天给4分钱,以此类推,每天给前一天的2倍,给1个月(按30天)算就行.问:第30天给多少钱,总共给多少钱? 问题 ...

  9. VUE简单整理

    在用 Vue.js 构建大型应用时推荐使用 NPM 安装: # 最新稳定版 $ cnpm install vue 命令行工具 Vue.js 提供一个官方命令行工具,可用于快速搭建大型单页应用. # 全 ...

  10. 算法——Java实现栈

    栈 定义: 栈是一种先进后出的数据结构,我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何元素的栈称为空栈 栈的java代码实现: 基于数组: import org.junit.jupite ...