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

这篇文章的主要目的是记录使用python来编写公司发版系统的想法、过程。

一、构思

主要特征

该系统拥有web界面
代码发布功能:可以在web中实现各个webent单独发布、整体发布
git历史查看功能:查看git提交历史、查看每次提交修改文件。所以需要定时自动更新日志。
两次发布版本差异对比功能

实践能力

一个python的web框架
python调度操作git、maven、执行脚本
python写入和读取数据库
python/git版本对比

二、计划

1、寻找一款python的web框架。定为django。
2、学习并实践该框架
3、设计系统的MVC
4、各个功能编码实现和测试

三、执行

django的安装

安装的方法丰富多彩,很简单。参考github上django/django
或者参考官方网站的安装办法。

django的学习

主要参考官网的翻译资料:http://python.usyiyi.cn/translate/django_182/index.html
这里从文章发出到现在(2017/1/8),持续有40多天,期间断断续续的看,断断续续的边学边练习里面的例子。插播了很多其他事情,尤其是一些无聊的手机游戏,双休要跟老婆见面,时间蛮少了,坚持下来确实有点苦难,还好基础看完了。继续加油!下面硬着头皮继续下一个阶段的学习实践。

发版系统的原型

  1. 拉去分支的代码;分支是人工切换的,自动执行发布脚本去获取分支,并执行拉取动作。
  2. 使用maven的编译命令,按制定参数编译代码;其中分为基础的依赖包先编译,再编译各个独立的webent。每个webent独立不互相影响,都必须有依赖包。需要一个表来管理各个webent名,管理基础包(随着代码扩充还会新增)。webents。还需要一个表来管理发版的参数。
  3. 编译完成后,shell代码要将编译结果发布到tomcat容器中,容器路径在server.xml中配置了。其实这个地方理论上来将是没有必要的,个人认为,编译阶段就可以定义好编译的路径。研究下maven,把现在的shell流程简化。参考:http://blog.csdn.net/rj042/article/details/6834557。后发现pom.xml修改会影响研发的windows下编译发布路径,维持现状。
  4. 代码放到tomcat的容器后,就是重启tomcat。也就是能够启动tomcat的操作。
  5. 每个webent都有自己定义log级别(log4j)的配置文件,默认情况下是info级别,但是研发有需求(实际上经常让我vi命令去该配置,然后查看日志,报错再给它们,影响了我的生产力),变更日志级别,滚动查看tomcat日志。
  6. 打包发版的压缩包。直接使用测试tomcat的代码,替换配置文件打包。

编码阶段

准备工作

在我的django工程目录下新建自己的网站:

#新建项目
django-admin startproject mydemo
#新建网站
cd mydemo
python3.5 manage.py startapp gitlog

执行完
chaosbom@chaosbomPC:~/PycharmProjects/mydemo$ tree
.
├── gitlog
│ ├── admin.py
│ ├── apps.py
│ ├── init.py
│ ├── migrations
│ │ └── init.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── mydemo
├── init.py
├── pycache
│ ├── init.cpython-35.pyc
│ └── settings.cpython-35.pyc
├── settings.py
├── urls.py
└── wsgi.py

模型化

编辑gitlog/model.py

from django.db import models
# Create your models here.

#maven编译使用的配置表
class Profiles(models.Model):
    P= models.CharField(max_length=20)
    add_date = models.DateTimeField('date published')


#管理webents的表,记录webent上次发版的时间以及上次发版使用的配置
class Webents(models.Model):
    name= models.CharField(max_length=50)
    lastPubStatus=models.ForeignKey(Profiles,default=1)
    lastPubDate=models.DateTimeField('date published')
    add_date = models.DateTimeField('date published')


#author提交人,message提交备注,commitsFile修改文件,git提交的nvalue唯一号
class Commits(models.Model):
    author= models.CharField(max_length=20)
    message = models.CharField(max_length=200)
    commitsFile = models.CharField(max_length=2000)
    nvalue=models.CharField(max_length=2000)
    commit_date = models.DateTimeField()

编辑mydemo/settings.py:该Django 项目的设置/配置。至于它如何运作的,此处略。仅修改以下对应内容。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'gitlog',
]

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    # }
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '你的mysql数据库名称',
        'USER': 'root',
        'PASSWORD': '你的密码',
        'HOST': '127.0.0.1',
        'PORT': '3306',
    }
}

接着让模型自动在数据库中生成表:

python3.5 manage.py check
python3.5 manage.py makemigrations gitlog
python3.5 manage.py migrate

登陆数据库查看,已经能够看到模型对应的数据库。

初始化数据库:
使用python的脚本来更新。

from __future__ import print_function
from datetime import date, datetime, timedelta
import mysql.connector

cnx = mysql.connector.connect(user='root',password='yb198697', database='gitlog')
cursor = cnx.cursor()

tomorrow = datetime.now().date() + timedelta(days=1)
today=datetime.now().date()+ timedelta(days=0)

profiles=['product','st' ,'stKa' ,'st-https' ,'nowx']
add_profile=("INSERT INTO gitlog_profiles "
               "(P, add_date) "
               "VALUES (%s, %s)")

for profile in profiles:
    data_profiles=(profile, today)
    cursor.execute(add_profile,data_profiles)


webents=['mk-aggregator' ,'mk-img-webent' ,'mk-wm-msger' ,'mk-app-webent' ,'mk-job-webent' ,'mk-openApi' ,'mk-wm-webent' ,
         'mk-yum-webent' ,'mk-imgr-webent' ,'mk-passport' ,'mk-sn-webent' ,'mk-intf-webent' ,'mk-imgr-rpc' ,'mk-yum-rpc' ,
         'mk-mdata-rpc']
add_webent=("INSERT INTO gitlog_webents "
               "(name, lastPubStatus_id,lastPubDate,add_date) "
               "VALUES (%s, %s, %s, %s)")


for webent in webents:
    data_webents=(webent,37, tomorrow,tomorrow)
    cursor.execute(add_webent,data_webents)


# Make sure data is committed to the database
cnx.commit()

cursor.close()
cnx.close()
posted @ 2016-11-24 23:44  windanchaos  阅读(140)  评论(0编辑  收藏  举报