Поделиться через


Настройка автоматических сборок для приложения UWP

Azure Pipelines можно использовать для создания автоматизированных сборок для проектов UWP. В этой статье мы рассмотрим различные способы этого. Мы также покажем, как выполнять эти задачи с помощью командной строки, чтобы вы могли интегрироваться с любой другой системой сборки.

Создать новый конвейер Azure

Начните с регистрации в Azure Pipelines, если вы еще этого не сделали.

Затем создайте конвейер, который можно использовать для сборки исходного кода. Руководство по созданию конвейера для создания репозитория GitHub см. в статье Создание первого конвейера. Azure Pipelines поддерживает типы репозиториев, перечисленные в этой статье.

Настройка автоматической сборки

Мы начнем с определения сборки UWP по умолчанию, доступного в Azure Dev Ops, а затем покажем, как настроить конвейер.

В списке шаблонов определений сборки выберите шаблон универсальной платформы Windows.

Выбор шаблона UWP

Этот шаблон включает базовую конфигурацию для создания проекта UWP:

trigger:
- master

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'x86|x64|ARM'
  buildConfiguration: 'Release'
  appxPackageDir: '$(build.artifactStagingDirectory)\AppxPackages\\'

steps:
- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  inputs:
    platform: 'x86'
    solution: '$(solution)'
    configuration: '$(buildConfiguration)'
    msbuildArgs: '/p:AppxBundlePlatforms="$(buildPlatform)" /p:AppxPackageDir="$(appxPackageDir)" /p:AppxBundle=Always /p:UapAppxPackageBuildMode=StoreUpload'

Шаблон по умолчанию пытается подписать пакет с помощью сертификата, указанного в CSPROJ-файле. Если вы хотите подписать пакет во время сборки, у вас должен быть доступ к закрытому ключу. В противном случае можно отключить подпись, добавив параметр /p:AppxPackageSigningEnabled=false в раздел msbuildArgs в файле YAML.

Добавление сертификата проекта в библиотеку безопасных файлов

Вы должны избегать отправки сертификатов в репозиторий, если это возможно, и git игнорирует их по умолчанию. Для управления безопасной обработкой конфиденциальных файлов, таких как сертификаты, Azure DevOps поддерживает функцию безопасных файлов.

Чтобы отправить сертификат для автоматической сборки, выполните приведенные далее действия.

  1. В Azure Pipelines разверните Трубопроводы на панели навигации и щелкните Библиотека.

  2. Перейдите на вкладку Безопасные файлы и щелкните + Безопасный файл.

    снимок экрана Azure с выделенной опцией библиотеки, показывающей страницу «Безопасные файлы».

  3. Перейдите к файлу сертификата и нажмите кнопку ОК.

  4. После отправки сертификата выберите его, чтобы просмотреть его свойства. В разделе "разрешения для конвейеров"включите переключатель "Авторизовать для использования во всех конвейерах".

    снимок экрана раздела

  5. Если закрытый ключ в сертификате имеет пароль, рекомендуется сохранить пароль в Azure Key Vault, а затем связать пароль с группой переменных . С помощью переменной можно получить доступ к паролю из конвейера. Обратите внимание, что пароль поддерживается только для закрытого ключа; использование файла сертификата, защищенного паролем, в настоящее время не поддерживается.

Замечание

Начиная с Visual Studio 2019 временный сертификат больше не создается в проектах UWP. Чтобы создать или экспортировать сертификаты, используйте командлеты PowerShell, описанные в этой статье.

Настройка задачи сборки решения

Эта задача компилирует любое решение, которое находится в рабочей папке в двоичные файлы и создает выходной файл пакета приложения. Эта задача использует аргументы MSBuild. Необходимо указать значение этих аргументов. Используйте следующую таблицу в качестве руководства.

Аргумент MSBuild Ценность Описание
AppxPackageDir $(Build.ArtifactStagingDirectory)\AppxPackages Определяет папку для хранения созданных артефактов.
AppxBundlePlatforms $(Build.BuildPlatform) Позволяет определить платформы для включения в пакет.
AppxBundle Всегда Создает пакет MSIXBUNDLE или APPXBUNDLE, содержащий файлы MSIX или APPX, для указанной платформы.
UapAppxPackageBuildMode StoreUpload Генерирует файл .msixupload/.appxupload и папку _Test для боковой загрузки.
UapAppxPackageBuildMode СИ Генерирует только файл .msixupload или .appxupload.
UapAppxPackageBuildMode Только сторонняя загрузка Создает папку _Test только для боковой загрузки.
AppxPackageSigningEnabled (Включено Подписание Пакетов Appx) правда Включает подписывание пакетов.
Отпечаток сертификата пакета Отпечаток сертификата Это значение должно соответствовать отпечатку в сертификате для подписи, или строка должна быть пустой.
Файл ключа сертификата пакета Путь Путь к используемому сертификату. Он извлекается из метаданных защищенного файла.
Пароль для сертификата пакета Пароль Пароль для закрытого ключа в сертификате. Рекомендуется сохранить пароль в Azure Key Vault и связать пароль с группой переменных. Эту переменную можно передать в этот аргумент.

