一、说明

通过调用gitlab api直接获取相应project的所有issues,然后对其进行统计以制作燃尽图

二、方法

1.生成 Personal access token

Gitlab > Profile > Access Tokens

设置Name, Expires at, Scopes后Create personal access token

2.获取Project ID

curl https://gitlab.buaaoo.top/api/v4/projects?private_token=$your_personal_access_token$&search=$your_project_name$

将$your_personal_access_token$替换为你的personal access token

将$your_project_name$替换为你的项目名称

获取的数据中,第一个id即为项目id

3.执行脚本生成燃尽图

3.1获取项目的所有issues

curl --header "PRIVATE-TOKEN: $your_personal_access_token$" https://gitlab.buaaoo.top/api/v4/projects/ $your_project_id$/issues?per_page=$decided by your issues numbers$

将$your_personal_access_token$替换为你的personal access token

将$your_project_id$替换为你的项目id

将$decided by your issues numbers$替换为大于等于项目issues最大数量的值,比如你估计你的项目最多会同时存在80个issues,你可以把值设为100

注:per_page 默认为20,如果你不知道目前项目共有多少issues,也可以直接执行如下命令查看

curl --head --header "PRIVATE-TOKEN: $your_personal_access_token$" https://gitlab.buaaoo.top/api/v4/projects/$your_project_id$/issues

返回的数据中X-Total字段即为当前项目的issues数量

3.2 统计并生成燃尽图

根据issues数量的变化生成期望曲线和实际变化曲线

完整脚本如下:

import json
import matplotlib.pyplot as plt
from datetime import datetime, timedelta
from collections import defaultdict
import os # get all issues
project_id = #your project id#
gitlab_private_token = #your personal access token# get_issue_cmd = 'curl --header "PRIVATE-TOKEN: ' + gitlab_private_token + '" "https://gitlab.buaaoo.top/api/v4/projects/' \
+ project_id + '/issues?per_page=100" > all_issues.json' os.system(get_issue_cmd) # alpha phase start date and end date
start_date = '2021-04-21'
end_date = '2021-05-14' # get all dates between start date and end date
dates = []
dt = datetime.strptime(start_date, "%Y-%m-%d")
date = start_date
while date <= end_date:
dates.append(date)
dt = dt + timedelta(1)
date = dt.strftime("%Y-%m-%d") # count issue day by day
daily_issues_cnt = defaultdict(int)
issues_cnt = []
today = datetime.strftime(datetime.now() - timedelta(0), '%Y-%m-%d') with open('all_issues.json') as json_file:
data = json.load(json_file) for date in dates:
daily_issues_cnt[date] = 0
for i in range(len(data)):
daily_issues_cnt[data[i]['created_at'][0: 10]] += 1
closed_at = data[i]['closed_at']
if closed_at is not None:
daily_issues_cnt[closed_at[0: 10]] -= 1 issues_cnt.append(daily_issues_cnt[start_date])
for i, key in enumerate(sorted(daily_issues_cnt.keys())):
if i != 0:
issues_cnt.append(issues_cnt[i-1] + daily_issues_cnt[key])
if key == today:
break # plot burn down chart
expected_x = [0, len(dates) - 1]
expected_y = [daily_issues_cnt[start_date], 0] actual_x = range(0, len(issues_cnt))
actual_y = issues_cnt fig, ax = plt.subplots(figsize=(15, 10))
expected = plt.plot(expected_x, expected_y, color='green', label='expected')
actual = plt.plot(actual_x, actual_y, color='blue', label='actual')
plt.xticks(range(0, len(dates)), dates, rotation=45)
plt.legend()
plt.xlabel('Date')
plt.ylabel('Issues Count')
plt.savefig('burndown_chart.png')

生成的燃尽图:

