团队任务管理(Gitlab)及自动数据持久化(爬虫+MongoDB)方案(上)

前言

在团队日常工作中,必不可少的是任务监控、管理以及每月、每年的考核评价。在大数据时代,数据驱动研发是现在主流的趋势,团队的开发过程也离不开数据。曾经,每月的月度考核曾经也是我们团队最头疼的。因为生产考核的 依据难以收集,其准确性更是难以确认。年度的考核更是如此,一言难尽。

在进行团队敏捷实践时,我发现敏捷计划会议中的任务估点非常适合记录,如果结合一些自研工具、系统,我们能将团队中所有数据都持久化,所有问题应该都迎刃而解。

于是,结合团队任务管理特点和需求,经过充分调研比对,我们将工作任务转移到Gitlab进行管理,使用项目issue进行报工,使用label及issue的状态实现了项目任务的管理。

后边我将详细阐述大致方案,大家若有问题可以一起讨论。

相关知识点:

  • 敏捷开发
  • 任务管理:GitlabGitlab Api
  • 数据自动抓取及持久化:PythonGitlab CIMongoDB
  • 数据分析及展示:Python pandashtml、css、jsEcharts

一、定义工作流程

团队要有标准的工作流程,这样有利于团队进行项目任务管理和监控。

  • 每个项目在gitlab中建立一个project
  • 每个项目的每个需求,都建立成一个issue
  • 每个issue必须包含特定标签,用于定义任务规模任务类型任务状态

我把所有任务的标准流程定义如下

Created with Raphaël 2.2.0 收到新需求 新建issue 设计、开发 产物评审 关闭issue yes no

二、定义任务(issue)管理规范

对于每个任务,一定需要制定一个《任务管理规范》。用于规范所有项目、所有任务的issue。(这是数据抓取的关键——保证数据源的准确和稳定)

需要定义任务(Issue)必须包含:

  • 任务类型label:需求,设计,开发
  • 任务规模(预估工作量)label:1,2,3,5,8
  • 任务状态:open,closed
  • 预估时间、实际完成时间
  • 其它

要注意的是,任务规模(预估工作量)的评估方法。可以采用敏捷计划会议的点数评估方法,这样比较客观。(不过,我采用 “专家评估”。因为一个人评估也比较客观,能保证所有任务标准一致,关键是了计划会议的节约时间)

规范了issue的规范后,其实团队就能从Group的issue 面板中掌控现有项目的开发进度了。还能使用milestone等功能,这里我们就不做详细描述了。大家可以自行DIY~

三、任务数据自动抓取及持久化

终于到了需要写代码的环节了,期待已久。前言中有提到,我们实现数据自动抓取及持久化使用了PythonGitlab CIMongoDB

在最初我做数据抓取的时候确实走了弯路,弯路如下:

  1. 抓取团队group的项目列表,获取项目数据
  2. 通过项目数据,去抓每个项目的issue
  3. 在issue页面中抓取所需字段

后面发现可以实现,但是效率不高。且有些字段属于加载后请求的,爬虫直接访问链接无法获取。然后,我想了想如果有api可以调用就好了~~
团队任务管理(Gitlab)及自动数据持久化(爬虫+MongoDB)方案(上)_第1张图片
结果还真XX有!!直接蠢哭!

连忙安慰自己:这几天我充分学习了python 爬虫技术,掌握了爬取页面上的元素的技能,可喜可贺(wo xin ni ge gui)。

3.1 Python抓取数据

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)

3.2 解析数据及持久化

拿到数据后,进行数据的解析,获取我们需要的数据,依次入库

#解析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 代码省略
......

3.3 配置自动化入库

gitlab-CI 了解一下~,持续集成可以执行设置好的任务。你只需要选择好,python环境的image ,设置好stage所需要执行的命令行,再设定好时间,即可自动执行任务。

本篇小结

讲到这里,流程规范制定、数据抓取、持久化就完成了。在我设计中,数据抓取和数据分析、展示是两个项目各司其职,那么我们就先告一段落。

毕竟文章太长没人看!

你可能感兴趣的:(工作方法,项目管理,数据分析,python,前端,mongodb)