Please enable Javascript to view the contents

如何使用 python-gitlab 自动创建 GitLab Label

 ·  ☕ 3 分钟

利用 Gitlab issue 进行项目管理是一件对 Dev 十分友好的事。录入issue、发起 Merge Request、创建 milestone,这些都是开发过程中动态推进的。但,每个新项目都需要创建一堆 Label ,是件让人头疼的事。本文主要就是为了解决这个问题。

1. GitLab Label

在创建 GitLab Label 之前,我们先得规范一下 Label 的格式。

GitLab Label 主要用于对 issue 分类管理和过滤查看。比较推荐的一种用法是,
采用 “{type}/{value}” 标签,而不是 “{value}"。这样的二维标签可以表示更多的信息。

1.1 标签类别

  • type/feature
    对新功能的请求

  • type/enhancement
    对功能的改进、增强、重构。

  • type/bug
    不符合预期的小问题

  • type/question
    比较严重的问题

  • type/test
    与测试相关的问题

1.2 优先级:priority

优先级标签指定应处理问题的优先级。

  • priority/critical
    这个问题现在应该修复

  • priority/high
    这个问题应该尽快解决

  • priority/low
    这个问题不是高优先级问题,可以在以后处理。该标签允许记录问题,而无需立即处理

1.3 价值

价值标签描述了谁从这个问题中受益。这有助于更好地安排问题。

  • value/client
    这个问题将使客户受益

  • value/admin
    这个问题将使管理员用户受益。有时管理员用户不一定是客户端

  • value/developer
    这个问题将使开发人员受益

1.4 更改

更改标签对所涉及的变化进行了粗略估计。

  • change/minor
    这个问题通常需要几个小时或更短的时间。

  • change/medium
    这个问题花了不到一天的时间,但这不是一个快速解决方案。

  • change/major
    这个问题涉及重大变化,需要1天以上。

1.5 杂项

这些是非常重要的标签,应根据需要使用。

  • others/needs-discussion
    这个问题需要进一步讨论才能得到解决。

我们会尽可能多地查询具有此标签的所有内容,并与相关各方进行讨论。一旦我们完成讨论,我们通常会删除标签,但有时我们无法决定我们想要决定的内容,因此我们将标签留在那里,将项目推送到下一次会议。

  • others/in-progress
    这个问题正在进行中。此标签告诉正在处理该问题的人(分配标签的人)并阻止其他人开始处理同一问题。

  • others/duplicate
    这个问题与另一个功能请求或错误报告重复。

2. gitlab-python

python-gitlab 是一个 Python 软件包,提供对 GitLab 服务器 API 的访问。它支持 GitLab 的 v3 和 v4 API,并提供了一个 CLI 工具。

python-gitlab 兼容 Python 2.7 和 Python 3.4 及以上版本。

2.1 安装 python-gitlab

1
pip install python-gitlab -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com

2.2 配置访问权限

这里将配置文件放在 $HOME 目录下。

1
vim ~/.python-gitlab.cfg

python-gitlab 还支持配置系统级的访问权限文件,启动时指定配置访问权限文件。具体配置,请参考这里

1
2
3
4
5
6
7
8
9
[global]
default = gitlab-yourdomain
ssl_verify = false
timeout = 5

[gitlab-yourdomain]
url = https://gitlab.yourdomain.com
private_token = _AR7QqJ-hp4zLbZjVi6S
api_version = 4

这里的 private_token 可以在你的 GitLab 主页生成,http://gitlab.yourdomain.com/profile/personal_access_tokens。如下图:

2.3 常用命令

  • Console 中获取第一页 project
1
gitlab project list
  • Python 脚本

在 Python 脚本中访问 GitLab API 需要先获取到 gitlab 操作实例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import gitlab

gitlab_url = 'http://gitlab.yourdomain.com'
gitlab_token = '_AR7QqJ-hp4zLbZjVi6S'

# 登录
gl = gitlab.Gitlab(gitlab_url, gitlab_token)
# 获取第一页 project
projects = gl.projects.list()
# 获取所有的project
projects = gl.projects.list(all=True)

这里是创建项目需要的 Label 的 Python 脚本。

 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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# -*- coding: utf-8 -*-
import gitlab

gitlab_url = 'http://gitlab.yourdomain.com'
gitlab_token = '_AR7QqJ-hp4zLbZjVi6S'

# 登录
gl = gitlab.Gitlab(gitlab_url, gitlab_token)

# 通过 "空间名/项目""名获取 project 对象
project = gl.projects.get('namespace/project_name')

# 获取所有 label
labels = project.labels.list()

# 删除全部 label
for label in labels:
    label.delete()

# 创建项目的 label
# 类型 type
# 优先级 priority
# 价值 value
# 更改 changeA
# 杂项 others
all_label_list = {
    'type': [('feature', '#52BE80'), ('enhancement', '#5DADE2'), ('bug', '#E59866'), ('question', '#D35400'), ('test', '#A9CCE3')],
    'priority': [('critical', '#E74C3C'), ('high', '#F4D03F'), ('low', '#F5CBA7')],
    'value': [('client', '#AED6F1'), ('admin', '#D6DBDF'), ('developer', '#3498DB')],
    'change': [('minor', '#EBDEF0'), ('medium', '#BB8FCE'), ('major', '#8E44AD')],
    'others': [('needs-discussion', '#2E86C1'), ('in-progress', '#D68910'), ('duplicate', '#85929E')]}

for key in all_label_list:
    for label in all_label_list[key]:
        project.labels.create(
            {'name': ''.join([key, '/', label[0]]), 'color': label[1]})

# 创建一个 tag
# tag = project.tags.create({'tag_name':'V1.0.0', 'ref':'master'})

# 获取所有 commit info
# commits = project.commits.list()
# for c in commits:
#     print c.author_name, c.message, c.title

# 获取指定 commit 的 info
# commit = project.commits.get('2f597633')

#  创建一个 merge request
# mr = project.mergerequests.create({'source_branch':'bugfix',
#                                    'target_branch':'master',
#                                    'title':'fix db coding', })
# 更新一个 merge request 的描述
# mr.description = 'some description'
# mr.save()

执行之后的效果,是这样:

3. 参考


微信公众号
作者
微信公众号