2008-11-06 28 views
6

Tôi có một kịch bản Nant xây dựng mà CruiseControl sử dụng để xây dựng một giải pháp theo yêu cầu.Làm thế nào để vượt qua số xây dựng từ Nant trở lại Cruise Control

Tuy nhiên, chúng tôi chỉ mới có CruiseControl vì vậy số xây dựng chính thức của chúng tôi khác với những gì được liệt kê trong CruiseControl.

Tôi biết CruiseControl sẽ tiêm một số thuộc tính vào kịch bản xây dựng để tôi có thể truy cập số CC build trong tập lệnh (CCNetLabel) nhưng làm cách nào để chuyển giá trị quay lại CC để sử dụng làm số bản dựng trên màn hình giao diện người dùng?

Ví dụ, CC nói xây dựng số 2

Nant kịch bản increments một giá trị buildnumber.xml mọi xây dựng và xây dựng số chính thức là trên 123.

Tôi muốn giao diện người dùng CC để hiển thị thành công cuối cùng xây dựng số : 123, không phải 2, vậy làm thế nào để tôi vượt qua giá trị đó?

Trả lời

7

Trình tạo nhãn tùy chỉnh là bắt buộc cho việc này. Perforce là nhà cung cấp kiểm soát nguồn của chúng tôi và chúng tôi lấy được số phiên bản của chúng tôi từ đó. Mã này là như sau:

/// <summary> 
/// Gets the latest change list number from perforce, for ccnet to consume as a build label. 
/// </summary> 
[ReflectorType("p4labeller")] 
public class PerforceLabeller : ILabeller 
{ 
    // perforce executable (optional) 
    [ReflectorProperty("executable", Required = false)] 
    public string P4Executable = "p4.exe"; 

    // perforce port (i.e. myserver:1234) 
    [ReflectorProperty("port", Required = false)] 
    public string P4Port = String.Empty; 

    // perforce user 
    [ReflectorProperty("user", Required = false)] 
    public string P4User = String.Empty; 

    // perforce client 
    [ReflectorProperty("client", Required = false)] 
    public string P4Client = String.Empty; 

    // perforce view (i.e. //Dev/Code1/...) 
    [ReflectorProperty("view", Required = false)] 
    public string P4View = String.Empty; 

    // Returns latest change list 
    public string Generate(IIntegrationResult previousLabel) 
    { 
     return GetLatestChangelist(); 
    } 

    // Stores latest change list into a label 
    public void Run(IIntegrationResult result) 
    { 
     result.Label = GetLatestChangelist(); 
    } 

    // Gets the latest change list 
    public string GetLatestChangelist() 
    { 
     // Build the arguments to pass to p4 to get the latest changelist 
     string theArgs = "-p " + P4Port + " -u " + P4User + " -c " + P4Client + " changes -m 1 -s submitted " + P4View; 
     Log.Info(string.Format("Getting latest change from Perforce using --> " + theArgs)); 

     // Execute p4 
     ProcessResult theProcessResult = new ProcessExecutor().Execute(new ProcessInfo(P4Executable, theArgs)); 

     // Extract the changelist # from the result 
     Regex theRegex = new Regex(@"\s[0-9]+\s", RegexOptions.IgnoreCase); 
     Match theMatch = theRegex.Match(theProcessResult.StandardOutput); 
     return theMatch.Value.Trim(); 
    } 
} 

Phương pháp, GetLatestChangelist, là nơi bạn có lẽ sẽ chèn logic riêng của mình để nói chuyện với hệ thống kiểm soát phiên bản của bạn. Trong Perforce, ý tưởng về danh sách thay đổi cuối cùng là duy nhất. Số xây dựng của chúng tôi và cuối cùng là số phiên bản dựa trên đó.

Khi bạn xây dựng này (thành một dll lắp ráp), bạn sẽ phải móc nó vào ccnet. Bạn chỉ có thể thả assembly vào thư mục máy chủ (bên cạnh ccnet.exe).

Tiếp theo bạn sửa đổi tệp dự án ccnet của mình để sử dụng labeller này. Chúng tôi đã làm điều này với default labeller block. Một cái gì đó như sau:

