【问题标题】:How can I copy a TFS 2010 Build Definition?如何复制 TFS 2010 构建定义?
【发布时间】:2011-02-23 23:07:09
【问题描述】:

有没有办法复制构建定义?我在主线源代码控制方法中工作,该方法利用许多不同的分支,这些分支的生命周期很短(即几天到一周)。我真的很想复制一个构建模板,然后将解决方案更改为构建。有没有办法做到这一点?

【问题讨论】:

    标签: tfs tfsbuild


    【解决方案1】:

    您可以下载新的TFS 2010 power tools。它可以选择克隆构建定义。

    请参阅http://msmvps.com/blogs/molausson/archive/2010/10/21/clone-a-build-definition.aspx 了解示例

    注意:请注意,克隆仅在您未弹出构建窗口时才有效。

    【讨论】:

      【解决方案2】:

      您可以编写一个加载项来执行此操作。下面是复制现有构建定义的代码:

      static IBuildDefinition CloneBuildDefinition(IBuildDefinition buildDefinition)
      {
          var buildDefinitionClone = buildDefinition.BuildServer.CreateBuildDefinition(
              buildDefinition.TeamProject);
      
          buildDefinitionClone.BuildController = buildDefinition.BuildController;
          buildDefinitionClone.ContinuousIntegrationType = buildDefinition.ContinuousIntegrationType;
          buildDefinitionClone.ContinuousIntegrationQuietPeriod = buildDefinition.ContinuousIntegrationQuietPeriod;
          buildDefinitionClone.DefaultDropLocation = buildDefinition.DefaultDropLocation;
          buildDefinitionClone.Description = buildDefinition.Description;
          buildDefinitionClone.Enabled = buildDefinition.Enabled;
          buildDefinitionClone.Name = String.Format("Copy of {0}", buildDefinition.Name);
          buildDefinitionClone.Process = buildDefinition.Process;
          buildDefinitionClone.ProcessParameters = buildDefinition.ProcessParameters;
      
          foreach (var schedule in buildDefinition.Schedules)
          {
              var newSchedule = buildDefinitionClone.AddSchedule();
              newSchedule.DaysToBuild = schedule.DaysToBuild;
              newSchedule.StartTime = schedule.StartTime;
              newSchedule.TimeZone = schedule.TimeZone;
          }
      
          foreach (var mapping in buildDefinition.Workspace.Mappings)
          {
              buildDefinitionClone.Workspace.AddMapping(
                  mapping.ServerItem, mapping.LocalItem, mapping.MappingType, mapping.Depth);
          }
      
          buildDefinitionClone.RetentionPolicyList.Clear();
      
          foreach (var policy in buildDefinition.RetentionPolicyList)
          {
              buildDefinitionClone.AddRetentionPolicy(
                  policy.BuildReason, policy.BuildStatus, policy.NumberToKeep, policy.DeleteOptions);
          }
      
          return buildDefinitionClone;
      }
      

      【讨论】:

        【解决方案3】:

        以下工具(VS Addin)将满足您的要求>

        社区 TFS 构建管理器

        http://visualstudiogallery.msdn.microsoft.com/16bafc63-0f20-4cc3-8b67-4e25d150102c

        【讨论】:

          【解决方案4】:

          我只是需要复制构建定义,发现上面 Jim 的回答很有帮助。但是,作为 TFS API 的新手,我需要帮助连接到服务器并通过代码获取现有的构建定义。这两个链接有助于填补空白:

          http://msdn.microsoft.com/en-us/library/bb286958.aspx

          http://geekswithblogs.net/jakob/archive/2010/04/26/creating-a-build-definition-using-the-tfs-2010-api.aspx

          【讨论】:

          • 我最终使用了 2010 年 9 月的 TFS Power Tools,其中包含克隆构建定义命令。
          【解决方案5】:

          您可以右键单击构建定义并选择“克隆构建定义”以复制定义文件。然后,您可以从那里对其进行编辑。

          【讨论】:

            【解决方案6】:

            如果您想将构建定义从一个团队项目移动到另一个团队项目,这是一个解决方案。

                public void MoveBuild(string fromTeamProject, string toTeamProject, string buildName, string newBuildName)
                {
            
                    var _server = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(new
            
                    Uri("http://Mytfs:8080/defaultcollection"));
            
                    IBuildServer _buildServer = _server.GetService<IBuildServer>();
            
                    var buildDetails = _buildServer.QueryBuildDefinitions(fromTeamProject);
            
                    foreach (var fromBuild in buildDetails)
                    {
                        if (fromBuild.Name != buildName) continue;
                        var newBuildDefinition = _buildServer.CreateBuildDefinition(toTeamProject);
                        newBuildDefinition.Name = !string.IsNullOrEmpty(newBuildName) ? newBuildName : fromBuild.Name;
            
                        newBuildDefinition.BuildController = fromBuild.BuildController;
            
                        // This finds the template to use 
                        foreach (var mapping in fromBuild.Workspace.Mappings)
                        {
                            newBuildDefinition.Workspace.AddMapping(
                                mapping.ServerItem, mapping.LocalItem, mapping.MappingType, mapping.Depth);
                        }
                        newBuildDefinition.DefaultDropLocation = fromBuild.DefaultDropLocation;
                        newBuildDefinition.Description = fromBuild.Description;
                        // buildDefinition.Workspace.AddMapping(build.Workspace.);
                        newBuildDefinition.Process = _buildServer.QueryProcessTemplates(fromBuild)[2];
            
                        newBuildDefinition.ProcessParameters = fromBuild.ProcessParameters;
                        newBuildDefinition.Enabled = false;
                        newBuildDefinition.Save();
                    }//end of for each loop 
            
                }
            

            【讨论】:

              【解决方案7】:

              从您的消息中不清楚您使用的构建定义是哪个模板(默认、升级或实验室管理)。如果我理解正确,您想轻松设置一个构建定义,该定义构建相同的解决方案但来自不同的分支。

              您可以尝试编辑它而不是复制定义。当分支终止时,重命名构建定义(可能有助于报告),更改构建的工作区映射,您应该完成。

              谢谢,拉迪斯劳

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2012-03-04
                • 1970-01-01
                • 2011-05-04
                • 2012-03-26
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多