目录

    利用 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

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

    2.2 配置访问权限

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

    vim ~/.python-gitlab.cfg
    

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

    [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
    gitlab project list
    
    • Python 脚本

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

    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 脚本。

    # -*- 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. 参考