《GitLab批量修改專案成員許可權以及生成報表邏輯實現》
阿新 • • 發佈:2019-01-07
1.需求
生產中一個小夥伴需要將GitLab上所有的專案中的master許可權只保留給Administra使用者,其餘具備master許可權的使用者降權為developer許可權,並且被降權的使用者名稱輸出為報表,未降權前的專案下的所有成員,以“專案名使用者名稱 許可權”的格式輸出為報表。
2.設計思路
主要參考了三份文件:
-------------------------------------------------------------------------------------------
①通過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的字樣,但邏輯上沒有問題。