2014-07-01 48 views
1

似乎TeamCity參數$ {build.counter}沒有在我們的ant build.xml中解析。我們有:build.xml中的T​​eamCity build.counter參數

<replaceregexp 
     file="AndroidManifest.xml" 
     match='android:versionCode="(.*)"' 
     replace='android:versionCode="${build.counter}"' 
/> 

這引發錯誤:

String types not allowed (at 'versionCode' with value '${build.counter}')

它看起來像它走的是參數 「$ {} build.counter」 作爲一個字符串。

使用另一個TeamCity整數參數代替$ {build.counter},例如$ {teamcity.build.id},可以正常工作。

有誰知道這可能是爲什麼?

更新

感謝Biswajit_86的答案。這裏也是我的related discussion with JetBrains

+0

你確定這個屬性解析所有?嘗試在此步驟之前添加' $ {build.counter}'。一個隨機nitpick:你的正則表達式替換不使用捕獲組引用,所以你的匹配模式不需要括號。 – CAustin

+0

@CAustin - 你是對的!這給了我「步驟2/2」echo $ {build.counter}「。那麼爲什麼這個屬性不會在其他人做的時候解決呢? –

+0

說實話,我對TeamCity一無所知。這是你所有的財產來自哪裏,對嗎?它看起來像是哪個文件保存了這些屬性格式不正確,就好像它包含'build.counter = Step 2/2] echo $ {build.counter}'或類似的東西。 – CAustin

回答

3

你的構建文件根本不知道build.counter的值。他們只能讀取系統屬性,但build.counter是一個配置參數。

爲此,請聲明一個名爲system.BUILD.COUNTER的系統參數,其值爲%build.counter%並將其傳遞到您的目標中。如果你改變你的build.xml ABNT閱讀$ {} BUILD.COUNTER,它會正常工作

構建參數部分 system.BUILD.COUNTER%build.counter%

構建XML文件

<replaceregexp 
     file="AndroidManifest.xml" 
     match='android:versionCode="(.*)"' 
     replace='android:versionCode="${BUILD.COUNTER}"' 
/> 
+0

這看起來很有趣,但其他人喜歡teamcity.build.id和build.number。他們在build.xml中解析得很好。他們和build.counter有區別嗎? –

+0

你有沒有使用build.id的例子。 build.number作爲系統屬性和env變量發佈,由teamcity –

0

Ant不會直接讀取teamctiy varaibles。你需要在你的像螞蟻項目創建一個類似的build.counter屬性:

<property name="build.conuter" value=""/> 

,並從TeamCity的構建步驟通過它的價值,如:

enter image description here

+0

發佈我們不需要定義屬性構建。計數器,它將設置爲空字符串,然後不會更改 – user3584056

+0

它的值需要從TeamCity傳遞到其他Ant命令行參數中,該參數將覆蓋默認的空白值。 –

+0

是真的,但對於哪些屬性需要與'var' ant-contrib任務一起出現,我認爲。另外,如果不使用ant命令行,可以將其設置爲具有env變量的其他自定義變量,該變量可以在build.xml中使用$ {env.BUILD_COUNTER} – user3584056