獲取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
英文地址,請注明出處:http://en.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…