|
| 1 | +name: Build MSIX Installer |
| 2 | + |
| 3 | +# 触发条件: |
| 4 | +# - 推送到 main / copilot/** 分支时自动构建 |
| 5 | +# - 向 main 分支发起 PR 时自动构建 |
| 6 | +# - 支持在 Actions 页面手动触发 |
| 7 | +on: |
| 8 | + push: |
| 9 | + branches: |
| 10 | + - main |
| 11 | + - 'copilot/**' |
| 12 | + pull_request: |
| 13 | + branches: |
| 14 | + - main |
| 15 | + workflow_dispatch: |
| 16 | + |
| 17 | +env: |
| 18 | + CONFIGURATION: Release |
| 19 | + PLATFORM: x64 |
| 20 | + # MSIX 输出目录(相对于仓库根目录) |
| 21 | + APPX_DIR: AppPackages |
| 22 | + |
| 23 | +jobs: |
| 24 | + build: |
| 25 | + name: Build & Package (Windows x64) |
| 26 | + runs-on: windows-latest |
| 27 | + |
| 28 | + steps: |
| 29 | + # ── 1. 检出代码 ────────────────────────────────────────────────────────── |
| 30 | + - name: Checkout repository |
| 31 | + uses: actions/checkout@v4 |
| 32 | + |
| 33 | + # ── 2. 配置 .NET 8 SDK ─────────────────────────────────────────────────── |
| 34 | + - name: Setup .NET SDK 8.0 |
| 35 | + uses: actions/setup-dotnet@v4 |
| 36 | + with: |
| 37 | + dotnet-version: '8.0.x' |
| 38 | + |
| 39 | + # ── 3. 配置 MSBuild (Visual Studio 2022) ───────────────────────────────── |
| 40 | + - name: Setup MSBuild |
| 41 | + uses: microsoft/setup-msbuild@v2 |
| 42 | + |
| 43 | + # ── 4. 还原 NuGet 包 ────────────────────────────────────────────────────── |
| 44 | + - name: Restore NuGet packages |
| 45 | + run: dotnet restore RunOnce/RunOnce.csproj -p:Platform=${{ env.PLATFORM }} |
| 46 | + |
| 47 | + # ── 5. 编译 C++ ShellExt.dll ────────────────────────────────────────────── |
| 48 | + - name: Build ShellExt (C++ DLL, Release|x64) |
| 49 | + run: > |
| 50 | + msbuild ShellExt/ShellExt.vcxproj |
| 51 | + /p:Configuration=${{ env.CONFIGURATION }} |
| 52 | + /p:Platform=${{ env.PLATFORM }} |
| 53 | + /m /nologo /verbosity:minimal |
| 54 | +
|
| 55 | + # ── 6. 生成自签名证书(主题必须与 Package.appxmanifest 中 Publisher 完全一致)─ |
| 56 | + - name: Generate self-signed signing certificate |
| 57 | + shell: pwsh |
| 58 | + run: | |
| 59 | + $publisher = "CN=28B58DEE-3276-4667-848D-FC06656EFB1D" |
| 60 | + $cert = New-SelfSignedCertificate ` |
| 61 | + -Type Custom ` |
| 62 | + -Subject $publisher ` |
| 63 | + -KeyUsage DigitalSignature ` |
| 64 | + -FriendlyName "RunOnce Self-Signed" ` |
| 65 | + -CertStoreLocation "Cert:\CurrentUser\My" ` |
| 66 | + -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.3", "2.5.29.19={text}") |
| 67 | +
|
| 68 | + # 导出 PFX(供 MSBuild 签名使用) |
| 69 | + $pfxPassword = ConvertTo-SecureString -String "RunOnce-CI" -Force -AsPlainText |
| 70 | + Export-PfxCertificate ` |
| 71 | + -Cert "Cert:\CurrentUser\My\$($cert.Thumbprint)" ` |
| 72 | + -FilePath RunOnce/RunOnce_TemporaryKey.pfx ` |
| 73 | + -Password $pfxPassword |
| 74 | +
|
| 75 | + # 导出 .cer(供用户在安装前信任证书使用) |
| 76 | + Export-Certificate ` |
| 77 | + -Cert "Cert:\CurrentUser\My\$($cert.Thumbprint)" ` |
| 78 | + -FilePath RunOnce_SideloadCert.cer ` |
| 79 | + -Type CERT |
| 80 | +
|
| 81 | + Write-Host "Certificate thumbprint: $($cert.Thumbprint)" |
| 82 | +
|
| 83 | + # ── 7. 编译并打包 MSIX ──────────────────────────────────────────────────── |
| 84 | + - name: Build and Package MSIX |
| 85 | + shell: pwsh |
| 86 | + run: | |
| 87 | + $pfxPath = Join-Path $env:GITHUB_WORKSPACE "RunOnce/RunOnce_TemporaryKey.pfx" |
| 88 | + msbuild RunOnce/RunOnce.csproj ` |
| 89 | + /p:Configuration=${{ env.CONFIGURATION }} ` |
| 90 | + /p:Platform=${{ env.PLATFORM }} ` |
| 91 | + /p:GenerateAppxPackageOnBuild=True ` |
| 92 | + /p:AppxPackageSigningEnabled=True ` |
| 93 | + /p:GenerateTemporaryStoreCertificate=False ` |
| 94 | + /p:PackageCertificateKeyFile="$pfxPath" ` |
| 95 | + /p:PackageCertificatePassword="RunOnce-CI" ` |
| 96 | + /p:AppxBundle=Never ` |
| 97 | + /p:UapAppxPackageBuildMode=SideloadOnly ` |
| 98 | + /p:AppxPackageDir="$env:GITHUB_WORKSPACE\${{ env.APPX_DIR }}\" ` |
| 99 | + /p:GenerateTestArtifacts=True ` |
| 100 | + /m /nologo /verbosity:minimal |
| 101 | +
|
| 102 | + # ── 8. 校验并列出构建产物(防止上传缺少 .msix 的空包)────────────────────── |
| 103 | + - name: Validate and list package artifacts |
| 104 | + shell: pwsh |
| 105 | + run: | |
| 106 | + $appxDir = "${{ env.APPX_DIR }}" |
| 107 | + Write-Host "=== AppPackages ===" |
| 108 | + Get-ChildItem -Recurse $appxDir -ErrorAction SilentlyContinue | Select-Object -ExpandProperty FullName |
| 109 | + $msixFiles = Get-ChildItem -Recurse $appxDir -Filter *.msix -File -ErrorAction SilentlyContinue |
| 110 | + if (-not $msixFiles) { |
| 111 | + Write-Error "No .msix file found under $appxDir. Packaging did not produce an installer." |
| 112 | + exit 1 |
| 113 | + } |
| 114 | +
|
| 115 | + # ── 9. 写入安装说明 ─────────────────────────────────────────────────────── |
| 116 | + - name: Write install instructions |
| 117 | + shell: pwsh |
| 118 | + run: | |
| 119 | + $content = @" |
| 120 | + # RunOnce 安装说明 |
| 121 | +
|
| 122 | + ## 安装前提 |
| 123 | + RunOnce 以旁加载 (Sideload) 方式分发,安装前需先信任签名证书。 |
| 124 | +
|
| 125 | + ## 安装步骤 |
| 126 | +
|
| 127 | + ### 方法一:使用安装脚本(推荐) |
| 128 | + 1. 以**管理员**身份打开 PowerShell |
| 129 | + 2. 进入下载并解压后的文件夹 |
| 130 | + 3. 运行: |
| 131 | + \`\`\`powershell |
| 132 | + Set-ExecutionPolicy Bypass -Scope Process |
| 133 | + .\Add-AppDevPackage.ps1 |
| 134 | + \`\`\` |
| 135 | + 脚本会自动安装证书并完成应用安装。 |
| 136 | +
|
| 137 | + ### 方法二:手动安装 |
| 138 | + 1. 双击 **RunOnce_SideloadCert.cer** |
| 139 | + 2. 选择「安装证书」→「本地计算机」→「受信任的根证书颁发机构」→ 完成 |
| 140 | + 3. 双击 **.msix** 文件,按提示完成安装 |
| 141 | +
|
| 142 | + ## 系统要求 |
| 143 | + - Windows 11(版本 22000 或更高) |
| 144 | + - 已安装 [Windows App Runtime](https://aka.ms/windowsappsdk) 1.8+ |
| 145 | + "@ |
| 146 | + $content | Out-File -FilePath INSTALL.md -Encoding utf8 |
| 147 | +
|
| 148 | + # ── 10. 上传构建产物 ────────────────────────────────────────────────────── |
| 149 | + - name: Upload MSIX artifact |
| 150 | + uses: actions/upload-artifact@v4 |
| 151 | + with: |
| 152 | + name: RunOnce-MSIX-${{ env.CONFIGURATION }}-${{ env.PLATFORM }} |
| 153 | + path: | |
| 154 | + ${{ env.APPX_DIR }}/**/*.msix |
| 155 | + ${{ env.APPX_DIR }}/**/*.ps1 |
| 156 | + RunOnce_SideloadCert.cer |
| 157 | + INSTALL.md |
| 158 | + if-no-files-found: error |
| 159 | + retention-days: 30 |
0 commit comments