2016-04-06 43 views
5

在TFS 2015上創建vNext構建時,您可以定義變量,然後在構建步驟中使用它們,也可以在構建腳本的腳本中用作環境變量。TFS 2015構建:是否可以在存儲庫映射中使用變量?

我正在開發的構建腳本從映射的位置提取文件,所以如果我可以定義一個變量並在映射中使用它,這樣會很好,例如,如果我更新項目中的引用,構建正在構建,我可以簡單地使用新位置更新變量,並使存儲庫映射和腳本全部從新位置正確拉取,而無需在多個位置進行更改。

我試圖通過設置變量和映射如下這樣做, enter image description here enter image description here 但是當你試圖保存構建抱怨說,有兩個「$」的字符映射這會產生一個錯誤。有沒有辦法做到這一點,或者這目前不可能?

回答

2

這是不可能的。就像提到的錯誤信息一樣:映射中有兩個'$'字符。這意味着您的應用程序的路徑不應因構建而異。在庫頁

映射用於指定源控制它包含了需要建立在構建 定義項目 文件夾。您可以通過單擊省略號(...)按鈕 來設置它,但不能在變換路徑中包含變量。

有一個類似的問題:Variables in TFS Mappings on Visual Studio Online Team Builds

+3

你在函數上是正確的,但是聲明路徑不應該從構建變爲構建是錯誤的。在開發過程中有多個環境是很常見的,理想情況下建立這些環境的過程應該是相同的。通過手動輸入這些單獨的子樹/分支,這成爲了失敗的一個點,同時也使得構建環境變得更加複雜,重複的條目完全相同。這無異於將重複數據輸入到數據庫中,以便處理客戶地址等問題,這是一個嚴重的設計缺陷。 – user2197169

4

這已經引起了我的Havok相當長一段時間爲好。

對於初學者來說,這個功能有一個uservoice請求。您可以添加您的投票並在此處輸入以使Microsoft允許此功能:https://visualstudio.uservoice.com/forums/330519-team-services/suggestions/14131002-allow-variables-in-repository-variables-and-trigg

其次,我們制定了一種解決方法,使我們獲得了大部分途徑。這並不完美,但如果您對這些缺點感到滿意或可以解決缺陷,它可能對您有用。

首先關閉構建的「標籤源」選項,然後將「服務器路徑」字段映射到基礎構建。您需要將自定義變量添加到構建定義中,以告知構建實例要從哪個TFS位置提取。例如,我們從項目基地項目,然後多個分支,所以我們的源構造這樣

$\Team Project\Project1 
$\Team Project\Project1Branch1 
$\Team Project\Project1Branch2 
$\Team Project\Project1Branch3 

,我們創建了一個名爲「分支」,我們可以設置爲「Branch1的」變量「,店2 「等等。

當我們要構建基礎項目時,我們在啓動構建時將Branch變量留空。對於分支構建,我們將其設置爲我們想要構建的分支的名稱。

然後我們構建步驟是這樣的

  • 重映射工作區文件夾到分公司夾
  • 獲取文件對指定的分支 - 我們必須 後手動執行此重新映射我們的工作區
  • 編譯來源指定分支
  • 從指定分支發佈構建工件
  • 手動標記指定分支的代碼

重映射任務運行

tf workfold "$/Team Project/Project1$(Branch)" "$(build.sourcesDirectory)\$(Build.DefinitionName)$(Branch)" 

手動獲取任務運行以下命令

get /recursive /noprompt "$/Team Project/Project1$(Branch)" 

構建使用科變量指向解決方案文件的正確位置的命令對於指定分支

$(build.sourcesDirectory)\$(Build.DefinitionName)$(Branch)\SolutionFile.sln 

The Publ ISH神器任務使用科變量同時在內容領域和內容的路徑字段 例

**\$(Build.DefinitionName)$(Branch)\bin 

標籤代碼任務使用下面的命令

tf label "$(build.buildNumber)" "$/Team Project/Project1$(Branch)" /recursive 

這種設置的缺點是,你請勿將關聯的更改和工作項目捕獲到您的子分公司,因爲「服務器路徑」字段始終設置爲主要位置。這可能不是一個問題,如果您在啓動一個旨在生產的構建之前總是從您的分支合併到您的主要位置。你可以做些什麼來彌補這一點,這取決於你的用例。

隨着一些調整,你可以使用相同的格式來指定完整路徑,如果你需要的話。

+0

您在VSTS的限制範圍內以優雅的方式解決了問題。但是,使用這種方法存在性能問題。我們有相當多的發佈分支,並且在構建之前我必須檢查所有內容,我認爲這會很慢。 – dynamokaj

+0

謝謝你的讚揚。當你說「必須在構建之前檢查所有內容」時,我不確定你指的是什麼。在這種情況下檢查文件不應該是必需的(雖然我們的構建有一個結帳操作,他們不是這個問題的必要條件,我只是忽略了刪除對它們的引用,現在沒有看到它們)。 – mattbbpl

+0

在考慮了一段時間的評論之後,我想你是指每個分支上的「獲取」操作。如果是這樣,請勿煩惱 - 僅上述解決方案從「主位置」(「服務器路徑」字段中的路徑)和「分支」變量指定的特定分支中「獲取」源。所以雖然它是「獲取」了一個不必要的分支,除非它是一個主構建,但它只是一個 - 它不會「獲取」解決方案中的每個分支。 – mattbbpl

相關問題