Настройте сборку

Если вы хотите создать решение с помощью командной строки или с помощью любой другой системы сборки, запустите MSBuild с этими аргументами.

/p:AppxPackageDir="$(Build.ArtifactStagingDirectory)\AppxPackages\\"
/p:UapAppxPackageBuildMode=StoreUpload
/p:AppxBundlePlatforms="$(Build.BuildPlatform)"
/p:AppxBundle=Always

Настройка подписания программного пакета

Чтобы подписать пакет MSIX (или .appx), конвейеру необходимо получить сертификат подписи. Для этого добавьте задачу DownloadSecureFile перед задачей VSBuild. Это обеспечит доступ к сертификату подписи с помощью signingCert.

- task: DownloadSecureFile@1
  name: signingCert
  displayName: 'Download CA certificate'
  inputs:
    secureFile: '[Your_Pfx].pfx'

Затем обновите задачу VSBuild, чтобы ссылаться на сертификат подписи:

- task: VSBuild@1
  inputs:
    platform: 'x86'
    solution: '$(solution)'
    configuration: '$(buildConfiguration)'
    msbuildArgs: '/p:AppxBundlePlatforms="$(buildPlatform)" 
                  /p:AppxPackageDir="$(appxPackageDir)" 
                  /p:AppxBundle=Always 
                  /p:UapAppxPackageBuildMode=StoreUpload 
                  /p:AppxPackageSigningEnabled=true
                  /p:PackageCertificateThumbprint="" 
                  /p:PackageCertificateKeyFile="$(signingCert.secureFilePath)"'

Замечание

Аргумент PackageCertificateThumbprint намеренно присваивается пустой строке в качестве меры предосторожности. Если отпечаток установлен в проекте, но не соответствует сертификату подписи, сборка завершится ошибкой: Certificate does not match supplied signing thumbprint.

Проверка параметров

Параметры, определенные с помощью синтаксиса $(), являются переменными, определенными в определении сборки, и изменятся в других системах сборки.

переменные по умолчанию

Чтобы просмотреть все предопределенные переменные, см. статью Предопределенные переменные сборки.

Настройте задачу "Публикация артефактов сборки"

Конвейер UWP по умолчанию не сохраняет созданные результаты. Чтобы добавить возможности публикации в определение YAML, добавьте следующие задачи.

- task: CopyFiles@2
  displayName: 'Copy Files to: $(build.artifactstagingdirectory)'
  inputs:
    SourceFolder: '$(system.defaultworkingdirectory)'
    Contents: '**\bin\$(BuildConfiguration)\**'
    TargetFolder: '$(build.artifactstagingdirectory)'

- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'
  inputs:
    PathtoPublish: '$(build.artifactstagingdirectory)'

Созданные артефакты можно просмотреть в параметре Артефакты на странице результатов сборки.

артефактов

Так как аргумент UapAppxPackageBuildMode имеет значение StoreUpload, папка артефактов включает в себя пакет для отправки в магазин (.msixupload/.appxupload). Обратите внимание, что вы также можете отправить обычный пакет приложения (MSIX/.appx) или пакет приложений (.msixbundle/.appxbundle/) в Магазин. В целях этой статьи мы будем использовать файл .appxupload.

Ошибки пакета адресов

Если вы добавите в решение несколько проектов UWP, а затем попытаетесь создать пакет, может появиться сообщение об ошибке, подобной этой.

MakeAppx(0,0): Error : Error info: error 80080204: The package with file name "AppOne.UnitTests_0.1.2595.0_x86.appx" and package full name "8ef641d1-4557-4e33-957f-6895b122f1e6_0.1.2595.0_x86__scrj5wvaadcy6" is not valid in the bundle because it has a different package family name than other packages in the bundle

Эта ошибка появляется, так как на уровне решения не ясно, какое приложение должно отображаться в пакете. Чтобы устранить эту проблему, откройте каждый файл проекта и добавьте следующие свойства в конце первого элемента <PropertyGroup>.

Проект Свойства
Приложение <AppxBundle>Always</AppxBundle>
UnitTests <AppxBundle>Never</AppxBundle>

Затем удалите аргумент MSBuild AppxBundle из шага сборки.