工作中的场景,记录下来分享给大家。
需求
公司私有部署了gitlab保存公司代码,希望在发布系统中可以展示项目在gitlab的提交历史,供发布人员选择提交commit记录并构建对应的docker镜像。
假设仓库地址: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: https://docs.gitlab.com/ee/api/
- python-gitlab SDK: https://python-gitlab.readthedocs.io/en/latest/api-objects.html
前者告诉你Gitlab API有哪些能力,后者告诉你Python如何调用这些API。