python检测gitlab中某个标签在一个月内添加和移除了多少次

news2025/1/14 12:32:47

可以通过 Python 脚本和 GitLab API 检测一个标签在一个月内被添加和移除的次数。以下是实现的步骤和示例代码:

步骤

  1. 获取 GitLab API 访问令牌:在 GitLab 中生成一个 Personal Access Token。
  2. 设置时间范围:确定一个月的时间范围。
  3. 调用 GitLab API 获取相关事件
    • 使用 /projects/{id}/events 端点获取标签相关的事件(如创建、删除)。
  4. 统计事件次数

示例代码

import requests
from datetime import datetime, timedelta

# 配置 GitLab 信息
GITLAB_URL = "https://gitlab.example.com"  # 替换为你的 GitLab 地址
PROJECT_ID = 12345  # 替换为你的项目 ID
PRIVATE_TOKEN = "your_personal_access_token"  # 替换为你的访问令牌
LABEL_NAME = "example-label"  # 替换为你要检测的标签

def get_events(project_id, start_date, end_date):
    headers = {"PRIVATE-TOKEN": PRIVATE_TOKEN}
    url = f"{GITLAB_URL}/api/v4/projects/{project_id}/events"
    params = {
        "after": start_date,
        "before": end_date,
        "action": "update",  # 标签操作可能是更新事件
    }
    response = requests.get(url, headers=headers, params=params)
    response.raise_for_status()
    return response.json()

def count_label_events(events, label_name):
    added_count = 0
    removed_count = 0
    
    for event in events:
        if "label" in event and event["label"]["name"] == label_name:
            if event["action_name"] == "added":
                added_count += 1
            elif event["action_name"] == "removed":
                removed_count += 1
    
    return added_count, removed_count

if __name__ == "__main__":
    # 计算一个月的时间范围
    end_date = datetime.now()
    start_date = end_date - timedelta(days=30)
    
    start_date_str = start_date.strftime("%Y-%m-%d")
    end_date_str = end_date.strftime("%Y-%m-%d")
    
    print(f"Fetching events from {start_date_str} to {end_date_str}...")
    events = get_events(PROJECT_ID, start_date_str, end_date_str)
    
    added, removed = count_label_events(events, LABEL_NAME)
    print(f"Label '{LABEL_NAME}' was added {added} times and removed {removed} times in the past month.")

代码说明

  1. GitLab API
    • 使用 /projects/{id}/events 获取项目内的活动。
    • 需要设置 PRIVATE-TOKEN 作为访问令牌。
  2. 时间范围
    • 使用 datetime 模块动态计算最近一个月的时间范围。
  3. 事件过滤
    • 根据事件的 action_name 字段统计标签的添加和移除次数。
  4. 输出
    • 最终打印出标签添加和移除的次数。

运行方式

  1. 替换 GITLAB_URLPROJECT_IDPRIVATE_TOKEN 为实际值。
  2. 运行脚本。

依赖

确保已安装 requests 库:

pip install requests

如果需要实现一个MR的添加和移除标签最多各算一次,以下是实现方法的步骤和示例代码:

1. 准备工作

  • 确保你有访问 GitLab API 的权限,并生成一个访问令牌(Private Token)。
  • 确定 GitLab 项目的 ID 和需要检测的标签名称。

2. 安装必要的库

需要安装 requests 库,用于调用 GitLab API:

pip install requests

3. 示例代码

以下代码实现了检测标签在一个月内添加和移除的次数:

import requests
from datetime import datetime, timedelta

# 配置 GitLab API 信息
GITLAB_URL = "https://gitlab.example.com"  # 替换为你的 GitLab 地址
PRIVATE_TOKEN = "your_private_token"       # 替换为你的访问令牌
PROJECT_ID = "12345"                       # 替换为你的项目 ID
LABEL_NAME = "your_label_name"             # 替换为你要检测的标签名称

