2010-11-11 20 views
2

我的任務是使用CruiseControl.NET審計構建服務器。其中有不少,我想知道是否有一種方法來編程/自動編譯每個項目的列表。使用PowerShell在CCNet服務器上創建所有項目的列表

有沒有辦法做到這一點?

我的第一本能是使用PowerShell(v2.0),但我不確定如何開始編寫一個腳本來完成我所需要的。我應該使用PowerShell還是其他方法?那些其他方法會是什麼?

回答

1

如果您可以訪問的ccnet.config文件,你可以:

([xml](Get-Content ccnet.config)).cruisecontrol.project | Select name, artifactDirectory # or whatever 
+0

謝謝!我將在一分鐘內爲這種功能提供我的PowerShell腳本。 – 2010-11-12 06:52:04

2

Powershell可以很容易地讀取xml文件。你應該用這個來詢問CC.NET的構建。

開始herehere

+0

這裏是我用來加載XML的代碼:$ xml = [xml](Get-Content ccnet.config)。但是,它返回的是根元素。我究竟做錯了什麼? – 2010-11-11 11:01:01

+0

沒有錯。該根元素對每個子元素都會有屬性 - 或者您可以使用xpath。 Preet鏈接的文件是很好的起點。 – Jaykul 2010-11-11 16:40:50

+0

D'oh!的確,這些博客帖子解釋瞭如何訪問子節點/元素 - 我應該一直讀。 +1提供有用的鏈接(當我獲得足夠的聲望以upvote,那是...)。 – 2010-11-12 06:50:50

4

我會用Thoughtworks.CruiseControl.Remote.dll並將其加載到PowerShell中

創建ICruiseManagerFactory managerFactory;

然後你可以迭代你的服務器列表和C reate開放的我們像服務器:

ServerUri = @"tcp://" + Server + ":" + Port + @"/CruiseManager.rem" 

然後用獲得的項目,並從該服務器的狀態列表:

 foreach (ProjectStatus projectStatus in currentStatuses) 
     { 
      string name = projectStatus.Name; 
      string status = projectStatus.Status; 
    } 
+0

這很有趣。當只使用一個XML對象可以實現相同的結果時,似乎過於費力地投擲相對較大的對象。雖然,替代方法爲+1! (當我獲得足夠的聲望來升級時,那就是......) – 2010-11-12 06:47:41

+0

雖然方法上的差異是我的代碼可以在任何地方與任意數量的服務器運行,而無需在服務器上擁有任何所需的權限,也無需訪問文件系統:) – Alex 2010-11-12 13:39:20

+0

是的,我喜歡這樣。你應該寫一個CruiseControl模塊;) – Jaykul 2010-11-19 15:13:29

0

感謝:

ProjectStatus[] currentStatuses = managerFactory.GetCruiseManager(ServerUri).GetProjectStatus(); 

然後遍歷列表大家爲他們的答案。 :-)我沒有提到的一件事是,所有的構建服務器都具有與CruiseControl.NET相同的安裝結構,安裝目錄可以通過文件夾共享直接訪問。

全部放在一起,這是我的一個特定的構建服務器上創建的項目清單腳本:

function Get-Projects 
{ 
    param([string]$BuildServer = $(Throw "You must specify the name of the build server containing the projects you want to list")) 
    $BuildServer = $BuildServer.ToUpper() 

    $ConfigFilePath = [string]"\\$BuildServer\CruiseControl.NET\server\ccnet.config" 
    $ValidPath = Test-Path -Path "$ConfigFilePath" 
    if (!$ValidPath) 
    { 
    $InvalidPathErrorMessage = [string]"Path $ConfigFilePath does not exist!" 
    Write-Host $InvalidPathErrorMessage 
    $InvalidPathErrorMessage 
    return 
    } 

    $ConfigXml = [xml](Get-Content $ConfigFilePath) 
    $Projects = @($ConfigXml.SelectNodes("cruisecontrol/project")) 

    if (!$Projects) 
    { 
    $ErrorMessage = [string]"No projects on $BuildServer!" 
    Write-Host $ErrorMessage 
    $ErrorMessage 
    return 
    } 

    $Projects 
} 

然後,假設這個腳本是你的PowerShell會話中訪問,你可以簡單地選擇數據你想,作爲Jaykul建議:

Get-Projects <BuildServer> | Select-Object name, queue, category | Sort-Object category

我希望這個發現是有幫助的!

相關問題