python脚本(三)

add_suff.py
批量添加文件后缀

import os

def rename_files_with_suffix(directory, suffix="_V1.00"):
    for filename in os.listdir(directory):
            if filename.count('.')==2:
                continue
            new_filename = filename.split('.')[0]+suffix+'.'+filename.split('.')[1]
            source = os.path.join(directory, filename)
            destination = os.path.join(directory, new_filename)
            os.rename(source, destination)

rename_files_with_suffix("C:\\Users\\Desktop\\test")  # 替换为你的文件夹路径

get_gitlab_project_member.py
查询gitlab信息

import requests

# 设置 GitLab 的 API 地址和访问令牌
URL = 'https://gitlab'
ACCESS_TOKEN = ''
user_id=4694


# 获取用户的访问令牌
# def get_user_access_token(user_login):
#     url = f"{GITLAB_URL}/oauth/token?grant_type=password&client_id=client_id&client_secret=client_secret&username={user_login}&password=password"
#     response = requests.post(url)
#     return response.json()['access_token']


#添加仓库管理员权限
def add_repository_admin(id,level):
    url = f"{URL}/api/v4/projects/{id}/members"
    headers = {'Private-Token': ACCESS_TOKEN}
    data = {'user_id': user_id, 'access_level': level}
    response = requests.post(url, headers=headers, data=data)
    print(response.json())

def update_repository_admin(id):
    url = f"{URL}/api/v4/projects/{id}/members/{user_id}"
    headers = {'Private-Token': ACCESS_TOKEN}
    data = {'access_level': 20}
    response = requests.put(url, headers=headers, data=data)
    print(response.json())

def convert(access_level):
    if access_level==10:
        return "Guest"
    if access_level==20:
        return "Reporter"
    if access_level==30:
        return "Developer"
    if access_level==40:
        return "Maintainer"
    return "other"

def query_project_members(id):
    #url = f"{URL}/api/v4/user"
    #url = f"{URL}/api/v4/projects/9615/repository/branches"
    #url = f"{URL}/api/v4/projects/9615"
    url = f"{URL}/api/v4/projects/{id}/members"
    headers = {'Private-Token': ACCESS_TOKEN}
    response = requests.get(url, headers=headers)
    # print(response.json())
    for user_info in response.json():
        # print(user_info)
        print(user_info['username']+" "+convert(user_info['access_level']))

def query_project_by_name(name):
    url = f"{URL}/api/v4/projects/"
    headers = {'Private-Token': ACCESS_TOKEN}
    data = {'search': name}
    response = requests.get(url, headers=headers,data=data)
    for project_info in response.json():
        print(str(project_info['id'])+" "+project_info['name'])

def query_group_by_name(name):
    url = f"{URL}/api/v4/group/"
    headers = {'Private-Token': ACCESS_TOKEN}
    data = {'search': name}
    response = requests.get(url, headers=headers,data=data)
    print(response.json())
    # for project_info in response.json():
    #     print(str(project_info['id'])+" "+project_info['name'])

def get_mr_id(id,source_branch,target_branch):
    url = f"{URL}/api/v4/projects/{id}/merge_requests"
    headers = {'Private-Token': ACCESS_TOKEN}
    data = {'state': 'opened',
            'source_branch':source_branch,
            'target_branch':target_branch}
    response = requests.get(url, headers=headers, data=data)
    print(response.json())
    return response.json()[0]['iid']

def query_project_info(id):
    url = f"{URL}/api/v4/projects/{id}"
    headers = {'Private-Token': ACCESS_TOKEN}
    data = {'id': id}
    response = requests.get(url, headers=headers,data=data)
    print(response.json())

def query_project_webhook_info(id):
    url = f"{URL}/api/v4/projects/{id}/hooks"
    headers = {'Private-Token': ACCESS_TOKEN}
    response = requests.get(url, headers=headers)
    print(response.json())

def query_system_webhook():
    url = f"{URL}/api/v4/hooks"
    headers = {'Private-Token': ACCESS_TOKEN}
    response = requests.get(url, headers=headers)
    print(response.json())

def query_group_projects(id):
    url = f"{URL}/api/v4/groups/{id}/projects"
    headers = {'Private-Token': ACCESS_TOKEN}
    data = {'per_page': 50}
    response = requests.get(url, headers=headers)
    # print(response.json())
    for proj in response.json():
        print(proj)

def query_user(username):
    url = f"{URL}/api/v4/users"
    headers = {'Private-Token': ACCESS_TOKEN}
    #,'blocked':True
    data = {'username': username}
    response = requests.get(url, headers=headers, data=data)
    print(response.json())

