4

我们正在使用 Microsoft 的发布管理工具来自动将我们的解决方案部署到我们的各种开发服务器。这个工具对我们来说是理想的,因为它可以执行跨多个服务器的更复杂的部署。从这个意义上说,它工作正常,一切都正确部署。

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

因为我们没有使用发布管理部署过去的开发(很遗憾,我们不允许这样做),所以我们不需要保留所有这些开发构建。

有没有办法更改发布管理,使其不会将构建设置为无限期保留?

更新:由于目前无法实现,如果您想要此功能,请在 UserVoice 上投票:https ://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/6537614-allow-retain-indefinitely -不被设置

4

3 回答 3

4

从 TFS 2013.3 的 RM 开始,这是不可能的。根据 Teodora Stanev 在这篇文章中的说法,这是设计使然。

随时在Visual Studio UserVoice 网站上发布请求

于 2014-10-08T14:12:20.720 回答
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>
于 2015-05-06T19:32:41.643 回答
0

发布管理遵循实验室管理的模型,如果部署了一个构建,它将无限期地保留。

这允许您在构建经过验证和签署后更改构建质量等,然后您可以对该构建进行升级/执行任何操作,而不必担心它会被保留策略删除。

您只需将其作为每日/每周/每月的管理任务执行,从构建屏幕的下拉列表中选择您的构建,然后显示全部。

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

如果它让您很困扰,您可以编写一个脚本来查找所有构建,然后删除锁定。

伪:

BuildDefinition.KeepForever = False;
于 2014-10-08T14:38:37.710 回答