TeamCity создает файлы MSP

Для справки: у меня довольно хорошая настройка TeamCity; содержащий сборку ci и сборку выпуска, которая использует WiX для сборки моих установщиков и исправления всех номеров версий. Когда я делаю новую сборку релиза, я бы хотел автоматически создавать патчи MSP для предыдущего набора установщиков. Я думаю, либо помечены RTM в TeamCity, либо в виде списка номеров версий.

Подход, к которому я склоняюсь, - это создание отдельной конфигурации и получение артефактов msi всех предыдущих сборок, которые соответствуют критериям (тег или номер версии). Тег будет казаться намного аккуратнее, но я не вижу ничего в документации о том, как вы его используете?

У меня есть скрипт для сборки патча MSP, но он основан на файле PCP, который нужно отредактировать в ORCA для описания патча.

  1. Что касается редактирования PCP, могу ли я использовать что-то еще, кроме ORCA, для редактирования? Я смотрел на переход к методу WiX здесь: http://wix.sourceforge.net/manual-wix3/patch_building.htm который выглядит многообещающим.
  2. Кто-нибудь знает, можно ли получить доступ к артефактам в TeamCity по тегу в той же или другой сборке?
  3. Есть ли у кого-нибудь еще идеи для автоматического создания / создания цепочек MSP-файлов патчей в TeamCity?

2 ответа

Решение
  1. Вы можете создать файл.PCP, используя элемент PatchCreation в наборе инструментов WiX. Это, вероятно, даст вам необходимую гибкость, необходимую для создания настраиваемых файлов.PCP.

  2. Извините, не используйте TeamCity.

  3. Извините, не используйте TeamCity.:)

Чтобы добавить к ответу Роба:

# 2. TeamCity может извлекать предметы по тегу:

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

# 3. Я использовал элемент PatchCreation (Роб предложил выше) в наборе инструментов WiX, и он достаточно гибок для этого. Вот краткий обзор того, что я построил, все это, кажется, работает очень хорошо в тестировании,

Проект teamcity имеет ряд параметров сборки:

  1. Новый номер версии - по умолчанию, как changeme, поэтому, если он не был изменен, он нарушает сборку.

  2. Старый номер версии - как указано выше

  3. Новый репозиторий сборки - это buildtypeid, посмотрите строку запроса для вашего проекта, и он будет иметь buildTypeId=btXX. XX - это число, которое должно быть указано здесь.

  4. Старая сборка репо - как указано выше

Проект teamcity имеет следующие этапы:

  1. MSBuild runner для запуска build.msbuild (см. Ниже)

  2. Запустите Candle в patch.wxs, чтобы создать файл patch.wixobj

  3. Запустите Light на patch.wixobj, чтобы создать 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>

Template.wxs используется скриптом MSBuild

<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>
Другие вопросы по тегам