基于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多天,期间断断续续的看,断断续续的边学边练习里面的例子。插播了很多其他事情,尤其是一些无聊的手机游戏,双休要跟老婆见面,时间蛮少了,坚持下来确实有点苦难,还好基础看完了。继续加油!下面硬着头皮继续下一个阶段的学习实践。
发版系统的原型
- 拉去分支的代码;分支是人工切换的,自动执行发布脚本去获取分支,并执行拉取动作。
- 使用maven的编译命令,按制定参数编译代码;其中分为基础的依赖包先编译,再编译各个独立的webent。每个webent独立不互相影响,都必须有依赖包。需要一个表来管理各个webent名,管理基础包(随着代码扩充还会新增)。webents。还需要一个表来管理发版的参数。
- 编译完成后,shell代码要将编译结果发布到tomcat容器中,容器路径在server.xml中配置了。其实这个地方理论上来将是没有必要的,个人认为,编译阶段就可以定义好编译的路径。研究下maven,把现在的shell流程简化。参考:http://blog.csdn.net/rj042/article/details/6834557。后发现pom.xml修改会影响研发的windows下编译发布路径,维持现状。
- 代码放到tomcat的容器后,就是重启tomcat。也就是能够启动tomcat的操作。
- 每个webent都有自己定义log级别(log4j)的配置文件,默认情况下是info级别,但是研发有需求(实际上经常让我vi命令去该配置,然后查看日志,报错再给它们,影响了我的生产力),变更日志级别,滚动查看tomcat日志。
- 打包发版的压缩包。直接使用测试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()