Skip to content

Build and Release

Build and Release #15

Workflow file for this run

name: Build and Release
on:
push:
tags:
- 'v*'
workflow_dispatch:
inputs:
build_windows:
description: 'Build Windows x64 executable'
required: true
default: true
type: boolean
build_linux:
description: 'Build Linux x64 deb package'
required: true
default: true
type: boolean
create_release:
description: 'Create GitHub Release'
required: true
default: false
type: boolean
env:
APP_NAME: assignsticker
APP_VERSION: "1.3.0"
jobs:
build-windows:
runs-on: windows-latest
if: github.event_name != 'workflow_dispatch' || inputs.build_windows
steps:
- uses: actions/checkout@v4
- name: Install uv
uses: astral-sh/setup-uv@v5
- name: Set up Python
run: uv python install 3.13
- name: Install dependencies
run: |
uv sync
uv pip install pyinstaller
- name: Build
run: uv run python build.py
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: AssignSticker-windows-x64
path: dist/AssignSticker.exe
build-linux:
runs-on: ubuntu-latest
if: github.event_name != 'workflow_dispatch' || inputs.build_linux
steps:
- uses: actions/checkout@v4
- name: Get version from tag
if: startsWith(github.ref, 'refs/tags/v')
run: echo "APP_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
- name: Install uv
uses: astral-sh/setup-uv@v5
- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y \
python3-venv \
python3-dev \
pkg-config \
libcairo2-dev \
libgirepository-2.0-dev \
gir1.2-gtk-3.0 \
gir1.2-webkit2-4.1 \
gir1.2-ayatanaappindicator3-0.1 \
dpkg-dev
- name: Build DEB package
run: |
set -e
PKG="build/deb/${APP_NAME}"
# 目录结构
mkdir -p "${PKG}/opt/${APP_NAME}"
mkdir -p "${PKG}/usr/bin"
mkdir -p "${PKG}/usr/share/applications"
mkdir -p "${PKG}/DEBIAN"
# 复制项目文件
cp *.py "${PKG}/opt/${APP_NAME}/"
for item in icons htmls saying desktop_widgets font.ttf icon.ico introduce banner.png LICENSE README.md pyproject.toml; do
[ -e "$item" ] && cp -r "$item" "${PKG}/opt/${APP_NAME}/"
done
# 用 uv 创建 venv 并安装依赖
cd "${PKG}/opt/${APP_NAME}"
uv venv venv
uv pip install --python venv/bin/python \
pystray Pillow pycairo PyGObject requests loguru
cd -
# 修复 venv 路径
sed -i "s|${PWD}/${PKG}||g" "${PKG}/opt/${APP_NAME}/venv/bin/"* 2>/dev/null || true
# 启动脚本
cat > "${PKG}/usr/bin/${APP_NAME}" <<'EOF'
#!/bin/bash
export GI_TYPELIB_PATH=/usr/lib/x86_64-linux-gnu/girepository-1.0
cd /opt/assignsticker
exec /opt/assignsticker/venv/bin/python main.py "$@"
EOF
chmod +x "${PKG}/usr/bin/${APP_NAME}"
# Desktop Entry
cat > "${PKG}/usr/share/applications/${APP_NAME}.desktop" <<EOF
[Desktop Entry]
Name=AssignSticker
Comment=Homework Kanban Application
Exec=${APP_NAME}
Icon=/opt/${APP_NAME}/icon.ico
Type=Application
Categories=Education;Office;
Terminal=false
StartupWMClass=assignsticker
EOF
# 计算大小
SIZE=$(du -sk "${PKG}" | cut -f1)
# Control
cat > "${PKG}/DEBIAN/control" <<EOF
Package: ${APP_NAME}
Version: ${APP_VERSION}
Section: education
Priority: optional
Architecture: amd64
Installed-Size: ${SIZE}
Depends: python3 (>= 3.10),
gir1.2-gtk-3.0,
gir1.2-webkit2-4.1,
gir1.2-ayatanaappindicator3-0.1,
libcairo2,
libgtk-3-0,
libwebkit2gtk-4.1-0
Maintainer: SECTL <sectl@example.com>
Homepage: https://github.com/sectl/AssignSticker
Description: Homework Showboard Application
AssignSticker is a homework management and display
application for classroom use.
EOF
# 打包
dpkg-deb --root-owner-group --build "${PKG}"
mv "build/deb/${APP_NAME}.deb" "AssignSticker-${APP_VERSION}-amd64.deb"
- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: AssignSticker-linux-amd64
path: "*.deb"
release:
needs: [build-windows, build-linux]
runs-on: ubuntu-latest
if: |
always() &&
(startsWith(github.ref, 'refs/tags/v') ||
(github.event_name == 'workflow_dispatch' && inputs.create_release))
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
path: artifacts
merge-multiple: true
- name: List files
run: find artifacts -type f
- name: Create Release
uses: softprops/action-gh-release@v2
with:
files: artifacts/*
draft: false
prerelease: false
generate_release_notes: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}