gitlab初始化+API批量操作

news2024/12/19 18:57:12

几年没接触gitlab了,新版本装完以后代码提交到默认的main分支,master不再是主分支
项目有几十个仓库,研发提交代码后仓库地址和之前的发生了变化
有几个点 需要注意
1、修改全局默认分支
2、关闭分支保护
在这里插入图片描述

上面修改了全局配置不会影响已经创建好的项目,所以还需要批量修改已创建的项目
先修改Group的默认分支,不会影响已存在的项目在这里插入图片描述
修改gitlab全局的默认分支
在这里插入图片描述

这就引出了需求,要获取当前仓库下所有仓库地址,还要修改所有仓库的默认分支,从main修改为master

生成AccessToken在这里插入图片描述

创建个人访问令牌

填写信息时,确保勾选以下权限(Scopes):
api
read_api
read_repository
write_repository
admin_mode(如果是要批量修改默认分支,可能需要这个权限)
# 权限解析
api 和 read_api: 基本的 API 访问权限
read_repository: 读取仓库信息
write_repository: 修改仓库设置(包括默认分支)
admin_mode: 管理员级别的操作权限

需求1-获取仓库下所有项目地址

import requests
import sys
import time
from typing import List, Dict

class GitLabProjectFetcher:
    def __init__(self, base_url: str, private_token: str):
        """
        初始化 GitLab API 客户端
        
        Args:
            base_url: GitLab 实例的基础 URL
            private_token: GitLab 个人访问令牌
        """
        self.base_url = base_url.rstrip('/')
        self.headers = {'PRIVATE-TOKEN': private_token}
        self.session = requests.Session()
        self.session.headers.update(self.headers)

    def get_all_projects(self) -> List[Dict]:
        """获取所有项目"""
        projects = []
        page = 1
        while True:
            url = f"{self.base_url}/api/v4/projects"
            params = {
                'page': page,
                'per_page': 100,
                'order_by': 'path',
                'sort': 'asc'
            }
            
            try:
                response = self.session.get(url, params=params)
                response.raise_for_status()
                
                batch = response.json()
                if not batch:
                    break
                    
                projects.extend(batch)
                page += 1
                print(f"已获取 {len(projects)} 个项目...")
                
                time.sleep(0.5)  # 避免请求过快
                
            except requests.exceptions.RequestException as e:
                print(f"获取项目列表时发生错误: {str(e)}")
                sys.exit(1)
            
        return projects

