网站建设流程范文,安徽省建设干部学校网站首页,手机网站开发调用照片,婚礼策划师获取gitlab上项目分支版本_gitlab代码分支版本在哪-CSDN博客
原先写过一版#xff0c;但是这次想更新一下项目的分支信息时#xff0c;提示我 git服务器上的Python版本是2.7.3#xff0c;这个错误表明当前Python环境中没有安装requests库#xff0c;服务器也没有连接外网但是这次想更新一下项目的分支信息时提示我 git服务器上的Python版本是2.7.3这个错误表明当前Python环境中没有安装requests库服务器也没有连接外网所以排除了上面的方法。换了一种方式是获取列表后 测试发现是输出到屏幕想直接生成一个表格这样便于后面分析。计划是使用xlwt库来创建Excel文件的但是机器里也没有安装xlwt所以采用CSV代替ExcelPython内置的csv模块无需额外安装输出为CSV格式可直接用Excel打开。 文件管理 自动创建输出目录GitLab_Branch_Reports 文件名包含时间戳便于区分不同时间的报告 输出格式优化 表头项目ID, 项目名称, 分支数量, 分支列表 分支列表以逗号分隔方便查看。
使用说明 将脚本保存为gitlab_branches_csv.py 在命令行中运行python gitlab_branches_csv.py 脚本运行完成后在GitLab_Branch_Reports目录下找到CSV文件 用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), timeout5)sock.close()print(网络连接成功)# 测试API访问权限print(验证API访问权限...)test_url GITLAB_URL /api/v4/projects?per_page1req urllib2.Request(test_url)for key, value in HEADERS.items():req.add_header(key, value)response urllib2.urlopen(req, timeoutTIMEOUT)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, paramsNone):发起带重试机制和分页处理的请求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, timeoutTIMEOUT)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 relnext 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.7def __init__(self, f, dialectcsv.excel, encodingutf-8, **kwds):self.queue []self.writer csv.writer(f, dialectdialect, **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/projectsall_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