Files
Fig/.github/workflows/build.yml

333 lines
11 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 }}