diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 1e1bce8..b68553a 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -14,8 +14,7 @@ name: "CodeQL" on: push: branches: [ "master", "dev" ] - pull_request: - branches: [ "master", "dev" ] + jobs: analyze: diff --git a/.github/workflows/publish-msstore.yml b/.github/workflows/publish-msstore.yml index 18049b1..6edb0c4 100644 --- a/.github/workflows/publish-msstore.yml +++ b/.github/workflows/publish-msstore.yml @@ -1,134 +1,117 @@ -name: Publish to Microsoft Store +name: Package for Microsoft Store on: workflow_dispatch: inputs: - release_notes: - description: 'Release notes for Store submission' - required: false - default: 'Updated version' + version: + description: 'Package version to publish (example: 2.1.0 or 2.1.0.0)' + required: true + +permissions: + contents: read + +concurrency: + group: publish-to-store + cancel-in-progress: false env: DOTNET_VERSION: 10.0.x CONFIGURATION: Release - STORE_PRODUCT_ID: 9NBLGGH4NNS1 STORE_APP_ID: ${{ secrets.STORE_APP_ID }} + PROJECT_PATH: ./src/uno/AzureKeyVaultStudio/AzureKeyVaultStudio.csproj jobs: - debug_store_access: - name: Debug Store credentials + prepare_version: + name: Prepare release version + runs-on: ubuntu-latest + outputs: + version: ${{ steps.version.outputs.value }} + + steps: + - name: Validate version + id: version + shell: pwsh + run: | + $versionInput = '${{ github.event.inputs.version }}' + $version = ($versionInput -replace '^v', '').Trim() + if ($version -notmatch '^\d+(?:\.\d+){2,3}$') { + throw "Version '$versionInput' is not in the expected format. Examples: 2.1.0 or 2.1.0.0." + } + $parts = $version.Split('.') + if ($parts.Length -eq 3) { + $version = "$($parts[0]).$($parts[1]).$($parts[2]).0" + } + echo "value=$version" >> $env:GITHUB_OUTPUT + + build_msix_packages: + name: Build MSIX package for (${{ matrix.platform }}) + needs: prepare_version runs-on: windows-latest + strategy: + matrix: + platform: [x64, x86, arm64] + timeout-minutes: 45 + steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 - - name: Configure Microsoft Store CLI - uses: microsoft/microsoft-store-apppublisher@v1.1 + - name: Setup .NET + uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 + with: + dotnet-version: ${{ env.DOTNET_VERSION }} - - name: Reconfigure store credentials + - name: Build MSIX package for ${{ matrix.platform }} shell: pwsh run: | - msstore reconfigure ` - --tenantId ${{ secrets.AZURE_AD_TENANT_ID }} ` - --sellerId ${{ secrets.SELLER_ID }} ` - --clientId ${{ secrets.AZURE_AD_APPLICATION_CLIENT_ID }} ` - --clientSecret ${{ secrets.AZURE_AD_APPLICATION_SECRET }} + $version = '${{ needs.prepare_version.outputs.version }}' + $packageRoot = Join-Path $env:GITHUB_WORKSPACE 'artifacts/store-bundle' + $platformDir = Join-Path $packageRoot '${{ matrix.platform }}' - - name: List all apps (find correct IDs) - shell: pwsh - run: | - Write-Host "--- Listing all apps visible to these credentials ---" - msstore apps list + New-Item -ItemType Directory -Force -Path $packageRoot | Out-Null + New-Item -ItemType Directory -Force -Path $platformDir | Out-Null - - name: Try getting product by Store ID - shell: pwsh - continue-on-error: true - run: | - Write-Host "--- Trying apps get with ProductId: ${{ env.STORE_PRODUCT_ID }} ---" - msstore apps get ${{ env.STORE_PRODUCT_ID }} --verbose + dotnet msbuild "${{ env.PROJECT_PATH }}" ` + /restore ` + /t:Build ` + /p:Configuration=Release ` + /p:TargetFramework=net10.0-windows10.0.26100 ` + /p:WindowsPackageType=MSIX ` + /p:GenerateAppxPackageOnBuild=true ` + /p:UapAppxPackageBuildMode=StoreUpload ` + /p:AppxBundle=Never ` + /p:Platform=${{ matrix.platform }} ` + /p:AppxPackageSigningEnabled=false ` + /p:AppxPackageDir="$platformDir\" ` + /p:Version=$version ` + /p:AppxManifestIdentityVersion=$version - - name: Print configured info - shell: pwsh - continue-on-error: true - run: | - msstore info + - name: Upload MSIX package artifact + uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a + with: + name: msix-${{ matrix.platform }} + path: artifacts/store-bundle/${{ matrix.platform }}/** + if-no-files-found: error - # build_and_publish: - # name: Build MSIX and Publish to Store + # publish_to_partner_center: + # name: Publish MSIX bundle to Partner Center + # needs: [prepare_version, build_msix_packages] # runs-on: windows-latest - # needs: debug_store_access + # timeout-minutes: 25 + # steps: # - name: Checkout repository - # uses: actions/checkout@v4 - # + # uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 + # - name: Setup .NET - # uses: actions/setup-dotnet@v4 + # uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # with: # dotnet-version: ${{ env.DOTNET_VERSION }} - # - # - name: Restore workloads - # run: dotnet workload restore - # - # - name: Restore NuGet packages - # run: dotnet restore ./AzureKeyVaultStudio/AzureKeyVaultStudio.csproj - # - # - name: Build MSIX for x64 - # shell: pwsh - # run: | - # dotnet publish ./AzureKeyVaultStudio/AzureKeyVaultStudio.csproj ` - # -f net10.0-windows10.0.26100 ` - # -r win-x64 ` - # -c ${{ env.CONFIGURATION }} ` - # -p:WindowsPackageType=MSIX ` - # -p:GenerateAppxPackageOnBuild=true ` - # -p:UapAppxPackageBuildMode=StoreUpload ` - # -p:AppxPackageSigningEnabled=false ` - # -p:AppxBundle=Never ` - # -p:AppxPackageDir="${{ github.workspace }}\AzureKeyVaultStudio\artifacts\win-x64\" ` - # -p:SelfContained=true ` - # -p:PublishReadyToRun=true ` - # -p:PublishTrimmed=false ` - # -p:Version=2.0.${{ github.run_number }} - # - # - name: Build MSIX for ARM64 - # shell: pwsh - # run: | - # dotnet publish ./AzureKeyVaultStudio/AzureKeyVaultStudio.csproj ` - # -f net10.0-windows10.0.26100 ` - # -r win-arm64 ` - # -c ${{ env.CONFIGURATION }} ` - # -p:Platform=arm64 ` - # -p:WindowsPackageType=MSIX ` - # -p:GenerateAppxPackageOnBuild=true ` - # -p:UapAppxPackageBuildMode=StoreUpload ` - # -p:AppxPackageSigningEnabled=false ` - # -p:AppxBundle=Never ` - # -p:AppxPackageDir="${{ github.workspace }}\AzureKeyVaultStudio\artifacts\win-arm64\" ` - # -p:SelfContained=true ` - # -p:PublishReadyToRun=true ` - # -p:PublishTrimmed=false ` - # -p:Version=2.0.${{ github.run_number }} - # - # - name: Locate Store packages - # shell: pwsh - # run: | - # $packageRoot = "${{ github.workspace }}\AzureKeyVaultStudio\artifacts" - # $patterns = @("*.msix", "*.msixupload", "*.msixbundle", "*.appxbundle") - # $packages = foreach ($pattern in $patterns) { - # Get-ChildItem -Recurse -Filter $pattern -Path $packageRoot -ErrorAction SilentlyContinue - # } - # if (-not $packages) { - # Write-Error "No Store package files found!" - # exit 1 - # } - # foreach ($file in $packages) { - # Write-Host "Found: $($file.FullName)" - # } - # + # - name: Configure Microsoft Store CLI - # uses: microsoft/microsoft-store-apppublisher@v1.1 - # - # - name: Reconfigure store credentials + # uses: microsoft/microsoft-store-apppublisher@b76227f539d68e6465f79bbbc82ed92f61081aa4 + + # - name: Reconfigure Store credentials # shell: pwsh # run: | # msstore reconfigure ` @@ -136,47 +119,68 @@ jobs: # --sellerId ${{ secrets.SELLER_ID }} ` # --clientId ${{ secrets.AZURE_AD_APPLICATION_CLIENT_ID }} ` # --clientSecret ${{ secrets.AZURE_AD_APPLICATION_SECRET }} - # - # - name: Publish x64 MSIX to Store + + # - name: Download MSIX artifacts + # uses: actions/download-artifact@v4 + # with: + # pattern: msix-* + # path: artifacts/store-bundle/downloaded + # merge-multiple: false + + # - name: Collect MSIX files for bundling # shell: pwsh # run: | - # $outputRoot = "${{ github.workspace }}\AzureKeyVaultStudio\artifacts\win-x64" - # $patterns = @("*.msix", "*.msixupload", "*.msixbundle", "*.appxbundle") - # $packageFile = @( - # foreach ($pattern in $patterns) { - # Get-ChildItem -Recurse -Filter $pattern -Path $outputRoot -ErrorAction SilentlyContinue | Select-Object -First 1 - # } - # ) | Where-Object { $_ } | Select-Object -First 1 - # if (-not $packageFile) { - # Write-Error "Could not find x64 Store package" - # exit 1 + # $packageRoot = Join-Path $env:GITHUB_WORKSPACE 'artifacts/store-bundle' + # $bundleSource = Join-Path $packageRoot 'msix-source' + # $downloadRoot = Join-Path $packageRoot 'downloaded' + # New-Item -ItemType Directory -Force -Path $bundleSource | Out-Null + + # $msixFiles = Get-ChildItem -Path $downloadRoot -Recurse -File -Filter *.msix -ErrorAction SilentlyContinue + + # if (-not $msixFiles) { + # throw "No .msix files were found under $downloadRoot" # } - # msstore publish "$($packageFile.FullName)" ` - # -id ${{ env.STORE_APP_ID }} - # - # - name: Publish ARM64 MSIX to Store + + # $msixFiles | Copy-Item -Destination $bundleSource -Force + + # Write-Host "Collected MSIX files for bundling:" + # Write-Host "*******************************************************" + # Get-ChildItem -Path $bundleSource -File -Filter *.msix | ForEach-Object { Write-Host " - $($_.FullName)" } + # Write-Host "*******************************************************" + + # - name: Bundle MSIX packages into a single msixbundle + # id: bundler + # uses: LanceMcCarthy/Action-MsixBundler@77c9b8fdbc620b6e42c26f4c4252321cf24fda18 + # with: + # msix-folder: ${{ github.workspace }}\artifacts\store-bundle\msix-source + # msixbundle-filepath: ${{ github.workspace }}\artifacts\store-bundle\bundle\AzureKeyVaultStudio_${{ needs.prepare_version.outputs.version }}_x86_x64_arm64.msixbundle + # msixbundle-version: ${{ needs.prepare_version.outputs.version }} + + + # - name: Upload msixbundle to the Microsoft Store (no certification) # shell: pwsh # run: | - # $outputRoot = "${{ github.workspace }}\AzureKeyVaultStudio\artifacts\win-arm64" - # $patterns = @("*.msix", "*.msixupload", "*.msixbundle", "*.appxbundle") - # $packageFile = @( - # foreach ($pattern in $patterns) { - # Get-ChildItem -Recurse -Filter $pattern -Path $outputRoot -ErrorAction SilentlyContinue | Select-Object -First 1 - # } - # ) | Where-Object { $_ } | Select-Object -First 1 - # if (-not $packageFile) { - # Write-Error "Could not find ARM64 Store package" - # exit 1 + # $path_to_my_msix_bundle = "${{steps.bundler.outputs.msixbundle_path}}".Trim() + # $inputDirectory = (Split-Path -Path $path_to_my_msix_bundle -Parent).Trim() + # Write-Output "msixbundle path: '$path_to_my_msix_bundle'" + # Write-Output "input directory: '$inputDirectory'" + + # msstore publish $path_to_my_msix_bundle ` + # --appId ${{ env.STORE_APP_ID }} ` + # --inputDirectory $inputDirectory ` + # --noCommit ` + # --verbose + + # if ($LASTEXITCODE -ne 0) { + # Write-Host $Error[0] + # throw "msstore publish failed with exit code $LASTEXITCODE" # } - # msstore publish "$($packageFile.FullName)" ` - # -id ${{ env.STORE_APP_ID }} - # - # - name: Upload artifacts + + # - name: Upload package artifacts # if: always() - # continue-on-error: true - # uses: actions/upload-artifact@v4 + # uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # with: - # name: store-packages + # name: store-package # path: | - # AzureKeyVaultStudio\artifacts\**\*.msix - # AzureKeyVaultStudio\artifacts\**\*.msixupload + # artifacts/** + diff --git a/.github/workflows/uno-dotnet.yml b/.github/workflows/uno-dotnet.yml index 92afde1..6bd2b9c 100644 --- a/.github/workflows/uno-dotnet.yml +++ b/.github/workflows/uno-dotnet.yml @@ -1,14 +1,18 @@ -name: Build and Release +name: Release Azure Key Vault Explorer + on: - workflow_dispatch: push: branches: - master - - + workflow_dispatch: + inputs: + run_release: + type: boolean + description: Run Release true or false + pull_request: - types: [opened, synchronize, reopened] + types: [opened] branches: - master @@ -46,12 +50,12 @@ jobs: Move-Item -Path ".\bin\Release\net10.0-windows10.0.26100\win-x64\publish\*.exe" -Destination "$env:GITHUB_WORKSPACE\win-x64\" -Force - name: Create Package shell: pwsh - run: tar -cvf azurekeyvaultstudio.win-x64.tar win-x64 + run: Compress-Archive -Path "win-x64/*" -DestinationPath "azurekeyvaultstudio.win-x64.zip" -Force - name: Upload Artifact uses: actions/upload-artifact@v4 with: - name: azurekeyvaultstudio.win-x64.tar - path: azurekeyvaultstudio.win-x64.tar + name: azurekeyvaultstudio.win-x64.zip + path: azurekeyvaultstudio.win-x64.zip build_windows_arm64: name: Build Windows ARM64 @@ -77,15 +81,15 @@ jobs: Move-Item -Path ".\bin\Release\net10.0-windows10.0.26100\win-arm64\publish\*.exe" -Destination "$env:GITHUB_WORKSPACE\win-arm64\" -Force - name: Create Package shell: pwsh - run: tar -cvf azurekeyvaultstudio.win-arm64.tar win-arm64 + run: Compress-Archive -Path "win-arm64/*" -DestinationPath "azurekeyvaultstudio.win-arm64.zip" -Force - name: Upload Artifact uses: actions/upload-artifact@v4 with: - name: azurekeyvaultstudio.win-arm64.tar - path: azurekeyvaultstudio.win-arm64.tar + name: azurekeyvaultstudio.win-arm64.zip + path: azurekeyvaultstudio.win-arm64.zip build_macos_x64: - name: Build macOS + name: Build macOS x64 (untested) runs-on: macos-latest steps: - uses: actions/checkout@v4 @@ -109,12 +113,15 @@ jobs: Move-Item -Path "./bin/Release/net10.0-desktop/osx-x64/publish/*.app" -Destination "$env:GITHUB_WORKSPACE/osx-x64/" -Force - name: Create Package shell: pwsh - run: tar -cvf azurekeyvaultstudio.macos-x64.tar osx-x64 + run: | + $appBundle = Get-ChildItem -Path "$env:GITHUB_WORKSPACE/osx-x64" -Filter "*.app" | Select-Object -First 1 + if (-not $appBundle) { Get-ChildItem -recurse; throw "No macOS app bundle was found for packaging." } + ditto -c -k --sequesterRsrc --keepParent "$($appBundle.FullName)" "$env:GITHUB_WORKSPACE/azurekeyvaultstudio.macos-x64.zip" - name: Upload Artifact uses: actions/upload-artifact@v4 with: - name: azurekeyvaultstudio.macos-x64.tar - path: azurekeyvaultstudio.macos-x64.tar + name: azurekeyvaultstudio.macos-x64.zip + path: azurekeyvaultstudio.macos-x64.zip build_macos_arm64: name: Build macOS ARM64 @@ -141,12 +148,15 @@ jobs: Move-Item -Path "./bin/Release/net10.0-desktop/osx-arm64/publish/*.app" -Destination "$env:GITHUB_WORKSPACE/osx-arm64/" -Force - name: Create Package shell: pwsh - run: tar -cvf azurekeyvaultstudio.macos-arm64.tar osx-arm64 + run: | + $appBundle = Get-ChildItem -Path "$env:GITHUB_WORKSPACE/osx-arm64" -Filter "*.app" | Select-Object -First 1 + if (-not $appBundle) { Get-ChildItem -recurse; throw "No macOS app bundle was found for packaging." } + ditto -c -k --sequesterRsrc --keepParent "$($appBundle.FullName)" "$env:GITHUB_WORKSPACE/azurekeyvaultstudio.macos-arm64.zip" - name: Upload Artifact uses: actions/upload-artifact@v4 with: - name: azurekeyvaultstudio.macos-arm64.tar - path: azurekeyvaultstudio.macos-arm64.tar + name: azurekeyvaultstudio.macos-arm64.zip + path: azurekeyvaultstudio.macos-arm64.zip build_linux: name: Build Linux @@ -184,7 +194,7 @@ jobs: name: Release Packages needs: [build_windows_x64, build_windows_arm64, build_macos_x64, build_macos_arm64, build_linux] runs-on: ubuntu-latest - if: github.ref == 'refs/heads/master' + if: github.ref == 'refs/heads/master' || github.event.inputs.run_release == 'true' steps: - uses: actions/checkout@v4 - name: Download all artifacts @@ -194,10 +204,35 @@ jobs: - name: List artifacts shell: pwsh run: Get-ChildItem -Recurse + - name: Generate checksums for Cask + shell: bash + run: | + sha256sum \ + "./azurekeyvaultstudio.win-x64.zip/azurekeyvaultstudio.win-x64.zip" \ + "./azurekeyvaultstudio.win-arm64.zip/azurekeyvaultstudio.win-arm64.zip" \ + "./azurekeyvaultstudio.macos-x64.zip/azurekeyvaultstudio.macos-x64.zip" \ + "./azurekeyvaultstudio.macos-arm64.zip/azurekeyvaultstudio.macos-arm64.zip" \ + "./azurekeyvaultstudio.linux-x64.tar/azurekeyvaultstudio.linux-x64.tar" > SHA256SUMS.txt - name: Create Release run: | - gh release create v${{ env.APP_VERSION_NUMBER }} --draft --title "Azure Key Vault v${{ env.APP_VERSION_NUMBER }}" || true - gh release upload v${{ env.APP_VERSION_NUMBER }} "./azurekeyvaultstudio.win-x64.tar/azurekeyvaultstudio.win-x64.tar" "./azurekeyvaultstudio.win-arm64.tar/azurekeyvaultstudio.win-arm64.tar" "./azurekeyvaultstudio.macos-x64.tar/azurekeyvaultstudio.macos-x64.tar" "./azurekeyvaultstudio.macos-arm64.tar/azurekeyvaultstudio.macos-arm64.tar" "./azurekeyvaultstudio.linux-x64.tar/azurekeyvaultstudio.linux-x64.tar" --clobber || true + cat > RELEASE_NOTES.md <<'EOF' + Notes: + - macOS x64 build is untested + + ### SHA256 Hashes of the release artifacts: + ```text + EOF + cat ./SHA256SUMS.txt >> RELEASE_NOTES.md + echo '```' >> RELEASE_NOTES.md + gh release create v${{ env.APP_VERSION_NUMBER }} --draft --title "Azure Key Vault Explorer v${{ env.APP_VERSION_NUMBER }}" --notes-file RELEASE_NOTES.md || true + gh release upload v${{ env.APP_VERSION_NUMBER }} \ + "./azurekeyvaultstudio.win-x64.zip/azurekeyvaultstudio.win-x64.zip" \ + "./azurekeyvaultstudio.win-arm64.zip/azurekeyvaultstudio.win-arm64.zip" \ + "./azurekeyvaultstudio.macos-x64.zip/azurekeyvaultstudio.macos-x64.zip" \ + "./azurekeyvaultstudio.macos-arm64.zip/azurekeyvaultstudio.macos-arm64.zip" \ + "./azurekeyvaultstudio.linux-x64.tar/azurekeyvaultstudio.linux-x64.tar" \ + "./SHA256SUMS.txt" \ + --clobber || true env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} shell: bash diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..a0f64a4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "github-actions.workflows.pinned.workflows": [ + ".github/workflows/publish-msstore.yml", + ".github/workflows/uno-dotnet.yml" + ] +} \ No newline at end of file diff --git a/src/uno/AzureKeyVaultStudio/msbuild.ps1 b/src/uno/AzureKeyVaultStudio/msbuild.ps1 index 8073a84..1823af2 100644 --- a/src/uno/AzureKeyVaultStudio/msbuild.ps1 +++ b/src/uno/AzureKeyVaultStudio/msbuild.ps1 @@ -1,16 +1,11 @@ param( - [string]$BuildNumber = '2.1.1.0' + [string]$BuildNumber = '2.1.1.0', + [string]$OutputPath = 'C:\temp\output' ) -msbuild .\AzureKeyVaultStudio.csproj /t:Restore,Build /r /p:TargetFramework='net10.0-windows10.0.26100' /p:Configuration=Release /p:Platform=x64 /p:GenerateAppxPackageOnBuild=true /p:AppxBundle=Never /p:UapAppxPackageBuildMode=StoreUpload /p:AppxManifestIdentityVersion=$BuildNumber /p:AppxPackageDir="C:\temp\output\$BuildNumber"; +msbuild .\AzureKeyVaultStudio.csproj /t:Restore,Build /r /p:TargetFramework='net10.0-windows10.0.26100' /p:Configuration=Release /p:Platform=x64 /p:GenerateAppxPackageOnBuild=true /p:AppxBundle=Never /p:UapAppxPackageBuildMode=StoreUpload /p:AppxManifestIdentityVersion=$BuildNumber /p:AppxPackageDir="$OutputPath\$BuildNumber"; -return +msbuild .\AzureKeyVaultStudio.csproj /t:Restore,Build /r /p:TargetFramework='net10.0-windows10.0.26100' /p:Configuration=Release /p:Platform=x86 /p:GenerateAppxPackageOnBuild=true /p:AppxBundle=Never /p:UapAppxPackageBuildMode=StoreUpload /p:AppxManifestIdentityVersion=$BuildNumber /p:AppxPackageDir="$OutputPath\$BuildNumber"; -msbuild .\AzureKeyVaultStudio.csproj /t:Restore,Build /r /p:TargetFramework='net10.0-windows10.0.26100' /p:Configuration=Release /p:Platform=x86 /p:GenerateAppxPackageOnBuild=true /p:AppxBundle=Never /p:UapAppxPackageBuildMode=StoreUpload /p:AppxManifestIdentityVersion=$BuildNumber /p:AppxPackageDir="C:\temp\output\$BuildNumber"; - - - - - -msbuild .\AzureKeyVaultStudio.csproj /t:Restore,Build /r /p:TargetFramework='net10.0-windows10.0.26100' /p:Configuration=Release /p:Platform=arm64 /p:GenerateAppxPackageOnBuild=true /p:AppxBundle=Never /p:UapAppxPackageBuildMode=StoreUpload /p:AppxManifestIdentityVersion=$BuildNumber /p:AppxPackageDir="C:\temp\output\$BuildNumber"; +msbuild .\AzureKeyVaultStudio.csproj /t:Restore,Build /r /p:TargetFramework='net10.0-windows10.0.26100' /p:Configuration=Release /p:Platform=arm64 /p:GenerateAppxPackageOnBuild=true /p:AppxBundle=Never /p:UapAppxPackageBuildMode=StoreUpload /p:AppxManifestIdentityVersion=$BuildNumber /p:AppxPackageDir="$OutputPath\$BuildNumber";