Update build.yml #42
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build and Release | |
| on: | |
| push: | |
| branches: | |
| - main | |
| - master | |
| tags: | |
| - 'v*' | |
| pull_request: | |
| branches: | |
| - main | |
| - master | |
| workflow_dispatch: | |
| jobs: | |
| build: | |
| strategy: | |
| matrix: | |
| include: | |
| - os: windows-latest | |
| goos: windows | |
| goarch: amd64 | |
| exe_ext: .exe | |
| archive_format: zip | |
| archive_ext: .zip | |
| - os: macos-15-intel | |
| goos: darwin | |
| goarch: amd64 | |
| exe_ext: '' | |
| archive_format: zip | |
| archive_ext: .zip | |
| - os: macos-14 | |
| goos: darwin | |
| goarch: arm64 | |
| exe_ext: '' | |
| archive_format: zip | |
| archive_ext: .zip | |
| - os: ubuntu-latest | |
| goos: linux | |
| goarch: amd64 | |
| exe_ext: '' | |
| archive_format: tar.gz | |
| archive_ext: .tar.gz | |
| - os: ubuntu-24.04-arm | |
| goos: linux | |
| goarch: arm64 | |
| exe_ext: '' | |
| archive_format: tar.gz | |
| archive_ext: .tar.gz | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Set up Go | |
| uses: actions/setup-go@v5 | |
| with: | |
| go-version: '1.23' | |
| cache: false | |
| - name: Initialize Go module | |
| run: | | |
| go mod init ech-workers || true | |
| go mod tidy | |
| - name: Build Go executable | |
| run: | | |
| GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -o ech-workers${{ matrix.exe_ext }} ech-workers.go | |
| shell: bash | |
| - name: Set up Python | |
| if: startsWith(github.ref, 'refs/tags/') | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: '3.11' | |
| - name: Install system dependencies (Linux) | |
| if: startsWith(github.ref, 'refs/tags/') && matrix.goos == 'linux' | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y python3-pyqt5 python3-pyqt5.qtsvg python3-dev | |
| shell: bash | |
| - name: Install PyInstaller and dependencies | |
| if: startsWith(github.ref, 'refs/tags/') | |
| run: | | |
| python -m pip install --upgrade pip | |
| if [ "${{ matrix.goos }}" == "linux" ]; then | |
| # Linux: 使用系统包中的 PyQt5,只安装其他依赖 | |
| pip install pyinstaller pystray Pillow | |
| # 验证 PyQt5 是否可用 | |
| python -c "import PyQt5.QtWidgets; print('PyQt5 available')" || echo "PyQt5 not available, will skip GUI build" | |
| else | |
| # Windows 和 macOS: 从 PyPI 安装 | |
| pip install pyinstaller PyQt5 pystray Pillow | |
| fi | |
| shell: bash | |
| - name: Build Python executable | |
| if: startsWith(github.ref, 'refs/tags/') | |
| run: | | |
| # PyInstaller 会自动使用当前系统架构 | |
| # macos-13 = Intel (x86_64), macos-14 = Apple Silicon (arm64) | |
| # ubuntu-latest = x86_64, ubuntu-latest-arm64 = ARM64 | |
| if [ "${{ matrix.goos }}" == "windows" ]; then | |
| pyinstaller --onefile --windowed --name ECHWorkersGUI gui.py | |
| elif [ "${{ matrix.goos }}" == "linux" ]; then | |
| # Linux: 检查 PyQt5 是否可用 | |
| if python -c "import PyQt5.QtWidgets" 2>/dev/null; then | |
| pyinstaller --onefile --name ECHWorkersGUI gui.py | |
| else | |
| echo "PyQt5 not available, skipping GUI build for Linux" | |
| echo "Only Go executable will be included" | |
| fi | |
| else | |
| # macOS 不需要 --windowed(会隐藏控制台) | |
| pyinstaller --onefile --name ECHWorkersGUI gui.py | |
| fi | |
| shell: bash | |
| - name: Prepare release files | |
| if: startsWith(github.ref, 'refs/tags/') | |
| run: | | |
| mkdir -p release | |
| # 复制 Go 可执行文件 | |
| cp ech-workers${{ matrix.exe_ext }} release/ | |
| # 复制 Python 打包后的可执行文件 | |
| if [ "${{ matrix.goos }}" == "windows" ]; then | |
| if [ -f "dist/ECHWorkersGUI.exe" ]; then | |
| cp dist/ECHWorkersGUI.exe release/ | |
| fi | |
| else | |
| if [ -f "dist/ECHWorkersGUI" ]; then | |
| cp dist/ECHWorkersGUI release/ | |
| chmod +x release/ECHWorkersGUI | |
| elif [ "${{ matrix.goos }}" == "linux" ]; then | |
| echo "GUI executable not built, only Go executable will be included" | |
| fi | |
| fi | |
| # 创建 README | |
| { | |
| echo "ECH Workers Client" | |
| echo "" | |
| echo "Files:" | |
| echo "- ech-workers(.exe): Go compiled core proxy program" | |
| if [ "${{ matrix.goos }}" == "windows" ]; then | |
| echo "- ECHWorkersGUI.exe: Python GUI client (standalone executable)" | |
| elif [ "${{ matrix.goos }}" == "linux" ]; then | |
| if [ -f "release/ECHWorkersGUI" ]; then | |
| echo "- ECHWorkersGUI: Python GUI client (standalone executable)" | |
| else | |
| echo "- Note: GUI client not available for this architecture" | |
| echo " Use ech-workers from command line instead" | |
| fi | |
| else | |
| echo "- ECHWorkersGUI: Python GUI client (standalone executable)" | |
| fi | |
| echo "" | |
| echo "Usage:" | |
| if [ "${{ matrix.goos }}" == "windows" ]; then | |
| echo "1. Double-click ECHWorkersGUI.exe to launch the GUI" | |
| echo "2. Or run ech-workers.exe from command line" | |
| else | |
| echo "1. Run ./ECHWorkersGUI to launch the GUI" | |
| echo "2. Or run ./ech-workers from command line" | |
| fi | |
| echo "" | |
| echo "System Requirements:" | |
| if [ "${{ matrix.goos }}" == "windows" ]; then | |
| echo "- Windows: Windows 10+" | |
| elif [ "${{ matrix.goos }}" == "darwin" ]; then | |
| echo "- macOS: macOS 10.13+" | |
| else | |
| echo "- Linux: Ubuntu 18.04+ / Debian 10+ / CentOS 7+" | |
| echo "- Architecture: ${{ matrix.goarch }}" | |
| fi | |
| echo "- No Python installation required (standalone executables)" | |
| } > release/README.txt | |
| shell: bash | |
| - name: Create archive (Windows) | |
| if: startsWith(github.ref, 'refs/tags/') && matrix.goos == 'windows' | |
| run: | | |
| cd release | |
| powershell Compress-Archive -Path * -DestinationPath ../ECHWorkers-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.archive_ext }} -Force | |
| shell: powershell | |
| - name: Create archive (macOS) | |
| if: startsWith(github.ref, 'refs/tags/') && matrix.goos == 'darwin' | |
| run: | | |
| cd release | |
| zip -r ../ECHWorkers-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.archive_ext }} . | |
| shell: bash | |
| - name: Create archive (Linux) | |
| if: startsWith(github.ref, 'refs/tags/') && matrix.goos == 'linux' | |
| run: | | |
| cd release | |
| tar -czf ../ECHWorkers-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.archive_ext }} . | |
| shell: bash | |
| - name: Upload artifacts | |
| if: startsWith(github.ref, 'refs/tags/') | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ECHWorkers-${{ matrix.goos }}-${{ matrix.goarch }} | |
| path: ECHWorkers-${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.archive_ext }} | |
| retention-days: 30 | |
| release: | |
| needs: build | |
| runs-on: ubuntu-latest | |
| if: startsWith(github.ref, 'refs/tags/') | |
| steps: | |
| - name: Download all artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| path: artifacts | |
| - name: Create release | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| files: | | |
| artifacts/**/*.zip | |
| artifacts/**/*.tar.gz | |
| draft: false | |
| prerelease: false | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |