获取gitlab上项目分支版本(二)

获取gitlab上项目分支版本_gitlab代码分支版本在哪-CSDN博客

原先写过一版,但是这次想更新一下项目的分支信息时,提示我

git服务器上的Python版本是2.7.3,这个错误表明当前Python环境中没有安装requests库,服务器也没有连接外网,所以排除了上面的方法。换了一种方式是获取列表后 测试发现是输出到屏幕,想直接生成一个表格,这样便于后面分析。计划是使用xlwt库来创建Excel文件的,但是机器里也没有安装xlwt,所以采用CSV代替Excel,Python内置的csv模块,无需额外安装,输出为CSV格式,可直接用Excel打开。

  1. 文件管理

    • 自动创建输出目录GitLab_Branch_Reports

    • 文件名包含时间戳,便于区分不同时间的报告

  2. 输出格式优化

    • 表头:项目ID, 项目名称, 分支数量, 分支列表

    • 分支列表以逗号分隔,方便查看。 

使用说明

  1. 将脚本保存为gitlab_branches_csv.py

  2. 在命令行中运行:python gitlab_branches_csv.py

  3. 脚本运行完成后,在GitLab_Branch_Reports目录下找到CSV文件

  4. 用Excel打开CSV文件查看结果

    # -*- coding: utf-8 -*-
    import urllib2
    import json
    import time
    import sys
    import socket
    import csv
    import os
    from datetime import datetime# 配置信息
    GITLAB_URL = 'http://172.16.67.163:8083'
    ACCESS_TOKEN = 'glpat-xcyhWihzE7Z3SxQVicuY'
    HEADERS = {'PRIVATE-TOKEN': ACCESS_TOKEN}
    TIMEOUT = 30  # 请求超时时间(秒)
    MAX_RETRIES = 3  # 最大重试次数
    DELAY_BETWEEN_REQUESTS = 0.5  # 请求间隔(秒)def test_connection():"""测试网络连接并验证API访问权限"""print("测试连接至 GitLab 服务器...")try:# 测试网络连接host, port = '172.16.67.163', 8083sock = socket.create_connection((host, port), timeout=5)sock.close()print("网络连接成功!")# 测试API访问权限print("验证API访问权限...")test_url = GITLAB_URL + "/api/v4/projects?per_page=1"req = urllib2.Request(test_url)for key, value in HEADERS.items():req.add_header(key, value)response = urllib2.urlopen(req, timeout=TIMEOUT)if response.getcode() == 200:print("API访问验证成功!")return Trueelse:print("API访问失败,状态码: %d" % response.getcode())return Falseexcept (socket.timeout, socket.error) as e:print("网络连接失败: %s" % str(e))print("请检查: ")print("1. 服务器 %s 是否在线" % host)print("2. 端口 %s 是否开放" % port)print("3. 本地防火墙设置")except urllib2.HTTPError as e:print("API访问错误: %d %s" % (e.code, e.reason))if e.code == 401:print("认证失败,请检查访问令牌是否有效")elif e.code == 403:print("权限不足,请检查令牌权限")except Exception as e:print("未知错误: %s" % str(e))return Falsedef make_request(url, params=None):"""发起带重试机制和分页处理的请求"""all_items = []page = 1retry_count = 0while True:try:# 构建请求参数params = params or {}params['page'] = pageparams['per_page'] = 100query = '&'.join(["%s=%s" % (k, v) for k, v in params.items()])full_url = "%s?%s" % (url, query)# 创建请求对象req = urllib2.Request(full_url)for key, value in HEADERS.items():req.add_header(key, value)# 发送请求(带超时设置)response = urllib2.urlopen(req, timeout=TIMEOUT)data = response.read()items = json.loads(data)if not items:breakall_items.extend(items)# 检查是否有更多页面link_header = response.info().getheader('Link')if not link_header or 'rel="next"' not in link_header:breakpage += 1retry_count = 0  # 成功则重置重试计数except urllib2.URLError as e:if isinstance(e.reason, socket.timeout):print("请求超时: %s" % full_url)else:print("URL错误: %s" % str(e))retry_count += 1if retry_count > MAX_RETRIES:print("达到最大重试次数,放弃请求")breakprint("等待 %d 秒后重试..." % retry_count)time.sleep(retry_count * 2)  # 指数退避except Exception as e:print("请求出错: %s" % str(e))retry_count += 1if retry_count > MAX_RETRIES:print("达到最大重试次数,放弃请求")breaktime.sleep(retry_count * 2)return all_items# 创建输出目录
    OUTPUT_DIR = "GitLab_Branch_Reports"
    if not os.path.exists(OUTPUT_DIR):os.makedirs(OUTPUT_DIR)# 先测试网络连接
    if not test_connection():print("无法连接到 GitLab 服务器,请检查网络连接和API权限")sys.exit(1)# 创建CSV文件
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    csv_filename = os.path.join(OUTPUT_DIR, 'gitlab_branches_%s.csv' % timestamp)# 修复Unicode问题:使用UnicodeWriter类
    class UnicodeWriter:"""CSV writer that supports Unicode in Python 2.7"""def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):self.queue = []self.writer = csv.writer(f, dialect=dialect, **kwds)self.encoding = encodingdef writerow(self, row):# 确保所有元素都是Unicodeunicode_row = []for item in row:if isinstance(item, (str, unicode)):if not isinstance(item, unicode):item = unicode(item, self.encoding)else:item = unicode(item)unicode_row.append(item)self.queue.append(unicode_row)def writerows(self, rows):for row in rows:self.writerow(row)def write_to_file(self):# 写入BOM头,使Excel正确识别UTF-8编码self.writer.writerow([])  # 先写一个空行确保位置正确for row in self.queue:# 将Unicode编码为UTF-8字节串encoded_row = [col.encode(self.encoding) for col in row]self.writer.writerow(encoded_row)# 打开CSV文件准备写入
    with open(csv_filename, 'wb') as csvfile:# 创建UnicodeWriter实例writer = UnicodeWriter(csvfile)# 写入CSV表头(使用Unicode字符串)headers = [u'项目ID', u'项目名称', u'分支数量', u'分支列表']writer.writerow(headers)# 获取所有项目print("\n正在获取所有项目列表...")projects_url = GITLAB_URL + '/api/v4/projects'all_projects = make_request(projects_url, {'simple': True})if not all_projects:print("无法获取项目列表,请检查错误信息")sys.exit(1)print("\n共获取 %d 个项目\n%s" % (len(all_projects), '='*50))# 遍历所有项目获取分支for idx, project in enumerate(all_projects, 1):project_id = project['id']# 安全处理项目名称try:# 优先使用带命名空间的项目名project_name = project.get('name_with_namespace', project.get('name', u'未知项目'))except Exception as e:project_name = u"项目名获取失败: %s" % unicode(e)# 打印项目信息try:print("\n[%d/%d] 处理项目: %s" % (idx, len(all_projects), project_name.encode('utf-8')))except:print("\n[%d/%d] 处理项目: [Unicode项目名]" % (idx, len(all_projects)))# 获取项目所有分支branches_url = GITLAB_URL + '/api/v4/projects/%d/repository/branches' % project_idall_branches = make_request(branches_url)branch_count = len(all_branches) if all_branches else 0# 处理分支信息branch_names = []if all_branches:print("  找到 %d 个分支:" % branch_count)# 收集分支名称for branch in all_branches:try:branch_name = branch.get('name', u'未知分支')branch_names.append(branch_name)# 只打印前5个分支if len(branch_names) <= 5:try:print("    - %s" % branch_name.encode('utf-8'))except:print("    - [Unicode分支名]")except Exception as e:error_msg = u"分支名获取失败: %s" % unicode(e)branch_names.append(error_msg)print("    - [分支名错误]")if branch_count > 5:print("    ...及其他 %d 个分支" % (branch_count-5))else:print("  该项目没有分支或获取失败")# 准备CSV行数据branch_list_str = u", ".join(branch_names)csv_row = [unicode(project_id),project_name,unicode(branch_count),branch_list_str]writer.writerow(csv_row)# 避免请求过快time.sleep(DELAY_BETWEEN_REQUESTS)# 将所有数据写入文件writer.write_to_file()print("\n所有项目处理完成!结果已保存到: %s" % csv_filename)# 添加完成提示
    print("\n操作说明:")
    print("1. CSV文件路径: %s" % os.path.abspath(csv_filename))

 

