前言

受《分布式自动化版本发布系统》启发,决定对我们公司现有的shell脚本发版进行升级。业余时间研究,主要达到以下目的:

前二个做完,可以了解python的一些基本语法数据类型,把更新记录写入到数据库便于日常查看。
第三个,续用当前测试环境发布代码的shell脚本。

python3.5 and mysql5.7

mysql5.7 install

参考:官网安装方法
首先:下载MySQL APT Repository。参考链接的方法,设置MySQL APT Repository。

1
2
3
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
<!-- more -->
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日志问题,pygit2中没有找到类似的api。所以考虑有时间作为新旧数据判断依据。
这里面的难点(对于小白的我来说),是如何比较时间。开始直接比较:
/#下面 datetimelog 是tuple类型的
dataNewtime= datetimelog
/#commit.author.time是long型自然是无法比较的,发现这个是使用了commit.author.time - dataNewtime,编译器提示发现类型不正确。

正确代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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下的编译器

本次实验使用了:

python连接mysql使用config

未解决,使用的时候类型不匹配错误。

计划和实际

写这篇文章的时候是希望使用python来自动处理目前公司的发版流程,基于实际考虑,我编写的shell脚本已经足够应付发版工作,再深究下去并不是非常必要,目前发版的不足回头总结再弥补也来得及。那么问题来了,用python去实现的必要性?首先明确一点,我使用python的目的是学习和研究。其次,目前对于web系统的了解程度还不够深入,没有真正的学习过一个web框架。所以还是要做一个发布的系统出来。这个内容留到下一篇文章再继续了。