Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 .
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:
No Azure Pipelines, expanda Pipelines no painel de navegação e clique em Biblioteca.
Clique no separador Ficheiros seguros e, em seguida, clique em + Ficheiro seguro.
Navegue até o arquivo de certificado e clique em OK.
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.
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.
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.
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.