From 3d58b7615fa7101e1028c3970fb85854cbea08b6 Mon Sep 17 00:00:00 2001 From: PuqiAR Date: Fri, 2 Jan 2026 13:18:57 +0800 Subject: [PATCH] =?UTF-8?q?[FEAT]=20=E6=B5=8B=E8=AF=95Github=20Action?= =?UTF-8?q?=E6=9E=84=E5=BB=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 333 ++++++++++++++++++++ Installer/ConsoleInstaller/main.py | 3 + Installer/ConsoleInstaller/requirements.txt | 2 + 3 files changed, 338 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 Installer/ConsoleInstaller/main.py create mode 100644 Installer/ConsoleInstaller/requirements.txt diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..f66f186 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,333 @@ +name: Build and Release + +on: + push: + branches: [ main, master ] + tags: [ 'v*' ] + pull_request: + branches: [ main, master ] + workflow_dispatch: # 允许手动触发 + +env: + PROJECT_NAME: "myapp" + +jobs: + version-info: + runs-on: ubuntu-latest + outputs: + version: ${{ steps.get_version.outputs.version }} + git_commit: ${{ steps.get_git_info.outputs.commit }} + git_tag: ${{ steps.get_git_info.outputs.tag }} + + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # 获取完整的git历史,用于标签检测 + + - name: Get Git info + id: get_git_info + run: | + echo "commit=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + if git describe --tags --exact-match HEAD 2>/dev/null; then + TAG=$(git describe --tags --exact-match HEAD) + echo "tag=${TAG}" >> $GITHUB_OUTPUT + echo "version=${TAG#v}" >> $GITHUB_OUTPUT + else + echo "tag=unknown" >> $GITHUB_OUTPUT + echo "version=0.0.0-dev+$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT + fi + + - name: Display version info + run: | + echo "Version: ${{ steps.get_git_info.outputs.version }}" + echo "Git Commit: ${{ steps.get_git_info.outputs.commit }}" + echo "Git Tag: ${{ steps.get_git_info.outputs.tag }}" + + build-linux: + needs: version-info + runs-on: ubuntu-latest + strategy: + matrix: + arch: [x86_64, aarch64] + build_type: [release, debug] + + steps: + - uses: actions/checkout@v3 + + - name: Install xmake + run: | + curl -fsSL https://xmake.io/shget.text | bash + echo "$HOME/.xmake/bin" >> $GITHUB_PATH + + - name: Build for Linux + run: | + # 更新版本号 + if [[ "${{ needs.version-info.outputs.version }}" != "0.0.0-dev"* ]]; then + sed -i "s/set_version(\"[^\"]*\")/set_version(\"${{ needs.version-info.outputs.version }}\")/" xmake.lua + fi + + # 配置并构建 + xmake f -p linux -a ${{ matrix.arch }} --mode=${{ matrix.build_type }} + xmake build -v + + # 显示构建信息 + xmake show + + - name: Run tests (if any) + run: | + if xmake -q test 2>/dev/null; then + xmake test + fi + + - name: Package Linux binaries + run: | + mkdir -p artifacts/linux-${{ matrix.arch }} + + # 复制可执行文件 + cp -r build/linux/${{ matrix.arch }}/${{ matrix.build_type }}/* artifacts/linux-${{ matrix.arch }}/ 2>/dev/null || true + + # 压缩 + cd artifacts + tar -czf linux-${{ matrix.arch }}-${{ matrix.build_type }}.tar.gz linux-${{ matrix.arch }}/ + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: linux-${{ matrix.arch }}-${{ matrix.build_type }} + path: artifacts/linux-${{ matrix.arch }}-${{ matrix.build_type }}.tar.gz + + build-windows: + needs: version-info + runs-on: windows-latest + strategy: + matrix: + arch: [x64, x86] + build_type: [release, debug] + + steps: + - uses: actions/checkout@v3 + + - name: Install xmake + run: | + Invoke-WebRequest https://xmake.io/psget.text -UseBasicParsing | Invoke-Expression + echo "$env:USERPROFILE\.xmake\bin" | Out-File -FilePath $env:GITHUB_PATH -Append + + - name: Build for Windows + run: | + # 更新版本号 + if ("${{ needs.version-info.outputs.version }}" -notmatch "^0\.0\.0-dev") { + $content = Get-Content xmake.lua -Raw + $content = $content -replace 'set_version\("[^"]*"\)', "set_version(`"${{ needs.version-info.outputs.version }}`")" + $content | Set-Content xmake.lua + } + + # 配置并构建 + xmake f -p windows -a ${{ matrix.arch }} --mode=${{ matrix.build_type }} + xmake build -v + + - name: Package Windows binaries + run: | + New-Item -ItemType Directory -Force -Path artifacts\windows-${{ matrix.arch }} + + # 复制可执行文件 + Copy-Item -Path "build\windows\${{ matrix.arch }}\${{ matrix.build_type }}\*.exe" -Destination "artifacts\windows-${{ matrix.arch }}\" -ErrorAction SilentlyContinue + Copy-Item -Path "build\windows\${{ matrix.arch }}\${{ matrix.build_type }}\*.dll" -Destination "artifacts\windows-${{ matrix.arch }}\" -ErrorAction SilentlyContinue + + # 压缩 + Compress-Archive -Path "artifacts\windows-${{ matrix.arch }}\*" -DestinationPath "artifacts\windows-${{ matrix.arch }}-${{ matrix.build_type }}.zip" + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: windows-${{ matrix.arch }}-${{ matrix.build_type }} + path: artifacts/windows-${{ matrix.arch }}-${{ matrix.build_type }}.zip + + build-macos: + needs: version-info + runs-on: macos-latest + strategy: + matrix: + arch: [x86_64, arm64] + build_type: [release, debug] + + steps: + - uses: actions/checkout@v3 + + - name: Install xmake + run: | + curl -fsSL https://xmake.io/shget.text | bash + echo "$HOME/.xmake/bin" >> $GITHUB_PATH + + - name: Build for macOS + run: | + # 更新版本号 + if [[ "${{ needs.version-info.outputs.version }}" != "0.0.0-dev"* ]]; then + sed -i "s/set_version(\"[^\"]*\")/set_version(\"${{ needs.version-info.outputs.version }}\")/" xmake.lua + fi + + # 配置并构建 + xmake f -p macosx -a ${{ matrix.arch }} --mode=${{ matrix.build_type }} + xmake build -v + + - name: Package macOS binaries + run: | + mkdir -p artifacts/macos-${{ matrix.arch }} + + # 复制可执行文件 + cp -r build/macosx/${{ matrix.arch }}/${{ matrix.build_type }}/* artifacts/macos-${{ matrix.arch }}/ 2>/dev/null || true + + # 创建.app包(如果需要) + if [ -f "artifacts/macos-${{ matrix.arch }}/${{ env.PROJECT_NAME }}" ]; then + mkdir -p "artifacts/macos-${{ matrix.arch }}/${{ env.PROJECT_NAME }}.app/Contents/MacOS" + cp "artifacts/macos-${{ matrix.arch }}/${{ env.PROJECT_NAME }}" "artifacts/macos-${{ matrix.arch }}/${{ env.PROJECT_NAME }}.app/Contents/MacOS/" + fi + + # 压缩 + cd artifacts + tar -czf macos-${{ matrix.arch }}-${{ matrix.build_type }}.tar.gz macos-${{ matrix.arch }}/ + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: macos-${{ matrix.arch }}-${{ matrix.build_type }} + path: artifacts/macos-${{ matrix.arch }}-${{ matrix.build_type }}.tar.gz + + build-cross-platform: + needs: version-info + runs-on: ubuntu-latest + strategy: + matrix: + target: [mingw, android, ios] # 交叉编译目标 + + steps: + - uses: actions/checkout@v3 + + - name: Install xmake and toolchains + run: | + curl -fsSL https://xmake.io/shget.text | bash + echo "$HOME/.xmake/bin" >> $GITHUB_PATH + + # 安装交叉编译工具链 + if [ "${{ matrix.target }}" = "mingw" ]; then + sudo apt-get update + sudo apt-get install -y g++-mingw-w64-x86-64 g++-mingw-w64-i686 + elif [ "${{ matrix.target }}" = "android" ]; then + xmake repo --add third-party https://github.com/xmake-io/xmake-repo.git + fi + + - name: Build for ${{ matrix.target }} + run: | + # 更新版本号 + if [[ "${{ needs.version-info.outputs.version }}" != "0.0.0-dev"* ]]; then + sed -i "s/set_version(\"[^\"]*\")/set_version(\"${{ needs.version-info.outputs.version }}\")/" xmake.lua + fi + + # 根据目标平台配置 + case "${{ matrix.target }}" in + mingw) + xmake f -p mingw -a x86_64 --mode=release + ;; + android) + xmake f -p android --ndk=~/android-ndk-r23b --mode=release + ;; + ios) + xmake f -p iphoneos --mode=release + ;; + esac + + xmake build -v + + - name: Package cross-platform binaries + run: | + mkdir -p artifacts/${{ matrix.target }} + + # 复制构建结果 + case "${{ matrix.target }}" in + mingw) + cp -r build/mingw/x86_64/release/* artifacts/${{ matrix.target }}/ 2>/dev/null || true + ;; + android) + cp -r build/android/arm64-v8a/release/*.apk artifacts/${{ matrix.target }}/ 2>/dev/null || true + ;; + ios) + cp -r build/iphoneos/arm64/release/*.ipa artifacts/${{ matrix.target }}/ 2>/dev/null || true + ;; + esac + + # 压缩 + cd artifacts + tar -czf ${{ matrix.target }}-release.tar.gz ${{ matrix.target }}/ + + - name: Upload artifacts + uses: actions/upload-artifact@v3 + with: + name: ${{ matrix.target }}-release + path: artifacts/${{ matrix.target }}-release.tar.gz + + create-release: + needs: [version-info, build-linux, build-windows, build-macos] + if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + + steps: + - name: Download all artifacts + uses: actions/download-artifact@v3 + + - name: Create Release + id: create_release + uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref_name }} + release_name: Release ${{ github.ref_name }} + body: | + # Release ${{ github.ref_name }} + + ## Build Info + - Version: ${{ needs.version-info.outputs.version }} + - Git Commit: ${{ needs.version-info.outputs.git_commit }} + - Build Date: ${{ env.BUILD_DATE }} + + ## Downloads + Below are the binaries for different platforms: + + ### Linux + - x86_64 Release + - x86_64 Debug + - ARM64 Release + - ARM64 Debug + + ### Windows + - x64 Release + - x64 Debug + - x86 Release + - x86 Debug + + ### macOS + - x86_64 Release + - x86_64 Debug + - ARM64 Release + - ARM64 Debug + + draft: false + prerelease: false + files: | + linux-*/ + windows-*/ + macos-*/ + mingw-*/ + + - name: Generate SHA256 checksums + run: | + # 为所有发布文件生成校验和 + find . -name "*.tar.gz" -o -name "*.zip" | while read file; do + sha256sum "$file" > "$file.sha256" + done + + # 上传校验和文件到发布 + gh release upload ${{ github.ref_name }} *.sha256 \ + --clobber \ + --repo ${{ github.repository }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/Installer/ConsoleInstaller/main.py b/Installer/ConsoleInstaller/main.py new file mode 100644 index 0000000..0d44677 --- /dev/null +++ b/Installer/ConsoleInstaller/main.py @@ -0,0 +1,3 @@ +from tqdm import tqdm +import requests + diff --git a/Installer/ConsoleInstaller/requirements.txt b/Installer/ConsoleInstaller/requirements.txt new file mode 100644 index 0000000..2c8b74e --- /dev/null +++ b/Installer/ConsoleInstaller/requirements.txt @@ -0,0 +1,2 @@ +requests +tqdm \ No newline at end of file