Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
160 changes: 50 additions & 110 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ on:
default: true
type: boolean
build_linux:
description: Build Linux x64 deb package
description: Build Linux x64 package
required: true
default: true
type: boolean
Expand Down Expand Up @@ -57,16 +57,16 @@ jobs:
- name: Install dependencies
run: |
uv sync --frozen
uv pip install pyinstaller
uv pip install nuitka

- name: Build Windows executable
run: uv run python build.py
run: uv run python build.py --backend nuitka

- name: Upload Windows artifact
uses: actions/upload-artifact@v4
with:
name: AssignSticker-windows-x64
path: dist/AssignSticker.exe
path: release/AssignSticker-windows-x64-*.zip
if-no-files-found: error

build-linux:
Expand Down Expand Up @@ -103,123 +103,59 @@ jobs:
run: |
sudo apt-get update
sudo apt-get install -y \
patchelf \
python3-dev \
pkg-config \
libcairo2-dev \
libgirepository-2.0-dev \
gir1.2-gtk-3.0 \
gir1.2-webkit2-4.1 \
python3-gi \
python3-gi-cairo \
libwebkit2gtk-4.1-0 \
libayatana-appindicator3-1 \
dpkg-dev
libayatana-appindicator3-1
sudo apt-get install -y libwebkit2gtk-4.1-0 || sudo apt-get install -y libwebkit2gtk-4.0-37
sudo apt-get install -y libgirepository-2.0-dev || sudo apt-get install -y libgirepository1.0-dev
sudo apt-get install -y gir1.2-webkit2-4.1 || sudo apt-get install -y gir1.2-webkit2-4.0

- name: Build with PyInstaller
shell: bash
- name: Build Linux package
run: |
uv sync --frozen
uv pip install pyinstaller

cat > assignsticker.spec << 'SPECEOF'
# -*- mode: python ; coding: utf-8 -*-
from PyInstaller.building.build_main import Analysis, PYZ, EXE

block_cipher = None

datas = [
('htmls', 'htmls'),
('icons', 'icons'),
('saying', 'saying'),
('desktop_widgets', 'desktop_widgets'),
('homeworktemple', 'homeworktemple'),
('font.ttf', '.'),
('icon.ico', '.'),
('introduce', '.'),
('banner.png', '.'),
('作业模板YML格式标准.txt', '.'),
]

hiddenimports = [
'gi',
'gi.repository',
'gi.repository.Gtk',
'gi.repository.Gdk',
'gi.repository.GObject',
'gi.repository.GLib',
'gi.repository.Gio',
'gi.repository.AyatanaAppIndicator3',
'cairo',
'webview',
'webview.platforms.gtk',
'pystray',
'pystray._appindicator',
'PIL',
'PIL._imagingtk',
'PIL._tkinter_finder',
]

a = Analysis(
['main.py'],
pathex=[],
binaries=[],
datas=datas,
hiddenimports=hiddenimports,
hookspath=[],
hooksconfig={},
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False,
)
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)

exe = EXE(
pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='assignsticker',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=False,
disable_windowed_traceback=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
icon='icon.ico',
)
SPECEOF

uv run pyinstaller assignsticker.spec
uv pip install nuitka
uv run python build.py --backend nuitka

- name: Build DEB package
shell: bash
env:
APP_VERSION: ${{ steps.version.outputs.app_version }}
run: |
set -euo pipefail
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"
DIST_DIR="$(find dist -maxdepth 1 -type d -name '*.dist' | head -n1)"
if [[ -z "${DIST_DIR}" ]]; then
echo "Cannot find Nuitka dist directory under ./dist" >&2
exit 1
fi

