python获取gitlab提交历史

工作中的场景,记录下来分享给大家。

需求

公司私有部署了gitlab保存公司代码,希望在发布系统中可以展示项目在gitlab的提交历史,供发布人员选择提交commit记录并构建对应的docker镜像。

python获取gitlab提交历史

假设仓库地址:https://gitlab-team.tiantian.com/python/web.git。

不可行的方案

一开始我尝试找到了python的GitPython库: https://pypi.org/project/GitPython/ 。

但是很快我就发现,这个方案是不可行的。

这个库实际上相当于git客户端,它必须把gitlab远程仓库的代码checkout到本地,然后才能执行类似git log命令的方式获取提交日志。

对于一个web应用来说,仅仅为了看一下提交历史就要把代码下载回来,显然是合理的。

建议方案

解决方法是直接访问gitlab的API,它拥有所有的仓库,因此也可以快速的查看提交历史。

我们需要使用python-gitlab库: https://github.com/python-gitlab/python-gitlab 。

首先创建客户端:

import gitlab
 
client = gitlab.Gitlab(https://gitlab-team.tiantian.com, private_token='XXXXXXXXXX', timeout=2, api_version='3')
  • 第一个参数:gitlab服务端地址
  • private_token:它支持多种登录认证方式,常见的就是帐号+密码 或者 授权一个token(去gitlab中分配)。
  • timeout:超时时间单位是秒。
  • api_version:需要看一下gitlab服务端的版本,较旧的服务端版本提供的是v3的API,最新的提供的是v4 API,版本不对应是无法访问通gitlab的。

现在我们要主动发起认证:

client.auth()

然后获取到project:

project = client.projects.get('python/web')

该库整体遵循同样的面向对象以及资源风格,因此获取projects就是projects.get(),列举projects就是projects.list()。

拿到project后,就可以进一步获取其下的commits信息:

commits = project.commits.list(ref_name='master', page=0, per_page=20)
print(commits)

可以筛选特定分支的提交记录,支持翻页(注意第一页page=0)。

最终得到的结果是什么呢?

[<ProjectCommit id:c26b3147427de4f1da55dc597692382952bdf920>, <ProjectCommit id:e8c0320b7d76888b50b4704c986ab162f729d9d2>, <ProjectCommit id:7e0e6a24742fe8dca494aee37dacfff4c5986102>, <ProjectCommit id:e91f06831edaa848ffa9e43d919a91140731af52>, <ProjectCommit id:ef12984c9557926e48bb8bb192ee7edfeeeb6caa>, <ProjectCommit id:9397bb9fff51905d30a23b35300ff020990e8757>, <ProjectCommit id:7a654deab1bdaf51992197eb5e0b5c37cd9467c4>, <ProjectCommit id:5bd30698a6ea3a77be66b32b26de8dff07964c5b>, <ProjectCommit id:d9b59a3add8d0314d8c1617b09706f773ebd2fd5>, <ProjectCommit id:32a459cabc2037b6ea3a3f32ce9fb9bd0d481e24>]

没错,若干ProjectCommit对象组成的列表,依旧遵循面向对象风格。

我们可以遍历每个Commit对象,进一步获取其信息:

    for c in commits:
        print(c.id, c.committer_name, c.created_at, c.message)

输出如下:

e8c0320b7d76888b50b4704c986ab162f729d9d2 owen 2019-02-12T15:39:51.000+08:00 修复BUG
 
7e0e6a24742fe8dca494aee37dacfff4c5986102 owen 2019-02-01T18:17:46.000+08:00 添加REDIS
 
e91f06831edaa848ffa9e43d919a91140731af52 owen 2019-01-24T14:02:33.000+08:00 删除调试代码

最后

相信大家已经掌握了该库的使用思路,具体每个对象有什么方法,有哪些属性呢?

参考2个文档:

前者告诉你Gitlab API有哪些能力,后者告诉你Python如何调用这些API。

上一篇:[牛客剑指offer]重建二叉树


下一篇:二叉树