Skip to content

Commit c11a7a1

Browse files
Merge pull request #3 from SECTL/migrate-to-uv-and-fix-dependcies-on-linux
Migrate to uv and fix dependcies on linux
2 parents 438d9c9 + 77d8436 commit c11a7a1

File tree

5 files changed

+500
-139
lines changed

5 files changed

+500
-139
lines changed

.github/workflows/build.yml

Lines changed: 153 additions & 139 deletions
Original file line numberDiff line numberDiff line change
@@ -22,157 +22,171 @@ on:
2222
default: false
2323
type: boolean
2424

25+
env:
26+
APP_NAME: assignsticker
27+
APP_VERSION: "1.3.0"
28+
2529
jobs:
2630
build-windows:
2731
runs-on: windows-latest
28-
if: github.event_name != 'workflow_dispatch' || github.event.inputs.build_windows == 'true'
32+
if: github.event_name != 'workflow_dispatch' || inputs.build_windows
2933
steps:
30-
- name: Checkout code
31-
uses: actions/checkout@v4
32-
33-
- name: Set up Python
34-
uses: actions/setup-python@v5
35-
with:
36-
python-version: '3.11'
37-
38-
- name: Install dependencies
39-
run: |
40-
python -m pip install --upgrade pip
41-
pip install pyinstaller
42-
pip install -r requirements.txt
43-
44-
- name: Build Windows executable
45-
run: |
46-
python build.py
47-
48-
- name: Upload Windows artifact
49-
uses: actions/upload-artifact@v4
50-
with:
51-
name: AssignSticker-windows-x64
52-
path: dist/AssignSticker.exe
34+
- uses: actions/checkout@v4
35+
36+
- name: Install uv
37+
uses: astral-sh/setup-uv@v5
38+
39+
- name: Set up Python
40+
run: uv python install 3.13
41+
42+
- name: Install dependencies
43+
run: |
44+
uv sync
45+
uv pip install pyinstaller
46+
47+
- name: Build
48+
run: uv run python build.py
49+
50+
- name: Upload artifact
51+
uses: actions/upload-artifact@v4
52+
with:
53+
name: AssignSticker-windows-x64
54+
path: dist/AssignSticker.exe
5355

