Skip to content

Release Build

Release Build #33

Workflow file for this run

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