@@ -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+
2529jobs :
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 }}
0 commit comments