1

我正在尝试将 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>

我认为这与缺少工作区有关 - 但詹金斯把一切都拉下来了,所以工作区不应该存在吗?

一些指导将不胜感激,因为我开始为此而秃头。

4

1 回答 1

1

支持材料:

您可以在不需要工作区的情况下进行 TFS 获取吗?

解决方案1:

绕过 TFS voodoo,为 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

这可能有一些内置的工作区巫术,这在变更集中不存在。

获取源代码并环顾四周,它会告诉你发生了什么。

我看到这个:

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";
于 2013-10-15T22:18:03.963 回答