Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Você pode usar o Azure Pipelines para criar builds automatizados para projetos UWP. Neste artigo, examinaremos diferentes maneiras de fazer isso. Também mostraremos como executar essas tarefas usando a linha de comando para que você possa se integrar a qualquer outro sistema de build.
Criar um novo pipeline do Azure
Comece inscrever-se no Azure Pipelines se você ainda não fez isso.
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 do GitHub, consulte Criar seu primeiro pipeline. O Azure Pipelines dá suporte aos tipos de repositório listados neste artigo.
Configurar um build automatizado
Começaremos com a definição de build UWP padrão disponível no Azure Dev Ops e mostraremos como configurar o pipeline.
Na lista de modelos de definição de build, escolha o modelo Plataforma Universal do Windows .
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 o pacote durante o build, deverá ter acesso à chave privada. Caso contrário, você poderá desabilitar a assinatura adicionando o parâmetro /p:AppxPackageSigningEnabled=false à seção msbuildArgs no arquivo YAML.
Adicionar seu certificado de projeto à biblioteca de arquivos seguros
Você deve evitar enviar certificados ao repositório, se possível, e o Git os ignorará por padrão. Para gerenciar o tratamento seguro de arquivos confidenciais, como certificados, o Azure DevOps dá suporte ao recurso arquivos seguros.
Para carregar um certificado para a sua compilação automatizada:
No Azure Pipelines, expanda Pipelines no painel de navegação e clique em Library.
Clique na guia arquivos seguros e clique em + Arquivo seguro.
Navegue até o arquivo de certificado e clique em OK.
Depois de carregar o certificado, selecione-o para exibir suas propriedades. Em permissões de pipeline, habilite a opção Autorizar para uso em todos os pipelines.
Se a chave privada no certificado tiver uma senha, recomendamos que você armazene sua senha no do Azure Key Vault 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ó tem suporte 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 neste artigo.
Configurar a tarefa de compilação da solução
Essa 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. Essa tarefa usa argumentos do MSBuild. Você precisará especificar o valor desses argumentos. Use a tabela a seguir como guia.
| Argumento MSBuild | Valor | Descrição |
|---|---|---|
| AppxPackageDir | $(Build.ArtifactStagingDirectory)\AppxPackages | Define a pasta para armazenar os artefatos gerados. |
| AppxBundlePlatforms | $(Build.BuildPlatform) | Permite que você defina as plataformas a serem incluídas no pacote. |
| AppxBundle | Sempre | Cria um .msixbundle/.appxbundle com os arquivos .msix/.appx para a plataforma especificada. |
| UapAppxPackageBuildMode | StoreUpload | Gera o arquivo .msixupload/.appxupload e a pasta _Test para carregamento lateral. |
| UapAppxPackageBuildMode | Integração Contínua (CI) | Gera apenas o arquivo .msixupload/.appxupload. |
| UapAppxPackageBuildMode | SideloadOnly | Gera a pasta _Test somente para sideload. |
| AppxPackageSigningEnabled | verdadeiro | Ativa 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. |
| ArquivoDeChaveDeCertificadoDoPacote | Caminho | O caminho para o certificado a ser usado. Isso é recuperado dos metadados seguros de arquivo. |
| SenhaDoCertificadoDoPacote | Senha | A senha da chave privada no certificado. Recomendamos que você armazene sua senha no do Azure Key Vault e vincule a senha para 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 build, execute o MSBuild com esses argumentos.
/p:AppxPackageDir="$(Build.ArtifactStagingDirectory)\AppxPackages\\"
/p:UapAppxPackageBuildMode=StoreUpload
/p:AppxBundlePlatforms="$(Build.BuildPlatform)"
/p:AppxBundle=Always
Configurar a assinatura do pacote
Para assinar o pacote MSIX (ou .appx), o pipeline precisa obter o certificado de assinatura. Para fazer isso, adicione uma tarefa DownloadSecureFile antes da tarefa VSBuild.
Isso lhe dará acesso ao certificado de assinatura por meio de 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 é definido intencionalmente 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, o build falhará com o erro: Certificate does not match supplied signing thumbprint.
Revisar parâmetros
Os parâmetros definidos com a sintaxe $() são variáveis definidas na definição de build e serão alterados em outros sistemas de build.
Para exibir todas as variáveis predefinidas, consulte variáveis de build predefinidas.
Configurar a tarefa Publicar Artefatos do Build
O pipeline UWP padrão não salva os artefatos gerados. Para adicionar os recursos de publicação à definição do 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 envio à 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 do pacote de endereços
Se você adicionar mais de um projeto UWP à sua solução e 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 elemento <PropertyGroup>.
| Projeto | Propriedades |
|---|---|
| Aplicativo | <AppxBundle>Always</AppxBundle> |
| UnitTests | <AppxBundle>Never</AppxBundle> |
Em seguida, remova o argumento AppxBundle MSBuild da etapa de build.