321 lines
11 KiB
YAML
321 lines
11 KiB
YAML
name: Build Windows
|
||
|
||
on:
|
||
push:
|
||
branches:
|
||
- main
|
||
- develop
|
||
tags:
|
||
- 'v*'
|
||
pull_request:
|
||
branches:
|
||
- main
|
||
workflow_dispatch:
|
||
inputs:
|
||
build_type:
|
||
description: '构建类型'
|
||
required: true
|
||
default: 'release'
|
||
type: choice
|
||
options:
|
||
- debug
|
||
- release
|
||
api_domain:
|
||
description: 'API 域名'
|
||
required: true
|
||
default: 'api.maodag.top'
|
||
type: string
|
||
oss_url_1:
|
||
description: 'OSS 配置地址 1'
|
||
required: true
|
||
default: 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt'
|
||
type: string
|
||
oss_url_2:
|
||
description: 'OSS 配置地址 2'
|
||
required: true
|
||
default: 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt'
|
||
type: string
|
||
oss_url_3:
|
||
description: 'OSS 配置地址 3'
|
||
required: true
|
||
default: 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt'
|
||
type: string
|
||
oss_url_4:
|
||
description: 'OSS 配置地址 4'
|
||
required: true
|
||
default: 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt'
|
||
type: string
|
||
encryption_key:
|
||
description: '加密密钥'
|
||
required: true
|
||
default: 'c0qhq99a-nq8h-ropg-wrlc-ezj4dlkxqpzx'
|
||
type: string
|
||
|
||
jobs:
|
||
# ==================== 编译 libcore (Windows) ====================
|
||
build-libcore-windows:
|
||
name: 编译 libcore (Windows)
|
||
runs-on: client-server
|
||
|
||
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: 🔧 设置 Node.js
|
||
uses: actions/setup-node@v4
|
||
with:
|
||
node-version: '20'
|
||
|
||
- name: 🔧 安装 MinGW (交叉编译工具)
|
||
run: |
|
||
sudo apt-get update
|
||
sudo apt-get install -y mingw-w64
|
||
|
||
- 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/libcore.dll bin/HiddifyCli.exe
|
||
else
|
||
echo "❌ Windows libcore 编译失败"
|
||
exit 1
|
||
fi
|
||
|
||
- name: 📤 上传 Windows libcore
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: libcore-windows
|
||
path: |
|
||
libcore/bin/libcore.dll
|
||
libcore/bin/HiddifyCli.exe
|
||
libcore/bin/webui/**
|
||
retention-days: 7
|
||
|
||
# ==================== Windows 构建 ====================
|
||
build-windows:
|
||
name: 构建 Windows
|
||
needs: build-libcore-windows
|
||
runs-on: windows-latest
|
||
|
||
steps:
|
||
- name: 📥 Checkout 代码
|
||
uses: actions/checkout@v4
|
||
with:
|
||
submodules: recursive
|
||
fetch-depth: 0
|
||
|
||
- name: 🔧 设置 Flutter
|
||
uses: subosito/flutter-action@v2
|
||
with:
|
||
flutter-version: '3.24.5'
|
||
channel: 'stable'
|
||
cache: true
|
||
|
||
- name: 📥 下载 Windows libcore
|
||
uses: actions/download-artifact@v4
|
||
with:
|
||
name: libcore-windows
|
||
path: libcore_windows_temp
|
||
|
||
- name: 🔧 复制 libcore 文件到正确位置并重命名
|
||
run: |
|
||
Write-Host "📋 开始复制 libcore 文件..."
|
||
|
||
# 显示下载的文件结构
|
||
Write-Host "🔍 检查下载的文件结构:"
|
||
Get-ChildItem -Recurse libcore_windows_temp -ErrorAction SilentlyContinue | Format-Table Name, FullName
|
||
|
||
# 确保目标目录存在
|
||
New-Item -ItemType Directory -Force -Path "libcore\bin" | Out-Null
|
||
|
||
# 查找 libcore.dll(可能在 libcore_windows_temp/bin/ 或 libcore_windows_temp/libcore/bin/)
|
||
$dllFiles = Get-ChildItem -Path libcore_windows_temp -Recurse -Filter "libcore.dll" -ErrorAction SilentlyContinue
|
||
if ($dllFiles) {
|
||
$sourceDll = $dllFiles[0].FullName
|
||
Write-Host "✅ 找到 libcore.dll: $sourceDll"
|
||
Copy-Item $sourceDll "libcore\bin\libcore.dll" -Force
|
||
} else {
|
||
Write-Host "❌ 未找到 libcore.dll"
|
||
Write-Host "当前目录内容:"
|
||
Get-ChildItem -Path . -Recurse | Select-Object -First 20 | Format-Table Name, FullName
|
||
exit 1
|
||
}
|
||
|
||
# 查找并复制 HiddifyCli.exe,重命名为 BearVPNCli.exe
|
||
$exeFiles = Get-ChildItem -Path libcore_windows_temp -Recurse -Filter "HiddifyCli.exe" -ErrorAction SilentlyContinue
|
||
if ($exeFiles) {
|
||
$sourceExe = $exeFiles[0].FullName
|
||
Write-Host "✅ 找到 HiddifyCli.exe: $sourceExe"
|
||
Write-Host "📝 复制并重命名为 BearVPNCli.exe"
|
||
Copy-Item $sourceExe "libcore\bin\BearVPNCli.exe" -Force
|
||
Write-Host "✅ 重命名完成:HiddifyCli.exe → BearVPNCli.exe"
|
||
} else {
|
||
Write-Host "⚠️ 未找到 HiddifyCli.exe(这不是致命错误)"
|
||
}
|
||
|
||
# 复制 webui 目录
|
||
$webuiDir = Get-ChildItem -Path libcore_windows_temp -Recurse -Filter "webui" -Directory -ErrorAction SilentlyContinue
|
||
if ($webuiDir) {
|
||
Write-Host "✅ 找到 webui 目录: $($webuiDir[0].FullName)"
|
||
Copy-Item -Path $webuiDir[0].FullName -Destination "libcore\bin\webui" -Recurse -Force
|
||
} else {
|
||
Write-Host "⚠️ 未找到 webui 目录(这不是致命错误)"
|
||
}
|
||
|
||
Write-Host ""
|
||
Write-Host "📄 验证复制后的文件结构:"
|
||
if (Test-Path "libcore\bin") {
|
||
Get-ChildItem libcore\bin\ -Recurse | Format-Table Name, FullName, Length
|
||
} else {
|
||
Write-Host "❌ libcore\bin 目录不存在"
|
||
}
|
||
|
||
if (-not (Test-Path "libcore\bin\libcore.dll")) {
|
||
Write-Host "❌ libcore.dll 未正确复制到 libcore\bin\"
|
||
exit 1
|
||
}
|
||
|
||
Write-Host "✅ libcore 文件复制完成"
|
||
shell: pwsh
|
||
|
||
- name: ⚙️ 配置 API、OSS 和加密密钥
|
||
shell: bash
|
||
run: |
|
||
CONFIG_FILE="lib/app/common/app_config.dart"
|
||
API_DOMAIN="${{ inputs.api_domain || 'api.maodag.top' }}"
|
||
OSS_URL_1="${{ inputs.oss_url_1 || 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt' }}"
|
||
OSS_URL_2="${{ inputs.oss_url_2 || 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt' }}"
|
||
OSS_URL_3="${{ inputs.oss_url_3 || 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt' }}"
|
||
OSS_URL_4="${{ inputs.oss_url_4 || 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt' }}"
|
||
ENCRYPTION_KEY="${{ inputs.encryption_key || 'c0qhq99a-nq8h-ropg-wrlc-ezj4dlkxqpzx' }}"
|
||
|
||
ENCRYPTION_KEY_ESCAPED=$(echo "$ENCRYPTION_KEY" | perl -pe 's/([\[\].*^$()+?{|\\])/\\$1/g')
|
||
|
||
sed -i "s|api\.maodag\.top|$API_DOMAIN|g" "$CONFIG_FILE"
|
||
sed -i "s|https://ppp2\.oss-cn-hongkong\.aliyuncs\.com/bear1\.txt|$OSS_URL_1|g" "$CONFIG_FILE"
|
||
sed -i "s|https://xgp3\.oss-ap-northeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_2|g" "$CONFIG_FILE"
|
||
sed -i "s|https://xpp4\.oss-ap-northeast-2\.aliyuncs\.com/bear1\.txt|$OSS_URL_3|g" "$CONFIG_FILE"
|
||
sed -i "s|https://xpp5\.oss-ap-southeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_4|g" "$CONFIG_FILE"
|
||
sed -i "s|c0qhq99a-nq8h-ropg-wrlc-ezj4dlkxqpzx|$ENCRYPTION_KEY_ESCAPED|g" "$CONFIG_FILE"
|
||
|
||
- name: 📦 安装 Flutter 依赖
|
||
run: |
|
||
flutter pub get
|
||
|
||
- name: 🔧 生成代码文件 (build_runner)
|
||
run: |
|
||
echo "🔧 开始运行 build_runner..."
|
||
flutter pub run build_runner build --delete-conflicting-outputs
|
||
|
||
echo ""
|
||
echo "✅ build_runner 完成,检查生成的文件..."
|
||
|
||
if (Test-Path "lib\singbox\model\singbox_status.freezed.dart") {
|
||
echo "✅ singbox_status.freezed.dart 已生成"
|
||
} else {
|
||
echo "❌ singbox_status.freezed.dart 未生成"
|
||
exit 1
|
||
}
|
||
|
||
if (Test-Path "lib\singbox\service\singbox_service_provider.g.dart") {
|
||
echo "✅ singbox_service_provider.g.dart 已生成"
|
||
} else {
|
||
echo "❌ singbox_service_provider.g.dart 未生成"
|
||
exit 1
|
||
}
|
||
shell: pwsh
|
||
|
||
- name: 🔧 验证 libcore 文件存在
|
||
run: |
|
||
Write-Host "📋 验证 libcore 文件是否存在..."
|
||
|
||
if (Test-Path "libcore\bin\libcore.dll") {
|
||
$dllInfo = Get-Item "libcore\bin\libcore.dll"
|
||
Write-Host "✅ libcore.dll 存在: $($dllInfo.FullName) - 大小: $($dllInfo.Length) bytes"
|
||
} else {
|
||
Write-Host "❌ libcore.dll 不存在"
|
||
Write-Host "当前 libcore\bin 目录内容:"
|
||
if (Test-Path "libcore\bin") {
|
||
Get-ChildItem "libcore\bin" | Format-Table Name, FullName, Length
|
||
} else {
|
||
Write-Host "libcore\bin 目录不存在"
|
||
}
|
||
exit 1
|
||
}
|
||
|
||
if (Test-Path "libcore\bin\BearVPNCli.exe") {
|
||
$exeInfo = Get-Item "libcore\bin\BearVPNCli.exe"
|
||
Write-Host "✅ BearVPNCli.exe 存在: $($exeInfo.FullName) - 大小: $($exeInfo.Length) bytes"
|
||
} else {
|
||
Write-Host "⚠️ BearVPNCli.exe 不存在"
|
||
}
|
||
shell: pwsh
|
||
|
||
- name: 🔨 构建 Windows (Release)
|
||
run: |
|
||
flutter build windows --release
|
||
|
||
- name: 🔍 验证 Windows 文件结构
|
||
run: |
|
||
Write-Host "📋 检查 Release 目录文件结构..."
|
||
|
||
$releaseDir = "build\windows\x64\runner\Release"
|
||
if (Test-Path $releaseDir) {
|
||
Write-Host "✅ Release 目录存在"
|
||
Write-Host ""
|
||
Write-Host "📄 文件列表:"
|
||
Get-ChildItem $releaseDir | Format-Table Name, Length, LastWriteTime
|
||
|
||
# 检查关键文件
|
||
if (Test-Path "$releaseDir\BearVPN.exe") {
|
||
Write-Host "✅ BearVPN.exe 存在"
|
||
} else {
|
||
Write-Host "❌ BearVPN.exe 不存在"
|
||
}
|
||
|
||
if (Test-Path "$releaseDir\BearVPNCli.exe") {
|
||
Write-Host "✅ BearVPNCli.exe 存在"
|
||
} else {
|
||
Write-Host "⚠️ BearVPNCli.exe 不存在"
|
||
}
|
||
|
||
if (Test-Path "$releaseDir\libcore.dll") {
|
||
Write-Host "✅ libcore.dll 存在"
|
||
} else {
|
||
Write-Host "❌ libcore.dll 不存在"
|
||
}
|
||
} else {
|
||
Write-Host "❌ Release 目录不存在"
|
||
}
|
||
shell: pwsh
|
||
|
||
- name: 📦 打包 Windows
|
||
shell: bash
|
||
run: |
|
||
COMMIT_SHA=${GITHUB_SHA::7}
|
||
DATE=$(date '+%Y%m%d')
|
||
|
||
cd build/windows/x64/runner/Release
|
||
7z a -tzip "../../../../../BearVPN-windows-x64-release-${DATE}-${COMMIT_SHA}.zip" ./*
|
||
|
||
- name: 📤 上传 Windows
|
||
uses: actions/upload-artifact@v4
|
||
with:
|
||
name: windows-x64
|
||
path: BearVPN-windows-*.zip
|
||
retention-days: 30
|