def get_merge_requests():
    """
    获取过去一个月的所有 Merge Requests
    """
    one_month_ago = datetime.now() - timedelta(days=30)
    url = f"{GITLAB_URL}/api/v4/projects/{PROJECT_ID}/merge_requests"
    headers = {"PRIVATE-TOKEN": PRIVATE_TOKEN}
    params = {
        "created_after": one_month_ago.isoformat(),
        "state": "all",
    }
    response = requests.get(url, headers=headers, params=params)
    response.raise_for_status()
    return response.json()

def get_label_changes(mr_iid):
    """
    获取某个 Merge Request 的标签变更历史
    """
    url = f"{GITLAB_URL}/api/v4/projects/{PROJECT_ID}/merge_requests/{mr_iid}/resource_label_events"
    headers = {"PRIVATE-TOKEN": PRIVATE_TOKEN}
    response = requests.get(url, headers=headers)
    response.raise_for_status()
    return response.json()

def count_label_changes(label_name):
    """
    统计标签添加和移除次数
    """
    mrs = get_merge_requests()
    add_count = 0
    remove_count = 0

    for mr in mrs:
        label_events = get_label_changes(mr["iid"])
        added = False
        removed = False
        for event in label_events:
            if event["label"]["name"] == label_name:
                if event["action"] == "add" and not added:
                    add_count += 1
                    added = True
                elif event["action"] == "remove" and not removed:
                    remove_count += 1
                    removed = True

    return add_count, remove_count

if __name__ == "__main__":
    added, removed = count_label_changes(LABEL_NAME)
    print(f"标签 '{LABEL_NAME}' 在过去一个月内被添加了 {added} 次,移除了 {removed} 次。")

4. 代码说明

  1. 获取 Merge Request 列表:
    使用 GET /projects/:id/merge_requests API 获取过去一个月内的所有 MR。
  2. 获取标签变更历史:
    使用 GET /projects/:id/merge_requests/:mr_iid/resource_label_events API 获取某个 MR 的标签变更历史。
  3. 统计添加和移除次数:
    遍历标签变更事件,根据 action 判断是否为 addremove 操作,同时确保对同一个 MR 的标签添加或移除只统计一次。

5. 注意事项

  • 如果项目中 MR 较多,可能需要分页处理,可通过 pagination 参数实现。
  • 确保你的 GitLab API URL 和访问权限正确。

你可以运行这段脚本来统计标签的添加和移除情况。

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

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

相关文章

【江协STM32】11-2/3 W25Q64简介、软件SPI读写W25Q64

1. W25Q64简介 W25Qxx系列是一种低成本、小型化、使用简单的非易失性存储器,常应用于数据存储、字库存储、固件程序存储等场景存储介质:Nor Flash(闪存)时钟频率:80MHz / 160MHz (Dual SPI) / 320MHz (Quad SPI)存储容…

RNN之:LSTM 长短期记忆模型-结构-理论详解-及实战(Matlab向)

0.前言 递归!循环神经网络Recurrent Neural Network 循环神经网络(又称递归神经网络,Recurrent Neural Network,RNN)。是一种用于处理序列数据的神经网络结构,具有记忆功能,能够捕捉序列中的时…

SOLID原则学习,接口隔离原则

