调用gitlibapi v3保护分支,并开通Developers can push

第三方包要求需要安装requests

# -*- coding:utf-8 -*-

import requests, re, logging, sys

class GitLabAPI(object):
    def __init__(self, headers=None, *args, **kwargs):
        self.headers = headers
        self.logger = logging.getLogger("GitLabAPI")
        self.formatter = logging.Formatter('%(levelname)s: %(message)s')
        self.logger.setLevel(logging.INFO)
        # 文件日志
        self.file_handler = logging.FileHandler("GitLabAPI.log")
        self.file_handler.setFormatter(self.formatter)  # 可以通过setFormatter指定输出格式

        # 控制台日志
        self.console_handler = logging.StreamHandler(sys.stdout)
        self.console_handler.formatter = self.formatter  # 也可以直接给formatter赋值
        # 为logger添加的日志处理器
        self.logger.addHandler(self.file_handler)
        self.logger.addHandler(self.console_handler)

    '''
    搜索用户可以看到的所有工程
    :name: 工程名
    :result: 工程集合
    '''
    def get_user_projects(self, name):
        res = requests.get("http://example.com/api/v3/projects/all?search=%s&per_page=100" % name, headers=self.headers, verify=False)
        status_code = res.status_code
        if status_code != 200:
            raise RuntimeError(res.json().get('message'))
        content = res.json()
        return content

    '''
    获取用户工程id
    :param name: 项目名称 
    :return: 工程id,工程访问路径
    '''
    def get_user_project_id(self, name):
        project_id = None
        web_url = None
        projects = self.get_user_projects(name)
        if projects:
            for item in projects:
                if item.get('name') == name:
                    project_id = item.get('id')
                    web_url = item.get('web_url')
        if project_id is None:
            raise RuntimeError('找不到工程:%s' % name)
        return project_id, web_url

    '''
    获取工程的所有分支
    :project_id: 工程id
    :return: 分支名数组
    '''
    def get_project_branchs(self, project_id):
        branchs = []
        res = requests.get("http://example.com/api/v3/projects/%s/repository/branches"%project_id, headers=self.headers, verify=False)
        status_code = res.status_code
        if status_code != 200:
            raise RuntimeError(res.json().get('message'))
        content = res.json()
        if content:
            for item in content:
                branchs.append(item.get('name'))
        return branchs

    '''
    获取工程的指定分支是否已经保护
    :project_id: 工程id
    :branch_name: 分支名
    :return: True or False
    '''
    def get_project_branch(self, project_id, branch_name):
        res = requests.get("http://example.com/api/v3/projects/%s/repository/branches/%s" % (project_id, branch_name), headers=self.headers, verify=False)
        status_code = res.status_code
        if status_code != 200:
            raise RuntimeError(res.json().get('message'))
        content = res.json()
        if content:
            return content.get('protected')
        return False

    '''
    保护单个工程的分支
    :session: requests session用于保持登录
    :project_name: 工程名
    :branch_name: 分支名
    :result: True or False
    '''
    def project_protect_branch(self, session, project_name, branch_name):
        self.logger.info("工程:%s 分支:%s" % (project_name, branch_name))
        project_id, web_url = self.get_user_project_id(project_name)
        self.logger.info("工程id:%s" % project_id)
        branchs = self.get_project_branchs(project_id)
        self.logger.debug("所有分支:%s" % branchs)
        if branch_name in branchs:
            content = self.get_project_branch(project_id, branch_name)
            if content:
                self.logger.info('工程:%s 分支:%s 已经被保护,不能重复保护' % (project_name, branch_name))
                return True
            protected_page = session.get(web_url+'/protected_branches')
            authenticity_token = re.findall(r'<meta content="([^"]+)" name="csrf-token" />',protected_page.text)
            protect_data = {'utf8':'✓','authenticity_token':authenticity_token,'protected_branch[name]':branch_name,
                                'protected_branch[developers_can_push]':0,'protected_branch[developers_can_push]':1}
            session.post(web_url+'/protected_branches', protect_data)
            content = self.get_project_branch(project_id, branch_name)
            return content
        else:
            raise RuntimeError('工程:%s 找不到分支:%s' % (project_name, branch_name))

    '''
    保护多个工程的分支
    :project_names: 工程名数组
    :branch_name: 分支名
    :username: gitlib用户名
    :password: gitlib密码
    '''
    def projects_protect_branch(self, project_names, branch_name, username, password):
        session = requests.Session()
        login_page = session.get('http://example.com/users/sign_in')
        authenticity_token = re.findall(r'<meta content="([^"]+)" name="csrf-token" />',login_page.text)
        #print(authenticity_token)
        login_data = {'utf8':'✓','authenticity_token':authenticity_token,'user[login]':username,'user[password]':password,'user[remember_me]':0}
        res = session.post('http://example.com/users/sign_in', data=login_data)
        #print(res.text)
        for project_name in project_names:
            self.logger.info("-----------------------------------------------------------------------------------------------")
            try:
                result = api.project_protect_branch(session, project_name, branch_name)
                if result:
                    self.logger.info("工程:%s 分支:%s 保护成功 message:%s" % (project_name, branch_name, result))
                else:
                    self.logger.error("工程:%s 分支:%s 保护失败 message:%s" % (project_name, branch_name, result))
            except Exception as e:
                self.logger.exception("工程:%s 分支:%s 保护失败" % (project_name, branch_name)) 
            self.logger.info("-----------------------------------------------------------------------------------------------")


if __name__ == "__main__":
    headers = {'PRIVATE-TOKEN': 'privatetoken'} #你的gitlab账户Account里面的private token
    username = 'username'#你的gitlab账户的用户名
    password = 'password'#你的gitlab账户的密码
    branch_name = 'branch_name'#分支名
    projects = ['project_name']#工程名数组
    api = GitLabAPI(headers=headers)
    api.projects_protect_branch(projects, branch_name, username, password)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值