1.需求

生产中一个小伙伴需要将GitLab上所有的项目中的master权限只保留给Administra用户,其余具备master权限的用户降权为developer权限,并且被降权的用户名输出为报表,未降权前的项目下的所有成员,以“项目名用户名 权限”的格式输出为报表。


2.设计思路

主要参考了三份文档:

使用gitlab API

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的字样,但逻辑上没有问题。


Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