然后再通过Excel的操作,获取到分支信息

需要注意的是:ACCESS_TOKEN = 'glpat-xcyhWihzE7Z3SxQVicuY'的有效期会变,需要重新去gitlab上生成。

 Excel单元和合并,2列内容合并到一起,2列内容都保留
公式:=A2 & " " & B2

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

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

相关文章

主流防火墙策略绕过漏洞的修复方案与加固实践

主流防火墙策略绕过漏洞的修复方案与加固实践 流量关键点分析&#xff08;攻击手法&#xff09; 攻击者通过精心构造的TCP序列号攻击和恶意标志组合绕过防火墙DPI检测&#xff0c;核心手法如下&#xff1a; TCP连接建立&#xff08;正常握手&#xff09; 1049&#xff1a;客户…

泛微OAe9-后端二开常见数据库操作

泛微OAe9-后端二开常见数据库操作 文章目录 泛微OAe9-后端二开常见数据库操作一、RecordSet1 RecordSet 操作OA本身的表2 RecordSet 操作OA 本身的存储过程 二、RecordSetTrans三、RecordSetDataSource四、原生 jdbc 一、RecordSet RecordSet 适用于操作 OA 自己的库。OA 数据库…

【数据分析八:hypothesis testing】假设检验

本节我们讲述假设检验和抽样方法 有关假设检验的详细内容&#xff0c;可以参考我以往的博客 概率论与数理统计总复习_概率论与数理统计复习-CSDN博客文章浏览阅读1.5k次&#xff0c;点赞33次&#xff0c;收藏23次。中科大使用的教辅《概率论和数理统计》&#xff0c;带大家复…

