Partilhar via


Configurar compilações automatizadas para seu aplicativo UWP

Você pode usar o Azure Pipelines para criar compilações automatizadas para projetos UWP. Neste artigo, veremos diferentes maneiras de fazer isso. Também mostraremos como executar essas tarefas usando a linha de comando para que você possa se integrar com qualquer outro sistema de compilação.

Criar um novo pipeline do Azure

Comece por inscrever-se no Azure Pipelines se ainda não o tiver feito.

Em seguida, crie um pipeline que você pode usar para criar seu código-fonte. Para obter um tutorial sobre como criar um pipeline para criar um repositório GitHub, consulte Criar seu primeiro pipeline. O Azure Pipelines dá suporte aos tipos de repositório listados neste artigo.

Configurar uma compilação automatizada

Começaremos com a definição de compilação UWP padrão disponível no Azure Dev Ops e mostraremos como configurar o pipeline.

Na lista de modelos de definição de compilação, escolha o modelo da Plataforma Universal do Windows .

Selecione o modelo UWP

Este modelo inclui a configuração básica para criar seu projeto 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'

O modelo padrão tenta assinar o pacote com o certificado especificado no arquivo .csproj. Se você quiser assinar seu pacote durante a compilação, você deve ter acesso à chave privada. Caso contrário, você pode desabilitar a assinatura adicionando o parâmetro /p:AppxPackageSigningEnabled=false à msbuildArgs seção no arquivo YAML.

Adicione seu certificado de projeto à biblioteca de arquivos seguros

Você deve evitar enviar certificados para seu repositório, se possível, e o git os ignora por padrão. Para gerenciar o tratamento seguro de arquivos confidenciais, como certificados, o Azure DevOps dá suporte ao recurso de arquivos seguros .

Para carregar um certificado para sua compilação automatizada:

  1. No Azure Pipelines, expanda Pipelines no painel de navegação e clique em Biblioteca.

  2. Clique no separador Ficheiros seguros e, em seguida, clique em + Ficheiro seguro.

    Captura de ecrã do Azure com a opção Biblioteca realçada a mostrar a página Ficheiros seguros.

  3. Navegue até o arquivo de certificado e clique em OK.

  4. Depois de carregar o certificado, selecione-o para exibir suas propriedades. Em Pipeline permissions, ative a alternância Autorizar para uso em todos os pipelines.

    Captura de tela da seção Permissões de pipeline com a opção Autorizar para uso em todos os pipelines selecionada.

  5. Se a chave privada no certificado tiver uma senha, recomendamos que você armazene sua senha no Cofre de Chaves do Azure e vincule a senha a um grupo de variáveis. Você pode usar a variável para acessar a senha do pipeline. Observe que uma senha só é suportada para a chave privada; No momento, não há suporte para o uso de um arquivo de certificado protegido por senha.

Observação

A partir do Visual Studio 2019, um certificado temporário não é mais gerado em projetos UWP. Para criar ou exportar certificados, use os cmdlets do PowerShell descritos no artigo.

Configurar a tarefa de compilação da solução

Esta tarefa compila qualquer solução que esteja na pasta de trabalho para binários e produz o arquivo de pacote do aplicativo de saída. Esta tarefa usa argumentos MSBuild. Você terá que especificar o valor desses argumentos. Use a tabela a seguir como guia.

argumento do MSBuild Valor Descrição
AppxPackageDir $(Build.ArtifactStagingDirectory)/AppxPackages Define a pasta para armazenar os artefatos gerados.
AppxBundlePlataformas $(Build.BuildPlatform) Permite definir as plataformas a serem incluídas no pacote.
AppxBundle Sempre Cria um .msixbundle/.appxbundle com os arquivos .msix/.appx para a plataforma especificada.
UapAppxPackageBuildMode LojaUpload Gera o ficheiro .msixupload/.appxupload e a pasta _Test para instalação direta.
UapAppxPackageBuildMode IC Gera somente o arquivo .msixupload/.appxupload.
UapAppxPackageBuildMode SideloadOnly Gera a pasta _Test apenas para carregamento lateral.
AssinaturaDePacoteAppxAtivada verdadeiro Habilita a assinatura de pacotes.
Impressão digital do certificado do pacote Impressão digital do certificado Esse valor deve corresponder à impressão digital no certificado de assinatura ou ser uma cadeia de caracteres vazia.
FicheiroDeChaveDeCertificadoDePacote Caminho O caminho para o certificado a ser usado. Isso é recuperado dos metadados do arquivo seguro.
Senha do Certificado do Pacote Palavra-passe A senha para a chave privada no certificado. Recomendamos que você armazene sua senha no Cofre de Chaves do Azure e vincule a senha ao grupo de variáveis. Você pode passar a variável para esse argumento.

Configurar a compilação

Se você quiser criar sua solução usando a linha de comando ou usando qualquer outro sistema de compilação, execute o MSBuild com esses argumentos.

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

Configurar assinatura de pacote

Para assinar o pacote MSIX (ou .appx), a pipeline precisa recuperar o certificado de assinatura. Para fazer isso, adicione uma tarefa DownloadSecureFile antes da tarefa VSBuild. Isso lhe dará acesso ao certificado de assinatura via signingCert.

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

Em seguida, atualize a tarefa VSBuild para fazer referência ao certificado de assinatura:

- 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)"'

Observação

O argumento PackageCertificateThumbprint é intencionalmente definido como uma cadeia de caracteres vazia como precaução. Se a impressão digital estiver definida no projeto, mas não corresponder ao certificado de assinatura, a compilação falhará com o erro: Certificate does not match supplied signing thumbprint.

Rever parâmetros

Os parâmetros definidos com a $() sintaxe são variáveis definidas na definição de compilação e serão alterados em outros sistemas de compilação.

variáveis padrão

Para exibir todas as variáveis predefinidas, consulte Variáveis de compilação predefinidas.

Configurar a tarefa Publicar Artefatos de Compilação

O pipeline UWP padrão não salva os artefatos gerados. Para adicionar os recursos de publicação à sua definição de YAML, adicione as seguintes tarefas.

- 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)'

Você pode ver os artefatos gerados na opção Artefatos da página de resultados da compilação.

artefatos

Como definimos o argumento UapAppxPackageBuildMode como StoreUpload, a pasta de artefatos inclui o pacote para submissão para a Loja (.msixupload/.appxupload). Observe que você também pode enviar um pacote de aplicativo regular (.msix/.appx) ou um pacote de aplicativos (.msixbundle/.appxbundle/) para a Loja. Para os fins deste artigo, usaremos o arquivo .appxupload.

Erros de pacote de endereço

Se você adicionar mais de um projeto UWP à sua solução e, em seguida, tentar criar um pacote, poderá receber um erro como este.

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

Esse erro aparece porque, no nível da solução, não está claro qual aplicativo deve aparecer no pacote. Para resolver esse problema, abra cada arquivo de projeto e adicione as seguintes propriedades no final do primeiro <PropertyGroup> elemento.

Projeto Propriedades
Aplicação <AppxBundle>Always</AppxBundle>
Testes Unitários <AppxBundle>Never</AppxBundle>

Em seguida, remova o AppxBundle argumento MSBuild da etapa de compilação.