Dela via


Konfigurera CI/CD-pipeline med YAML-fil

Tabellen nedan visar de olika MSBuild-argument som du kan definiera för att konfigurera bygg-pipelinen.

MSBuild-argument Värde Beskrivning
AppxPackageDir $(Build.ArtifactStagingDirectory)\AppxPackages Definierar mappen för att lagra de genererade artefakterna.
AppxBundlePlatforms $(Build.BuildPlatform) Gör att du kan definiera de plattformar som ska ingå i paketet.
AppxBundle Alltid Skapar en .msixbundle/.appxbundle med .msix/.appx-filerna för den angivna plattformen.
UapAppxPackageBuildMode StoreUpload Genererar filen .msixupload/.appxupload och mappen _Test för sidoöverföring.
UapAppxPackageBuildMode CI (Kontinuerlig integration) Genererar endast filen .msixupload/.appxupload.
UapAppxPackageBuildMode SideloadOnly Genererar mappen _Test endast för sidoöverföring.
AppxPaketsigneringAktiverad sann Aktiverar paketsignering.
Paketcertifikatthumbprint Certifikatets tumavtryck Det här värdet måste matcha tumavtrycket i signeringscertifikatet eller vara en tom sträng.
Paketcertifikatnyckelfil Väg Sökvägen till certifikatet som ska användas. Detta hämtas från de säkra filmetadata.
Paketcertifikatlösenord Lösenord Lösenordet för den privata nyckeln i certifikatet. Vi rekommenderar att du lagrar ditt lösenord i Azure Key Vault- och länkar lösenordet till variabelgrupp. Du kan skicka variabeln till det här argumentet.

Innan du skapar paketeringsprojektet på samma sätt som guiden i Visual Studio använder kommandoraden MSBuild kan byggprocessen versionföra MSIX-paketet som skapas genom att redigera versionsattributet för paketelementet i filen Package.appxmanifest. I Azure Pipelines kan detta uppnås genom att använda ett uttryck för att ange en räknarvariabel som ökar för varje version och ett PowerShell-skript som använder klassen System.Xml.Linq.XDocument i .NET för att ändra värdet för attributet.

Exempel på YAML-fil som definierar MSIX Build Pipeline

pool: 
  vmImage: windows-2019
  
variables:
  buildPlatform: 'x86'
  buildConfiguration: 'release'
  major: 1
  minor: 0
  build: 0
  revision: $[counter('rev', 0)]
  
steps:
- powershell: |
     # Update appxmanifest. This must be done before the build.
     [xml]$manifest= get-content ".\Msix\Package.appxmanifest"
     $manifest.Package.Identity.Version = "$(major).$(minor).$(build).$(revision)"    
     $manifest.save("Msix/Package.appxmanifest")
  displayName: 'Version Package Manifest'
  
- task: MSBuild@1
  inputs:
    solution: Msix/Msix.wapproj
    platform: $(buildPlatform)
    configuration: $(buildConfiguration)
    msbuildArguments: '/p:OutputPath=NonPackagedApp
     /p:UapAppxPackageBuildMode=SideLoadOnly  /p:AppxBundle=Never /p:AppxPackageOutput=$(Build.ArtifactStagingDirectory)\MsixDesktopApp.msix /p:AppxPackageSigningEnabled=false'
  displayName: 'Package the App'
  
- task: DownloadSecureFile@1
  inputs:
    secureFile: 'certificate.pfx'
  displayName: 'Download Secure PFX File'
  
- script: '"C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x86\signtool"
    sign /fd SHA256 /f $(Agent.TempDirectory)/certificate.pfx /p secret $(
    Build.ArtifactStagingDirectory)/MsixDesktopApp.msix'
  displayName: 'Sign MSIX Package'
  
- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact: drop'

Nedan visas uppdelningar av de olika build-uppgifter som definierats i YAMl-filen:

Konfigurera egenskaper för paketgenerering

Definitionen nedan anger katalogen för Build-komponenter, plattformen och definierar om du vill skapa ett paket eller inte.

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

Konfigurera paketsignering

Om du vill signera MSIX-paketet (eller APPX) måste pipelinen hämta signeringscertifikatet. Det gör du genom att lägga till en DownloadSecureFile-uppgift före VSBuild-aktiviteten. Detta ger dig åtkomst till signeringscertifikatet via signingCert.

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