cp -r dist/assignsticker/* "${PKG}/opt/${APP_NAME}/"
PKG="build/deb/${APP_NAME}"
mkdir -p "${PKG}/opt/${APP_NAME}" "${PKG}/usr/bin" "${PKG}/usr/share/applications" "${PKG}/DEBIAN"
cp -a "${DIST_DIR}/." "${PKG}/opt/${APP_NAME}/"

BIN_NAME=""
for c in AssignSticker assignsticker; do
if [[ -f "${PKG}/opt/${APP_NAME}/${c}" ]]; then
BIN_NAME="${c}"
break
fi
done
if [[ -z "${BIN_NAME}" ]]; then
BIN_NAME="$(find "${PKG}/opt/${APP_NAME}" -maxdepth 1 -type f -executable | head -n1 | xargs -r basename)"
fi
if [[ -z "${BIN_NAME}" ]]; then
echo "Cannot detect executable in ${PKG}/opt/${APP_NAME}" >&2
exit 1
fi
chmod +x "${PKG}/opt/${APP_NAME}/${BIN_NAME}"

cat > "${PKG}/usr/bin/${APP_NAME}" <<'LAUNCHEOF'
cat > "${PKG}/usr/bin/${APP_NAME}" <<LAUNCHEOF
#!/bin/bash
export GI_TYPELIB_PATH=/usr/lib/x86_64-linux-gnu/girepository-1.0
exec /opt/assignsticker/assignsticker "$@"
exec /opt/${APP_NAME}/${BIN_NAME} "\$@"
LAUNCHEOF
chmod +x "${PKG}/usr/bin/${APP_NAME}"

Expand All @@ -228,7 +164,7 @@ jobs:
Name=AssignSticker
Comment=Homework Kanban Application
Exec=${APP_NAME}
Icon=/opt/${APP_NAME}/icon.ico
Icon=/opt/${APP_NAME}/icon.png
Type=Application
Categories=Education;Office;
Terminal=false
Expand All @@ -243,21 +179,25 @@ jobs:
Priority: optional
Architecture: amd64
Installed-Size: ${SIZE}
Depends: gir1.2-gtk-3.0, gir1.2-webkit2-4.1, libayatana-appindicator3-1, libcairo2, libgtk-3-0, libwebkit2gtk-4.1-0, libgirepository-2.0-0
Depends: gobject-introspection, libayatana-appindicator3-1, gir1.2-ayatanaappindicator3-0.1, gir1.2-webkit2-4.1
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.
CONTROLEOF

dpkg-deb --root-owner-group --build "${PKG}"
mv "build/deb/${APP_NAME}.deb" "AssignSticker-${APP_VERSION}-amd64.deb"
mkdir -p release
mv "build/deb/${APP_NAME}.deb" "release/AssignSticker-${APP_VERSION}-amd64.deb"
ls -lah release

- name: Upload Linux artifact
uses: actions/upload-artifact@v4
with:
name: AssignSticker-linux-amd64
path: AssignSticker-*-amd64.deb
name: AssignSticker-linux-x64
path: |
release/AssignSticker-linux-x64-*.zip
release/AssignSticker-*-amd64.deb
if-no-files-found: error

release:
Expand Down Expand Up @@ -295,7 +235,7 @@ jobs:
if: needs.build-linux.result == 'success'
uses: actions/download-artifact@v4
with:
name: AssignSticker-linux-amd64
name: AssignSticker-linux-x64
path: artifacts/linux

- name: List release files
Expand All @@ -306,8 +246,8 @@ jobs:
with:
tag_name: ${{ steps.rel.outputs.tag }}
files: |
artifacts/windows/*
artifacts/linux/*
artifacts/windows/**/*
artifacts/linux/**/*
draft: false
prerelease: false
generate_release_notes: true
Expand Down
41 changes: 40 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,2 +1,41 @@
logs/*
.DS_Store
.DS_Store
dist
release
.venv
logs
*.pyc
*.pyo
__pycache__/
*.pyd
*.pyw
*.egg-info
*.egg
*.manifest
*.spec
*.whl
*.dist-info
*.egg-info
*.egg
*.manifest
*.spec
*.whl
*.dist-info
*.egg-info
*.egg
*.manifest
*.spec
*.whl
*.dist-info
*.egg-info
*.egg
*.manifest
*.spec
*.whl
*.dist-info
*.egg-info
*.egg
*.manifest
*.spec
*.whl
*.dist-info
Binary file removed __pycache__/main.cpython-313.pyc
Binary file not shown.
Binary file removed __pycache__/main.cpython-38.pyc
Binary file not shown.
Loading
Loading