3

背景:我有一个相当不错的 TeamCity 设置;包含一个 ci 构建和一个发布构建,它使用 WiX 构建我的安装程序并修补所有版本号。当我进行新的发布构建时,我想针对以前的一组安装程序自动创建 MSP 补丁。我想要么在 TeamCity 中标记 RTM,要么作为版本号列表。

我倾向于的方法是创建一个单独的配置并获取符合标准(标签或版本号)的所有先前构建的 msi 工件。标签看起来更整洁,但我在文档中看不到有关您如何使用它的任何内容?

我有一个脚本来构建 MSP 补丁,但它依赖于一个 PCP 文件,需要在 ORCA 中编辑该文件来描述补丁。

  1. 在编辑 PCP 方面,除了 ORCA 之外,我还有什么可以用来编辑的吗?我一直在考虑转向 WiX 方法:http ://wix.sourceforge.net/manual-wix3/patch_building.htm看起来很有希望。
  2. 有谁知道您是否可以在同一版本或另一个版本中按标签访问 TeamCity 中的工件?
  3. 是否有人对在 TeamCity 中自动构建/链接 MSP 补丁文件有任何其他见解?
4

2 回答 2

1
  1. 您可以使用 WiX 工具集中的 PatchCreation 元素构建 .PCP 文件。这可能会为您提供创建自定义 .PCP 文件所需的必要灵活性。

  2. 抱歉,不要使用 TeamCity。

  3. 抱歉,不要使用 TeamCity。:)

于 2012-06-20T16:18:52.887 回答
1

要添加到 Rob 的答案:

#2。TeamCity 可以按标签检索项目:

http://servername:8080/httpAuth/app/rest/buildTypes/id:bt13/builds?status=SUCCESS&tag=RTM

#3。我在 WiX 工具集中使用了 PatchCreation 元素(上面 Rob 建议),他说得对,它足够灵活。这是我构建的内容的概述,在测试中似乎一切都很好,

teamcity 项目有许多构建参数,它们是:

  1. 新版本号 - 默认为 changeme,因此如果未更改它会破坏构建。

  2. 旧版本号——如上

  3. 新的构建 repo - 这是 buildtypeid,查看您项目的查询字符串,它将有 buildTypeId=btXX。XX 是此处应提供的数字。

  4. 旧版本仓库 - 如上所述

teamcity 项目有以下步骤:

  1. 运行 build.msbuild 的 MSBuild 运行器(见下文)

  2. 在 patch.wxs 上运行 Candle 以创建 patch.wixobj 文件

  3. 在 patch.wixobj 上运行 Light 以创建 patch.pcp

  4. 解压新版本(命令:msiexec /q /a new.msi) -

  5. 解压旧版本(命令:msiexec /q /a old.msi) - 选择不同的工作目录

  6. 创建补丁(命令:msimsp -s patch.pcp p hotfix-%system.msiOldVersion%-%system.msiNewVersion%.msp -l patch.log

MSBuild 创建 patch.pcp

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="Build"  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <!--<Import Project="references\MSBuild.Community.Tasks.Targets"/>-->
  <UsingTask AssemblyFile="references\MSBuild.Community.Tasks.dll" TaskName="WebDownload"/>
  <UsingTask AssemblyFile="references\MSBuild.Community.Tasks.dll" TaskName="TemplateFile"/>
  <Target Name="Build">
    <!-- preconditions for build -->
    <Error Condition="'$(msiOldVersion)' == 'changeme'" Text="Use run custom build, setting the client version of the msi"/>
    <Error Condition="'$(msiOldVersion)' == ''" Text="Use run custom build, setting the client version of the msi"/>
    <Error Condition="'$(msiNewVersion)' == 'changeme'" Text="Use run custom build, setting the new version of the msi"/>
    <Error Condition="'$(msiNewVersion)' == ''" Text="Use run custom build, setting the new version of the msi"/>
    <Message Text="Old Version: $(msiOldVersion)"/>
    <Message Text="New version: $(msiNewVersion)"/>

    <!-- download files from teamcity... -->
    <WebDownload FileUri="http://server:8080/httpAuth/repository/download/bt$(msiOldRepo)/trunk/Path/bin/Release/en-us/installer-v-v.$(msiOldVersion).msi" UserName="download" Password="abcdefgh" FileName="downloads/oldversion.msi"  />
    <WebDownload FileUri="http://server:8080/httpAuth/repository/download/bt$(msiNewRepo)/trunk/Path/bin/Release/en-us/installer-v.$(msiNewVersion).msi" UserName="download" Password="abcdefgh" FileName="downloads/newversion.msi"  />

    <!-- fill in blanks in patch.wxs -->
    <ItemGroup>
      <Tokens Include="oldVersion">
        <ReplacementValue>$(msiOldVersion)</ReplacementValue>
      </Tokens>
      <Tokens Include="newVersion">
        <ReplacementValue>$(msiNewVersion)</ReplacementValue>
      </Tokens>
    </ItemGroup>
    <TemplateFile Template="template.wxs" OutputFileName="patch.wxs" Tokens="@(Tokens)"/>    
  </Target>

MSBuild 脚本使用的 Template.wxs

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <PatchCreation
      Id="deadbeef-dead-beef-dead-beefdeadbeef"
      CleanWorkingFolder="no"
      OutputPath="patch.pcp"
      WholeFilesOnly="no">
    <PatchInformation
        Description="Small Update Patch"
        Comments="Small Update Patch"                        
        Manufacturer="Your Manufacturer"/>
    <PatchMetadata
        AllowRemoval="yes"
        Description="Hotfix"
        ManufacturerName="Your Manufacturer"
        MoreInfoURL="http://yourwebsite.com"
        TargetProductName="Your Product Name"        
        Classification="Hotfix"
        DisplayName="Hotfix - TBC"/>

    <Family DiskId="5000"
        MediaSrcProp="Sample"
        Name="Sample"
        SequenceStart="5000">
      <UpgradeImage SourceFile="downloads\newunpack\newVersion.msi" Id="SampleUpgrade">
        <TargetImage SourceFile="downloads\oldunpack\oldVersion.msi" Order="2"
            Id="SampleTarget" IgnoreMissingFiles="no" />
      </UpgradeImage>
    </Family>

    <PatchSequence PatchFamily="SamplePatchFamily"        
        Supersede="yes" />    
  </PatchCreation>
</Wix>
于 2012-06-25T14:49:00.503 回答