Uppdatera sedan MSBuild-uppgiften för att referera till signeringscertifikatet:

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

Anmärkning

Argumentet PackageCertificateThumbprint är avsiktligt inställt på en tom sträng som en försiktighetsåtgärd. Om tumavtrycket anges i projektet men inte matchar signeringscertifikatet misslyckas kompileringen med felet: Certificate does not match supplied signing thumbprint.

Granska parametrar

Parametrarna som definieras med $() syntax är variabler som definieras i versionsdefinitionen och ändras i andra byggsystem.

För att se alla fördefinierade variabler, se Fördefinierade byggvariabler.

Konfigurera uppgiften Publicera artefakter från byggprocessen

Standard-MSIX-pipelinen sparar inte de genererade artefakterna. Lägg till följande uppgifter för att lägga till publiceringsfunktionerna i YAML-definitionen.

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

Du kan se de genererade artefakterna i alternativet Artifacts på sidan med byggresultat.

AppInstaller-fil för distribution utanför butiken

Om du distribuerar ditt program utanför Store kan du dra nytta av AppInstaller-filen för paketinstallationen och uppdateringarna

En .appinstaller-fil som söker efter uppdaterade filer på \server\foo

<?xml version="1.0" encoding="utf-8"?>
<AppInstaller xmlns="http://schemas.microsoft.com/appx/appinstaller/2018"
              Version="1.0.0.0"
              Uri="\\server\foo\MsixDesktopApp.appinstaller">
  <MainPackage Name="MyCompany.MySampleApp"
               Publisher="CN=MyCompany, O=MyCompany, L=Stockholm, S=N/A, C=Sweden"
               Version="1.0.0.0"
               Uri="\\server\foo\MsixDesktopApp.msix"
               ProcessorArchitecture="x86"/>
  <UpdateSettings>
    <OnLaunch HoursBetweenUpdateChecks="0" />
  </UpdateSettings>
</AppInstaller>

UpdateSettings-elementet används för att informera systemet när uppdateringar ska kontrolleras och om användaren tvingas att uppdatera. Den fullständiga schemareferensen, inklusive de namnområden som stöds för varje version av Windows 10, finns i dokumenten på bit.ly/2TGWnCR.

Om du lägger till .appinstaller-filen i paketeringsprojektet och ställer in dess paketåtgärdsegenskap till Innehåll och egenskapen Kopiera till utdatakatalog till Kopiera om nyare, kan du sedan lägga till en annan PowerShell-uppgift i YAML-filen som uppdaterar versionsattributen för rot- och MainPackage-elementen och sparar den uppdaterade filen i mellanlagringskatalogen:

- powershell: |
  [Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq")
  $doc = [System.Xml.Linq.XDocument]::Load(
    "$(Build.SourcesDirectory)/Msix/Package.appinstaller")
  $version = "$(major).$(minor).$(build).$(revision)"
  $doc.Root.Attribute("Version").Value = $version;
  $xName =
    [System.Xml.Linq.XName]
      "{http://schemas.microsoft.com/appx/appinstaller/2018}MainPackage"
  $doc.Root.Element($xName).Attribute("Version").Value = $version;
  $doc.Save("$(Build.ArtifactStagingDirectory)/MsixDesktopApp.appinstaller")
displayName: 'Version App Installer File'

Sedan distribuerar du .appinstaller-filen till dina slutanvändare och låter dem dubbelklicka på den här filen i stället för msix-filen för att installera den paketerade appen.

Kontinuerlig distribution

Själva appinstallationsfilen är en okompilerad XML-fil som kan redigeras efter bygget, om det behövs. Det gör det enkelt att använda när du distribuerar programvaran till flera miljöer och när du vill separera bygg-pipelinen från lanseringsprocessen.

Om du skapar en versionspipeline i Azure-portalen med hjälp av mallen "Tomt jobb" och använder den nyligen konfigurerade bygg-pipelinen som källa för artefakten som ska distribueras, kan du sedan lägga till PowerShell-aktiviteten i versionssteget för att dynamiskt ändra värdena för de två Uri-attributen i .appinstaller-filen för att återspegla den plats där appen publiceras.

En versionspipelineaktivitet som ändrar Uris i .appinstaller-filen

- powershell: |
  [Reflection.Assembly]::LoadWithPartialName("System.Xml.Linq")
  $fileShare = "\\filesharestorageccount.file.core.windows.net\myfileshare\"
  $localFilePath =
    "$(System.DefaultWorkingDirectory)\_MsixDesktopApp\drop\MsixDesktopApp.appinstaller"
  $doc = [System.Xml.Linq.XDocument]::Load("$localFilePath")
  $doc.Root.Attribute("Uri").Value = [string]::Format('{0}{1}', $fileShare,
    'MsixDesktopApp.appinstaller')
  $xName =
    [System.Xml.Linq.XName]"{http://schemas.microsoft.com/appx/appinstaller/2018}MainPackage"
  $doc.Root.Element($xName).Attribute("Uri").Value = [string]::Format('{0}{1}',
    $fileShare, 'MsixDesktopApp.appx')
  $doc.Save("$localFilePath")
displayName: 'Modify URIs in App Installer File'

I uppgiften ovan är URI:n inställd till UNC-sökvägen för en Azure-fildelningsresurs. Eftersom det är här operativsystemet letar efter MSIX-paketet när du installerar och uppdaterar appen, har jag också lagt till ett annat kommandoradsskript till versionspipelinen som först mappar filresursdelningen i molnet till de lokala Z:\ drive on the build agent before it uses the xcopy command to copy the .appinstaller and .msix-filerna där:

- script: |
  net use Z: \\filesharestorageccount.file.core.windows.net\myfileshare
    /u:AZURE\filesharestorageccount
    3PTYC+ociHIwNgCnyg7zsWoKBxRmkEc4Aew4FMzbpUl/
    dydo/3HVnl71XPe0uWxQcLddEUuq0fN8Ltcpc0LYeg==
  xcopy $(System.DefaultWorkingDirectory)\_MsixDesktopApp\drop Z:\ /Y
  displayName: 'Publish App Installer File and MSIX package'

Om du är värd för din egen lokala Azure DevOps Server kan du naturligtvis publicera filerna till din egen interna nätverksresurs.

Om du väljer att publicera till en webbserver kan du be MSBuild att generera en version av .appinstaller-filen och en HTML-sida som innehåller en nedladdningslänk och viss information om den paketerade appen genom att ange några ytterligare argument i YAML-filen:

- task: MSBuild@1
  inputs:
    solution: Msix/Msix.wapproj
    platform: $(buildPlatform)
    configuration: $(buildConfiguration)
    msbuildArguments: '/p:OutputPath=NonPackagedApp /p:UapAppxPackageBuildMode=SideLoadOnly  /p:AppxBundle=Never /p:GenerateAppInstallerFile=True
/p:AppInstallerUri=http://yourwebsite.com/packages/ /p:AppInstallerCheckForUpdateFrequency=OnApplicationRun /p:AppInstallerUpdateFrequency=1 /p:AppxPackageDir=$(Build.ArtifactStagingDirectory)/'
  displayName: 'Package the App'

Den genererade HTML-filen innehåller en hyperlänk som är prefixad med det webbläsaroberoende ms-appinstaller-protokollets aktiveringsschema.

<a href="ms-appinstaller:?source=
  http://yourwebsite.com/packages/Msix_x86.appinstaller ">Install App</a>

Om du konfigurerar en versionspipeline som publicerar innehållet i mappen drop till intranätet eller någon annan webbplats, och webbservern stöder byteintervallbegäranden och är korrekt konfigurerad, kan slutanvändarna använda den här länken för att installera appen direkt utan att ladda ned MSIX-paketet först.

Anmärkning

Möjligheten att använda ms-appinstaller URI(Uniform Resource Identifier)-schemat (protokoll) kan styras av en IT-tekniker (administratör). Om du vill aktivera ms-appinstaller i nätverket anger du grupprincipen EnableMSAppInstallerProtocol (/windows/client-management/mdm/policy-csp-desktopappinstaller) till aktiverad (se CSP-princip – DesktopAppInstaller). Mer information finns i Installera Windows 10-appar från en webbsida.