文章目录 1. 定义2. 为什么要遵循接口隔离原则?3. 违反接口隔离原则的例子4. 遵循接口隔离原则的改进5. 总结 1. 定义 接口隔离原则(Interface Segregation Principle, ISP) 接口隔离原则是面向对象设计中的五大原则(SOLID&#…

Qt WORD/PDF(五)使用Json一键填充Word表格

关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: 《Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 操作》 《Qt WORD/PDF&#…

AIGC时代 | 探索AI Agent的奥秘:四种设计模式引领未来智能趋势

文章目录 1. 反思案例: 2. 工具使用案例: 3. 规划案例: 4. 多Agent协作案例: 总结作者简介:延伸阅读内容简介:目录 导读:AI Agent是指能够在特定环境中自主执行任务的人工智能系统,不…

消息队列使用中防止消息丢失的实战指南

消息队列使用中防止消息丢失的实战指南 在分布式系统架构里,消息队列起着举足轻重的作用,它异步解耦各个业务模块,提升系统整体的吞吐量与响应速度。但消息丢失问题,犹如一颗不定时炸弹,随时可能破坏系统的数据一致性…

Python爬虫-汽车之家各车系周销量榜数据

前言 本文是该专栏的第43篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者在文章《Python爬虫-汽车之家各车系月销量榜数据》中,有详细介绍,如何爬取“各车系车型的月销量榜单数据”的方法以及完整代码教学教程。 而本文,笔者同样以汽车之家平台为例,…

[C++]类与对象(上)

目录 💕1.C中结构体的优化 💕2.类的定义 💕3.类与结构体的不同点 💕4.访问限定符(public,private,protected) 💕5.类域 💕6.类的实例化 💕7.类的字节大小 💕8.类的字节大小特例…

Sprint Boot教程之五十八:动态启动/停止 Kafka 监听器

Spring Boot – 动态启动/停止 Kafka 监听器 当 Spring Boot 应用程序启动时,Kafka Listener 的默认行为是开始监听某个主题。但是,有些情况下我们不想在应用程序启动后立即启动它。 要动态启动或停止 Kafka Listener,我们需要三种主要方法…

《JavaWeb开发-javascript基础》

文章目录 《JavaWeb开发-javascript基础》1.javascript 引入方式2.JS-基础语法-书写语法2.1 书写语法2.2 输出语句 3.JS-基础语法-变量4.JS-基础语法-数据类型&运算符4.1 数据类型4.2 运算符4.3 数据类型转换 5. JS-函数6. JS-对象-Array数组7. JS-对象-String字符串8. JS-…

1.组件的三大组成部分注意点(结构/样式/逻辑)scoped解决样式冲突/data是一个函数2.组件通信组件通信语法父传子子传父

学习目标 1.组件的三大组成部分注意点(结构/样式/逻辑) scoped解决样式冲突/data是一个函数 2.组件通信 组件通信语法 父传子 子传父 非父子通信(扩展) 3.综合案例:小黑记事本(组件版) …

mapbox基础,expressions表达式汇总

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言二、🍀Expressions简介2.1 expressions 操作符2.1.1 Data expressions2.1.2 Camera expressions2.2 Expressi…

一文清晰梳理Mysql 数据库

现在处于大四上学期的阶段,在大四下学期即将要进行毕业设计,所以在毕业设计开始之前呢,先将Mysql 数据库有关知识进行了一个梳理,以防选题需要使用到数据库。 1)什么是数据库? 简单理解数据库&#xff0c…

基于大语言模型的组合优化

摘要:组合优化(Combinatorial Optimization, CO)对于提高工程应用的效率和性能至关重要。随着问题规模的增大和依赖关系的复杂化,找到最优解变得极具挑战性。在处理现实世界的工程问题时,基于纯数学推理的算法存在局限…

安装conda 环境

conda create -n my_unet5 python3.8 conda activate my_unet5

容器技术全面攻略:Docker的硬核玩法

文章背景 想象一下,一个项目终于要上线了,结果因为环境配置不一致,测试服务器一切正常,生产环境却宕机了。这是开发者噩梦的开始,也是Docker救世主角色的登场!Docker的出现颠覆了传统环境配置的方式&#…

LabVIEW部署Web服务

目录 LabVIEW部署Web服务1、创建项目2、创建Web服务3、新建WebVI3.1、使用GET方法3.2、使用POST方法 4、 部署和对应URL4.1、应用程序:80804.2、本地调试:80094.3、NI Web服务器:9090(禁用) 5、测试5.1、测试GET方法5.2、测试POST方法 6、实际…

STM32 : 波特率发生器

波特率发生器 1. 发送器和接收器的波特率 波特率寄存器 (BRR): 在串行通信中,发送器和接收器的波特率是由波特率寄存器(BRR)中的一个值 DIV 来确定的。 2. 计算公式 计算公式: 详细解释 1. 波特率寄存器 (BRR) BRR: 波特率寄存器是一…

Excel数据叠加生成新DataFrame:操作指南与案例

目录 一、准备工作 二、读取Excel文件 三、数据叠加 四、处理重复数据(可选) 五、保存新DataFrame到Excel文件 六、案例演示 七、注意事项 八、总结 在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFra…

基于微信小程序的汽车销售系统的设计与实现springboot+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…