5456
build-linux:
5557
runs-on: ubuntu-latest
56-
if: github.event_name != 'workflow_dispatch' || github.event.inputs.build_linux == 'true'
58+
if: github.event_name != 'workflow_dispatch' || inputs.build_linux
5759
steps:
58-
- name: Checkout code
59-
uses: actions/checkout@v4
60-
61-
- name: Set up Python
62-
uses: actions/setup-python@v5
63-
with:
64-
python-version: '3.11'
65-
66-
- name: Install dependencies
67-
run: |
68-
python -m pip install --upgrade pip
69-
pip install pyinstaller
70-
pip install -r requirements.txt
71-
72-
- name: Install system dependencies
73-
run: |
74-
sudo apt-get update
75-
sudo apt-get install -y dpkg-dev fakeroot
76-
77-
- name: Build Linux executable
78-
run: |
79-
pyinstaller --onefile --windowed --name assignsticker main.py
80-
81-
- name: Prepare DEB package
82-
run: |
83-
mkdir -p release/deb/assignsticker/usr/local/bin
84-
mkdir -p release/deb/assignsticker/usr/share/assignsticker
85-
mkdir -p release/deb/assignsticker/usr/share/applications
86-
mkdir -p release/deb/assignsticker/DEBIAN
87-
88-
# Copy executable
89-
cp dist/assignsticker release/deb/assignsticker/usr/local/bin/
90-
chmod +x release/deb/assignsticker/usr/local/bin/assignsticker
91-
92-
# Copy all project files (excluding unnecessary directories)
93-
for item in icons htmls saying desktop_widgets; do
94-
if [ -d "$item" ]; then
95-
cp -r "$item" release/deb/assignsticker/usr/share/assignsticker/
96-
fi
97-
done
98-
99-
for file in font.ttf icon.ico introduce banner.png LICENSE README.md; do
100-
if [ -f "$file" ]; then
101-
cp "$file" release/deb/assignsticker/usr/share/assignsticker/
102-
fi
103-
done
104-
105-
# Create desktop entry
106-
echo "[Desktop Entry]" > release/deb/assignsticker/usr/share/applications/assignsticker.desktop
107-
echo "Name=AssignSticker" >> release/deb/assignsticker/usr/share/applications/assignsticker.desktop
108-
echo "Comment=Homework Kanban Application" >> release/deb/assignsticker/usr/share/applications/assignsticker.desktop
109-
echo "Exec=/usr/local/bin/assignsticker" >> release/deb/assignsticker/usr/share/applications/assignsticker.desktop
110-
echo "Icon=/usr/share/assignsticker/icon.ico" >> release/deb/assignsticker/usr/share/applications/assignsticker.desktop
111-
echo "Type=Application" >> release/deb/assignsticker/usr/share/applications/assignsticker.desktop
112-
echo "Categories=Education;Office;" >> release/deb/assignsticker/usr/share/applications/assignsticker.desktop
113-
echo "Terminal=false" >> release/deb/assignsticker/usr/share/applications/assignsticker.desktop
114-
115-
# Create control file
116-
echo "Package: assignsticker" > release/deb/assignsticker/DEBIAN/control
117-
echo "Version: 1.3.0" >> release/deb/assignsticker/DEBIAN/control
118-
echo "Section: education" >> release/deb/assignsticker/DEBIAN/control
119-
echo "Priority: optional" >> release/deb/assignsticker/DEBIAN/control
120-
echo "Architecture: amd64" >> release/deb/assignsticker/DEBIAN/control
121-
echo "Depends: python3" >> release/deb/assignsticker/DEBIAN/control
122-
echo "Maintainer: SECTL <sectl@example.com>" >> release/deb/assignsticker/DEBIAN/control
123-
echo "Description: Homework Kanban Application" >> release/deb/assignsticker/DEBIAN/control
124-
echo " AssignSticker is a homework management application" >> release/deb/assignsticker/DEBIAN/control
125-
echo " that helps users organize and track homework tasks." >> release/deb/assignsticker/DEBIAN/control
126-
127-
# Build DEB package
128-
dpkg-deb --build release/deb/assignsticker
129-
mv release/deb/assignsticker.deb release/AssignSticker-linux-amd64.deb
130-
131-
- name: Upload Linux artifact
132-
uses: actions/upload-artifact@v4
133-
with:
134-
name: AssignSticker-linux-amd64
135-
path: release/AssignSticker-linux-amd64.deb
60+
- uses: actions/checkout@v4
61+
62+
- name: Get version from tag
63+
if: startsWith(github.ref, 'refs/tags/v')
64+
run: echo "APP_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
65+
66+
- name: Install uv
67+
uses: astral-sh/setup-uv@v5
68+
69+
- name: Install system dependencies
70+
run: |
71+
sudo apt-get update
72+
sudo apt-get install -y \
73+
python3-venv \
74+
python3-dev \
75+
pkg-config \
76+
libcairo2-dev \
77+
libgirepository1.0-dev \
78+
gir1.2-gtk-3.0 \
79+
gir1.2-webkit2-4.1 \
80+
gir1.2-ayatanaappindicator3-0.1 \
81+
dpkg-dev
82+
83+
- name: Build DEB package
84+
run: |
85+
set -e
86+
PKG="build/deb/${APP_NAME}"
87+
88+
# 目录结构
89+
mkdir -p "${PKG}/opt/${APP_NAME}"
90+
mkdir -p "${PKG}/usr/bin"
91+
mkdir -p "${PKG}/usr/share/applications"
92+
mkdir -p "${PKG}/DEBIAN"
93+
94+
# 复制项目文件
95+
cp *.py "${PKG}/opt/${APP_NAME}/"
96+
for item in icons htmls saying desktop_widgets font.ttf icon.ico introduce banner.png LICENSE README.md pyproject.toml; do
97+
[ -e "$item" ] && cp -r "$item" "${PKG}/opt/${APP_NAME}/"
98+
done
99+
100+
# 用 uv 创建 venv 并安装依赖
101+
cd "${PKG}/opt/${APP_NAME}"
102+
uv venv venv
103+
uv pip install --python venv/bin/python \
104+
pystray Pillow pycairo PyGObject requests loguru
105+
cd -
106+
107+
# 修复 venv 路径
108+
sed -i "s|${PWD}/${PKG}||g" "${PKG}/opt/${APP_NAME}/venv/bin/"* 2>/dev/null || true
109+
110+
# 启动脚本
111+
cat > "${PKG}/usr/bin/${APP_NAME}" <<'EOF'
112+
#!/bin/bash
113+
export GI_TYPELIB_PATH=/usr/lib/x86_64-linux-gnu/girepository-1.0
114+
cd /opt/assignsticker
115+
exec /opt/assignsticker/venv/bin/python main.py "$@"
116+
EOF
117+
chmod +x "${PKG}/usr/bin/${APP_NAME}"
118+
119+
# Desktop Entry
120+
cat > "${PKG}/usr/share/applications/${APP_NAME}.desktop" <<EOF
121+
[Desktop Entry]
122+
Name=AssignSticker
123+
Comment=Homework Kanban Application
124+
Exec=${APP_NAME}
125+
Icon=/opt/${APP_NAME}/icon.ico
126+
Type=Application
127+
Categories=Education;Office;
128+
Terminal=false
129+
StartupWMClass=assignsticker
130+
EOF
131+
132+
# 计算大小
133+
SIZE=$(du -sk "${PKG}" | cut -f1)
134+
135+
# Control
136+
cat > "${PKG}/DEBIAN/control" <<EOF
137+
Package: ${APP_NAME}
138+
Version: ${APP_VERSION}
139+
Section: education
140+
Priority: optional
141+
Architecture: amd64
142+
Installed-Size: ${SIZE}
143+
Depends: python3 (>= 3.10),
144+
gir1.2-gtk-3.0,
145+
gir1.2-webkit2-4.1,
146+
gir1.2-ayatanaappindicator3-0.1,
147+
libcairo2,
148+
libgtk-3-0,
149+
libwebkit2gtk-4.1-0
150+
Maintainer: SECTL <sectl@example.com>
151+
Homepage: https://github.com/sectl/AssignSticker
152+
Description: Homework Showboard Application
153+
AssignSticker is a homework management and display
154+
application for classroom use.
155+
EOF
156+
157+
# 打包
158+
dpkg-deb --root-owner-group --build "${PKG}"
159+
mv "build/deb/${APP_NAME}.deb" "AssignSticker-${APP_VERSION}-amd64.deb"
160+
161+
- name: Upload artifact
162+
uses: actions/upload-artifact@v4
163+
with:
164+
name: AssignSticker-linux-amd64
165+
path: "*.deb"
136166

