1. 程式人生 > >《GitLab批量修改專案成員許可權以及生成報表邏輯實現》

《GitLab批量修改專案成員許可權以及生成報表邏輯實現》

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的字樣,但邏輯上沒有問題。