基于Gitlab进行开发团队管理的尝试——02.成员负载可视化

What

通过图表直观展示团队成员工作负载、贡献、以及项目进度等信息
核心目的: 细化工作量, 通过可量化、可追踪的方式, 把控项目进度

效果如下:

00

高价值指标包括:

  1. 成员当前issue数量
  2. 当前版本项目issue进度及分布
  3. 成员参与issue数量
  4. bug数量趋势

Why

  1. 通过燃尽图追踪项目进度及任务pipeline分布, 实时掌握项目进度, 降低延期风险
  2. 展示成员负载, 方便high-level协调调度开发资源
  3. 量化成员工作贡献
  4. 分析项目质量趋势及问题分布

How

  1. 定时轮询 gitlab相关项目的issue列表并持久化。
    1. 为了减少工作量, 直接存储json字段, 查询时解析
  2. 通过 metabase 展示数据指标图表

问题1: 一个issue经过多人开发(前端+后端), 工作量如何计算?

通过成员参与过的issue进行计算, 可以做到相对准确

DB结构定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
CREATE TABLE if not exists `issue`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '标识',
`issue_iid` int(10) NOT NULL COMMENT 'issue标识',
`group_id` int(10) NOT NULL COMMENT '组标识',
`group_name` varchar(128) NOT NULL COMMENT '组名',
`project_id` int(10) NOT NULL COMMENT '项目标识',
`project_name` varchar(128) NOT NULL COMMENT '项目名',
`state` varchar(128) NOT NULL COMMENT '状态',
`title` varchar(256) NOT NULL COMMENT '标题',
`labels` varchar(128) COMMENT '标签',
`description` text COMMENT '描述',
`author` json not null COMMENT '创建人',
`assignee` json COMMENT '指派人',
`milestone` json COMMENT '里程碑',
`due_date` date COMMENT '到期日',
`created_at` datetime NOT NULL COMMENT '创建时间',
`updated_at` datetime COMMENT '修改时间',
`closed_at` datetime COMMENT '关闭时间',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8
ROW_FORMAT = DYNAMIC COMMENT ='任务';

CREATE TABLE if not exists `participant`
(
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '标识',
`issue_iid` int(10) NOT NULL COMMENT 'issue标识',
`group_id` int(10) NOT NULL COMMENT '组标识',
`group_name` varchar(128) NOT NULL COMMENT '组名',
`project_id` int(10) NOT NULL COMMENT '项目标识',
`project_name` varchar(128) NOT NULL COMMENT '项目名',
`title` varchar(256) NOT NULL COMMENT '标题',
`name` varchar(128) NOT NULL COMMENT '姓名',
`username` varchar(128) NOT NULL COMMENT '用户名',
PRIMARY KEY (`id`)
) ENGINE = InnoDB
DEFAULT CHARSET = utf8
ROW_FORMAT = DYNAMIC COMMENT ='参与者';

参考指标SQL

  1. 显示json字段中的中文, 需要通过 ->>, 如 issue.assignee->>'$.name'
  2. metabase 可以通过 {{param}} 指定参数变量, 如 milestone->> '$.title'= {{milestone}}

1. 成员参与工作量

1
2
3
4
SELECT `participant`.`name` AS `name`, count(*) AS `count`
FROM `participant`
GROUP BY `participant`.`name`
ORDER BY `count` DESC

2. 成员当前工作量

1
2
3
4
SELECT `issue`.`assignee`->>'$.name' as `owner`, count(*) AS `count`
FROM `issue`
GROUP BY `issue`.`assignee`
order by `count`

3. 当前版本进度

1
2
3
4
5
6
7
8
9
SELECT case
when `issue`.labels like '%To Do%' then "To Do"
when labels like '%Doing%' then "Doing"
when labels like '%verify%' then "Verify"
ELSE "BACKLOG"
END as 'progress', count(*) AS `count`
FROM `issue`
where state='opened' and project_name='keeper' and milestone->> '$.title'= {{milestone}}
GROUP BY progress

小技巧

  1. 每个issue表示的工作量<2天, 耗时尽量统一
  2. 通过 00.通过issue管理需求 中对board及label的操作, 定义issue生命周期
  3. 未加入milestone的issue可以通过创建时间管理, 也可以加入默认时间milestone中