3

我们正在使用Microsoft的发布管理工具来自动化将我们的解决方案部署到各种开发服务器。这个工具非常适合我们,因为它可以执行跨越多个服务器的更复杂的部署。从这个意义上说,它工作正常,一切正常部署。发布管理集版本将无限期保留

一个小问题是,经过发布管理自动部署构建,它设置由锁图标指示的构建,以“无限期保留”。由于我们正在进行持续部署,因此我们保留了大量构建,并且构建定义的保留策略被覆盖。因此,我必须定期进入并突出显示以前的所有版本,并取消选择无限期保留。

,因为我们没有过去部署与发布管理DEV(很遗憾,我们不能),我们并不需要把所有这些开发的建立各地。

有没有办法改变发布管理,以便它不设置构建保留无限期?

更新:由于这是目前不可能,如果你想此功能,请投票支持它UserVoice的:https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/6537614-allow-retain-indefinitely-to-not-be-set

回答

3

至于RM为TFS 2013.3,这是不可能的。根据Teodora Stanev在这post,这是设计。

随意张贴在Visual Studio UserVoice site

+0

根据您的建议,我已经张贴上UserVoice的请求:https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/6537614-allow-retain-indefinitely-to-not -be-set – Redbaran 2014-10-08 14:47:49

+0

如果您不介意修改您的构建模板,请参阅下面的解决方法。 – rshadman 2015-05-18 14:00:19

0

发布管理的要求如下实验室管理,因此如果构建部署它无限期地保留的模型。

这可以让你改变建设质量等作为构建进行验证,并签了字,你便可以推动/做任何与构建,而不必担心它会被保留策略被删除。

你只需要做它作为一个每天/每周/每月的管理任务,从下拉菜单中生成屏幕列表中选择您的构建,然后显示所有。

突出显示所有构建,然后单击删除保留按钮。

如果它困扰你很多,你可以写一个脚本来找到所有的构建,然后删除锁。

psudo:

BuildDefinition.KeepForever = False; 
1

我有一个解决的办法,而不是一种解决方法。

我已经在工作流程开始时使用以下序列(针对TFS 2013)自定义了我们的构建定义。这个序列抓取定义的所有成功构建并清除无限期保留。

这意味着只有上次运行的版本才会有标志。这也意味着您无法为该定义无限期地将构建设置为保留。对于我们来说,在这种特定情况下这是可以的,因为它是用于持续集成构建(如海报)。

编辑:更改为包括所有作品(仅是成功​​的),作为为失败构建标记,仍然设置为在构建成功,但无法释放无限期保留。

<Sequence DisplayName="Cleanup: Clear 'Retain Indefinitely' from previous builds"> 
    <Sequence.Variables> 
    <Variable x:TypeArguments="mtbc:IBuildDetail" Name="localBuildDetail" /> 
    <Variable x:TypeArguments="mtbc:IBuildDetailSpec" Name="localBuildDetailSpec" /> 
    <Variable x:TypeArguments="mtbc:IBuildQueryResult" Name="localBuildQueryResult" /> 
    </Sequence.Variables> 
    <mtbwa:GetBuildDetail DisplayName="Get the Build Details" Result="[localBuildDetail]" /> 
    <InvokeMethod DisplayName="Create the Build Detail Spec" MethodName="CreateBuildDetailSpec"> 
    <InvokeMethod.TargetObject> 
     <InArgument x:TypeArguments="mtbc:IBuildServer">[localBuildDetail.BuildServer]</InArgument> 
    </InvokeMethod.TargetObject> 
    <InvokeMethod.Result> 
     <OutArgument x:TypeArguments="mtbc:IBuildDetailSpec">[localBuildDetailSpec]</OutArgument> 
    </InvokeMethod.Result> 
    <InArgument x:TypeArguments="x:String">[localBuildDetail.TeamProject]</InArgument> 
    </InvokeMethod> 
    <Assign DisplayName="Setting Query Order Descending"> 
    <Assign.To> 
     <OutArgument x:TypeArguments="mtbc:BuildQueryOrder">[localBuildDetailSpec.QueryOrder]</OutArgument> 
    </Assign.To> 
    <Assign.Value> 
     <InArgument x:TypeArguments="mtbc:BuildQueryOrder">FinishTimeDescending</InArgument> 
    </Assign.Value> 
    </Assign> 
    <Assign DisplayName="Setting Build Definition"> 
    <Assign.To> 
     <OutArgument x:TypeArguments="x:String">[localBuildDetailSpec.DefinitionSpec.Name]</OutArgument> 
    </Assign.To> 
    <Assign.Value> 
     <InArgument x:TypeArguments="x:String">[localBuildDetail.BuildDefinition.Name]</InArgument> 
    </Assign.Value> 
    </Assign> 
    <Assign DisplayName="Setting Query Type to All Builds"> 
    <Assign.To> 
     <OutArgument x:TypeArguments="mtbc:BuildStatus">[localBuildDetailSpec.Status]</OutArgument> 
    </Assign.To> 
    <Assign.Value> 
     <InArgument x:TypeArguments="mtbc:BuildStatus">All</InArgument> 
    </Assign.Value> 
    </Assign> 
    <InvokeMethod DisplayName="Getting Previous Builds" MethodName="QueryBuilds"> 
    <InvokeMethod.TargetObject> 
     <InArgument x:TypeArguments="mtbc:IBuildServer">[localBuildDetail.BuildServer]</InArgument> 
    </InvokeMethod.TargetObject> 
    <InvokeMethod.Result> 
     <OutArgument x:TypeArguments="mtbc:IBuildQueryResult">[localBuildQueryResult]</OutArgument> 
    </InvokeMethod.Result> 
    <InArgument x:TypeArguments="mtbc:IBuildDetailSpec">[localBuildDetailSpec]</InArgument> 
    </InvokeMethod> 
    <ForEach DisplayName="Loop through all builds and undo 'Retain Indefinitely' set by Release Management." 
      x:TypeArguments="mtbc:IBuildDetail" 
      Values="[localBuildQueryResult.Builds]"> 
    <ActivityAction x:TypeArguments="mtbc:IBuildDetail"> 
     <ActivityAction.Argument> 
     <DelegateInArgument x:TypeArguments="mtbc:IBuildDetail" Name="localBuild" /> 
     </ActivityAction.Argument> 
     <Sequence DisplayName="Checking Build Next Build"> 
     <If Condition="[localBuild.KeepForever = True]" DisplayName="If the build is marked 'Retain Indefinitely'"> 
      <If.Then> 
      <Sequence DisplayName="Updating Build Details"> 
       <Assign DisplayName="Setting KeepForver to false"> 
       <Assign.To> 
        <OutArgument x:TypeArguments="x:Boolean">[localBuild.KeepForever]</OutArgument> 
       </Assign.To> 
       <Assign.Value> 
        <InArgument x:TypeArguments="x:Boolean">false</InArgument> 
       </Assign.Value> 
       </Assign> 
       <InvokeMethod DisplayName="Saving Build Details" MethodName="Save"> 
       <InvokeMethod.TargetObject> 
        <InArgument x:TypeArguments="mtbc:IBuildDetail">[localBuild]</InArgument> 
       </InvokeMethod.TargetObject> 
       </InvokeMethod> 
      </Sequence> 
      </If.Then> 
     </If> 
     </Sequence> 
    </ActivityAction> 
    </ForEach> 
</Sequence>