#query_project_info(10300)
#query_project_webhook_info(9586)
# query_system_webhook()
#add_repository_admin(8734,30)
#update_repository_admin(9911)
#query_project_by_name('aidisdk')
#query_project_members(7624)
# query_group_projects(2661)
#query_user('')
# print(get_mr_id(9615,"feat-test1","master"))
# query_group_by_name("gallery")

get_all_project_id_from_group.py
从组的id递归获取所有project id

import gitlab

def group_search_repo(group_id):
    group = gl.groups.get(group_id)
    project_ids = []

    # 获取当前组的所有项目ID
    for project in group.projects.list(all=True):
        project_ids.append(project.id)
    #print(project_ids)

        # 遍历当前组的所有子组
    for subgroup in group.subgroups.list(all=True):
        # 递归调用以获取子组中的所有项目ID
        project_ids.extend(group_search_repo(subgroup.id))

    return project_ids
def get_all_project_ids(group, gl):
    project_ids = []

    # 获取当前组的所有项目ID
    for project in group.projects.list(all=True):
        project_ids.append(project.id)
    #print(project_ids)

        # 遍历当前组的所有子组
    for subgroup in group.subgroups.list(all=True):
        # 使用子组的ID获取完整的子组对象
        full_subgroup = gl.groups.get(subgroup.id)
        # 递归调用以获取子组中的所有项目ID
        project_ids.extend(get_all_project_ids(full_subgroup, gl))

    return project_ids

def group_search_repo_url(group_id):
    group = gl.groups.get(group_id)
    project_urls = []  # 改变变量名以反映现在存储的是URLs

    # 获取当前组的所有项目URL
    for project in group.projects.list(all=True):
        # print(project.web_url)
        project_urls.append(project.web_url)

    # 遍历当前组的所有子组
    for subgroup in group.subgroups.list(all=True):
        # 递归调用以获取子组中所有项目的URL
        project_urls.extend(group_search_repo_url(subgroup.id))

    # print(project_urls)
    return project_urls


# 从配置文件中加载 GitLab 实例
gl = gitlab.Gitlab.from_config('trigger', ['python-gitlab.cfg'])

gl.auth()
# 假设你知道组ID
group_id = '12900'

# 获取组对象
try:
    group = gl.groups.get(group_id)
except gitlab.exceptions.GitlabGetError as e:
    print(f"Error retrieving group with ID {group_id}: {e}")
    exit()

# 调用函数获取所有项目ID
# all_project_ids = get_all_project_ids(group, gl)
# print(len(all_project_ids))

# all_project_ids1=group_search_repo(group_id)
# print(len(all_project_ids1))
# 打印所有项目ID
# for project_id in all_project_ids:
#     print(project_id)

all_project_urls=group_search_repo_url(group_id)
print(len(all_project_urls))
for project_id in all_project_urls:
    print(project_id)

get_project_id_from_url.py
从gitlab url得到id

import re

import gitlab

# GitLab的URL和授权令牌
gitlab_url = 'https://gitlab.hobot.cc'
gitlab_token = ''
gitlab_prefix = "git@gitlab.hobot.cc"

# 初始化GitLab连接
gl = gitlab.Gitlab(url=gitlab_url, private_token=gitlab_token)
gl.auth()  # 进行安全认证

def convert_http_to_git(url):
    url=url.strip()
    if ".git" not in url:
        url+='.git'

    pattern = gitlab_url + '/(.*)/(.*).git'
    match = re.search(pattern, url)
    if match:
        return gitlab_prefix + f':{match.group(1)}/{match.group(2)}.git'
    else:
        return url


ssh_address = ""

# 使用split方法分隔字符串,以冒号为分隔符
line =convert_http_to_git(ssh_address)
repository_path=line.split(':')[-1].split('.git')[0]
print(repository_path)


# # 通过完整路径获取项目
try:
    project = gl.projects.get(repository_path)
    print(f"仓库ID: {project.id}")
except gitlab.exceptions.GitlabGetError as e:
    print(f"无法获取仓库信息: {e}")

branch_sync.py
同步gitlab仓库分支
分别复制clonewith ssh,粘贴至A、B位置,并填写对应分支至至
src_branch、dst_branch,按需编写sync_conf.yml文件中的其它各项参数。

  • sync:
    proposer: xxx
    project: xxx
    src_repo: A [注:源仓库]
    src_branch:
    dst_repo: B [注:目标仓库]
    dst_branch:
    【注】branch与对应的repo一致且真实存在,不可为空,sro_branch与
    dst_branch不要求内容一致。
import yaml
import threading
import os
import subprocess
import shutil
import sys
import logging

logging.basicConfig(level=logging.INFO, format=' %(asctime)s - %(levelname)s - %(message)s')

