对于大部分的公司来说,搭建一套自动化发版流程是必备的。自动化发版的优势:
- 节省沟通成本。让项目,测试,软件能更高效的运转。
- 节约人力,没有自动化发版,手动发版的效率不忍直视。
对于没有自动化,或者自动化程度不高的中小公司,低效带来的人力成本是容易被忽视的,但是的确存在的。
自动化发版可以自动到什么程度,取决于团队对规则的执行力,脱离了执行力,再好的工具也是摆设。
一套完整的自动化发版流程如下图所示,本文重点介绍第一部分的实现。第二部分主要是一些Jenkins的邮件配置和releasenote的自动生成脚本。
这套流程使用的工具:
bug管理工具: redmine
编译工具: Jenkins服务器
版本服务器: ubuntu服务器
redmine/jira/mantis/禅道等bug/项目管理的优缺点,不做过多的讨论,对于中心公司最关键的就是开源,免费。开源可定制,免费不花钱。
编译服务器使用大名鼎鼎的Jenkins,如果jenkins都不知道,可以自行百度一下。
版本服务器没有过多要求,就是存放服务器,使用ubuntu/windows系统都可以。这里使用ubuntu主要是因为jenkins连接ubuntu使用ssh方式登录,拷贝,更便捷。
一. redmine触发Jenkins自动编译流程。
规则:计划发布版本链接的问题,全部解决后redmine自动触发jenkins编译
优点:redmine自动触发Jenkins编译,无需额外人员手动发布,多项目的发版,这套规则很实用。
具体步骤:
1. 项目管理人员:
1. 在redmine上建立对应的project。
2. 建立计划发布版本如 IOT_PCBA_V001_20200101。
2. 测试人员:
测试将所有需要在IOT_PCBA_V001_20200101版本解决的问题关联到该目标版本。
3. 开发人员:
开发人员提交bug,fix后更新redmine/JIRA的状态到已解决。
脚本会定时检测IOT_PCBA_V001_20200101版本的所有问题解决状态,当所有问题是已经解决,则开启编译。
具体实现自动化触发编译脚本:
脚本实现:python
1.设定一个定时器,定时查询redmine 计划发布版本的问题状态。
*/10 * * * * python /home/ubuntu/xl/auto-build/main.py
2.定时查询redmine各个计划版本的问题解决状态,选择服务器,触发jenkins上的jobs编译。
实现的主要步骤以及代码:
- 查询数据库中计划发布版本链接的问题是否解决
- 使用jenkins插件连接enkins服务器
- redmine的当前版本的build字段是1,则说明已经编译了,无需再次编译
- 寻找空闲服务器
- jenkins服务器开始编译
- 更新redmine build字段,避免下次轮询再次编译
import jenkins
def Build(self, sqlite):
``` 1. 查询数据库中计划发布版本链接的问题是否解决```
info_list = sqlite.GetBuildInfo()
if info_list == None or len(info_list) <= 0:
return
```2. 使用jenkins插件连接enkins服务器```
server = jenkins.Jenkins(contast.JENKINS_URL,
username=contast.JENKINS_USERNAME, password=contast.JENKINS_PASSWORD)
print server
print server.jobs_count()
for info in info_list:
param = {'versionname':None, 'buildtype': None, 'versionid':None }
param['buildtype'] = info['buildtype']
identifier = info['identifier']
param['versionname'] = info['versionname']
logging.debug('Build State:' + info['build'])
```3. redmine的当前版本的build字段是1,则说明已经编译了,无需再次编译```
if info['build'] == '1':return
logging.debug('Trigger Build! identifier:%s, %s' %(identifier, param))
```4. 寻找空闲服务器```
item = self.GetFreeServer(identifier)
if item == None:
logging.debug("Please Check Your Server,Maybe You Don't Config!!");
return
```5. jenkins服务器开始编译```
server.build_job(item, param)
'''update version build states, don't build next time'''
version_id = info['versionid']
```6.更新redmine build字段,避免下次轮询再次编译```
sqlite.UpdateBuildField(version_id)