1.需求
生产中一个小伙伴需要将GitLab上所有的项目中的master权限只保留给Administra用户,其余具备master权限的用户降权为developer权限,并且被降权的用户名输出为报表,未降权前的项目下的所有成员,以“项目名用户名 权限”的格式输出为报表。
2.设计思路
主要参考了三份文档:
②GitLab Documentation/Group and project members
③GitLab Documentation/Projects
-------------------------------------------------------------------------------------------
①通过python requests模块中的get/put方法进行gitlab Api的相应操作
②通过get方法获取GitLab上的项目:
③通过put方法调用如下GitLab接口,实现修改成员权限功能:
curl --request PUT --header "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/groups/:id/members/:user_id?access_level=40
其中master所对应的access_level为40,developer的权限为30,将access_level从40改成30就实现了降权。
3.代码实现
①修改成员权限
'''
Author:司小幽
time:2016-11-30 ~ 2016-12-1
function:遍历GitLab上的项目,将每个项目中除Administrator用户外,其余具有master权限的用户更改为developer权限。
'''
import requests
import json
import csv
#获取projectId
urlId = 'http://{Your Git Ip}/api/v3/projects?private_token={Your Private token}'
projectId = requests.get(urlId)
idData=json.loads(projectId.text)
dict={}
dict1={}
#将项目成员名分别和id以及access_level建立两种映射关系
def getProjectMember(projectId):
urlMember = 'http://{Your Git Ip}/api/v3/projects/'+str(projectId)+'/members?private_token={Your Private token}'
projectMember=requests.get(urlMember)
membersData=json.loads(projectMember.text)
for j in membersData:
dict[j["name"]] = j["id"]
dict1[j["name"]]=j["access_level"]
#修改成员权限,并将更改权限的成员名输出至报表
def modifyUserLevel(projectId):
getProjectMember(projectId)
for name in dict1:
if name != 'Administrator':
if dict1[name] == 40:
urlPut='http://{Your Git Ip}/api/v3/projects/'+str(projectId)+'/members/'+str(dict[name])+'?access_level=30?private_token={Your Private token}'
put=requests.put(urlPut)
writer = csv.writer(csvfile)
data=[]
data.append(name)
writer.writerows(data)
#主方法
csvfile = file('{Path}', 'wb')
for projectId in idData:
modifyUserLevel(projectId["id"])
csvfile.close()
②生成规范格式报表
'''
Author:司小幽
TIME:2016-11-30 ~ 2016-12-1
function:以”GitLab项目名 用户名 用户权限“的格式将GitLab上的对应数据写入.csv文件(除了Administrator)
'''
import requests
import json
import csv
#获取projectId
urlId = 'http://{Your Git Ip}/api/v3/projects?private_token={Your Private token}'
projectId = requests.get(urlId)
idData=json.loads(projectId.text)
dict={}
dict1={}
#将项目成员名分别和id以及access_level建立两种映射关系
def getProjectMember(projectId):
urlMember = 'http://{Your Git Ip}/api/v3/projects/'+str(projectId)+'/members?private_token={Your Private token}'
projectMember=requests.get(urlMember)
membersData=json.loads(projectMember.text)
for j in membersData:
dict[j["name"]] = j["id"]
dict1[j["name"]]=j["access_level"]
#未降权前的除Adminstrator用户的其余项目所有用户以“项目名 用户名 权限”格式输出至报表
csvfile = file('{Path}', 'wb')
for projectId in idData:
getProjectMember(projectId["id"])
for name in dict1:
if name != 'Administrator':
writer = csv.writer(csvfile)
data=[]
data.append((projectId["name"], name, dict1[name]))
writer.writerows(data)
csvfile.close()
4.问题说明
上述代码仅仅是逻辑上成立的实现,其中第二部分生成规范格式的报表可以实打实地实现,但第一部分,可能权限不够,会出现401,not Authorized的字样,但逻辑上没有问题。