如何通过TFS2018 API获取构建定义的最后修改时间?
获取TFS2018构建定义的最后修改时间及手动变更判断
我刚好处理过类似的TFS2018构建定义管理场景,给你分享几个实用的方案,完美匹配你的需求:
1. 先拿到基础的最后修改信息
TFS2018的构建定义API本身就提供了直接的修改追踪字段,你可以调用Build Definitions - Get接口(端点格式:GET https://{instance}/{collection}/{project}/_apis/build/definitions/{definitionId}?api-version=2.0),返回的JSON里有两个关键字段:
lastModifiedDate:记录了该构建定义最后一次被修改的时间,不管是API批量更新、模板同步还是Web页面手动修改,都会更新这个时间。lastModifiedBy:记录了最后修改该定义的用户/账号,这是区分自动更新和手动修改的核心依据。
2. 区分自动更新与手动修改的关键技巧
要避免删除手动修改过的定义,你需要在自动更新流程里给构建定义打上专属标记,比如:
- 在创建/更新时,给定义添加一个自定义标签(比如
AutoGeneratedByTemplate),或者在description字段里加入特定标识(比如[AutoSync:TemplateV2])。 - 后续检查时,结合两个条件判断:
- 如果
lastModifiedBy是你的API服务账号,且自定义标记存在/未被修改,说明是模板同步的自动更新,可以放心删除重建。 - 如果
lastModifiedBy是普通用户,或者自定义标记被移除/修改了,那肯定是有人手动改过这个定义,直接跳过删除逻辑。
- 如果
3. 精准追踪构建步骤的变更(进阶)
如果需要严格判断构建步骤本身是否被修改(而不是任何无关的修改,比如修改了定义名称),可以对比构建定义的process字段:
- 每次自动更新完成后,把当前定义的
process字段内容(这就是构建步骤的完整配置)计算一个哈希值,和定义ID一起存到外部存储(比如数据库)里。 - 下次检查时,获取最新的
process字段并计算哈希值,和存储的旧值对比:- 如果哈希一致,说明构建步骤没动过,即使其他字段修改了(比如名称),只要是自动更新的就可以处理。
- 如果哈希不一致,再结合
lastModifiedBy判断是手动修改了步骤,还是模板更新导致的步骤变更。
代码示例(C#)
这里给你一段调用API获取信息的极简示例,方便你快速上手:
using System; using System.Net.Http; using System.Net.Http.Headers; using System.Text; using Newtonsoft.Json.Linq; class TfsBuildDefinitionChecker { static async System.Threading.Tasks.Task Main(string[] args) { var tfsInstance = "https://your-tfs-server/DefaultCollection"; var projectName = "YourTargetProject"; var definitionId = 123; // 替换成你的构建定义ID var patToken = "your-personal-access-token"; var apiUrl = $"{tfsInstance}/{projectName}/_apis/build/definitions/{definitionId}?api-version=2.0"; using (var client = new HttpClient()) { client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); // PAT认证:注意前面的冒号不能丢 client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($":{patToken}")) ); var response = await client.GetAsync(apiUrl); response.EnsureSuccessStatusCode(); var definitionData = JObject.Parse(await response.Content.ReadAsStringAsync()); // 提取关键信息 var lastModifiedTime = definitionData["lastModifiedDate"].Value<DateTime>(); var modifierName = definitionData["lastModifiedBy"]["displayName"].Value<string>(); var hasAutoTag = definitionData["tags"]?.Any(tag => tag.Value<string>() == "AutoGeneratedByTemplate") ?? false; // 判断逻辑 if (!hasAutoTag || modifierName != "YourApiServiceAccountName") { Console.WriteLine($"构建定义 {definitionId} 已被手动修改,跳过删除操作"); } else { Console.WriteLine($"构建定义 {definitionId} 为自动同步,可进行模板更新操作"); } } } }
几个注意事项
- TFS2018对应的API版本是
2.0,别用错版本,不同版本的字段结构可能有差异。 - 如果你是通过删除重建的方式更新模板,一定要在新创建的定义上重新打上自定义标记,不然下次检查会误判。
- 可以结合
revision字段辅助判断:每次修改都会递增版本号,记录你上次自动更新时的版本号,下次如果版本号更高且修改人不是服务账号,就标记为手动修改。
内容的提问来源于stack exchange,提问作者doorman
相关产品推荐
相关产品推荐

