name: Build Windows run-name: 构建Win流程 on: push: branches: - main - dev pull_request: branches: - main - dev jobs: # 先编译 libcore build-libcore: name: 编译 libcore (Windows) runs-on: client-server container: image: node:20 strategy: matrix: # 只有node支持版本号别名 node: ['20.15.1'] steps: - name: 📥 Checkout 代码 uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: 🔧 设置 Go 环境 uses: actions/setup-go@v5 with: go-version: '1.23' cache: true cache-dependency-path: libcore/go.sum - name: 🔧 安装 MinGW run: | # 在 GitHub 托管 runner(有 sudo)与 act/自托管容器(无 sudo)均可运行 if command -v sudo >/dev/null 2>&1; then sudo apt-get update sudo apt-get install -y mingw-w64 else echo "sudo 不存在,按 root 用户直接执行 apt-get" export DEBIAN_FRONTEND=noninteractive apt-get update || apt update apt-get install -y mingw-w64 || apt install -y mingw-w64 fi - name: 📦 编译 libcore.dll working-directory: libcore run: | echo "🚀 开始编译 Windows libcore..." make windows-amd64 if [ -f "bin/libcore.dll" ] && [ -f "bin/HiddifyCli.exe" ]; then echo "✅ Windows libcore 编译成功" ls -lh bin/ else echo "❌ Windows libcore 编译失败" exit 1 fi - name: 📤 上传 Windows libcore uses: actions/upload-artifact@v3 with: name: libcore-windows path: | libcore/bin/libcore.dll libcore/bin/HiddifyCli.exe libcore/bin/webui/** retention-days: 7 # 构建 Windows 应用 build: runs-on: windows-latest needs: build-libcore steps: - name: 🔧 Add Git to PATH (Windows) if: ${{ runner.os == 'Windows' }} shell: powershell run: | $paths = @( 'C:\Program Files\Git\cmd', 'C:\Program Files\Git\bin', 'C:\Program Files (x86)\Git\cmd', 'C:\Program Files (x86)\Git\bin' ) foreach ($p in $paths) { if (Test-Path $p) { Add-Content -Path $env:GITHUB_PATH -Value $p $env:PATH = "$p;$env:PATH" Write-Host ("Added to PATH: {0}" -f $p) } } $candidates = @( 'C:\Program Files\Git\cmd\git.exe', 'C:\Program Files\Git\bin\git.exe', 'C:\Program Files (x86)\Git\cmd\git.exe', 'C:\Program Files (x86)\Git\bin\git.exe' ) $found = $false foreach ($g in $candidates) { if (Test-Path $g) { & $g --version $found = $true break } } if (-not $found) { Write-Host "Git executable not found in common locations; continuing." } - name: 📥 Checkout 代码 uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: 📥 下载 libcore uses: actions/download-artifact@v3 with: name: libcore-windows path: . - name: 🔧 复制 libcore 文件到正确位置并重命名 shell: cmd run: call copy_libcore.bat - name: 🔍 Verify jq Installation (ACT) shell: powershell run: | # Check if jq is available $jqFound = $false try { $version = jq --version 2>&1 if ($version -match 'jq-[\d\.]+') { Write-Host "jq is already installed: $version" $jqFound = $true } } catch { Write-Host "jq not installed or not in PATH" } if (-not $jqFound) { Write-Host "Preparing to install jq..." # Check if Chocolatey is available $chocoFound = $false try { choco --version 2>&1 | Out-Null $chocoFound = $true } catch {} if (-not $chocoFound) { Write-Host "Installing Chocolatey..." Set-ExecutionPolicy Bypass -Scope Process -Force [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) # Refresh PATH $env:PATH = [System.Environment]::GetEnvironmentVariable('PATH', 'Machine') + ';' + [System.Environment]::GetEnvironmentVariable('PATH', 'User') Write-Host "Chocolatey installed successfully" } Write-Host "Installing jq using Chocolatey..." choco install jq -y if ($LASTEXITCODE -eq 0) { Write-Host "jq installed successfully" # Verify again $version = jq --version 2>&1 Write-Host "jq version: $version" } else { Write-Host "jq installation failed, exit code: $LASTEXITCODE" exit 1 } } - name: Add jq to PATH shell: powershell run: | $jqPath = "C:\ProgramData\chocolatey\bin" if (Test-Path $jqPath) { Add-Content -Path $env:GITHUB_PATH -Value $jqPath $env:PATH = "$jqPath;$env:PATH" Write-Host "Added jq path to GITHUB_PATH and current PATH" } else { Write-Host "jq installation path not found" exit 1 } - name: Setup Flutter 3.24.3 uses: subosito/flutter-action@v2 with: flutter-version: '3.24.3' channel: 'stable' - name: Enable Windows desktop run: flutter config --enable-windows-desktop - name: Get dependencies run: flutter pub get - name: Generate code run: dart run build_runner build --delete-conflicting-outputs - name: Build Windows Debug run: flutter build windows - name: Build Windows Release run: flutter build windows --release - name: Upload Debug build artifacts uses: actions/upload-artifact@v3 with: name: windows-debug-build path: build/windows/runner/Debug/ - name: Upload Release build artifacts uses: actions/upload-artifact@v3 with: name: windows-release-build path: build/windows/runner/Release/ # 本地(act)验证作业:只验证 Git PATH 与 checkout/submodules build-act-windows: name: ACT Windows Checkout Verification if: ${{ env.ACT == 'true' }} runs-on: windows-latest steps: - name: Add Git to PATH (Windows) shell: powershell run: | $paths = @( 'C:\Program Files\Git\cmd', 'C:\Program Files\Git\bin', 'C:\Program Files (x86)\Git\cmd', 'C:\Program Files (x86)\Git\bin' ) foreach ($p in $paths) { if (Test-Path $p) { Add-Content -Path $env:GITHUB_PATH -Value $p $env:PATH = "$p;$env:PATH" Write-Host ("Added to PATH: {0}" -f $p) } } $candidates = @( 'C:\Program Files\Git\cmd\git.exe', 'C:\Program Files\Git\bin\git.exe', 'C:\Program Files (x86)\Git\cmd\git.exe', 'C:\Program Files (x86)\Git\bin\git.exe' ) $found = $false foreach ($g in $candidates) { if (Test-Path $g) { & $g --version $found = $true break } } if (-not $found) { Write-Host "Git executable not found in common locations; continuing." } - name: Checkout uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 persist-credentials: false # 仅用于本地 act 验证:目录级稀疏检出,避免包含 Windows 非法文件 sparse-checkout: | .github lib libcore android ios windows assets/core assets/fonts assets/translations sparse-checkout-cone: true - name: Setup Flutter uses: subosito/flutter-action@v2 with: flutter-version: '3.35.5' channel: 'stable' - name: Enable Windows desktop run: flutter config --enable-windows-desktop - name: 🔍 Verify jq Installation (ACT) shell: powershell run: | # Check if jq is available $jqFound = $false try { $version = jq --version 2>&1 if ($version -match 'jq-[\d\.]+') { Write-Host "jq is already installed: $version" $jqFound = $true } } catch { Write-Host "jq not installed or not in PATH" } if (-not $jqFound) { Write-Host "Preparing to install jq..." # Check if Chocolatey is available $chocoFound = $false try { choco --version 2>&1 | Out-Null $chocoFound = $true } catch {} if (-not $chocoFound) { Write-Host "Installing Chocolatey..." Set-ExecutionPolicy Bypass -Scope Process -Force [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) # Refresh PATH $env:PATH = [System.Environment]::GetEnvironmentVariable('PATH', 'Machine') + ';' + [System.Environment]::GetEnvironmentVariable('PATH', 'User') Write-Host "Chocolatey installed successfully" } Write-Host "Installing jq using Chocolatey..." choco install jq -y if ($LASTEXITCODE -eq 0) { Write-Host "jq installed successfully" # Verify again $version = jq --version 2>&1 Write-Host "jq version: $version" } else { Write-Host "jq installation failed, exit code: $LASTEXITCODE" exit 1 } } - name: Verify submodules shell: powershell continue-on-error: true run: | git --version git submodule status Write-Host "Submodules verified (status printed above)." - name: Summary shell: powershell run: | Write-Host "ACT Windows verification completed successfully."