WinUI uygulamanız için sürekli tümleştirmeyi ayarlama

WinUI projeleri için sürekli tümleştirme derlemeleri ayarlamak için GitHub Actions'ı kullanabilirsiniz. Bu makalede, bunu yapmanın farklı yollarını inceleyeceğiz. Ayrıca, diğer tüm derleme sistemleriyle tümleştirebilmeniz için komut satırını kullanarak bu görevleri nasıl gerçekleştirebileceğinizi de göstereceğiz.

Önkoşullar

1. Adım: Sertifikanızı ayarlama

MSIX uygulamalarının yüklenebilmesi için oturum açması gerekir. Zaten bir sertifikanız varsa bu adımı atlayabilirsiniz. Uygulamanızı Visual Studio'da açıp WinUI projenize sağ tıklayıp Paketle ve Yayımla ->Uygulama Paketleri Oluştur'u seçerek kolayca bir test sertifikası oluşturabilirsiniz.

Sonraki seçeneğine tıklayın, ardından İmzalama yöntemini seçin sayfasına gidin ve yeni bir sertifika oluşturmak için Oluştur... düğmesine tıklayın. Yayımcı adını seçin, parola alanını boş bırakın ve sertifikayı oluşturun.

Ardından, iletişim kutularını kapatın/iptal edin ve projenizde yeni bir .pfx dosyası oluşturulduğuna dikkat edin. Bu, MSIX'inizi imzalayabileceğiniz sertifikadır!

2. Adım: Sertifikanızı İşlemler gizli bilgilerine ekleyin

Mümkünse deponuza sertifika göndermekten kaçınmanız gerekir ve Git bunları varsayılan olarak yoksayar. GitHub, sertifikalar gibi hassas dosyaların güvenli bir şekilde işlenmesini yönetmek için gizli dizileri destekler.

Otomasyonlu derlemeniz için bir sertifikayı yüklemek amacıyla:

  1. Sertifikanızı Temel 64 dizesi olarak kodlayın: PowerShell'i sertifikanızı içeren dizine açın ve aşağıdaki komutu yürüterek pfx dosya adını sertifikanızın dosya adıyla değiştirin.
$pfx_cert = Get-Content 'App1_TemporaryKey.pfx' -AsByteStream

[System.Convert]::ToBase64String($pfx_cert) | Out-File 'App1_TemporaryKey_Base64.txt'
  1. GitHub deponuzda Ayarlar sayfasına gidin ve soldaki Gizli bilgiler kısmına tıklayın.
  2. Yeni Depo Sırrı Oluştur'a tıklayın, bunu adlandırın, ardından PowerShell çıktısındaki metin dosyasındaki metni kopyalayıp gizli değerine yapıştırın.

3. Adım: İş akışınızı ayarlama

Ardından, deponuzda Eylemler sekmesine gidin ve yeni bir iş akışı oluşturun. İş akışı şablonlarından biri yerine iş akışını kendiniz ayarlama seçeneğini belirleyin.

Aşağıdakileri iş akışı dosyanıza kopyalayıp yapıştırın ve ardından güncelleştirin...

  1. Solution_Name çözümünüzün adı için
  2. dotnet-version to 8.0.x (veya projenizin hedeflediği .NET sürüm)

Uyarı

Yapıtın karşıya yüklenmesi adımı için (aşağıdaki son adım), derleme çıktısı çözümünüzü içeren bir klasörde değilse, env.Solution_Namegithub.workspace ile değiştirin (GitHub Actions Çalışma Alanı klasörü).

# 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

4. Adım: İş akışını işleyin ve çalışmasını izleyin!

İş akışı dosyasını ana dalınıza işleyin ve gitHub deponuzdaki Eylemler sekmesine gidin ve iş akışınızın çalışmasını izleyin! Başarıyla çalışması ve derlenmiş MSIX uygulamanızı içeren yapıtlar üretmesi gerekir.

Komut satırından oluşturma

Çözümünüzü komut satırını veya başka bir CI sistemini kullanarak oluşturmak istiyorsanız, MSBuild'i bu bağımsız değişkenlerle çalıştırın. GenerateAppxPackageOnBuild özelliği MSIX paketinin oluşturulmasına neden olur.

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

1. Adım: İş akışınızı ayarlama

GitHub deponuzda Eylemler sekmesine gidin ve yeni bir iş akışı oluşturun. İş akışı şablonlarından biri yerine iş akışını kendiniz ayarlama seçeneğini belirleyin.

Aşağıdakileri iş akışı dosyanıza kopyalayıp yapıştırın ve ardından güncelleştirin...

  1. Solution_Name çözümünüzün adı için
  2. dotnet-version to 8.0.x (veya projenizin hedeflediği .NET sürüm)

Uyarı

Yapıtın karşıya yüklenmesi adımı için (aşağıdaki son adım), derleme çıktısı çözümünüzü içeren bir klasörde değilse, env.Solution_Namegithub.workspace ile değiştirin (GitHub Actions Çalışma Alanı klasörü).

# 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

2. Adım: İş akışını işleyin ve çalışmasını izleyin!

İş akışı dosyasını ana dalınıza işleyin ve gitHub deponuzdaki Eylemler sekmesine gidin ve iş akışınızın çalışmasını izleyin! Başarıyla çalışması ve yerleşik uygulamanızı içeren yapıtlar üretmesi gerekir.

Komut satırından oluşturma

Çözümünüzü komut satırını veya başka bir CI sistemini kullanarak oluşturmak istiyorsanız, MSBuild'i /t:Publish bağımsız değişkeniyle çalıştırın.

Azure Pipelines

Ekibiniz Azure DevOps kullanıyorsa, Azure Pipelines ile WinUI 3 uygulamaları oluşturabilirsiniz. Aşağıdaki YAML işlem hattı, bir Windows aracısı üzerinde paketlenmiş bir MSIX WinUI uygulaması oluşturur:

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'

Uyarı

Paketlenmemiş derlemeler için `/p:Appx*` MSBuild bağımsız değişkenlerini kaldırın ve `VSBuild` yerine `dotnet publish` kullanın. Ayrıntılar için yukarıdaki komut satırı bölümüne bakın.

MSIX paketlerini bir işlem hattında imzalamak için sertifikanızı güvenli dosyalar Azure Pipelines depolayın ve derleme sırasında erişmek için DownloadSecureFile görevini kullanın.

Important

İmzalama sertifikalarını veya parolalarını hiçbir zaman kaynak denetiminde depolamayın. Sertifika parolası için işlem hattı gizli değişkenlerini, sertifikanın kendisi içinse Azure Pipelines Secure Files özelliğini kullanın.