如何通过Azure Release API获取发布关联的提交消息?
解决方案:自动化获取Azure发布关联的提交消息
不需要手动操作,通过修正现有脚本即可实现完整的自动化需求,以下是关键问题修正和完整脚本:
原脚本的核心问题
- 发布详情API调用错误:
get_release_details函数硬编码了definitionId=2,且URL格式错误,应该根据传入的release_id获取单个发布的详细信息,而非按发布定义ID批量获取。 - Artifact遍历逻辑错误:单个发布详情的artifact数据在
release_details['artifacts']字段,而非release_details['value']。 - 缺少日期范围过滤:未筛选2024年1月1日至6月1日的发布。
- Build ID获取错误:原脚本从错误的字段提取build ID,导致提交API调用失败。
修正后的完整脚本
import requests from requests.auth import HTTPBasicAuth import pandas as pd from datetime import datetime # 替换为你的组织信息和PAT令牌 organization = 'NAME_OF_ORGANIZATION' pat = 'PAT_TOKEN' base_url = f'https://dev.azure.com/{organization}' # 定义日期范围 start_date = datetime(2024, 1, 1) end_date = datetime(2024, 6, 1) # 获取项目列表 def get_projects(): url = f'{base_url}/_apis/projects?api-version=6.0' response = requests.get(url, auth=HTTPBasicAuth('', pat)) response.raise_for_status() return response.json() # 获取项目下的发布列表(带日期范围过滤) def get_releases(project_name): # 添加minCreatedDate和maxCreatedDate参数过滤发布日期 url = (f'https://vsrm.dev.azure.com/{organization}/{project_name}/_apis/release/releases' f'?minCreatedDate={start_date.isoformat()}&maxCreatedDate={end_date.isoformat()}' f'&api-version=7.1-preview.8') response = requests.get(url, auth=HTTPBasicAuth('', pat)) response.raise_for_status() return response.json() # 获取单个发布的详细信息 def get_release_details(project_name, release_id): url = f'https://vsrm.dev.azure.com/{organization}/{project_name}/_apis/release/releases/{release_id}?api-version=7.1-preview.8' response = requests.get(url, auth=HTTPBasicAuth('', pat)) response.raise_for_status() return response.json() # 获取Build关联的提交消息 def get_build_commits(project_name, build_id): url = f'{base_url}/{project_name}/_apis/build/builds/{build_id}/commits?api-version=6.0' response = requests.get(url, auth=HTTPBasicAuth('', pat)) try: response.raise_for_status() commits_data = response.json() return [commit['comment'] for commit in commits_data.get('value', [])] except requests.exceptions.HTTPError: return [] # 主逻辑 release_data = [] projects = get_projects() for project in projects['value']: project_name = project['name'] releases = get_releases(project_name) for release in releases.get('value', []): release_id = release['id'] release_name = release['name'] release_date_str = release['createdOn'] # 转换日期格式用于展示 release_date = datetime.fromisoformat(release_date_str.replace('Z', '+00:00')).strftime('%Y-%m-%d %H:%M:%S') # 获取发布详情,提取关联的Build ID release_details = get_release_details(project_name, release_id) commits = [] for artifact in release_details.get('artifacts', []): # 判断artifact是否为Build类型 if artifact['type'] == 'Build': build_id = artifact['definitionReference']['version']['id'] build_commits = get_build_commits(project_name, build_id) commits.extend(build_commits) # 去重提交消息(避免同一提交在多个artifact中重复) unique_commits = list(set(commits)) commit_messages = ', '.join(unique_commits) if unique_commits else '无关联提交' release_data.append({ '项目名称': project_name, '发布名称': release_name, '发布日期': release_date, '发布提交消息': commit_messages }) # 生成CSV报告 df = pd.DataFrame(release_data) df.to_csv('azure_releases_report_20240101_20240601.csv', index=False, encoding='utf-8-sig') print('报告已生成,保存为azure_releases_report_20240101_20240601.csv')
关键修改说明
- 日期过滤:调用发布API时添加
minCreatedDate和maxCreatedDate参数,直接筛选目标时间范围内的发布,减少不必要的数据处理。 - 修正发布详情API:根据
release_id获取单个发布的完整信息,确保能正确提取关联的Build artifact。 - Build提交获取逻辑:仅处理类型为
Build的artifact,从definitionReference中正确提取Build ID,调用Build Commits API获取关联提交消息,并去重避免重复。 - 错误处理:添加
response.raise_for_status()捕获API调用错误,同时处理Build不存在关联提交的情况。
内容的提问来源于stack exchange,提问作者Loai amer
相关产品推荐
相关产品推荐

