OK ... Tôi nghĩ rằng tôi đã tìm được giải pháp cho điều này mặc dù nó rất khó khăn và sự thật được nói rằng tôi không chắc chắn nó hoạt động như thế nào. Nhưng ở đây đi - có lẽ nó sẽ chỉ một ai đó đi đúng hướng.
var associatedWorkItems = new List<WorkItem>();
//Passed in from the build workflow (this variable is available under the 'Run On Agent' sequence as 'associatedChangesets'
IList<Changeset> associatedChangesets = context.GetValue(BuildAssociatedChangesets);
if (associatedChangesets.Count > 0)
{
var projectCollection =
new TfsTeamProjectCollection(new Uri("http://localhost:8080/tfs/DefaultCollection"));
VersionControlServer versionControlServer = projectCollection.GetService<VersionControlServer>();
foreach (var changeset in associatedChangesets)
{
//In order to view the individual changes, load the changeset directly from the VCS.
Changeset localChangeset = versionControlServer.GetChangeset(changeset.ChangesetId);
foreach (Change change in localChangeset.Changes)
{
//Find out what was merged in.
ChangesetMerge[] mergedChangesets = versionControlServer.QueryMerges(
null,
null,
change.Item.ServerItem,
new ChangesetVersionSpec(localChangeset.ChangesetId),
new ChangesetVersionSpec(localChangeset.ChangesetId),
null,
RecursionType.Full);
//Extract work item information from changesets being identified as merged.
foreach (var changesetMerge in mergedChangesets)
{
Changeset actualChange = versionControlServer.GetChangeset(changesetMerge.SourceVersion);
foreach (WorkItem item in actualChange.WorkItems)
{
if (!associatedWorkItems.Exists(w => w.Id == item.Id))
{
associatedWorkItems.Add(item);
}
}
}
}
}
}
Đừng hỏi tôi một cách chính xác như thế nào QueryMerges công trình nhưng tất cả tôi đang làm ở đây nó nói cho tôi những gì những gì sáp nhập như một phần của một changeset kiểm tra trong. Bạn sẽ nhận thấy rằng các tham số ChangesetVersionSpec đều giống nhau - điều này có nghĩa là chúng ta chỉ xem xét việc hợp nhất từ một changeset này.
Bạn sẽ lấy lại một mảng các đối tượng ChangesetMerge từ QueryMerges(). Trong lớp ChangesetMerge có một thuộc tính được gọi là SourceVersion - đây là ChangeetId của changeset ban đầu được hợp nhất. Sau khi chúng ta đã có, chúng ta có thể sử dụng phương thức VersionControlServer.GetChangeset() để nạp tập hợp cá nhân và giải nén WorkItem. Điều này sau đó được thêm vào một danh sách các WorkItems có thể được thao tác theo bất kỳ cách nào bạn muốn (trong trường hợp của tôi là một email). Tôi cũng sử dụng kiểm tra .Exists() để đảm bảo WorkItem giống nhau không được ghi hai lần.
Lưu ý rằng mặc dù bạn có tập hợp 'linkedChangesets' từ luồng công việc xây dựng, vì lý do nào đó (ít nhất là đối với tôi), thuộc tính Changes [] bên trong 'associatedChangesets' không bao giờ được điền (do đó tải từng changeset riêng lẻ bằng cách sử dụng Phương thức VersionControlServer.GetChangeset() dường như thực sự phổ biến tất cả các trường chúng ta cần
Giống như tôi nói, 1. đây là một giải pháp khó khăn (rất nhiều vòng lặp - một số trong số đó có thể không cần thiết), 2. I don Tôi không hiểu rõ cách thức hoạt động này mặc dù dường như tạo ra kết quả cần thiết - tôi đã đi đến kết luận này bằng cách thực hiện nhiều thử nghiệm và gỡ lỗi) và cuối cùng - đó là điều tốt nhất tôi có thể đưa ra dựa trên tài liệu có hại của Microsoft.
Hy vọng nó sẽ giúp ai đó!
Nguồn
2011-09-28 08:53:38
Có thể là một bản sao/tập hợp con của điều này: http://stackoverflow.com/questions/7536323/how-to-determine-the-work-items-fixed-in-a-particular-tfs-build-when - sử dụng-chi nhánh – pantelif