137167
release:
138168
needs: [build-windows, build-linux]
139169
runs-on: ubuntu-latest
140170
if: |
141171
always() &&
142-
(github.event_name == 'workflow_dispatch' && github.event.inputs.create_release == 'true') ||
143-
startsWith(github.ref, 'refs/tags/v')
172+
(startsWith(github.ref, 'refs/tags/v') ||
173+
(github.event_name == 'workflow_dispatch' && inputs.create_release))
144174
steps:
145-
- name: Download Windows artifact
146-
if: needs.build-windows.result == 'success'
147-
uses: actions/download-artifact@v4
148-
with:
149-
name: AssignSticker-windows-x64
150-
path: artifacts/windows
151-
152-
- name: Download Linux artifact
153-
if: needs.build-linux.result == 'success'
154-
uses: actions/download-artifact@v4
155-
with:
156-
name: AssignSticker-linux-amd64
157-
path: artifacts/linux
158-
159-
- name: Prepare release files
160-
run: |
161-
mkdir -p release_files
162-
if [ -f artifacts/windows/AssignSticker.exe ]; then
163-
mv artifacts/windows/AssignSticker.exe release_files/
164-
fi
165-
if [ -f artifacts/linux/AssignSticker-linux-amd64.deb ]; then
166-
mv artifacts/linux/AssignSticker-linux-amd64.deb release_files/
167-
fi
168-
ls -la release_files/
169-
170-
- name: Create Release
171-
uses: softprops/action-gh-release@v1
172-
with:
173-
files: release_files/*
174-
draft: false
175-
prerelease: false
176-
generate_release_notes: true
177-
env:
178-
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
175+
- name: Download artifacts
176+
uses: actions/download-artifact@v4
177+
with:
178+
path: artifacts
179+
merge-multiple: true
180+
181+
- name: List files
182+
run: find artifacts -type f
183+
184+
- name: Create Release
185+
uses: softprops/action-gh-release@v2
186+
with:
187+
files: artifacts/*
188+
draft: false
189+
prerelease: false
190+
generate_release_notes: true
191+
env:
192+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
logs/*

.python-version

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
3.13

pyproject.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[project]
2+
name = "assignsticker"
3+
version = "1.2.0"
4+
description = "一款简洁,易用的作业板"
5+
readme = "README.md"
6+
requires-python = ">=3.13"
7+
dependencies = [
8+
"pillow>=12.1.1",
9+
"pygobject>=3.56.0 ; sys_platform == 'linux'",
10+
"pystray>=0.19.5",
11+
"pywebview==4.4.1",
12+
]
13+
14+
[[tool.uv.index]]
15+
# 使用清华大学PyPI镜像源以提高下载速度
16+
url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
17+
# 设置为默认索引
18+
default = true

0 commit comments

Comments
 (0)