一 背景
某些情况下,我们可能想全局搜索确定哪些项目包含某些配置,比如,想知道哪些项目使用了fastjson,我们是无法直接在gitlab上针对全部代码仓库查询一遍的,这种情况下,我们只能通过脚本来查。
此文章就是通过python脚本来实现该功能,可以大大节省时间。
如果你们的项目本来就不多,只有几个,到gitlab上每个搜索一遍就好,也没有必要通过这个脚本去倒腾。这个脚本主要是针对可能有几十上百,甚至有几百个项目的情况下使用。
二 python版本与依赖
依赖Docker python:3.9.1 (如果本地已有python3的环境则不需要通过docker)
python依赖的module如下:
- requests
- lxml
- python-gitlab (相关API说明)
三 操作步骤
pull镜像1
docker pull python:3.9.1
创建目录并挂载启动1
2
3mkdir ~/python-script
cd ~/python-script
docker run -dt -v $PWD:/usr/src/python-script -w /usr/src/python-script --name python-script python:3.9.1 /bin/bash
安装依赖模块1
2
3docker exec -it python-script pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
docker exec -it python-script pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple
docker exec -it python-script pip install python-gitlab -i https://pypi.tuna.tsinghua.edu.cn/simple
运行以下python脚本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
57cat >> searchgitlab.py << EOF
#/usr/bin/python
#coding=utf-8
import requests
import re
from lxml import etree
from multiprocessing import Pool
import gitlab
search_content='搜索内容'
gitlab_url='http://192.168.90.221'
private_token='xxxxxxxxxx-xxxxxxxxx'
gitlab_username='gitlab用户名'
gitlab_password='gitlab密码'
gl = gitlab.Gitlab(gitlab_url, private_token=private_token)
def create_session():
session = requests.session()
login_page_resp = session.get(gitlab_url + '/users/sign_in').text
authenticity_token = re.findall(
'type="hidden" name="authenticity_token" value="(.*?)" />',
login_page_resp)[0]
post_form = {
'user[remember_me]': '0',
'utf8': '?',
'authenticity_token': authenticity_token,
'user[login]': gitlab_username,
'user[password]': gitlab_password}
session.post(gitlab_url + '/users/sign_in', data=post_form)
return session
urls =[]
content = create_session()
def getPorject(s):
url="%s/search?utf8=&snippets=&scope=&search=%s&project_id=%s" % (gitlab_url,search_content,s)
pagecontent=content.get(url).text
pagehtml=etree.HTML(pagecontent)
projecttitle=pagehtml.xpath("//div[@class='content']/div[@class='row-content-block']/a/@href")
if len(projecttitle):
print(gitlab_url+str(projecttitle[0]))
else:
return
if __name__ == '__main__':
pool = Pool(processes=5)
projects = gl.projects.list(all=True)
print("projects size:"+str(len(projects)))
for i in projects:
#getPorject(i.split()[0])
pool.apply_async(func=getPorject, args=(i.id,))
print('end')
pool.close()
pool.join()
EOF
1 | # 执行查询 |