通過(guò)Python掃描代碼關(guān)鍵字并進(jìn)行預(yù)警的實(shí)現(xiàn)方法
近期線上出現(xiàn)一個(gè)bug,研發(fā)的小伙伴把測(cè)試環(huán)境的地址寫(xiě)死到代碼中,在上線前忘記修改,導(dǎo)致線上發(fā)布的代碼中使用了測(cè)試環(huán)境地址。
開(kāi)發(fā)過(guò)程中雖然有各種規(guī)范制度,但是難免有粗心,與其責(zé)備不如通過(guò)技術(shù)手段將問(wèn)題進(jìn)行避免。
為了達(dá)到上述需求,初步想通過(guò)以下步驟來(lái)實(shí)現(xiàn)代碼關(guān)鍵字自動(dòng)掃描告警。
Python安裝 Git安裝 GitPython安裝 定時(shí)任務(wù)配置(方案一:crontab 方案二:APScheduler) git代碼獲取 關(guān)鍵詞掃描 郵件告警#安裝python的依賴(lài)包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安裝包,版本號(hào):Python-3.7.1.tgz(在/opt下創(chuàng)建目錄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#創(chuàng)建軟連接,將自定目錄管理到指定目錄ln -s /usr/local/python3/bin/python3 /usr/bin/python3ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3#添加環(huán)境變量vi /etc/profileexport PATH=/usr/local/python3/bin:$PATH source /etc/profile#至此Python3安裝完畢,通過(guò)命令驗(yàn)證
Git安裝#下載git安裝包,版本號(hào):2.21.0wget https://github.com/git/git/archive/v2.21.0.tar.gz#解壓tar -zxvf v2.21.0.tar.gz#安裝make prefix=/usr/local/git install#添加環(huán)境變量vi /etc/profileexport PATH=/usr/local/git/bin:$PATHsource /etc/profile #至此Python3安裝完畢,通過(guò)命令驗(yàn)證
GitPython3安裝#可以采用在線安裝pip3 install GitPython#但是我這里由于網(wǎng)絡(luò)限制無(wú)法在線安裝,只能采用手動(dòng)安裝#下載依賴(lài)包,下載地址https://pypi.org/,可以根據(jù)關(guān)鍵字smmap、gitdb進(jìn)行檢索下載smmap-3.0.4.tar.gzgitdb-4.0.5.tar.gz#安裝tar -zxvf smmap-3.0.4.tar.gzcd smmap-3.0.4python3 setup.py installtar -zxvf gitdb-4.0.5.tar.gzcd gitdb-4.0.5python3 setup.py installtar -zxvf GitPython-3.1.2cd GitPython-3.1.2python3 setup.py install#安裝完畢后,可以寫(xiě)一個(gè)demo.py進(jìn)行驗(yàn)證復(fù)制代碼from git.repo import Repoimport osdemo_git_path = ’/opt/workspace/demo’#定義本地目錄Repo.clone_from(’http://git.***.com/demo/demo_git.git’,to_path=demo_git_path, branch=’master’)復(fù)制代碼 #最終代碼庫(kù)將克隆到本地目錄(執(zhí)行前將demo.py賦權(quán)) python3 demo.py
linux下配置定時(shí)任務(wù)#定時(shí)任務(wù)采用linux的crontab來(lái)實(shí)現(xiàn)#編輯定時(shí)任務(wù)crontab -e* * * * * python3 /opt/python3-workspace/demo.py >> /opt/python3-workspace/logs/demo.log#前五個(gè)是時(shí)間指令,分鐘(0-59)小時(shí)(0-28)日期(1-31)月份(1-12)星期幾(0-6,其中0代表星期日)#python3 是具體執(zhí)行的指令 后面跟的是執(zhí)行的腳本 在后面跟的是日志#編輯保存后會(huì)立即執(zhí)行#查看當(dāng)前正在運(yùn)行的任務(wù),本案例中已臨時(shí)注釋#crontab -l
原計(jì)劃使用linux的crontab進(jìn)行任務(wù)調(diào)度,但是在執(zhí)行GitPython命令時(shí)遇到兩個(gè)問(wèn)題,即
問(wèn)題一:在crontab中無(wú)法調(diào)用GitPython命令,解決方案,在crontab中增加GitPython的路徑
主要內(nèi)容是在crontab中增加如下代碼,至此第問(wèn)題一可以解決
SHELL=/bin/bashPATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/git/bin:/root/binMAILTO=rootHOME=/
問(wèn)題二:在crontab中執(zhí)行GitPython命令時(shí),無(wú)法讀取linux記錄的賬號(hào)密碼,導(dǎo)致自動(dòng)任務(wù)始終無(wú)法檢出代碼,由于該問(wèn)題一直未解決,因此決定采用python的定時(shí)任務(wù)調(diào)度解決該問(wèn)題,具體見(jiàn)下文
APScheduler安裝#這里由于網(wǎng)絡(luò)限制無(wú)法在線安裝,只能采用手動(dòng)安裝#下載依賴(lài)包,下載地址https://pypi.org/,可以根據(jù)關(guān)鍵字pytz、six、tzlocal進(jìn)行檢索下載pytz-2020.1.tar.gzsix-1.14.0.tar.gztzlocal-2.1.tar.gzAPScheduler-3.6.3.tar.gz#安裝tzlocaltar -zxvf tzlocal-2.1.tar.gzcd tzlocal-2.1python3 setup.py install#安裝sixtar -zxvf six-1.14.0.tar.gzcd six-1.14.0python3 setup.py install#安裝pytztar -zxvf pytz-2020.1.tar.gzcd pytz-2020.1python3 setup.py install#安裝APSchedulertar -zxvf APScheduler-3.6.3.tar.gzcd APScheduler-3.6.3python3 setup.py install至次APScheduler安裝完畢,寫(xiě)個(gè)demo驗(yàn)證下:
git代碼獲取通過(guò)Repo.clone_from獲取遠(yuǎn)程代碼倉(cāng)庫(kù),指定master分支,將遠(yuǎn)程代碼庫(kù)clone到本地/opt/workspace/demo目錄下,如果當(dāng)前目錄不為空,則通過(guò)shutil.rmtree()進(jìn)行級(jí)聯(lián)刪除
關(guān)鍵詞掃描利用os組件,實(shí)現(xiàn)對(duì)指定目錄進(jìn)行遞歸掃描,將符合要求的文件擴(kuò)展名.css .js .ftl .properties等文件進(jìn)行逐行掃描關(guān)鍵詞掃描其實(shí)就是利用正則表達(dá)式,對(duì)要掃描的關(guān)鍵詞進(jìn)行匹配,如果匹配成功則將目標(biāo)文件名稱(chēng)放入到異常文件列表詳細(xì)代碼如下:import osimport reproject_git_path = ’/opt/workspace/demo’cssnum = 0jsnum = 0ftlnum = 0fileList = []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);#循環(huán)打印目錄下的所有文件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(’共計(jì):’, len(fileList))
郵件告警郵件告警即通過(guò)smtp服務(wù)將上述匹配出來(lái)的異常文件列表,發(fā)送給對(duì)應(yīng)系統(tǒng)負(fù)責(zé)人詳細(xì)代碼如下:import smtplibfrom email.mime.text import MIMETextfrom email.header import Header# 第三方 SMTP 服務(wù)mail_host = 'smtp.****.com' # 設(shè)置服務(wù)器mail_user = '*****@****.com' # 用戶(hù)名mail_pass = '*****' # 口令sender = ’*****@****.com’receivers = [’***@***.com’] # 接收郵件,可設(shè)置為你的QQ郵箱或者其他郵箱message = MIMEText(’Python 郵件發(fā)送測(cè)試...’, ’plain’, ’utf-8’)message[’From’] = Header('Python自動(dòng)化檢查', ’utf-8’)message[’To’] = Header('系統(tǒng)負(fù)責(zé)人', ’utf-8’)subject = ’某系統(tǒng)近2個(gè)月版本內(nèi)網(wǎng)域名檢查結(jié)果’message[’Subject’] = Header(subject, ’utf-8’)try: smtpObj = smtplib.SMTP() smtpObj.connect(mail_host, 25) # 25 為 SMTP 端口號(hào) smtpObj.login(mail_user, mail_pass) smtpObj.sendmail(sender, receivers, message.as_string()) print '郵件發(fā)送成功'except smtplib.SMTPException: print 'Error: 無(wú)法發(fā)送郵件'
至此,該項(xiàng)目所需要的所有模塊均已開(kāi)發(fā)完畢,最后只需要根據(jù)自己的實(shí)際需求將上述各個(gè)模塊組合在一起運(yùn)行即可
由于本人是python初學(xué)者,代碼基本是按照順序執(zhí)行的方式進(jìn)行設(shè)計(jì)的,以能實(shí)現(xiàn)最終目的為主,為對(duì)代碼結(jié)構(gòu)、性能等合理性做出特別考慮
最后利用nohup命令,實(shí)現(xiàn)最終腳本的后臺(tái)運(yùn)行
總結(jié)
到此這篇關(guān)于通過(guò)Python掃描代碼關(guān)鍵字并進(jìn)行預(yù)警的文章就介紹到這了,更多相關(guān)Python掃描代碼關(guān)鍵字預(yù)警內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. ASP.NET MVC使用jQuery ui的progressbar實(shí)現(xiàn)進(jìn)度條2. Ajax對(duì)xml信息的接收和處理操作實(shí)例分析3. Jsp中request的3個(gè)基礎(chǔ)實(shí)踐4. Ajax返回值類(lèi)型與用法實(shí)例分析5. ASP動(dòng)態(tài)include文件6. php根據(jù)id生成10位不重復(fù)數(shù)字跟字母混合字符串7. Python request中文亂碼問(wèn)題解決方案8. 利用Java對(duì)PDF文件進(jìn)行電子簽章的實(shí)戰(zhàn)過(guò)程9. python簡(jiǎn)單實(shí)現(xiàn)9宮格圖片實(shí)例10. Java實(shí)戰(zhàn)之實(shí)現(xiàn)一個(gè)好用的MybatisPlus代碼生成器
