zoukankan      html  css  js  c++  java
  • 基于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框架。所以还是要做一个发布的系统出来。这个内容留到下一篇文章再继续了。

  • 相关阅读:
    Ajax beforeSend和complete 方法
    CLR Via CSharp读书笔记(17):委托
    linux上部署Django项目(Apache+mod_wsgi+django)
    用Apache+mod_wsgi部署python程序 作者:leven | 日期20101129 00:09:37
    VirtualBox桥接网络的简单配置,让虚拟机直接访问网络
    Django and mod_wsgi deploy example
    How to use Django with FastCGI, SCGI, or AJP¶
    Fedora 15 下编译安装apache
    Change Ubuntu Server from DHCP to a Static IP Address
    How to Verify a CentOS Linux Server is 32 Bit or 64 Bit
  • 原文地址:https://www.cnblogs.com/windanchaos/p/6398814.html
Copyright © 2011-2022 走看看