书籍名称:[Python3 自动化软件发布系统-Django2 实战]
和 Jenkins 类似,GitLab 也提供了操作 API 的官方文档:https://docs.gitlab.com/ee/api/
。但这个操作是统一标准的,通过 REST API 的方式,支持主流的各种语言(Go,Java,JS,Python 等)。但为了在 Python 环境下更有效率,更规范,更自然地操作这些 API,我们这里也使用了一个第三方库 Python-GitLab 去操作这些 API。
Python-GitLab 的安装和配置
安装 Python-GitLab,运行如下命令:
1
pip install python-gitlab
在使用 Python-GitLab 连接 GitLab 系统时,需要准备两个数据:网址和 Access Token。网址已经有了,对于此处的测试环境,网址为:
http://192.168.200.16
。而 Access Token 是 GitLab 用来接入认证的,需要在 GitLab 上配置。我们点击登录进去后,在主页的右上角,点击导航的 Access Token,即进入了 Access Token 管理页面,在新开始的系统里,没有 Access Token,需要新建一个。在输入了信息(名称,过期时间,API 范围)之后,系统就会为我们生成一个 Access Token。如下图:记住这个新生成的 Access Token,因为接下来的测试中会用到。此处生成的 Token 是:v24s81wxYY3-G-y6dVSr。记住,这个 Token 当时就要找个安全的地方保存下来。在这次显示之后,以后再进入这个页面,我们只知道有这个 Token 存在,但不能知道 Token 值了。切记,如果丢失了再生成一个值,在测试环境问题不大,但如果在一个大的 IT 公司,分发替换 Token,也是有不小的工作量的。
Python-GitLab 常用功能使用
在安装好 Python-GitLab 库,并生成好 Access Token 之后,就可以使用它们来测试 GitLab API 提供的功能了。以下几个示例都在 Python IDEL 里输入代码来测试。
输出 GitLab 上所有项目组的 ID 及名称
1
2
3
4
5
6
7
8
9
10
11
12In [1]: import gitlab
In [2]: url = 'http://192.168.200.16'
In [3]: token = 'v24s81wxYY3-G-y6dVSr'
In [4]: gl = gitlab.Gitlab(url, token)
In [5]: groups = gl.groups.list()
In [6]: for g in groups:
print(g.id, g.name)输出如下:
1
2
3
4
5
66 ABC-BACKEND
7 ABC-FRONT
11 AKBY
2 GitLab Instance
4 ZEP-BACKEND
5 ZEP-FRONT根据项目组 ID,获取此项目组下所有项目的 ID 和名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14In [1]: import gitlab
In [2]: url = 'http://192.168.200.16'
In [3]: token = 'v24s81wxYY3-G-y6dVSr'
In [4]: gl = gitlab.Gitlab(url, token)
In [5]: group = gl.groups.get('4')
In [6]: projects = group.projects.list()
In [7]: for p in projects:
print(p.id, p.name)输出如下:
1
2
3
45 ZEP-BACKEND-JS
4 ZEP-BACKEND-PYTHON
3 ZEP-BACKEND-GO
2 ZEP-BACKEND-JAVA根据项目 ID 或项目组名加项目名,获取具体的项目信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17In [1]: import gitlab
In [2]: url = 'http://192.168.200.16'
In [3]: token = 'v24s81wxYY3-G-y6dVSr'
In [4]: gl = gitlab.Gitlab(url, token)
# 以下两种方式,同样输出
In [5]: project_2 = gl.projects.get(2)
In [6]: project_2 = gl.projects.get('ZEP-BACKEND/ZEP-BACKEND-JAVA')
# 以下两种方式,同样输出
In [7]: project_6 = gl.projects.get(6)
In [8]: project_6 = gl.projects.get('AKBY/ZEP-BACKEND-JAVA')
In [9]: print(project_2.id, project_2.name, project_2.http_url_to_repo)
In [17]: print(project_6.id, project_6.name, project_6.http_url_to_repo)输出如下:
1
22 ZEP-BACKEND-JAVA http://192.168.200.16/zep-backend/zep-backend-java.git
6 ZEP-BACKEND-JAVA http://192.168.200.16/AKBY/zep-backend-java.git这里有一个需要注意的地方,GitLab 允许在不同的项目组下,建立同样的项目名。这里就模拟了这个场景,在 ZEP-BACKEND 和 AKBY 两个项目组下,都建立了同样的名为 ZEP-BACKEND-JAVA 的项目。在实际的工作中,这种唯一性的区分是很重要的。建议以项目组加上项目名,来定位唯一的项目,而不要只用项目名称。
读取指定项目下的文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16In [1]: import gitlab
In [2]: url = 'http://192.168.200.16'
In [3]: token = 'v24s81wxYY3-G-y6dVSr'
In [4]: gl = gitlab.Gitlab(url, token)
In [5]: project = gl.projects.get('ZEP-BACKEND/ZEP-BACKEND-JAVA')
In [6]: items = project.repository_tree(path='javademo', ref='master')
In [7]: import json
In [8]: for item in items:
print(json.dumps(item, sort_keys=True, indent=4, separators=(',', ':')))输出如下:
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
56{
"id":"2f66a1bbd3e078dc44f0ea449994e09050af9a1f",
"mode":"040000",
"name":".settings",
"path":"javademo/.settings",
"type":"tree"
}
{
"id":"77975efe534ca88f13aa0beb118359e968bf107b",
"mode":"040000",
"name":"config",
"path":"javademo/config",
"type":"tree"
}
{
"id":"c026e6a39f3e7c4b941f9841d89ba3339c209325",
"mode":"040000",
"name":"src",
"path":"javademo/src",
"type":"tree"
}
{
"id":"d564d0bc3dd917926892c55e3706cc116d5b165e",
"mode":"040000",
"name":"target",
"path":"javademo/target",
"type":"tree"
}
{
"id":"b827969c69e76e33b978658fff218867a6608259",
"mode":"100644",
"name":".DS_Store",
"path":"javademo/.DS_Store",
"type":"blob"
}
{
"id":"f619a5369d9d71cf1eb2ab2ca3540e64498e9baa",
"mode":"100644",
"name":".classpath",
"path":"javademo/.classpath",
"type":"blob"
}
{
"id":"81d923d84818b0d5894d889ee85f7b44d2a7c571",
"mode":"100644",
"name":".project",
"path":"javademo/.project",
"type":"blob"
}
{
"id":"854263ca885ca4f9b33e76fca99c290e5cdf8208",
"mode":"100644",
"name":"pom.xml",
"path":"javademo/pom.xml",
"type":"blob"
}我们这里读取了 ZEP-BACKEND/ZEP-BACKEND-JAVA 项目 master 版本 javademo 目录下的所有文件和文件夹。注意此处的
mode
值:040000
为文件目录,100644
为文件。这种过滤,在以后可以作为判断标准。根据文件的 blob sha(上面内容的 id) 获取文件内容,并进行解码输出。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19In [1]: import base64
In [2]: import gitlab
In [3]: url = 'http://192.168.200.16'
In [4]: token = 'v24s81wxYY3-G-y6dVSr'
In [5]: gl = gitlab.Gitlab(url, token)
In [6]: project = gl.projects.get('ZEP-BACKEND/ZEP-BACKEND-JAVA')
In [7]: items = project.repository_tree(path='javademo/config', ref='master')
In [8]: for item in items:
...: file_info = project.repository_blob(item['id'])
...: content = base64.b64decode(file_info['content'])
...: print(content.decode())
...: print("=== ({}) ===".format(item['path']))输出如下:
1
2
3
4
5
6test.env = 'PRD'
test.db = 'PRD DATABASE'
=== (javademo/config/application-prd.properties) ===
test.env = 'TEST'
test.db = 'TEST DATABASE'
=== (javademo/config/application-test.properties) ===可以看到,输出的内容和我们实现的文件内容是一样的。
使用 Python-GitLab 获取 ZEP-BACKEND-JAVA 文件列表
有了上面的输出之后,就可以设计一个 Python 脚本,来获取 ZEP-BACKEND-JAVA项目下的所有文件列表。
1 | import gitlab |
输出如下:
1 | === (javademo/.settings/org.eclipse.core.resources.prefs) === |