Release Build #33
Workflow file for this run
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: Release Build | |
| on: | |
| push: | |
| tags: | |
| - 'v*' | |
| workflow_dispatch: | |
| permissions: | |
| contents: write | |
| jobs: | |
| build: | |
| runs-on: ${{ matrix.runner }} | |
| strategy: | |
| matrix: | |
| include: | |
| # Linux builds | |
| - os: linux | |
| arch: x64 | |
| runner: ubuntu-latest | |
| # macOS builds | |
| - os: macos | |
| arch: x64 | |
| runner: macos-latest | |
| # Windows builds | |
| - os: windows | |
| arch: x64 | |
| runner: windows-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Install Racket | |
| uses: Bogdanp/setup-racket@v1.10 | |
| with: | |
| version: '8.12' | |
| architecture: ${{ matrix.arch }} | |
| - name: Show environment info | |
| shell: bash | |
| run: | | |
| echo "Runner OS: ${{ runner.os }}" | |
| echo "Runner Architecture: ${{ runner.arch }}" | |
| echo "Runner OS Version: ${{ runner.osVersion }}" | |
| echo "Matrix OS: ${{ matrix.os }}" | |
| - name: Run tests | |
| run: racket ./test/run-all-tests.rkt | |
| - name: Get version | |
| id: get_version | |
| run: | | |
| VERSION=$(racket build/get-version.rkt) | |
| echo "VERSION=$VERSION" >> $GITHUB_ENV | |
| shell: bash | |
| - name: Build executable | |
| shell: bash | |
| run: | | |
| ARCH=${{ matrix.arch }} | |
| OS=${{ matrix.os }} | |
| VERSION=${{ env.VERSION }} | |
| case "$OS" in | |
| linux) | |
| if [ "$ARCH" = "x64" ]; then | |
| raco exe -o taskly taskly.rkt | |
| else | |
| # For ARM64, use qemu to build | |
| sudo apt-get update && sudo apt-get install -y qemu-user-static binfmt-support | |
| sudo update-binfmts --enable qemu-aarch64 | |
| raco exe -o taskly taskly.rkt | |
| fi | |
| raco distribute taskly-dist taskly | |
| cd taskly-dist | |
| tar -czf ../taskly-${VERSION}-${OS}-${ARCH}.tar.gz . | |
| cd .. | |
| ;; | |
| macos) | |
| # For macOS, use the runner's architecture | |
| echo "Building on macOS ${{ runner.arch }}" | |
| raco exe -o taskly taskly.rkt | |
| raco distribute taskly-dist taskly | |
| # Install create-dmg tool | |
| brew install create-dmg | |
| # Create application bundle structure | |
| mkdir -p Taskly.app/Contents/MacOS | |
| mkdir -p Taskly.app/Contents/Resources | |
| # Copy executable and resources | |
| cp -r taskly-dist/* Taskly.app/Contents/MacOS/ | |
| # Create DMG file | |
| create-dmg \ | |
| --volname "Taskly" \ | |
| --volicon "icons/taskly.svg" \ | |
| --window-pos 200 120 \ | |
| --window-size 800 400 \ | |
| --icon-size 100 \ | |
| --icon "Taskly.app" 200 190 \ | |
| --hide-extension "Taskly.app" \ | |
| --app-drop-link 600 185 \ | |
| "taskly-${VERSION}-${OS}-${ARCH}.dmg" \ | |
| "Taskly.app" | |
| # Also keep zip for backward compatibility | |
| cd taskly-dist | |
| zip -r ../taskly-${VERSION}-${OS}-${ARCH}.zip . | |
| cd .. | |
| ;; | |
| windows) | |
| if [ "$ARCH" = "x64" ]; then | |
| # 使用--embed-dlls选项将DLLs嵌入到可执行文件中,减小包体积 | |
| # 使用--ico选项添加应用图标 | |
| raco exe --gui --embed-dlls --ico icons/48x48.ico -o taskly.exe taskly.rkt | |
| else | |
| # For ARM64, use appropriate flags | |
| raco exe --gui --embed-dlls --ico icons/48x48.ico -o taskly.exe taskly.rkt | |
| fi | |
| raco distribute taskly-dist taskly.exe | |
| # 清理重复文件和目录,减小包体积 | |
| cd taskly-dist | |
| # 删除重复的ert目录(包含重复的DLL文件) | |
| rm -rf ert exts lib/plt/taskly/exts plt/taskly/exts taskly/exts | |
| # 删除重复的r0和r1目录 | |
| rm -rf r0 r1 | |
| # 删除重复的bundles目录 | |
| rm -rf bundles | |
| # 删除空目录 | |
| find . -type d -empty -delete | |
| # 使用PowerShell的Get-ChildItem命令获取所有文件,然后压缩 | |
| powershell "Get-ChildItem -Path . -Recurse | Compress-Archive -DestinationPath ../taskly-${VERSION}-${OS}-${ARCH}.zip -Force" | |
| cd .. | |
| ;; | |
| esac | |
| - name: List build artifacts | |
| shell: bash | |
| run: | | |
| ls -la | |
| file taskly 2>/dev/null || file taskly.exe 2>/dev/null | |
| - name: Verify build artifacts | |
| shell: bash | |
| run: | | |
| echo "Checking build artifacts..." | |
| ls -la taskly-*.zip taskly-*.tar.gz 2>/dev/null || echo "No artifacts found" | |
| - name: Get CHANGELOG content | |
| id: get_changelog | |
| run: | | |
| # 提取CHANGELOG.md中当前版本的内容 | |
| if grep -q "## \[${{ env.VERSION }}\]" CHANGELOG.md; then | |
| # 使用兼容所有平台的方式提取当前版本的变更日志 | |
| # 1. 提取从当前版本开始的所有行 | |
| # 2. 使用awk删除最后一行(下一个版本的标题) | |
| CHANGELOG_CONTENT=$(sed -n "/## \[${{ env.VERSION }}\]/,/## \[/p" CHANGELOG.md | awk 'NR>1 {print prev} {prev=$0}') | |
| else | |
| # 如果找不到当前版本,使用默认内容 | |
| CHANGELOG_CONTENT="## Release v${{ env.VERSION }}\n\nNo changes listed in CHANGELOG.md." | |
| fi | |
| # 将内容输出到环境变量,保留换行符 | |
| echo "CHANGELOG_CONTENT<<EOF" >> $GITHUB_ENV | |
| echo "$CHANGELOG_CONTENT" >> $GITHUB_ENV | |
| echo "EOF" >> $GITHUB_ENV | |
| shell: bash | |
| - name: Create Release | |
| uses: softprops/action-gh-release@v1 | |
| with: | |
| files: | | |
| taskly-*.zip | |
| taskly-*.tar.gz | |
| taskly-*.dmg | |
| name: Release v${{ env.VERSION }} | |
| generate_release_notes: true | |
| body: | | |
| ${{ env.CHANGELOG_CONTENT }} | |
| --- | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} |