try:
    from yaml import CLoader as Loader, CDumper as Dumper
except ImportError:
    from yaml import Loader, Dumper

class SyncBranch():
    def __init__(self):
        self.sync_conf = 'sync_conf.yml'
        self.sync_list = self.read_yaml()
        self.sync_thread_num = 1
        self.tmp_repo = 'tmp_repo'
        self.exec_result = True

    def read_yaml(self):
        f_obj = open(self.sync_conf, 'r')
        f_obj_data = f_obj.read()
        yaml_data = yaml.load(f_obj_data, Loader=Loader)
        f_obj.close()
        return yaml_data

    def remove_folder(self, folder):
        if os.path.exists(folder):
            shutil.rmtree(folder)

    def run_thread(self, name):
        repo_folder = self.tmp_repo + '/' + name
        print(self.sync_list)
        while True:
            try:
                one_sync = self.sync_list.pop()
            except Exception as e:
                print(e)
                if len(self.sync_list) == 0:
                    break
                continue
            print(one_sync)
            self.remove_folder(repo_folder)
            try:
                proposer = one_sync['sync']['proposer']
                project = one_sync['sync']['project']
                src_repo = one_sync['sync']['src_repo']
                src_branch = one_sync['sync']['src_branch']
                dst_repo = one_sync['sync']['dst_repo']
                dst_branch = one_sync['sync']['dst_branch']
            except Exception as e:
                print(e)
                self.exec_result = False
                continue
            # temp rule
            #if dst_repo.find('gitlab.hobot.cc:ptd/') > 0:
            #   continue
            command_git_clone = 'git clone -b %s %s %s' % (src_branch, src_repo, repo_folder)
            logging.info("git clone -b {} {} {}".format(src_branch, src_repo, repo_folder))
            if not self.runcmd(command_git_clone, dst_repo, dst_branch):
                continue
            command_add_remote = 'cd %s;git remote add upstream %s' % (repo_folder, dst_repo)
            logging.info('cd {};git remote add upstream {}'.format(repo_folder, dst_repo))
            if not self.runcmd(command_add_remote, dst_repo, dst_branch):
                continue
            command_fetch_upstream = 'cd %s;git fetch upstream' % (repo_folder)
            logging.info('cd {};git fetch upstream'.format(repo_folder))
            if not self.runcmd(command_fetch_upstream, dst_repo, dst_branch):
                continue
            command_set_upstream = 'cd %s;git branch %s --set-upstream-to=upstream/%s' % (repo_folder, src_branch, dst_branch)
            logging.info('cd {};git branch {} --set-upstream-to=upstream/{}'.format(repo_folder, src_branch, dst_branch))
            if not self.runcmd(command_set_upstream, dst_repo, dst_branch):
                continue
            command_set_upstream = 'cd %s;git branch -m %s' % (repo_folder, dst_branch)
            logging.info('cd {};git branch -m {}'.format(repo_folder, dst_branch))
            if not self.runcmd(command_set_upstream, dst_repo, dst_branch):
                continue
            command_push_force = 'cd %s;git push -f upstream %s' % (repo_folder, dst_branch)
            logging.info('cd {};git push -f upstream {}'.format(repo_folder, dst_branch))
            if not self.runcmd(command_push_force, dst_repo, dst_branch):
                continue 

    def runcmd(self, command, dst_repo, dst_branch):
        #print('run cmd---- ', command)
        try:
            ret = subprocess.run(command,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
        except Exception as e:
            print(e)
            self.exec_result = False
            return False
        if ret.returncode != 0:
            #print('error', command, ret.stdout)
            logging.error("error:",command, ret.returncode)
            logging.error("error: dst repo: {}, dst branch: {}, sync failed".format(dst_repo, dst_branch))
            #sys.exit(1)
            self.exec_result = False
            return False
        return True

    def parse_yaml_thread(self):
        self.remove_folder(self.tmp_repo)
        os.mkdir(self.tmp_repo)
        threadLock = threading.Lock()
        threads = list()
        for i in range(self.sync_thread_num):
            tr = threading.Thread(target=self.run_thread, args=(str(i)))
            threads.append(tr)
        for i in threads:
            i.start()
        for i in threads:
            i.join()

def main():
    sync_branch = SyncBranch()
    sync_branch.parse_yaml_thread()
    if not sync_branch.exec_result:
        print('exec fail')
        sys.exit(1)

if __name__ == "__main__":
    main()

sync_conf.yml

 - sync:
    proposer: xxx
    project: xxx
    src_repo: git@gitlab.test.cc:ptd/xxx.git
    src_branch: x
    dst_repo: git@gitlab.test.cc:ptd/xxx.git
    dst_branch: x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值