可以通过 Python 脚本和 GitLab API 检测一个标签在一个月内被添加和移除的次数。以下是实现的步骤和示例代码:
步骤
- 获取 GitLab API 访问令牌:在 GitLab 中生成一个 Personal Access Token。
- 设置时间范围:确定一个月的时间范围。
- 调用 GitLab API 获取相关事件:
- 使用
/projects/{id}/events
端点获取标签相关的事件(如创建、删除)。
- 使用
- 统计事件次数。
示例代码
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 = 0removed_count = 0for event in events:if "label" in event and event["label"]["name"] == label_name:if event["action_name"] == "added":added_count += 1elif event["action_name"] == "removed":removed_count += 1return added_count, removed_countif __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.")
代码说明
- GitLab API
- 使用
/projects/{id}/events
获取项目内的活动。 - 需要设置
PRIVATE-TOKEN
作为访问令牌。
- 使用
- 时间范围
- 使用
datetime
模块动态计算最近一个月的时间范围。
- 使用
- 事件过滤
- 根据事件的
action_name
字段统计标签的添加和移除次数。
- 根据事件的
- 输出
- 最终打印出标签添加和移除的次数。
运行方式
- 替换
GITLAB_URL
、PROJECT_ID
和PRIVATE_TOKEN
为实际值。 - 运行脚本。
依赖
确保已安装 requests
库:
pip install requests
如果需要实现一个MR的添加和移除标签最多各算一次,以下是实现方法的步骤和示例代码:
1. 准备工作
- 确保你有访问 GitLab API 的权限,并生成一个访问令牌(Private Token)。
- 确定 GitLab 项目的 ID 和需要检测的标签名称。
2. 安装必要的库
需要安装 requests
库,用于调用 GitLab API:
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 = 0remove_count = 0for mr in mrs:label_events = get_label_changes(mr["iid"])added = Falseremoved = Falsefor event in label_events:if event["label"]["name"] == label_name:if event["action"] == "add" and not added:add_count += 1added = Trueelif event["action"] == "remove" and not removed:remove_count += 1removed = Truereturn add_count, remove_countif __name__ == "__main__":added, removed = count_label_changes(LABEL_NAME)print(f"标签 '{LABEL_NAME}' 在过去一个月内被添加了 {added} 次,移除了 {removed} 次。")
4. 代码说明
- 获取 Merge Request 列表:
使用GET /projects/:id/merge_requests
API 获取过去一个月内的所有 MR。 - 获取标签变更历史:
使用GET /projects/:id/merge_requests/:mr_iid/resource_label_events
API 获取某个 MR 的标签变更历史。 - 统计添加和移除次数:
遍历标签变更事件,根据action
判断是否为add
或remove
操作,同时确保对同一个 MR 的标签添加或移除只统计一次。
5. 注意事项
- 如果项目中 MR 较多,可能需要分页处理,可通过
pagination
参数实现。 - 确保你的 GitLab API URL 和访问权限正确。
你可以运行这段脚本来统计标签的添加和移除情况。