Nastavení kontinuální integrace pro aplikaci WinUI

Pomocí GitHub Actions můžete nastavit sestavení kontinuální integrace pro projekty WinUI. V tomto článku se podíváme na různé způsoby, jak to udělat. Ukážeme vám také, jak tyto úlohy provádět pomocí příkazového řádku, abyste se mohli integrovat s jakýmkoli jiným systémem sestavení.

Požadavky

Krok 1: Nastavení certifikátu

Aby bylo možné nainstalovat aplikace MSIX, musí být podepsané. Pokud už certifikát máte, můžete tento krok přeskočit. Testovací certifikát můžete snadno vytvořit tak, že otevřete aplikaci v sadě Visual Studio, kliknete pravým tlačítkem na projekt WinUI a vyberete Balíček a Publikovat –>Vytvořit balíčky aplikací.

Potom vyberte Další a přejděte na stránku Vyberte metodu podepisování, a klikněte na tlačítko Vytvořit... k vytvoření nového certifikátu. Zvolte název vydavatele a ponechte pole s heslem prázdné a vytvořte certifikát.

Potom zavřete nebo zrušte dialogová okna a všimněte si, že se v projektu vytvořil nový soubor .pfx . Toto je certifikát, kterým můžete msiX podepsat.

Krok 2: Přidání certifikátu do tajných kódů Akcí

Pokud je to možné, měli byste se vyhnout odesílání certifikátů do úložiště a Git je ve výchozím nastavení ignoruje. Pro správu bezpečného zpracování citlivých souborů, jako jsou certifikáty, GitHub podporuje tajemství.

Chcete-li nahrát certifikát pro automatizované sestavení:

  1. Zakódujte certifikát jako řetězec Base 64: Otevřete PowerShell do adresáře, který obsahuje váš certifikát, a spusťte následující příkaz a nahraďte název souboru pfx názvem souboru vašeho certifikátu.
$pfx_cert = Get-Content 'App1_TemporaryKey.pfx' -AsByteStream

[System.Convert]::ToBase64String($pfx_cert) | Out-File 'App1_TemporaryKey_Base64.txt'
  1. V úložišti GitHub přejděte na nastavení a vlevo klikněte na Tajemství.
  2. Klikněte na Nový tajný klíč úložiště, pojmenujte ho BASE64_ENCODED_PFXa zkopírujte nebo vložte text z textového souboru ve výstupu PowerShellu do hodnoty tajného kódu.

Krok 3: Nastavení pracovního postupu

V dalším kroku v úložišti přejděte na kartu Akce a vytvořte nový pracovní postup. Zvolte nastavit pracovní postup sami možnost místo jedné ze šablon pracovních postupů.

Zkopírujte nebo vložte následující text do souboru pracovního postupu a pak aktualizujte...

  1. Solution_Name pro název vašeho řešení
  2. dotnet-version na 8.0.x (nebo podle toho, na kterou verzi .NET váš projekt cílí)

Poznámka:

Pokud se v kroku nahrání artefaktu (poslední krok níže) nezobrazí výstup sestavení ve složce, která obsahuje vaše řešení, nahraďte env.Solution_Namegithub.workspace (složka pracovního prostoru GitHub Actions).

# This workflow will build, sign, and package a WinUI MSIX desktop application
# built on .NET.

name: WinUI MSIX app

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:

  build:

    strategy:
      matrix:
        configuration: [Release]
        platform: [x64, x86]

    runs-on: windows-latest  # For a list of available runner types, refer to
                             # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on

    env:
      Solution_Name: your-solution-name                         # Replace with your solution name, i.e. App1.sln.

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        fetch-depth: 0

    # Install the .NET workload
    - name: Install .NET
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: 8.0.x

    # Add  MSBuild to the PATH: https://github.com/microsoft/setup-msbuild
    - name: Setup MSBuild.exe
      uses: microsoft/setup-msbuild@v2

    # Restore the application to populate the obj folder with RuntimeIdentifiers
    - name: Restore the application
      run: msbuild $env:Solution_Name /t:Restore /p:Configuration=$env:Configuration
      env:
        Configuration: ${{ matrix.configuration }}

    # Decode the base 64 encoded pfx and save the Signing_Certificate
    - name: Decode the pfx
      run: |
        $pfx_cert_byte = [System.Convert]::FromBase64String("${{ secrets.BASE64_ENCODED_PFX }}")
        $certificatePath = "GitHubActionsWorkflow.pfx"
        [IO.File]::WriteAllBytes("$certificatePath", $pfx_cert_byte)

    # Create the app package by building and packaging the project
    - name: Create the app package
      run: msbuild $env:Solution_Name /p:Configuration=$env:Configuration /p:Platform=$env:Platform /p:UapAppxPackageBuildMode=$env:Appx_Package_Build_Mode /p:AppxBundle=$env:Appx_Bundle /p:PackageCertificateKeyFile=GitHubActionsWorkflow.pfx /p:AppxPackageDir="$env:Appx_Package_Dir" /p:GenerateAppxPackageOnBuild=true
      env:
        Appx_Bundle: Never
        Appx_Package_Build_Mode: SideloadOnly
        Appx_Package_Dir: Packages\
        Configuration: ${{ matrix.configuration }}
        Platform: ${{ matrix.platform }}

    # Remove the pfx
    - name: Remove the pfx
      run: Remove-Item -path GitHubActionsWorkflow.pfx

    # Upload the MSIX package: https://github.com/marketplace/actions/upload-a-build-artifact
    - name: Upload MSIX package
      uses: actions/upload-artifact@v4
      with:
        name: MSIX Package - ${{ matrix.platform }}
        path: ${{ env.Solution_Name }}\\Packages