<project> 
<labeller type="p4labeller"> 
    <client>myclient</client> 
    <executable>p4.exe</executable> 
    <port>myserver:1234</port> 
    <user>myuser</user> 
    <view>//Code1/...</view> 
</labeller> 
<!-- Other project configuration to go here --> 
</project> 

Nếu bạn chỉ muốn số bản dựng hiển thị trong ccnet thì bạn đã hoàn thành và không thực sự cần phải làm gì khác. Tuy nhiên, bạn có thể truy cập nhãn trong tập lệnh NAnt nếu muốn bằng cách sử dụng thuộc tính đã được cung cấp CCNetLabel.

Hy vọng điều này sẽ giúp một số.Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi nào bằng cách đăng lên nhận xét.

+1

Để biên dịch điều này, tôi phải thêm tham chiếu đến ThoughtWorks.CruiseControl.Core.dll và NetReflector.dll (cả trong thư mục cài đặt CruiseControl.Net và sau đó thêm thông tin sau để nhập các không gian tên: sử dụng Exortech.NetReflector; sử dụng ThoughtWorks .CruiseControl.Core; – robaker

+0

Điều khác tôi sẽ thêm là bạn chắc chắn rằng dll lắp ráp của bạn được đặt tên là "ccnet. *. Plugin.dll" trong đó * là bất kỳ tên nào bạn chọn cho trình cắm thêm của mình. – Ken

1

Bạn đã thử sử dụng một số biến môi trường chưa? Tôi tin rằng CCNet có thể xử lý chúng.

Tôi sẽ tìm hiểu một chút về điều này.

Vâng, tôi thấy một giải pháp, khá bẩn, nhưng dù sao đi nữa:

1- Thêm một phần defaultlabeller trong định nghĩa dự án CCNET của bạn. Nó sẽ chứa mẫu của số bản dựng mà bạn muốn hiển thị.

2- Trong vòng NAnt, có tập lệnh để cập nhật tệp cấu hình của bạn, chèn số bản dựng bạn muốn xem.

3- Chạm (theo ý nghĩa của Unix) tệp ccnet.exe.config để làm cho nó tải lại tệp cấu hình dự án.

et voilà.

0

Chúng tôi cũng gặp sự cố này. Tôi đã viết một plugin ghi nhãn CC đặc biệt.

+0

Bạn không có mã để phân phối cho bạn? –

+0

Không, nhưng nó thực sự không phải là khó khăn. Kế thừa từ net.sourceforge.cruisecontrol.LabelIncrementer, hãy làm theo các tài liệu API, xây dựng plugin của bạn vào một cái lọ, thêm jar vào tệp config.xml của bạn. – JesperE

0

Nếu số bản dựng của bạn là tuần tự, bạn có thể chỉ cần hack tệp trạng thái kiểm soát hành trình để cung cấp cho nó số bản dựng chính xác để bắt đầu. Bạn đang tìm kiếm một tệp có tên là [projectName] .state.

Tôi đã thay đổi yếu tố Label với số đúng và LastSuccessfulIntegrationLabel được số điện thoại mới.

0

Tuy nhiên, chúng tôi chỉ gần đây đã CruiseControl để chính thức xây dựng số của chúng tôi khác với những gì là liệt kê trong CruiseControl.

Sắp xếp theo các dòng của những gì gbanfill cho biết, bạn có thể cho biết CC xây dựng số nào để bắt đầu, nhưng không cần phải hack tệp .ser. Bạn có thể sử dụng giao diện JMX để đặt số bản dựng hiện tại để đồng bộ hóa với số bản dựng NAnt của bạn.

Bạn cũng có thể đặt giá trị default label cho số bản dựng hiện tại của mình, xóa tệp .ser và khởi động lại CC. Tuy nhiên, có lẽ điều dễ nhất là viết số bản dựng vào một tệp thuộc tính từ NAnt và sau đó sử dụng property file label incrementer để đọc tệp đó. (Hãy nhớ đặt setPreBuildIncrementer = "true")

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