我正在尝试将Jenkins与MSBuildExtensions和TFS结合使用来转换AssemblyInfo.cs
在我的开发框中,一切正常,包括与TFS的连接,它正确返回变更集编号。
当我签入变更集并尝试在Jenkins服务器上构建时,我收到错误并且该命令的构建中断:
Resolve TF.exe path
TF.exe path resolved to: C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\..\IDE\tf.exe
TF Operation: GetChangeset
Executing C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\..\IDE\tf.exe changeset /login:myDomain\SomeUser,myPassword /latest /noprompt
C:\Program Files\Jenkins\jobs\DemoVersioning\workspace\VersioningDemo\VersioningDemo.csproj(513,3): error : Exit Code 100. Nothing Succeeded: Unable to determine the source control server.
在我的msbuild脚本中,这是我在“BeforeBuild”上运行的TFS命令:
<TfsSource TaskAction="GetChangeset"
Login="myDomain\someUser,password">
<Output TaskParameter="Changeset" PropertyName="ChangeSet" />
</TfsSource>
我认为这与缺少工作空间有关 - 但詹金斯把所有东西都拉得很好,所以工作区不应该存在吗?
当我开始对此秃顶时,我们会感激一些指导。
答案 0 :(得分:1)
支持材料:
Can you do a TFS get without needing a workspace?
解决方案1:
绕过TFS伏都教,获取TFS的Git,并运行以下内容 (如果你知道那个世界,这将相当于“svn.exe'export'”。
"C:\MyProgFiles\GitTF\git-tf.cmd" clone http://MyCoolteamfoundationserver:8080/tfs/ $/MySolution/
解决方案2:
创建工作区并对其进行映射,然后“获取”代码。
这是一个你会模仿的.bat版本:
set __MYWORKSPACENAME=CI_TEMP_WORKSPACE
set __BASEDIRECTORYFINAL=c:\ci_build_stuff\
MD %__BASEDIRECTORYFINAL%
CD %__BASEDIRECTORYFINAL%
set __tfExe=C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\TF.exe
"%__tfExe%" workspace /new %__MYWORKSPACENAME% /collection:http://my_super_cool_teamfoundationserver:8080/tfs/my_cool_projects /noprompt
"%__tfExe%" workfold /map $/MyTFSPath %__BASEDIRECTORYFINAL%\SXA
"%__tfExe%" get %__BASEDIRECTORYFINAL%\MyTFSPath\ /recursive /noprompt
set __BASEDIRECTORYFINAL=
set __MYWORKSPACENAME=
set __tfExe=
进一步的想法:
结帐
http://msbuildextensionpack.codeplex.com/workitem/11709
这可能有一些内置的工作区voodoo,在变更集中没有。
获取源代码并环顾四周,它会告诉你发生了什么。
我看到了这个:
http://msbuildextensionpack.codeplex.com/SourceControl/latest#Solutions/Main/TFS/TeamBuild.cs
public class TeamBuild : BaseTask
{
private const string GetLatestTaskAction = "GetLatest";
private const string QueueTaskAction = "Queue";
private const string RelatedChangesetsTaskAction = "RelatedChangesets";
private const string RelatedWorkItemsTaskAction = "RelatedWorkItems";