Fix: Use correct Docker-OSX startup with KVM and SSH
Build Debug / Build Android Debug APK (push) Successful in 5m47s
Build iOS / Build iOS IPA (push) Successful in 11m47s
Build UUVPN / Build Android APK (push) Has been skipped
Build UUVPN / Build iOS IPA (push) Has been skipped
Build UUVPN / Create GitHub Release (push) Has been skipped
Build UUVPN / Send Notification (push) Successful in 0s
Build Debug / Build iOS Debug App (push) Has been cancelled

This commit is contained in:
2026-07-05 12:07:24 +08:00
parent 7a95af02b9
commit b3057a72bb
+135 -89
View File
@@ -37,7 +37,7 @@ jobs:
echo "https://dl-cdn.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories echo "https://dl-cdn.alpinelinux.org/alpine/latest-stable/community" >> /etc/apk/repositories
apk update apk update
# 安装基础依赖,不安装完整的 qemu(依赖太多) # 安装基础依赖
apk add --no-cache \ apk add --no-cache \
wget \ wget \
curl \ curl \
@@ -46,7 +46,9 @@ jobs:
python3 \ python3 \
py3-pip \ py3-pip \
docker \ docker \
openrc openrc \
sshpass \
sshfs
# 启动 docker 服务 # 启动 docker 服务
rc-service docker start || true rc-service docker start || true
@@ -57,8 +59,11 @@ jobs:
echo "========================================" echo "========================================"
echo "Checking virtualization support..." echo "Checking virtualization support..."
echo "========================================" echo "========================================"
ls -la /dev/kvm 2>/dev/null || echo "KVM not available - will use QEMU emulation (slower)"
cat /proc/cpuinfo | grep -E "vmx|svm" || echo "No hardware virtualization detected" # 检查 KVM
ls -la /dev/kvm 2>/dev/null || echo "KVM device not found"
cat /proc/cpuinfo | grep -E "vmx|svm" | head -5 || echo "No hardware virtualization detected"
echo "" echo ""
echo "Docker version:" echo "Docker version:"
docker --version || echo "Docker not found" docker --version || echo "Docker not found"
@@ -73,7 +78,7 @@ jobs:
run: | run: |
git lfs install git lfs install
# 配置 LFS 认证 - 使用 token 直接认证 # 配置 LFS 认证
git config --global lfs.url "https://admin:73ffc0f4391a26bb327fbed379d63b5a087e5f10@git.viaeon.com/admin/UUVPN.git/info/lfs" git config --global lfs.url "https://admin:73ffc0f4391a26bb327fbed379d63b5a087e5f10@git.viaeon.com/admin/UUVPN.git/info/lfs"
echo "Attempting LFS pull..." echo "Attempting LFS pull..."
@@ -83,31 +88,6 @@ jobs:
git lfs fetch origin 2>&1 || echo "LFS fetch failed" git lfs fetch origin 2>&1 || echo "LFS fetch failed"
git lfs checkout 2>&1 || echo "LFS checkout failed" git lfs checkout 2>&1 || echo "LFS checkout failed"
echo ""
echo "Checking Libbox.xcframework..."
ls -la iOS-SwiftUI-Code/Libbox.xcframework/ 2>/dev/null || echo "Libbox.xcframework directory not found"
# 检查 Libbox.xcframework 目录
if [ -d "iOS-SwiftUI-Code/Libbox.xcframework" ]; then
echo "Libbox.xcframework directory exists"
ls -la iOS-SwiftUI-Code/Libbox.xcframework/
else
echo "Libbox.xcframework directory NOT found"
# 检查是否有 LFS 指针文件
cat iOS-SwiftUI-Code/.gitattributes 2>/dev/null || echo "No .gitattributes"
fi
# 检查文件是否是 LFS 指针文件
echo ""
echo "Checking if files are LFS pointers or actual binaries..."
if [ -f "iOS-SwiftUI-Code/Libbox.xcframework/ios-arm64/Libbox.framework/Libbox" ]; then
head -5 iOS-SwiftUI-Code/Libbox.xcframework/ios-arm64/Libbox.framework/Libbox 2>/dev/null
else
echo "File not found at expected path"
# 搜索所有可能的 Libbox 文件
find iOS-SwiftUI-Code -name "Libbox" -type f 2>/dev/null | head -10 || echo "No Libbox files found"
fi
- name: Check if Libbox framework exists - name: Check if Libbox framework exists
id: check_lfs id: check_lfs
run: | run: |
@@ -115,66 +95,95 @@ jobs:
echo "Checking LFS files..." echo "Checking LFS files..."
echo "========================================" echo "========================================"
# 正确路径: iOS-SwiftUI-Code/Libbox.xcframework (不是 uuvpn/Libbox.xcframework)
echo "Libbox.xcframework contents:" echo "Libbox.xcframework contents:"
ls -la iOS-SwiftUI-Code/Libbox.xcframework/ 2>/dev/null || echo "Directory not found or empty" ls -la iOS-SwiftUI-Code/Libbox.xcframework/ 2>/dev/null || echo "Directory not found or empty"
# 检查关键文件 # 检查关键文件是否是真正的二进制文件(不是 LFS 指针)
if [ -f "iOS-SwiftUI-Code/Libbox.xcframework/ios-arm64/Libbox.framework/Libbox" ]; then if [ -f "iOS-SwiftUI-Code/Libbox.xcframework/ios-arm64/Libbox.framework/Libbox" ]; then
echo "lfs_ready=true" >> $GITHUB_OUTPUT file_size=$(stat -c%s "iOS-SwiftUI-Code/Libbox.xcframework/ios-arm64/Libbox.framework/Libbox" 2>/dev/null || stat -f%z "iOS-SwiftUI-Code/Libbox.xcframework/ios-arm64/Libbox.framework/Libbox" 2>/dev/null)
echo "✅ LFS files downloaded successfully" if [ "$file_size" -gt 100 ]; then
file iOS-SwiftUI-Code/Libbox.xcframework/ios-arm64/Libbox.framework/Libbox 2>/dev/null || true echo "lfs_ready=true" >> $GITHUB_OUTPUT
echo "✅ LFS files downloaded successfully (file size: ${file_size} bytes)"
else
echo "lfs_ready=false" >> $GITHUB_OUTPUT
echo "❌ LFS files are pointers, not actual binaries"
fi
else else
echo "lfs_ready=false" >> $GITHUB_OUTPUT echo "lfs_ready=false" >> $GITHUB_OUTPUT
echo "❌ LFS files not available" echo "❌ LFS files not available"
echo ""
echo "This means Gitea LFS is not properly configured."
fi fi
# 不让 find 命令导致失败
exit 0 exit 0
- name: Pull Docker-OSX image - name: Pull Docker-OSX image
if: ${{ steps.check_lfs.outputs.lfs_ready == 'true' }} if: ${{ steps.check_lfs.outputs.lfs_ready == 'true' }}
run: | run: |
echo "Pulling Docker-OSX image (this may take a while)..." echo "Pulling Docker-OSX image..."
docker pull sickcodes/docker-osx:latest || echo "Failed to pull image" docker pull sickcodes/docker-osx:latest || echo "Failed to pull image"
- name: Start macOS VM with Docker-OSX - name: Start macOS VM (Sonoma)
if: ${{ steps.check_lfs.outputs.lfs_ready == 'true' }} if: ${{ steps.check_lfs.outputs.lfs_ready == 'true' }}
run: | run: |
echo "========================================" echo "========================================"
echo "Starting macOS VM with Docker-OSX..." echo "Starting macOS Sonoma VM with Docker-OSX..."
echo "========================================" echo "========================================"
echo "" echo ""
echo "Docker-OSX 需要使用 QEMU 运行 macOS 虚拟机" echo "⚠️ 注意: 首次启动需要下载 macOS 安装镜像 (~15GB)"
echo "这个镜像只是一个安装器,需要先启动虚拟机" echo "⚠️ 这可能需要 30-60 分钟"
echo "" echo ""
# 使用 Docker-OSX 的正确启动方式 # 使用正确的 Docker-OSX 启动命令
# 启动一个持久化的 macOS 容器 # 注意: 需要 --device /dev/kvm 来传递 KVM 设备
# 注意: 需要 -it 交互式模式
# 注意: Sonoma 需要特殊的 CPU 配置
# 检查 KVM 是否可用
if [ -e "/dev/kvm" ]; then
echo "✅ KVM is available"
KVM_DEVICE="--device /dev/kvm"
else
echo "❌ KVM not available, will use QEMU emulation (very slow)"
KVM_DEVICE=""
fi
# 启动 macOS Sonoma 容器
# 使用 -d 后台运行,并设置环境变量
docker run -d \ docker run -d \
--name macos-vm \ --name macos-vm \
$KVM_DEVICE \
--privileged \ --privileged \
-p 50922:10022 \
-e RAM=8192 \ -e RAM=8192 \
-e SMP=4 \ -e SMP=4 \
-e CPU='Haswell-noTSX' \
-e CPUID_FLAGS='kvm=on,vendor=GenuineIntel,+invtsc,vmware-cpuid-freq=on' \
-e GENERATE_UNIQUE=true \
-e MASTER_PLIST_URL='https://raw.githubusercontent.com/sickcodes/osx-serial-generator/master/config-custom-sonoma.plist' \
-e SHORTNAME=sonoma \
-e DISPLAY=dummy \ -e DISPLAY=dummy \
-v /tmp/workspace:/workspace \
sickcodes/docker-osx:latest || echo "Failed to start VM" sickcodes/docker-osx:latest || echo "Failed to start VM"
echo "等待 macOS 虚拟机启动..."
sleep 120
# 检查容器状态
docker ps -a | grep macos-vm || echo "VM container not running"
echo "" echo ""
echo "⚠️ 注意: Docker-OSX 需要 KVM 支持才能正常运行 macOS" echo "VM started in background"
echo "如果 runner 没有 KVM 支持,VM 将无法启动" echo "Waiting for macOS to boot (this may take several minutes)..."
echo ""
echo "当前构建环境:" # 等待 SSH 可用
ls -la /dev/kvm 2>/dev/null || echo "KVM not available" max_wait=600 # 10 分钟
docker logs macos-vm 2>/dev/null | tail -20 || echo "No VM logs" wait_count=0
while [ $wait_count -lt $max_wait ]; do
if sshpass -p "user" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 -p 50922 user@localhost "echo 'SSH ready'" 2>/dev/null; then
echo "✅ SSH is ready!"
break
fi
echo "Waiting for SSH... ($wait_count/$max_wait)"
sleep 10
wait_count=$((wait_count + 10))
done
if [ $wait_count -ge $max_wait ]; then
echo "❌ SSH not available after $max_wait seconds"
docker logs macos-vm 2>/dev/null | tail -50 || echo "No VM logs"
fi
- name: Check macOS VM status - name: Check macOS VM status
if: ${{ steps.check_lfs.outputs.lfs_ready == 'true' }} if: ${{ steps.check_lfs.outputs.lfs_ready == 'true' }}
@@ -183,33 +192,81 @@ jobs:
echo "macOS VM Status" echo "macOS VM Status"
echo "========================================" echo "========================================"
# 检查 VM 是否真的在运行 macOS # 通过 SSH 连接到 macOS
docker exec macos-vm uname -a 2>/dev/null || echo "Cannot exec in VM" echo "Checking macOS via SSH..."
docker exec macos-vm which xcodebuild 2>/dev/null || echo "xcodebuild not found in VM"
# 尝试连接 SSH
sshpass -p "user" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 -p 50922 user@localhost "uname -a" 2>/dev/null || echo "Cannot connect via SSH"
# 检查 xcodebuild
sshpass -p "user" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 -p 50922 user@localhost "xcodebuild -version" 2>/dev/null || echo "xcodebuild not found"
# 检查容器日志
echo "" echo ""
echo "⚠️ Docker-OSX 结论:" echo "Container logs (last 30 lines):"
echo "Docker-OSX 需要在支持 KVM 的主机上运行" docker logs macos-vm 2>/dev/null | tail -30 || echo "No VM logs"
echo "当前的 runner 环境可能不支持 KVM"
echo ""
echo "要真正构建 iOS 应用,建议:"
echo "1. 使用 GitHub Actions 的托管 macOS runner"
echo "2. 在 Mac 机器上部署 Gitea runner"
echo "3. 使用云服务 Mac (如 AWS EC2 Mac)"
# 清理容器 - name: Build iOS app (attempt)
docker stop macos-vm 2>/dev/null || true
docker rm macos-vm 2>/dev/null || true
- name: Check build output
if: ${{ steps.check_lfs.outputs.lfs_ready == 'true' }} if: ${{ steps.check_lfs.outputs.lfs_ready == 'true' }}
run: | run: |
echo "========================================" echo "========================================"
echo "Build output:" echo "Attempting iOS build..."
echo "========================================" echo "========================================"
find iOS-SwiftUI-Code/build -name "*.app" -type d 2>/dev/null || echo "No .app found"
find iOS-SwiftUI-Code/build -name "*.ipa" -type f 2>/dev/null || echo "No .ipa found" # 通过 SSHFS 挂载 macOS 文件系统,或者通过 SSH 直接执行命令
ls -la iOS-SwiftUI-Code/build/ 2>/dev/null || echo "Build directory not found" # 默认用户: user, 密码: user
# 检查 SSH 是否可用
if sshpass -p "user" ssh -o StrictHostKeyChecking=no -o ConnectTimeout=10 -p 50922 user@localhost "echo 'SSH ready'" 2>/dev/null; then
echo "✅ SSH connection available"
# 将代码复制到 macOS
echo "Copying code to macOS..."
sshpass -p "user" scp -o StrictHostKeyChecking=no -P 50922 -r iOS-SwiftUI-Code user@localhost:/tmp/ 2>/dev/null || echo "Failed to copy code"
# 检查代码是否存在
sshpass -p "user" ssh -o StrictHostKeyChecking=no -p 50922 user@localhost "ls -la /tmp/iOS-SwiftUI-Code/" 2>/dev/null || echo "Code not copied"
# 尝试构建
echo ""
echo "Building iOS app..."
sshpass -p "user" ssh -o StrictHostKeyChecking=no -p 50922 user@localhost "
cd /tmp/iOS-SwiftUI-Code || exit 1
# 检查 xcodebuild
xcodebuild -version || echo 'xcodebuild not found'
# 尝试构建
xcodebuild \
-project uuvpn.xcodeproj \
-scheme SFI \
-sdk iphoneos \
-configuration Debug \
-derivedDataPath build \
CODE_SIGN_IDENTITY='' \
CODE_SIGNING_REQUIRED=NO \
build 2>&1 || echo 'Build failed'
" 2>&1 || echo "SSH command failed"
else
echo "❌ SSH not available, cannot build"
echo ""
echo "Docker-OSX 问题总结:"
echo "1. 首次启动需要下载 macOS 安装镜像 (~15GB)"
echo "2. 需要等待 macOS 安装完成 (可能需要 1 小时+)"
echo "3. 需要手动安装 Xcode"
echo ""
echo "建议:"
echo "- 使用 GitHub Actions 的托管 macOS runner (免费)"
echo "- 或者预先准备好 macOS 虚拟机镜像"
fi
- name: Cleanup
if: always()
run: |
echo "Cleaning up..."
docker stop macos-vm 2>/dev/null || true
docker rm macos-vm 2>/dev/null || true
- name: Build summary - name: Build summary
run: | run: |
@@ -220,17 +277,6 @@ jobs:
echo "" echo ""
if [ "${{ steps.check_lfs.outputs.lfs_ready }}" != "true" ]; then if [ "${{ steps.check_lfs.outputs.lfs_ready }}" != "true" ]; then
echo "❌ Cannot build iOS without Libbox.xcframework" echo "❌ Cannot build iOS without Libbox.xcframework"
echo ""
echo "To fix this, configure Gitea LFS:"
echo "1. Enable LFS in Gitea config (app.ini):"
echo " [lfs]"
echo " START_SERVER = true"
echo " PATH = /data/git/lfs"
echo ""
echo "2. Generate JWT_SECRET:"
echo " openssl rand -hex 32"
echo ""
echo "3. Re-push LFS files to the repository"
else else
echo "✅ LFS files available" echo "✅ LFS files available"
echo "Build was attempted - check logs above for results" echo "Build was attempted - check logs above for results"