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

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

步骤

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

示例代码

python 复制代码
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 库:

bash 复制代码
pip install requests

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

1. 准备工作

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

2. 安装必要的库

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

bash 复制代码
pip install requests

3. 示例代码

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

python 复制代码
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 和访问权限正确。

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

相关推荐
清水白石0088 小时前
隔离的艺术:用 `unittest.mock` 驯服外部依赖,让测试真正可控
python
码农小韩8 小时前
AIAgent应用开发——大模型理论基础与应用(五)
人工智能·python·提示词工程·aiagent
百锦再8 小时前
Java中的char、String、StringBuilder与StringBuffer 深度详解
java·开发语言·python·struts·kafka·tomcat·maven
Jonathan Star9 小时前
Ant Design (antd) Form 组件中必填项的星号(*)从标签左侧移到右侧
人工智能·python·tensorflow
努力努力再努力wz9 小时前
【Linux网络系列】:TCP 的秩序与策略:揭秘传输层如何从不可靠的网络中构建绝对可靠的通信信道
java·linux·开发语言·数据结构·c++·python·算法
deep_drink9 小时前
【论文精读(三)】PointMLP:大道至简,无需卷积与注意力的纯MLP点云网络 (ICLR 2022)
人工智能·pytorch·python·深度学习·3d·point cloud
njsgcs10 小时前
langchain+vlm示例
windows·python·langchain
勇气要爆发10 小时前
LangGraph 实战:10分钟打造带“人工审批”的智能体流水线 (Python + LangChain)
开发语言·python·langchain
jz_ddk10 小时前
[实战] 从冲击响应函数计算 FIR 系数
python·fpga开发·信号处理·fir·根升余弦·信号成形
醒醒该学习了!11 小时前
如何将json文件转成csv文件(python代码实操)
服务器·python·json