def main():
    # 配置信息 - 根据实际环境修改
    GITLAB_URL = "http://gitlab地址"
    PRIVATE_TOKEN = "accesstoken"
    
    fetcher = GitLabProjectFetcher(GITLAB_URL, PRIVATE_TOKEN)
    
    try:
        print("正在获取项目列表...")
        projects = fetcher.get_all_projects()
        
        print("\n所有项目的 Git SSH Clone URL:")
        print("-" * 80)
        
        # 按照路径排序
        sorted_projects = sorted(projects, key=lambda x: x['path_with_namespace'])
        
        for project in sorted_projects:
            if 'ssh_url_to_repo' in project:
                print(project['ssh_url_to_repo'])
        
        print(f"\n总共找到 {len(projects)} 个项目")
        
    except Exception as e:
        print(f"发生错误: {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    main()

需求2-修改所有仓库默认的分支为master

root@prd-ops-cicd-jenkins33:/data/ops# cat chage-branch.py 
import requests
import sys
import time
from typing import List, Dict

class GitLabProjectManager:
    def __init__(self, base_url: str, private_token: str):
        """
        初始化 GitLab API 客户端
        """
        self.base_url = base_url.rstrip('/')
        self.headers = {'PRIVATE-TOKEN': private_token}
        self.session = requests.Session()
        self.session.headers.update(self.headers)

    def get_all_projects(self) -> List[Dict]:
        """获取所有项目"""
        projects = []
        page = 1
        while True:
            url = f"{self.base_url}/api/v4/projects"
            params = {
                'page': page,
                'per_page': 100,
                'order_by': 'path',
                'sort': 'asc',
                'simple': False
            }
            
            try:
                print(f"正在获取第 {page} 页...")
                response = self.session.get(url, params=params)
                response.raise_for_status()
                
                batch = response.json()
                if not batch:
                    break
                    
                projects.extend(batch)
                page += 1
                time.sleep(0.5)
                
            except requests.exceptions.RequestException as e:
                print(f"获取项目列表时发生错误: {str(e)}")
                sys.exit(1)
            
        return projects

    def check_branch_exists(self, project_id: int, branch: str) -> bool:
        """检查分支是否存在"""
        url = f"{self.base_url}/api/v4/projects/{project_id}/repository/branches/{branch}"
        response = self.session.get(url)
        return response.status_code == 200

    def update_default_branch(self, project_id: int, project_name: str, new_branch: str) -> bool:
        """更新项目的默认分支"""
        # 检查目标分支是否存在
        if not self.check_branch_exists(project_id, new_branch):
            print(f"项目 {project_name} 中不存在 {new_branch} 分支,跳过")
            return False

        url = f"{self.base_url}/api/v4/projects/{project_id}"
        data = {'default_branch': new_branch}
        
        try:
            response = self.session.put(url, json=data)
            response.raise_for_status()
            return True
        except requests.exceptions.RequestException as e:
            print(f"更新失败: {str(e)}")
            return False

def main():
    # 配置信息
    GITLAB_URL = "http://gitlab地址"
    PRIVATE_TOKEN = "accesstoken"
    NEW_DEFAULT_BRANCH = "master"
    
    manager = GitLabProjectManager(GITLAB_URL, PRIVATE_TOKEN)
    
    try:
        # 获取所有项目
        print("正在获取项目列表...")
        projects = manager.get_all_projects()
        print(f"\n找到 {len(projects)} 个项目")
        
        # 更新默认分支
        success_count = 0
        fail_count = 0
        skipped_count = 0
        
        print("\n开始更新默认分支...")
        for project in projects:
            project_id = project['id']
            project_name = project['path_with_namespace']
            current_default = project.get('default_branch', '')
            
            print(f"\n处理项目: {project_name}")
            print(f"当前默认分支: {current_default}")
            
            if current_default == NEW_DEFAULT_BRANCH:
                print("默认分支已经是 master,跳过")
                skipped_count += 1
                continue
                
            if manager.update_default_branch(project_id, project_name, NEW_DEFAULT_BRANCH):
                success_count += 1
                print(f"✓ 成功将默认分支更新为 {NEW_DEFAULT_BRANCH}")
            else:
                fail_count += 1
                print(f"✗ 更新失败")
        
        # 打印总结
        print("\n更新完成!")
        print(f"成功更新: {success_count} 个项目")
        print(f"更新失败: {fail_count} 个项目")
        print(f"跳过项目: {skipped_count} 个项目")
        print(f"总项目数: {len(projects)} 个项目")
        
    except Exception as e:
        print(f"发生错误: {str(e)}")
        sys.exit(1)

if __name__ == "__main__":
    main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2262312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java集合(完整版)

集合框架 Collection集合 概念:对象的容器,定义了对多个对象进行操作的常用方法。可以实现数组的功能 和数组的区别: 数组的长度固定,集合长度不固定数组可以存储基本类型和引用类型,集合只能存储引用类型 Collec…

常耀斌:深度学习和大模型原理与实战(深度好文)

目录 机器学习 深度学习 Transformer大模型架构 人工神经元网络 卷积神经网络 深度学习是革命性的技术成果,有利推动了计算机视觉、自然语言处理、语音识别、强化学习和统计建模的快速发展。 深度学习在计算机视觉领域上,发展突飞猛进,…

不能通过 ip 直接访问 共享盘 解决方法

from base_config.config import OpenSMB, SMB import os, time, calendar, requests, decimal, platform, fs.smbfsinfo_dict SMB.EPDI_dict info_dict[host] (FS03,10.6.12.182) info_dict[direct_tcp] True# smb OpenSMB(info_dict)print(ok)# 根据 ip 查询电脑名 impor…

Mapbox-GL 的源码解读的一般步骤

Mapbox-GL 是一个非常优秀的二三维地理引擎,随着智能驾驶时代的到来,应用也会越来越广泛,关于mapbox-gl和其他地理引擎的详细对比(比如CesiumJS),后续有时间会加更。地理首先理解 Mapbox-GL 的源码是一项复…

HIVE4.0.1在Hadoop HA部署hiveserver2模式

本文基于CENTOS7,在Hadoop3.4.0版本vm虚拟机3节点HA集群的基础上进行的搭建。 一、前置条件 本文使用MySQL8.0.26作为HIVE数据库,不使用hive自带的derby数据库,因为其不支持多客户端访问,也不方便查询。 所以必须先安装MySQL。版本…

Visual Studio 使用 GitHub Copilot 协助调试

🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…

C10.【C++ Cont】字符数组和万能头

目录 1.字符数组 1.初始化 1.按字符串初始化 2.按字符初始化 2.字符串的输入 1.无空格的字符串 2.带空格的字符串 解决方法 1.gets(了解即可) gets不安全的原因 2.fgets 3.改良后的scanf 4.getchar 3.字符数组的输出 2.C万能头 1.字符数组 C语言风格的字符串:用…

[C++]C++工具之对异常情况的处理(throw、catch、try)以及用命名空间避免同名冲突

一、C 异常处理😊 1.1 定义 C 中的异常处理用于应对程序运行中的异常情况(如除零、数组越界等),通过 try-catch 机制捕获和处理错误,防止程序崩溃。 异常是程序运行时意外发生的事件,可以通过抛出&#xf…

番外篇 | Hyper-YOLO:超图计算与YOLO架构相结合成为目标检测新的SOTA !

前言:Hello大家好,我是小哥谈。Hyper-YOLO,该方法融合了超图计算以捕捉视觉特征之间复杂的高阶关联。传统的YOLO模型虽然功能强大,但其颈部设计存在局限性,限制了跨层特征的融合以及高阶特征关系的利用。Hyper-YOLO在骨干和颈部的联合增强下,成为一个突破性的架构。在COC…

IDEA搭建springboot demo

如下所示创建SpringBootTest18项目,我选的maven,创建完成项目后,maven会自动下载一些依赖库到maven的repository目录中。 创建的项目结构如下图所示 接下来在项目中加入Framework支持,右击项目,弹出的菜单如下图所示&a…

vscode不同项目使用不同插件

转载请注明出处:小帆的帆的博客 在使用vscode开发不同项目时可能会用到不同的插件。手动管理不够优雅,本文介绍使用Profiles的方式的来管理不同项目的插件。 手动管理不同项目的插件 本来vscode安装了有三个插件 这时需要新建一个项目,新…

【FFmpeg】解封装 ① ( 封装与解封装流程 | 解封装函数简介 | 查找码流标号和码流参数信息 | 使用 MediaInfo 分析视频文件 )

文章目录 一、解封装1、封装与解封装流程2、解封装 常用函数 二、解封装函数简介1、avformat_alloc_context 函数2、avformat_free_context 函数3、avformat_open_input 函数4、avformat_close_input 函数5、avformat_find_stream_info 函数6、av_read_frame 函数7、avformat_s…

PDFMathTranslate 一个基于AI优秀的PDF论文翻译工具

PDFMathTranslate 是一个设想中的工具,旨在翻译PDF文档中的数学内容。以下是这个工具的主要特点和使用方法: 链接:https://www.modelscope.cn/studios/AI-ModelScope/PDFMathTranslate 功能特点 数学公式识别:利用先进的OCR&…

20241218_segmentation

参考: 使用SA模型 https://ai.meta.com/research/publications/segment-anything/讲解生物学意义 https://www.nature.com/articles/s41593-024-01714-3#Sec13 x.0 workflow 图像分割方法识别出重要的ROI区域计算ROI区域个数(需要计算机算法&#xff…

Ubuntu22.04配置3D gaussian splatting

这篇博客提供了3D gaussian splatting在新安装Ubuntu上的配置过程。 1.拉仓库 2.安装显卡驱动和cuda版本 3.安装Pytorch 4.安装Pycharm和配置Python 5.安装附加依赖项(方法一) 6.安装Anaconda(方法二) 7.测试 1.拉仓库 # HT…

Apache Kylin最简单的解析、了解

官网:Overview | Apache Kylin 一、Apache Kylin是什么? 由中国团队研发具有浓厚的中国韵味,使用神兽麒麟(kylin)为名 的一个OLAP多维数据分析引擎:(据官方给出的数据) 亚秒级响应&#xff…

【现代服务端架构】传统服务器 对比 Serverless

在现代开发中,选择合适的架构是至关重要的。两种非常常见的架构模式分别是 传统服务器架构 和 Serverless。它们各有优缺点,适合不同的应用场景。今天,我就带大家一起对比这两种架构,看看它们的差异,并且帮助你选择最适…

CVE-2024-32709 WordPress —— Recall 插件存在 SQL 注入漏洞

漏洞描述 WordPress 是一款免费开源的内容管理系统,适用于各类网站,包括个人博客、电子商务系统、企业网站。其插件 WP-Recall 的 account 存在 SQL 注入漏洞,攻击者可以通过该漏洞获取数据库敏感信息。 WP-Recall 版本 <= 16.26.5 漏洞复现 搭建环境、安装插件、完成…

vue+net使用stripe支付开发流程

文章目录 前言用到的语言和技术整体流程stripe平台vue前端Net后端遇到的问题思考总结 前言 公司最近做到了国外支付功能&#xff0c;最后选型使用stripe进行支付&#xff0c;实现目标&#xff1a;使用stripe支付可以让国外用户自己选择支付方式并订阅支付。 用到的语言和技术…

什么?Flutter 可能会被 SwiftUI/ArkUI 化?全新的 Flutter Roadmap

在刚刚过去的 FlutterInProduction 活动里&#xff0c;Flutter 官方除了介绍「历史进程」和「用户案例」之外&#xff0c;也着重提及了未来相关的 roadmap &#xff0c;其中就有 3.27 里的 Swift Package Manager 、 Widget 实时预览 和 Dart 与 native 平台原生语言直接互操作…