基于git maven的自动构建系统系列一

前言

受《分布式自动化版本发布系统》启发,决定对我们公司现有的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下的编译器

本次实验使用了:

  1. Eclipse+pydev,没有解决pydev引用pygit2模块,编译的代码都不能跑
  2. Vim扩展方式,可以编译运行。看起来高大上,用起来还需要熟悉。
  3. PyCharm Community Edition,可以编译。体验最好。

python连接mysql使用config

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

计划和实际

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

posted @ 2016-11-03 22:02  windanchaos  阅读(376)  评论(0编辑  收藏  举报