2008-11-06 12 views
6

पर बिल्ड नंबर कैसे पास करूं, मेरे पास एक नेंट बिल्ड स्क्रिप्ट है जो क्रूज़ कंट्रोल ऑन-डिमांड पर समाधान बनाने के लिए उपयोग करती है।मैं नेंट से क्रूज़ कंट्रोल

हालांकि, हमें हाल ही में क्रूज़ कंट्रोल मिला है, इसलिए हमारा आधिकारिक बिल्ड नंबर क्रूज़ कंट्रोल में सूचीबद्ध है।

मुझे पता है क्रूज़ कंट्रोल स्क्रिप्ट बनाने में कुछ गुणों को इंजेक्ट करता है ताकि मैं स्क्रिप्ट (सीसीनेट लेबेल) में सीसी बिल्ड नंबर तक पहुंच सकूं लेकिन यूआई स्क्रीन पर बिल्ड नंबर के रूप में उपयोग करने के लिए मैं सीसी को वापस मूल्य कैसे पास करूं?

उदाहरण, सीसी संख्या का निर्माण 2

Nant स्क्रिप्ट एक buildnumber.xml मूल्य वृद्धि कर देता है हर निर्माण, और आधिकारिक बिल्ड नंबर पर 123

मैं सीसी यूआई पिछले सफल बिल्ड नंबर दिखाना चाहते है कहते हैं : 123, 2 नहीं, तो मैं उस मान को वापस कैसे पास करूं?

उत्तर

7

इसके लिए एक कस्टम बिल्ड लेबलर की आवश्यकता है। पर्सफोर्स हमारा स्रोत नियंत्रण प्रदाता है और हम इससे हमारे संस्करण संख्या प्राप्त करते हैं।

/// <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(); 
    } 
} 

विधि, GetLatestChangelist है, जहां आप शायद अपने संस्करण नियंत्रण प्रणाली से बात करने के लिए अपने स्वयं के तर्क सम्मिलित होता है: कोड इस प्रकार है। पर्सफोर्स में आखिरी चेंजलिस्ट का विचार है जो अद्वितीय है। हमारे निर्माण संख्या, और अंत में संस्करण संख्याएं उस पर आधारित हैं।

एक बार जब आप इसे (एक असेंबली डीएल में) बनाते हैं, तो आपको इसे सीसीनेट में जोड़ना होगा। आप असेंबली को सर्वर निर्देशिका में छोड़ सकते हैं (ccnet.exe के बगल में)।

अगला आप इस प्रयोगशाला का उपयोग करने के लिए अपनी सीसीनेट परियोजना फ़ाइल को संशोधित करें। हमने इसे default labeller block के साथ किया था। निम्नलिखित की तरह कुछ:

<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> 

तुम सिर्फ ccnet तो आपका काम हो गया में दिखाने के लिए बिल्ड नंबर इच्छुक रहे हैं और वास्तव में कुछ और करने की जरूरत नहीं है। हालांकि, अगर आप पहले से प्रदत्त CCNetLabel संपत्ति का उपयोग करके अपनी एनएएनटी स्क्रिप्ट में लेबल तक पहुंच सकते हैं।

उम्मीद है कि इससे कुछ मदद मिलती है।यदि टिप्पणियों पर पोस्ट करके आपके कोई प्रश्न हैं तो मुझे बताएं।

+1

इस मैं (दोनों CruiseControl.Net स्थापना फ़ोल्डर में ThoughtWorks.CruiseControl.Core.dll और NetReflector.dll में संदर्भ जोड़ने की थी संकलन करने के लिए और फिर नामस्थान आयात करने के लिए निम्नलिखित जोड़ें: Exortech.NetReflector उपयोग करते हुए; ThoughtWorks का उपयोग कर .CruiseControl.Core; – robaker

+0

दूसरी चीज जो मैं जोड़ूंगा वह यह है कि आप सुनिश्चित करते हैं कि आपकी असेंबली डीएल को "सीसीनेट। *। Plugin.dll" नाम दिया गया है, जहां * आपके प्लग-इन के लिए आप जो भी नाम चुनते हैं। – Ken

1

क्या आपने कुछ पर्यावरण चर का उपयोग करने की कोशिश की? मेरा मानना ​​है कि सीसीनेट इन्हें संभाल सकता है।

मैं इस पर थोड़ा सा खोदूँगा।

खैर मैं एक समाधान है, काफी गंदा है, लेकिन किसी भी तरह देखें:

1- आपके CCNET परियोजना परिभाषा एक defaultlabeller अनुभाग जोड़ें। इसमें उस बिल्ड नंबर का पैटर्न शामिल होगा जिसे आप प्रदर्शित करना चाहते हैं।

2- एनएएनटी के भीतर, अपनी कॉन्फ़िगरेशन फ़ाइल को अपडेट करने के लिए एक स्क्रिप्ट है, जिसे आप जिस बिल्ड नंबर को देखना चाहते हैं उसे डालें।

3- ccnet.exe.config फ़ाइल को टच करें (यूनिक्स अर्थ में) ताकि इसे प्रोजेक्ट कॉन्फ़िगरेशन फ़ाइलों को फिर से लोड किया जा सके।

et voilà।

0

हमें यह समस्या भी थी। मैं एक विशेष सीसी लेबलिंग प्लगइन लिखना समाप्त हो गया।

+0

आपके पास वितरित करने के लिए कोड नहीं है? –

+0

नहीं, लेकिन वास्तव में यह मुश्किल नहीं है। Net.sourceforge.cruisecontrol.LabelIncrementer से इनहेरिट करें, एपीआई दस्तावेज़ों का पालन करें, अपनी प्लगइन को एक जार में बनाएं, अपने सीसी config.xml पर जार जोड़ें। – JesperE

0

यदि आपके बिल्ड नंबर अनुक्रमिक हैं, तो आप क्रूज़ कंट्रोल स्टेट फ़ाइल को केवल हैक करने के लिए सही बिल्ड नंबर देने के लिए हैक कर सकते हैं। आप [projectName] .state नामक फ़ाइल की तलाश में हैं।

मैं सही संख्या को लेबल तत्व बदल गया है और LastSuccessfulIntegrationLabel नया नंबर किया जाना है।

0

हालांकि, हम केवल हाल ही में CruiseControl मिला तो हमारे आधिकारिक निर्माण संख्या CruiseControl में सूचीबद्ध है क्या से अलग है।

गबानफिल ने जो कहा है, उसके साथ क्रमबद्ध करें, आप सीसी को बता सकते हैं कि किस संख्या से निर्माण शुरू हो सकता है, लेकिन .ser फ़ाइल को हैक करने की कोई आवश्यकता नहीं है। आप अपने एनएएनटी बिल्ड नंबर के साथ सिंक में लाने के लिए वर्तमान बिल्ड नंबर सेट करने के लिए जेएमएक्स इंटरफ़ेस का उपयोग कर सकते हैं।

आप अपने वर्तमान बिल्ड नंबर पर default label मान भी सेट कर सकते हैं, .ser फ़ाइल को हटाएं और सीसी को पुनरारंभ करें।

लेकिन शायद सबसे आसान बात यह है कि बिल्ड नंबर को NANT से प्रॉपर्टी फ़ाइल में लिखना है और फिर उस फ़ाइल को पढ़ने के लिए property file label incrementer का उपयोग करना है। (SetPreBuildIncrementer = "true" सेट करना सुनिश्चित करें)