Gitlab Burndown Chart的更多相关文章

  1. Burndown chart

    S型的燃尽图 在一次milestone开发过程中,开发者会持续编辑issue列表,每个issue都有自己的生命周期.燃尽图预期这些issues会被线性的消灭掉,所以从第一天直接到最后一天画个直线表示预 ...

  2. Alpha项目展示

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 Alpha-项目展示 我们是谁 删库跑路对不队 我们在做什么 题士 进度如何 进度总览 一.项目与团队亮点 ...

  3. 关于Agile Scrum的笔记

    Roles: Scrum Master -- advisor but leader, 替Team消除障碍 Product Owner -- 定sprint的交付内容, 优先级 Team -- 干活的, ...

  4. Daily Scrum Meeting ——SeventhDay(Beta)12.15

    一.Daily Scrum Meeting照片 二.Burndown Chart 想做的太多,冲刺仍在继续 三.项目进展(check-in) 1.完成了登录注册剩下的所有界面 2.更改通知详情和活动详 ...

  5. Daily Scrum Meeting ——SixthDay(Beta)12.14

    一.Daily Scrum Meeting照片 二.Burndown Chart 三.项目进展(check-in) 1.完成注册界面中的学院.年级.身份选择. 2.补充参与者报名活动成功后按钮变为不可 ...

  6. Daily Scrum Meeting ——FifthDay(Beta)12.13

    一.Daily Scrum Meeting照片 二.Burndown Chart 三.项目进展(check-in) 1.制作注册分流的头像 发布者头像 参与者头像 2.完成参与者上传头像的功能:通过本 ...

  7. Daily Scrum Meeting ——FourthDay(Beta)12.12

    一.Daily Scrum Meeting照片 讨论界面优化详情 二.Burndown Chart 项目有条不紊地进行中... 1.新增6个界面修改计划 2.修复两个BUG 三.项目进展(check- ...

  8. Daily Scrum Meeting ——ThirdDay(Beta)12.11

    一.Daily Scrum Meeting照片 二.Burndown Chart 三.项目进展(check-in) 1.欢迎界面的优化,从模糊到清楚 2.新增主界面背景 3.新增注册背景 4.参与者侧 ...

  9. Daily Scrum Meeting ——SecondDay(Beta)12.10

    一.Daily Scrum Meeting照片 二.Burndown Chart 三.项目进展(check-in) 1. 修复两个Alpha版本所遗留的BUG 2. 着手修改参与者与发布者的侧滑框,改 ...

随机推荐

  1. API:获取当前用户的公网IP

    在vue项目根目录下" public " 文件夹中的index.html,也就是根节点所在的文件引入JS,vue项目中静态文件需要在这里引入,用 script 标签规避跨域 < ...

  2. vue 进入页面每次都调用methods里的方法

    // 监听路由,每次进入页面调用方法,放在method里 mounted(){ this.getPath() }, methods: { getPath(){ console.log(this.$ro ...

  3. 利用滴答定时器(SysTick)实现简单的延时函数

    预备知识: 对标准库来说,如果定义了时钟频率,则系统会默认初始化该时钟频率. SysTick是CM4的内核外设,是一个24位的向下递减计数器,每次计数时间是1/SYSCLK,即1/168000000. ...

  4. 学习PHP中Fileinfo扩展的使用

    今天来学习的这个扩展其实现在也已经是标配的一个扩展了,为什么呢?因为 Laravel 框架在安装的时候它就是必须的一个扩展,没有打开它的话,连 Laravel 框架都是无法使用的. Fileinfo ...

  5. 你会阅读appium官网文档吗

    高效学习appium第一步,学会查看appium官方文档.如果能把appium文档都通读一遍,对学习appium大有益处. 而能做到通读appium官方文档的人,想必不是很多,刚开始学习appium的 ...

  6. GDOI2021划水记

    Day0 上午有意志行,一大早就醒了,然后走了五个小时脚痛.中午洗澡,宿舍轮流看巨人最终话然后聊了一个小时? 下午老师带着我和全爷先开溜,宿舍好像很破旧还还没得充电,领了牌牌和斐爷去吃饭. 然后六点多 ...

  7. element-ui上传多个文件时会发送多个请求

    1. element-ui的默认 默认是异步多次请求上传单个文件 如果业务就是单纯的上传文件,那么这个样子是没有问题的 前端代码参考 https://element-plus.gitee.io/#/z ...

  8. C++ 可变数组实现

    话不多说,直接上代码,看注释 template<class T> // 支持传入泛型,但string这种可变长度的类型还不支持 class Array { int mSize = 0, m ...

  9. 查看显卡报错:NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running.

    当输入nvidia-smi时出现 NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make ...

  10. 5.2 MySQL备份工具

    物理备份: 冷备份:cp tar 逻辑备份: mysqldump mysqldump:是MySQL的客户端命令,通过mysql协议连接至mysql服务器进行备份 -A, --all-databases ...