在团队日常工作中,必不可少的是任务监控、管理以及每月、每年的考核评价。在大数据时代,数据驱动研发是现在主流的趋势,团队的开发过程也离不开数据。曾经,每月的月度考核曾经也是我们团队最头疼的。因为生产考核的 依据难以收集,其准确性更是难以确认。年度的考核更是如此,一言难尽。
在进行团队敏捷实践时,我发现敏捷计划会议中的任务估点非常适合记录,如果结合一些自研工具、系统,我们能将团队中所有数据都持久化,所有问题应该都迎刃而解。
于是,结合团队任务管理特点和需求,经过充分调研比对,我们将工作任务转移到Gitlab进行管理,使用项目issue进行报工,使用label及issue的状态实现了项目任务的管理。
后边我将详细阐述大致方案,大家若有问题可以一起讨论。
相关知识点:
Gitlab
、Gitlab Api
Python
、 Gitlab CI
、MongoDB
Python pandas
、html、css、js
、Echarts
团队要有标准的工作流程,这样有利于团队进行项目任务管理和监控。
任务规模
、任务类型
、任务状态
等我把所有任务的标准流程定义如下
对于每个任务,一定需要制定一个《任务管理规范》。用于规范所有项目、所有任务的issue。(这是数据抓取的关键——保证数据源的准确和稳定)
需要定义任务(Issue)必须包含:
需求
,设计
,开发
1
,2
,3
,5
,8
open
,closed
要注意的是,任务规模(预估工作量)的评估方法。可以采用敏捷计划会议的点数评估方法,这样比较客观。(不过,我采用 “专家评估”。因为一个人评估也比较客观,能保证所有任务标准一致,关键是了计划会议的节约时间)
规范了issue的规范后,其实团队就能从Group的issue 面板中掌控现有项目的开发进度了。还能使用milestone等功能,这里我们就不做详细描述了。大家可以自行DIY~
终于到了需要写代码的环节了,期待已久。前言中有提到,我们实现数据自动抓取及持久化使用了Python
、Gitlab CI
、MongoDB
。
在最初我做数据抓取的时候确实走了弯路,弯路如下:
后面发现可以实现,但是效率不高。且有些字段属于加载后请求的,爬虫直接访问链接无法获取。然后,我想了想如果有api可以调用就好了~~
结果还真XX有!!直接蠢哭!
连忙安慰自己:这几天我充分学习了python 爬虫技术,掌握了爬取页面上的元素的技能,可喜可贺(wo xin ni ge gui)。
gitlab的issue数据,可以调用gitlab-api来获取。返回的数据是json数据,那么我们就可以轻松解析,不需要单独去爬了。
关于api的详细文档,请见:GitLab API
选择使用最热门的Python进行编写,使用requests模块发送请求。(圆了自己一个写爬虫的梦)
# 定义项目
gitProjects = [
{'id':'yyy','name':'trp'},
{'id': 'xxx', 'name': 'hub2c'}
]
#循环调用
def getGitIssue(project):
#考核周期边界日期计算
sprint_month = getsprint() #略
# 拼接api调用路径
# 条件:issue状态处于closed(已交付的任务)
# && 考核周期内更新(以免拉取到所有关闭的issue)&& 100个
url = GITLAB_URL + project['id']
+"/issues?state=closed & updated_after="
+ sprint_month +"&per_page=100"
# 请求头
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
'PRIVATE-TOKEN':'xxxxxx' # 申请自己账户的token
}
# 设置 请求路径、请求头、跳过验证
res = requests.get(url,headers=headers, verify=False)
data = []
if res.status_code == 200:
data = res.text
return praseIssue(json.loads(data),project)
拿到数据后,进行数据的解析,获取我们需要的数据,依次入库
#解析issue列表
def praseIssue(data,project):
list=[]
print('项目:%s 本周期issue数:%s' %(project['name'],len(data)))
for index in range(len(data)):
# developer处理
developer = ''
if(data[index]["assignee"] != None):
developer = data[index]["assignee"]['name']
else:
developer = data[index]['author']["name"]
# 考核月
donetime = data[index]["closed_at"]
sprint = getMonth(donetime)
dict = {
"id":data[index]["id"], # 任务id
"issueName":data[index]["title"], # 任务名
'developer':developer, # 任务承接人
......,# 需要什么拿什么
'point':getPoints(data[index]["labels"]), # 任务规模
'description':data[index]["description"], # 任务描述
'sprint':sprint, # 任务考核周期
'state':data[index]["state"] # 任务状态
}
list.append(dict)
return list
选择MongoDB,配合pymongo模块,进行入库
#先将list转换为pandas DataFrame
data = pd.DataFrame(lists)
# 直接入库
re = insertData(data)
# insertData 代码省略
......
gitlab-CI 了解一下~,持续集成可以执行设置好的任务。你只需要选择好,python环境的image ,设置好stage所需要执行的命令行,再设定好时间,即可自动执行任务。
讲到这里,流程规范制定、数据抓取、持久化就完成了。在我设计中,数据抓取和数据分析、展示是两个项目各司其职,那么我们就先告一段落。
毕竟文章太长没人看!