AI免费工具:promptpilot、今天学点啥、中英文翻译

promptpilot 激发模型潜能&#xff0c;轻松优化 Prompt https://promptpilot.volcengine.com/startup 今天学点啥 https://metaso.cn/study 能生成网页和语音播报 中英文翻译 沉浸式翻译&#xff0c;浏览器插件&#xff0c;ai翻译

计算机网络学习笔记:TCP三报文握手、四报文挥手

文章目录 前言一、TCP三报文握手二、TCP四报文挥手三、TCP保活计时器 前言 TCP通信&#xff0c;通常需要经历三个阶段&#xff1a;三报文握手->发送&#xff0c;接收数据->四报文挥手。 一、TCP三报文握手 三报文握手处于TCP的连接建立阶段&#xff0c;主要解决了以下的…

kafka部署和基本操作

一、部署kafka 解压 tar xzvf kafka_2.12-3.9.1.tgz tar -zxf kafka_2.12-3.9.1.tgz 1.修改config/server.properties # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license agreements. See the NOTICE file distributed with # …

Bootstrap 5学习教程,从入门到精通,Bootstrap 5 导航语法知识点及案例代码(17)

Bootstrap 5 导航语法知识点及案例代码 Bootstrap 5 提供了强大的导航组件&#xff0c;帮助开发者快速构建响应式且美观的导航栏。 一、Bootstrap 5 导航组件概述 Bootstrap 5 提供了多种导航组件&#xff0c;主要包括&#xff1a; 导航栏&#xff08;Navbar&#xff09;&am…

清除 docker 无用的 镜像/容器

清除 docker 无用的 镜像/容器 删除 <none> 的 docker 镜像 使用以下命令删除所有 的 Docker 镜像&#xff08;即悬空镜像 / dangling images&#xff09;&#xff1a; docker image prune -f这会自动删除所有没有 tag 的镜像&#xff08;&#xff09;&#xff0c;不会…

使用Charles抓包工具提升API调试与性能优化效率

在软件开发过程中&#xff0c;网络请求调试和性能优化往往成为开发者遇到的挑战&#xff0c;尤其是在进行API接口调试时。开发者需要确保网络请求的正确性、响应时间以及系统的整体性能。然而&#xff0c;传统的调试方法常常无法提供足够的细节来深入分析问题&#xff0c;进而影…

如何协调各项目关键节点的冲突与依赖

在多项目并行的环境下&#xff0c;关键节点间的冲突与依赖是导致项目延期、资源浪费和沟通误解的主要根源。要高效协调此类问题&#xff0c;企业应重点从建立透明的进度依赖图、使用项目管理工具对齐节点、推动跨部门协同机制入手。其中&#xff0c;通过Gantt图或关键路径法实现…

