2012-04-26 69 views
3

我在編寫一個腳本,只有在源代碼發生變化時纔會運行構建。我需要知道自上次構建之後是否有變化。這用於工作,因爲該文件夾不會被刪除,所以很容易確定是否有更改,但現在每次構建運行時都會刪除所有內容。我想過使用TFS TF歷史命令來查詢最後一個變更集或最後兩個變更集,但是在解析輸出中的變更集編號時遇到了問題。我也考慮過使用changeset命令。是否有任何可用於回答問題的命令行參數,自從日期或變更集編號以來是否發生過更改?使用TFS TF歷史來確定最新的變更集

+0

首先,Team Build具有已完成此功能的功能。你在用別的東西嗎?其次,存儲庫中的任何更改都足以觸發構建,還是需要查看某些特定目錄或目錄中是否有更改? – Andrew 2012-04-26 17:22:02

+0

是的,我正在使用不同的系統,特別是buildforge。我們使用CI構建的TFS適配器,但如果有更新,我們只想運行構建。由於構建是特定於分支的,我只想知道該分支/文件夾中是否有更改。 – 2012-04-27 18:37:36

+0

廣匯秦的回答非常好,速度非常快,你不需要工作空間。 – Yogurtu 2016-03-10 20:49:20

回答

2

正如Andrew所說,TFS具有內置的持續集成功能。但是,是的,從某個點開始查詢變更集很容易,無論是日期還是變更集。你想看看那個變更和最新的歷史:

tf history <folder> /version:C<changeset>~T /noprompt /recursive 

如果唯一的行輸出的是你查詢了,那麼顯然已經出現了自認爲沒有簽入的變化變更。否則,您將看到其他更改集,每行一個。

+1

是的,這告訴我包括被查詢的變更集。我怎麼能從輸出中解析數字?有沒有使用批處理命令解析的方法? – 2012-04-27 18:38:51

1

有一個可以集成BuildForge和Microsoft Team Foundation Server的適配器。這裏是URL,如果你有興趣... http://www-304.ibm.com/partnerworld/gsd/solutiondetails.do?&solution=46360&lc=en

的Automatra TFS適配器的Rational Build Forge中提供持續集成(CI)和報告功能。

TFS適配器還在TFS源(更改集)和WorkItem級別啓用CI功能。現成的報告提供了清晰的物料清單(BOM)報告,可以將這些報告發送給您的構建的下游消費者。最後,正如你必須知道的那樣,Build Forge的優勢在於它能夠將構建與部署(以及其他)結合起來。顯然,通過這些持續集成功能,您可以繼續實現我相信您希望實現的持續交付功能。

3

摘自我的批處理文件構建。

set _aPath="f:\TFS\a" 
set _TFPath="c:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE" 

...

pushd %_aPath% 
%_TFPath%\TF.exe history . /r /noprompt /stopafter:1 /Version:W > temp 
FOR /f "tokens=1" %%a in ('findstr /R "^[0-9][0-9]*" temp') do set _BuildVersion=10.3.0.%%a 
del temp 
popd 

使用臨時文件,但效果很好。

+0

請注意,您不需要中間文件,例如:'tf vc info d:\ w \ code04 \ Server.sln | findstr/R「最後修改:[^ \ r \ n] + r \ n」' – 2016-09-27 21:09:52

0

我的PowerShell腳本被稱爲GetVcsRevision.ps1,位於VCS根的子文件夾:

param (
    [string]$PathToTF='C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\TF.exe' 
    ,[Parameter(Mandatory=$true)][string]$Login 
    ,[Parameter(Mandatory=$true)][string]$Password 
) 
$result = &$PathToTF @("history","/stopafter:1","/recursive","..\*","/login:""$Login"",""$Password""") 2>&1 3>&1 

if ($result.GetType().Name -eq "Object[]") 
{ 
    <# $result format is: 
     Changeset User    Date  Comment 
     --------- ----------------- ---------- ---------------------------------------- 
     26038  user    24.06.2014 Sample commit comment 

     $result[2] is: 
     26038  user    24.06.2014 Sample commit comment 

     $result[2].Split(" ")[0] is: 
     26038 
    #> 

    $result[2].Split(" ")[0] 
} 
else 
{ 
    "0" 
} 

這是最後變更號碼發送到出管。如果出現問題,那麼這個號碼是0

您可以使用此腳本創建一個函數,並在您的構建腳本中調用它。

3

要沒有本地工作區中的最新變更號碼,請使用此命令:

tf history /collection:"http://server:8080/tfs/Collection" "$/Project" /recursive /stopafter:1 /noprompt /login:domain\user,password 
+0

我非常愛你。 – Yogurtu 2016-03-10 20:48:07

1

我的單行命令:

for /f "usebackq tokens=*" %%a in (`tf history . /recursive /noprompt /stopafter:1 /version:T ^| powershell -Command "$input | ? { $_ -imatch '^(\d+)\s+' } | %% { $matches[0].Trim() } | Select-Object -First 1"`) do set TIP_CHANGESET=%%a 

執行TIP_CHANGESET ENV。變量包含提示更改集