Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure Pipelines можно использовать для создания автоматизированных сборок для проектов UWP. В этой статье мы рассмотрим различные способы этого. Мы также покажем, как выполнять эти задачи с помощью командной строки, чтобы вы могли интегрироваться с любой другой системой сборки.
Создать новый конвейер Azure
Начните с регистрации в Azure Pipelines, если вы еще этого не сделали.
Затем создайте конвейер, который можно использовать для сборки исходного кода. Руководство по созданию конвейера для создания репозитория GitHub см. в статье Создание первого конвейера. Azure Pipelines поддерживает типы репозиториев, перечисленные в этой статье.
Настройка автоматической сборки
Мы начнем с определения сборки UWP по умолчанию, доступного в Azure Dev Ops, а затем покажем, как настроить конвейер.
В списке шаблонов определений сборки выберите шаблон универсальной платформы Windows.
Этот шаблон включает базовую конфигурацию для создания проекта 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 поддерживает функцию безопасных файлов.
Чтобы отправить сертификат для автоматической сборки, выполните приведенные далее действия.
В Azure Pipelines разверните Трубопроводы на панели навигации и щелкните Библиотека.
Перейдите на вкладку Безопасные файлы и щелкните + Безопасный файл.
Перейдите к файлу сертификата и нажмите кнопку ОК.
После отправки сертификата выберите его, чтобы просмотреть его свойства. В разделе "разрешения для конвейеров"включите переключатель "Авторизовать для использования во всех конвейерах".
Если закрытый ключ в сертификате имеет пароль, рекомендуется сохранить пароль в 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
из шага сборки.