mongodb单节点改副本集模式

前一阵将三节点的副本集改成了单节点&#xff0c;但后面业务代码出现问题&#xff1a;无法使用事务&#xff0c;因为事务只有在副本集上能用&#xff0c;单节点无法使用&#xff0c;故需要改回副本集模式&#xff0c;而我目前仅有一台服务器&#xff0c;所以考虑在一台服务器上…

Android 修改了页面的xml布局,使用了databinding,这时候编译时需要用到apt吗

deepseek回答&#xff1a; 在 Android 开发中使用 DataBinding 时&#xff0c;不需要显式使用 apt&#xff08;Annotation Processing Tool&#xff09;。以下是详细说明&#xff1a; 1. DataBinding 的编译机制 DataBinding 是 Android Gradle 插件原生支持的功能&#xff…

服务器如何从http升级到https(nginx)

1.证书申请 可以到阿里云或者华为云去申请证书&#xff0c;申请完下载证书是个压缩包&#xff0c;然后解压 可以到到几个文件夹&#xff0c;找到 .Nginx 文件夹打开 会有两个文件&#xff0c;将这两个文件上传至nginx/conf/cert文件夹下&#xff08;cert需要手…

6.19_JAVA_微服务

1、跑后端的时候要把数据库跑起来&#xff0c;否则会报错。 2、predicate断言&#xff1a; 预言&#xff1a;predict 3、gateway&#xff1a;出路口 4、API&#xff1a;List.of("a", "b", "c");把abc编程一个集合。 5、 6、shortcutFieldOrd…

Linux 基础命令:`ls`、`cd`、`du` 快速入门

在 Linux 系统中&#xff0c;ls、cd 和 du 是日常操作中最常用的三个命令。掌握它们能大幅提升文件管理效率。 1. ls&#xff1a;查看目录内容 用途&#xff1a;列出当前或指定目录下的文件和子目录。 常用命令&#xff1a; ls -l # 详细列表&#xff08;权限、大…

408第一季 - 数据结构 - 散列表

散列表 概念 散列表本身就是为了查找 原始人思想 散列表思想 6%5 是 1 1%5 也是1 冲突 冲突怎么办&#xff1f; 线性探测法 就往后找&#xff0c;1跑到索引为2 然后查找&#xff0c;可以发现&#xff0c;只要没冲突就只用查找1次 然后你想找10的话&#xff0c;发现索引为0…

Spring Boot 集成 Elasticsearch(含 ElasticsearchRestTemplate 示例)

Elasticsearch 是一个基于 Lucene 的分布式搜索服务器&#xff0c;具有高效的全文检索能力。在现代应用中&#xff0c;尤其是需要强大搜索功能的系统中&#xff0c;Elasticsearch 被广泛使用。 Spring Boot 提供了对 Elasticsearch 的集成支持&#xff0c;使得开发者可以轻松地…

CMake实践:指定gcc版本编译和交叉编译

目录 1.指定gcc版本编译 1.1.通过CMake参数来实现 1.2.使用 RPATH/RUNPATH 直接指定库路径 1.3.使用符号链接和 LD_LIBRARY_PATH 1.4.使用 wrapper 脚本封装 LD_LIBRARY_PATH 2.交叉编译 2.1.基本用法 2.2.工具链文件关键配置 2.3.多平台工具链示例 2.4.注意事项 2.…

详解鸿蒙Next仓颉开发语言中的全屏模式

大家好&#xff0c;今天跟大家分享一下仓颉开发语言中的全屏模式。 和ArkTS一样&#xff0c;仓颉的新建项目默认是非全屏模式的&#xff0c;如果你的应用颜色比较丰富&#xff0c;就会发现屏幕上方和底部的留白&#xff0c;这是应用自动避让了屏幕上方摄像头区域和底部的导航条…

LoRA 浅析

1. 核心思想 LoRA 是一种参数高效的微调方法&#xff0c;旨在减少微调大型语言模型 (LLMs) 所需的计算资源和存储空间。其核心思想是&#xff1a; 冻结预训练模型权重&#xff1a; 在微调过程中&#xff0c;保持预训练 LLM 的原始权重不变。引入低秩矩阵&#xff1a; 对于 LL…