Krok 4: Potvrďte pracovní postup a sledujte jeho spuštění.

Potvrďte soubor pracovního postupu do hlavní větve a pak přejděte na kartu Akce v úložišti GitHub a sledujte spuštění pracovního postupu. Měl by se úspěšně spustit a vytvořit výstupy, které obsahují vaši vytvořenou aplikaci MSIX.

Sestavení z příkazového řádku

Pokud chcete vytvořit řešení pomocí příkazového řádku nebo pomocí jakéhokoli jiného systému CI, spusťte nástroj MSBuild s těmito argumenty. Tato GenerateAppxPackageOnBuild vlastnost způsobí vygenerování balíčku MSIX.

/p:AppxPackageDir="Packages"
/p:UapAppxPackageBuildMode=SideloadOnly
/p:AppxBundle=Never
/p:GenerateAppxPackageOnBuild=true

Krok 1: Nastavení pracovního postupu

V úložišti GitHub přejděte na kartu Akce a vytvořte nový pracovní postup. Zvolte nastavit pracovní postup sami možnost místo jedné ze šablon pracovních postupů.

Zkopírujte nebo vložte následující text do souboru pracovního postupu a pak aktualizujte...

  1. Solution_Name pro název vašeho řešení
  2. dotnet-version na 8.0.x (nebo podle toho, na kterou verzi .NET váš projekt cílí)

Poznámka:

Pokud se v kroku nahrání artefaktu (poslední krok níže) nezobrazí výstup sestavení ve složce, která obsahuje vaše řešení, nahraďte env.Solution_Namegithub.workspace (složka pracovního prostoru GitHub Actions).

# This workflow will build and publish a WinUI unpackaged desktop application
# built on .NET.

name: WinUI unpackaged app

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:

  build:

    strategy:
      matrix:
        configuration: [Release]
        platform: [x64, x86]

    runs-on: windows-latest  # For a list of available runner types, refer to
                             # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on

    env:
      Solution_Name: your-solution-name                         # Replace with your solution name, i.e. App1.sln.

    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        fetch-depth: 0

    # Install the .NET workload
    - name: Install .NET
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: 8.0.x

    # Add  MSBuild to the PATH: https://github.com/microsoft/setup-msbuild
    - name: Setup MSBuild.exe
      uses: microsoft/setup-msbuild@v2

    # Restore the application to populate the obj folder with RuntimeIdentifiers
    - name: Restore the application
      run: msbuild $env:Solution_Name /t:Restore /p:Configuration=$env:Configuration
      env:
        Configuration: ${{ matrix.configuration }}

    # Create the app by building and publishing the project
    - name: Create the app
      run: msbuild $env:Solution_Name /t:Publish /p:Configuration=$env:Configuration /p:Platform=$env:Platform
      env:
        Configuration: ${{ matrix.configuration }}
        Platform: ${{ matrix.platform }}

    # Upload the app
    - name: Upload app
      uses: actions/upload-artifact@v4
      with:
        name: Upload app - ${{ matrix.platform }}
        path: ${{ env.Solution_Name }}\\bin

Krok 2: Potvrďte pracovní postup a sledujte jeho spuštění.

Potvrďte soubor pracovního postupu do hlavní větve a pak přejděte na kartu Akce v úložišti GitHub a sledujte spuštění pracovního postupu. Měl by se úspěšně spustit a vytvořit výstupy, které obsahují sestavenou aplikaci.

Sestavení z příkazového řádku

Pokud chcete řešení sestavit pomocí příkazového řádku nebo pomocí jiného systému CI, spusťte nástroj MSBuild s argumentem /t:Publish .

Azure Pipelines

Pokud váš tým používá Azure DevOps, můžete vytvářet aplikace WinUI 3 pomocí Azure Pipelines. Následující kanál YAML sestaví zabalenou aplikaci MSIX WinUI v agentu Windows:

trigger:
  - main

pool:
  vmImage: 'windows-latest'

variables:
  solution: '**/*.sln'
  buildPlatform: 'x64'
  buildConfiguration: 'Release'

steps:
- task: UseDotNet@2
  displayName: 'Install .NET SDK'
  inputs:
    packageType: 'sdk'
    version: '8.0.x'

- task: NuGetToolInstaller@1

- task: NuGetCommand@2
  inputs:
    restoreSolution: '$(solution)'

- task: VSBuild@1
  displayName: 'Build MSIX package'
  inputs:
    solution: '$(solution)'
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
    msbuildArgs: |
      /p:AppxBundlePlatforms="$(buildPlatform)"
      /p:AppxPackageDir="$(Build.ArtifactStagingDirectory)\AppxPackages\\"
      /p:AppxBundle=Never
      /p:UapAppxPackageBuildMode=SideloadOnly
      /p:GenerateAppInstallerFile=false

- task: PublishBuildArtifacts@1
  displayName: 'Publish MSIX artifacts'
  inputs:
    PathtoPublish: '$(Build.ArtifactStagingDirectory)\AppxPackages'
    ArtifactName: 'msix-package'

Poznámka:

Pro nesbalená sestavení odeberte argumenty nástroje MSBuild /p:Appx* a místo VSBuild použijte dotnet publish. Podrobnosti najdete v části příkazového řádku výše.

Pro podepisování balíčků MSIX v kanálu uložte certifikát do Azure Pipelines zabezpečených souborů a použijte úlohu DownloadSecureFile pro přístup k němu během sestavení.

Important

Nikdy neukládejte podpisové certifikáty ani jejich hesla ve správě zdrojového kódu. Pro heslo certifikátu použijte tajné proměnné kanálu a službu Azure Pipelines Secure Files pro samotný certifikát.