2011-09-26 33 views
5

Tôi cần gửi email khi hoàn tất bản dựng trong TFS 2010, chi tiết các mục công việc được liên kết với các đăng ký đã được biên soạn như một phần của bản dựng này. Điều này không có vấn đề gì khi sử dụng biến số associatedChangesets có sẵn trong quy trình xây dựng.TFS 2010 API - Nhận các mục công việc từ việc hợp nhất

Tuy nhiên, trong tình huống sản xuất, chúng tôi sẽ hợp nhất các thay đổi từ chi nhánh phát triển của chúng tôi vào chi nhánh phát hành. Tại thời điểm này, xây dựng xem xét ở đó để chỉ có một thay đổi - đó là sự kết hợp giữa Phát triển thành Phát hành. Rõ ràng điều này là khá vô dụng khi chúng ta cần phải tìm ra những thay đổi được thực hiện trong chi nhánh đã được sáp nhập, và các mục công việc được liên kết.

Có ai biết cách thực hiện điều này bằng API TFS 2010 không? Dường như nó được ghi nhận khá kém từ quan điểm API. Tôi biết bạn có thể mở rộng nút lịch sử hợp nhất trong VS2010 nhưng rõ ràng điều này là không tốt vì dữ liệu này cần được thu thập theo chương trình để email báo cáo có thể được gửi đi.

+0

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

Trả lời

7

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 đó!

Các vấn đề liên quan