前言
受《分布式自动化版本发布系统》启发,决定对我们公司现有的shell脚本发版进行升级。业余时间研究,主要达到以下目的:
python基础学习后的实践,包括pygit、python3记录git更新日志到数据库。本文的主要目标。
定时自动拉取代码自动构建测试环境(git pull –>maven install –>pub to tomcat)。在一边探索使用python一边写这篇文章的时候,shell脚本已经完成目标。具体参考:写在前面:公司代码发布体系总结
一键将测试环境测试的代码发布到生产环境(使用生产配置),考虑到后期生产会分布式部署,需要持续支持。
- 目标一:python3 数据库学习
- 目标二:pygit学习
- 目标三:python3 调用shell
前二个做完,可以了解python的一些基本语法数据类型,把更新记录写入到数据库便于日常查看。
第三个,续用当前测试环境发布代码的shell脚本。
python3.5 and mysql5.7
mysql5.7 install
参考:官网安装方法。
首先:下载MySQL APT Repository。参考链接的方法,设置MySQL APT Repository。
sudo dpkg -i mysql-apt-config_0.8.0-1_all.deb
sudo apt-get update
sudo apt-get install mysql-server
第一个命令需要选择自己将要安装的mysql版本。
启动mysql
安装mysql workbench。
Connector/Python install
参考:官方网站
基本的python数据库操作
以下操作完成了对git log记录数据库。不足之处在于,没有找到pygit2的方法去追加git 日志,先跳过去了。
大部分代码参考:pygit2官网document
插入全部数据
import time,datetime
import config as config
from pygit2 import Repository
from pygit2 import GIT_SORT_NONE,GIT_SORT_TOPOLOGICAL, GIT_SORT_REVERSE,GIT_SORT_TIME
import mysql.connector
cnx = mysql.connector.connect(**config)
#存储日志的列表[[logA],[logB]...[logN]]
argslog=[]
cursor = cnx.cursor()
repo = Repository('homeOfyourGit/.git')
for commit in repo.walk(repo.head.target,GIT_SORT_TOPOLOGICAL | GIT_SORT_REVERSE):
#logA..N
logtmp=[]
logtmp.append(commit.tree.id.hex)
logtmp.append(commit.message)
logtmp.append(datetime.datetime.utcfromtimestamp(commit.author.time))
logtmp.append(commit.author.name)
print(logtmp)
argslog.append(logtmp)
add_log="INSERT INTO gitlog.gitlog (nvalue,comments,date,Author) VALUES (%s,%s,%s,%s)"
cursor.executemany(add_log, argslog)
cursor.close()
cnx.commit()
cnx.close()
更新git的log日志到数据库
更新数据涉及到一个增量更新git的log日志问题,pygit2中没有找到类似的api。所以考虑有时间作为新旧数据判断依据。
这里面的难点(对于小白的我来说),是如何比较时间。开始直接比较:
#下面 datetimelog 是tuple类型的
dataNewtime= datetimelog
#commit.author.time是long型自然是无法比较的,发现这个是使用了commit.author.time - dataNewtime,编译器提示发现类型不正确。
正确代码:
import time,datetime
import config as config
from pygit2 import Repository
from pygit2 import GIT_SORT_NONE,GIT_SORT_TOPOLOGICAL, GIT_SORT_REVERSE,GIT_SORT_TIME
import mysql.connector
cnx = mysql.connector.connect(user='root',password='????',host='127.0.0.1',database='gitlog')
argslog=[]
cursor = cnx.cursor()
cursor.execute("SELECT UNIX_TIMESTAMP(date) FROM gitlog.gitlog order by gitlog.date desc limit 1")
for (datetimelog) in cursor:
#既然是数组,取数组第一个值
dataNewtime= datetimelog[0]
repo = Repository('/home/chaosbom/git/ArhasMK/.git')
for commit in repo.walk(repo.head.target,GIT_SORT_TOPOLOGICAL | GIT_SORT_REVERSE):
#时间比数据库里的新则更新进去
if(commit.author.time > dataNewtime):
logtmp=[]
logtmp.append(commit.tree.id.hex)
logtmp.append(commit.message)
logtmp.append(datetime.datetime.utcfromtimestamp(commit.author.time))
logtmp.append(commit.author.name)
print(logtmp)
argslog.append(logtmp)
log=(commit.tree.id.hex,commit.message,datetime.datetime.utcfromtimestamp(commit.author.time).strftime("%Y-%m-%d %H:%M:%S"),commit.author.name)
add_log="INSERT INTO gitlog.gitlog (nvalue,comments,date,Author) VALUES (%s,%s,%s,%s)"
cursor.executemany(add_log, argslog)
cursor.close()
cnx.commit()
cnx.close()
测试后,新增记录被更新到数据库,当然记录很简单,解决的时候百度了很多次。
python调用shell
在百度中看了数篇关于python调用shell的入门文章。推荐使用Python subprocess模块。
Python subprocess模块学习总结
python调用shell命令易如反掌,现在需要考虑的是如何使python调用的脚本联动起来。
题外话
python在ubuntu下的编译器
本次实验使用了:
- Eclipse+pydev,没有解决pydev引用pygit2模块,编译的代码都不能跑
- Vim扩展方式,可以编译运行。看起来高大上,用起来还需要熟悉。
- PyCharm Community Edition,可以编译。体验最好。
python连接mysql使用config
未解决,使用的时候类型不匹配错误。
计划和实际
写这篇文章的时候是希望使用python来自动处理目前公司的发版流程,基于实际考虑,我编写的shell脚本已经足够应付发版工作,再深究下去并不是非常必要,目前发版的不足回头总结再弥补也来得及。那么问题来了,用python去实现的必要性?首先明确一点,我使用python的目的是学习和研究。其次,目前对于web系统的了解程度还不够深入,没有真正的学习过一个web框架。所以还是要做一个发布的系统出来。这个内容留到下一篇文章再继续了。