使用Python和Gitlab创建一个票证系统
当你与一个正在成长的团队一起工作,并且你负责所有与IT相关的请求(购买硬件、创建帐户等)时,有时仅仅使用电子邮件或直接发送消息来处理这些请求就会变得难以追踪。当你忙着做其他的一些事情时,你可能会忘记其他人发送给你的消息,或者你可能会收到许多请求,其中一些请求你可能会忽略。这时候通常就是你考虑一个票证系统的最佳时机了。
票证(ticketing)系统是一个将你的所有客户和/或同事的请求集中起来的系统,它可以帮助你跟踪哪些请求已经被处理,哪些需要更多的时间,等等。通常,还有一种方法可以让你和提出请求的人讨论应该做什么的细节。目前有几个很好的票证系统供应商,例如Zendesk和Freshdesk。但是,如果你想避免必须安装这些额外的系统之一,并使用您更熟悉的一些东西,该怎么办呢?在本文中,我们将使用Gitlab Service Desk、Gitlab REST API和Python来构建一个简单的票证系统。
警告:本文假设你有一个随时可用的Gitlab Premium实例。
设置一个新的Gitlab存储库
第一步是为你的票证系统设置一个新的空白Gitlab存储库。我将我的存储库命名为ticketing,但是你可以给它取任何名字。
与其他任何存储库一样,你可以给它一个描述,选择将其公开、内部或私有,你还可以使用一个README文件初始化它。为了便于演示,我将保留默认设置。
启用Service Des
在本教程中,我们将使用的最重要的特性是Gitlab Service Desk。Service Desk是Gitlab Premium v9.1中发布的一个功能。它旨在简化开发团队和客户之间的交互。引用官方发布中的公告,
你的客户或任何与项目中人员有联系的人都可以将bug、特性请求或任何其他一般反馈直接发送到你的GitLab项目中。反过来,任何GitLab用户都可以直接从项目中进行响应。
我们可以充分利用这个特性,并使用它通过电子邮件将支持票(support ticket)直接发送到我们的新存储库中。
要启用Service Desk,你只需转到存储库的常规设置并向下滚动到Service Desk,。点击Expand (展开)并启用它(默认情况下它可能已经启用了)。你将看到Gitlab自动为要发送的支持请求生成了一个电子邮件地址。
现在一切都设置好了,我们可以开始编写我们自己的票证系统脚本了!
一个用Python编写的票证系统
我们将使用Gitlab REST API(点击这里查看文档https://docs.gitlab.com/ee/api/ )与我们的票证系统存储库以及Python requests库进行交互。要安装这个库,你只需按照官方的安装说明即可。下面的步骤都是用Python 3.7.3和requests 2.22.0进行测试的。
让我们创建一个Python脚本,并将其命名为gitlab-ticket.py。首先要做的是导入 requests库的内容。
大多数API功能都需要某种形式的身份验证。你可以使用OAUTH令牌,也可以使用个人访问令牌。我选择了后者。Gitlab文档中提供了创建个人访问令牌的说明。
Gitlab API请求的一般形式如下:
你可以在你的项目存储库的主页上获取项目ID。
为了使代码更具可读性,让我们在Python脚本中添加以下几行代码:
确保分别用你的个人访问令牌和项目的ID替换privateToken和projectId。
为了测试我们的设置,我们来将以下内容添加
到脚本中。这段代码会尝试从Gitlab检索项目属性并以JSON格式打印它们。你可以通过简单地执行来运行这个脚本:
你应该会看到一串JSON打印到屏幕上。如果没有,请确保你的个人访问令牌和项目ID是正确的。你现在可以安全地删除我们添加到Python脚本中的最后一行了。接下来,我们将为我们的票证系统设计一些功能。
设计一些功能
此时,一切都如预期的那样开始运行,你应该能够使用Gitlab API向你的存储库发出请求。我们准备开始编写我们的票证系统脚本了。
为了简单起见,我们将只在票务系统中加入几个功能。支持票将在存储库的问题中进行管理,并根据我们将要定义的类别进行标记。标签的分配应该是自动化的,并将基于一个常见的问题标题前缀。脚本应该负责添加缺失的标签。
实现
现在我们已经知道了我们的目标是什么,让我们深入研究代码。
首先,我们定义一些票的类别。我们将使用一个Python字典来保存数据。我们添加两个类别,将其命名为Hardware 和Gitlab Account ,前者用于与硬件相关的东西,后者用于Gitlab帐户创建请求。
每个类别都有一个唯一的标识符,以及一个关联的标签(带有名称和颜色)。
接下来,我们必须将这些标签添加到存储库中。为此,我们使用Gitlab API提供的labels请求。如果没有发生错误,请求将返回状态码201。如果一个标签已经存在,我们只需忽略错误并继续执行。
然后,我们从存储库中检索所有问题的列表。这将允许我们对它们进行迭代,并根据每个问题的标题自动为其分配正确的标签。
如果存储库中只有一个问题,resp.json() 将会返回一个字典,而如果有多个问题的化,它将会返回一个字典列表。我们来将其标准化,并始终使用一个列表。
接下来,我们遍历所有的问题并搜索Service Desk发布的问题。然后检查是否存在预定义的标题头部。一个典型的服务票标题如下所示:
我们试图找到与方括号内的类别ID之一对应的这个标题的子字符串,并将相应的标签附加给它。
就是这样!我们现在已经将一个简单的票务系统完全集成到Gitlab了。当你每次运行这个脚本时,所有问题都将自动使用正确的标签进行更新。我们来测试一下。
进行测试
我们来向Gitlab为我们的存储库生成的地址写一封电子邮件。我将请求一个新的屏幕:
注意,我在电子邮件的主题中使用了方括号内的一个类别ID。这非常重要,因为它将允许我们的脚本为生成的Gitlab问题提供正确的标签。
这个新的问题现在就可以在存储库中看到了。
我们可以像对待其他问题一样对它进行响应。应答将自动转发到发出请求者的邮箱。
最后的想法
正如我们在这篇文章中看到的,使用Python和Gitlab Service Desk设置一个简单的票证系统是很容易的。要完全自动化这个过程,你只需要将我们编写的Python脚本添加到CI任务中,定期触发它来更新所有新创建的问题。
英文原文:https://kayjukh.github.io/programming/using-gitlab-and-python-to-create-a-ticketing-system/
译者:Nothing