18 Commits

Author SHA1 Message Date
kdusek
51b3688410 Add workflow documentation for reusability
All checks were successful
build / build-linux (push) Successful in 15s
2025-12-08 00:40:56 +01:00
kdusek
700faee7da Fix mkdir for pixmaps
All checks were successful
build / build-linux (push) Successful in 16s
release / build-deb (push) Successful in 1m27s
2025-12-08 00:34:20 +01:00
kdusek
4d7845440c Use pixmaps for desktop icon
Some checks failed
build / build-linux (push) Successful in 15s
release / build-deb (push) Failing after 49s
2025-12-08 00:31:42 +01:00
kdusek
31c8b3139a Use PNG icon for desktop integration
All checks were successful
build / build-linux (push) Successful in 15s
release / build-deb (push) Successful in 1m27s
2025-12-08 00:27:45 +01:00
kdusek
ea3d534774 Add release script for easy tagging
All checks were successful
build / build-linux (push) Successful in 16s
2025-12-08 00:26:33 +01:00
kdusek
eefcbc86e5 Replace artifacts with direct Gitea API calls for releases
All checks were successful
build / build-linux (push) Successful in 16s
release / build-deb (push) Successful in 1m29s
2025-12-08 00:23:16 +01:00
kdusek
0d9d3f8d6c Downgrade to artifact actions v1 for Gitea compatibility
Some checks failed
build / build-linux (push) Successful in 15s
release / build-deb (push) Failing after 1m38s
release / release (push) Has been skipped
2025-12-08 00:19:19 +01:00
kdusek
a3c99b5f48 Use VERSION env var in fpm command
Some checks failed
build / build-linux (push) Successful in 15s
release / build-deb (push) Failing after 2m50s
release / release (push) Has been skipped
2025-12-07 23:56:46 +01:00
kdusek
5ce72c71e3 Use env.VERSION for artifact names
Some checks failed
build / build-linux (push) Successful in 15s
release / build-deb (push) Successful in 49s
release / release (push) Failing after 8s
2025-12-07 23:53:40 +01:00
kdusek
2b7079612e Fix artifact name to match version without v
Some checks failed
build / build-linux (push) Successful in 15s
release / build-deb (push) Failing after 49s
release / release (push) Has been skipped
2025-12-07 23:49:49 +01:00
kdusek
3d51013e48 Remove duplicate release job
Some checks failed
build / build-linux (push) Successful in 16s
release / build-deb (push) Successful in 1m2s
release / release (push) Failing after 16s
2025-12-07 23:43:34 +01:00
kdusek
f19f474df7 Change to v2 artifacts and Gitea token
All checks were successful
build / build-linux (push) Successful in 15s
2025-12-07 23:41:03 +01:00
kdusek
c49f761f93 Add fpm to PATH
Some checks failed
build / build-linux (push) Successful in 16s
release / build-deb (push) Successful in 49s
release / release (push) Failing after 8s
2025-12-07 23:36:36 +01:00
kdusek
ca05007197 Add debug steps for fpm and deb file
Some checks failed
build / build-linux (push) Successful in 16s
release / build-deb (push) Successful in 48s
release / release (push) Failing after 8s
2025-12-07 23:33:31 +01:00
kdusek
c2473ad714 Use tag version for deb package
Some checks failed
build / build-linux (push) Successful in 16s
release / build-deb (push) Successful in 48s
release / release (push) Failing after 8s
2025-12-07 23:30:43 +01:00
kdusek
56bebb4be7 Specify artifact name in download
Some checks failed
build / build-linux (push) Successful in 16s
release / build-deb (push) Successful in 1m29s
release / release (push) Failing after 8s
2025-12-07 23:27:13 +01:00
kdusek
e9bcac4f04 Install Ruby before fpm in CI
Some checks failed
build / build-linux (push) Successful in 16s
release / build-deb (push) Successful in 1m29s
release / release (push) Failing after 17s
2025-12-07 23:23:07 +01:00
kdusek
e2b94e2c23 Remove sudo from gem install fpm
Some checks failed
build / build-linux (push) Successful in 15s
release / build-deb (push) Failing after 34s
release / release (push) Has been skipped
2025-12-07 23:21:36 +01:00
4 changed files with 161 additions and 25 deletions

View File

@@ -28,15 +28,23 @@ jobs:
ls -la /lib/x86_64-linux-gnu/libpython* 2>/dev/null || echo "Not found in /lib" ls -la /lib/x86_64-linux-gnu/libpython* 2>/dev/null || echo "Not found in /lib"
- name: Build binary - name: Build binary
run: pyinstaller gotify-tray.spec run: pyinstaller gotify-tray.spec
- name: Install fpm - name: Set version
run: sudo gem install fpm run: echo "VERSION=${GITHUB_REF_NAME#v}" >> $GITHUB_ENV
- name: Install Ruby and fpm
run: |
sudo apt-get update
sudo apt-get install -y ruby-full
gem install fpm
export PATH="$(ruby -e 'puts Gem.user_dir')/bin:$PATH"
- name: Check fpm
run: which fpm
- name: Build Debian package - name: Build Debian package
run: | run: |
mkdir -p build/linux/opt mkdir -p build/linux/opt
mkdir -p build/linux/usr/share/applications mkdir -p build/linux/usr/share/applications
mkdir -p build/linux/usr/share/icons mkdir -p build/linux/usr/share/pixmaps
cp -r dist/gotify-tray build/linux/opt/gotify-tray cp -r dist/gotify-tray build/linux/opt/gotify-tray
cp gotify_tray/gui/images/logo.ico build/linux/usr/share/icons/gotify-tray.ico cp gotify_tray/gui/images/gotify-small.png build/linux/usr/share/pixmaps/gotify-tray.png
cp gotifytray.desktop build/linux/usr/share/applications cp gotifytray.desktop build/linux/usr/share/applications
find build/linux/opt/gotify-tray -type f -exec chmod 644 -- {} + find build/linux/opt/gotify-tray -type f -exec chmod 644 -- {} +
find build/linux/opt/gotify-tray -type d -exec chmod 755 -- {} + find build/linux/opt/gotify-tray -type d -exec chmod 755 -- {} +
@@ -52,24 +60,24 @@ jobs:
-m k.dries@protonmail.com \ -m k.dries@protonmail.com \
--description "Gotify Tray. A tray notification application for receiving messages from a Gotify server." \ --description "Gotify Tray. A tray notification application for receiving messages from a Gotify server." \
--category internet \ --category internet \
--version "$(cat version.txt)" \ --version "$VERSION" \
--license GPLv3 --license GPLv3
- name: Upload artifact - name: Check deb file
uses: actions/upload-artifact@v3 run: ls -la dist/
with: - name: Create release
name: gotify-tray_${{github.ref_name}}_amd64.deb run: |
path: dist/gotify-tray_${{github.ref_name}}_amd64.deb RESPONSE=$(curl -X POST \
-H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
release: -H "Content-Type: application/json" \
runs-on: ubuntu-latest -d "{\"tag_name\": \"${GITHUB_REF_NAME}\", \"name\": \"Release ${GITHUB_REF_NAME}\", \"body\": \"Automated release\"}" \
needs: [build-deb] http://192.168.88.97:3000/api/v1/repos/kadu/gotify-tray-customized/releases)
steps: echo "Release response: $RESPONSE"
- uses: actions/checkout@v4 RELEASE_ID=$(echo $RESPONSE | jq -r '.id')
- uses: actions/download-artifact@v3 echo "RELEASE_ID=$RELEASE_ID" >> $GITHUB_ENV
- name: Release - name: Upload asset
uses: marvinpinto/action-automatic-releases@latest run: |
with: curl -X POST \
repo_token: "${{ secrets.GITHUB_TOKEN }}" -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \
prerelease: false -H "Content-Type: application/octet-stream" \
files: | --data-binary @dist/gotify-tray_${VERSION}_amd64.deb \
gotify-tray_${{github.ref_name}}_amd64.deb http://192.168.88.97:3000/api/v1/repos/kadu/gotify-tray-customized/releases/${RELEASE_ID}/assets?name=gotify-tray_${VERSION}_amd64.deb

107
WORKFLOW.md Normal file
View File

@@ -0,0 +1,107 @@
# CI/CD Workflow for Gitea with Automated Debian Builds and Releases
This document describes the GitHub Actions workflow setup adapted for Gitea, enabling automated building, testing, and releasing of Debian packages for Linux applications.
## Overview
The workflow automates:
- **Development builds**: Pip package builds on every push to `develop`.
- **Release builds**: Debian package creation and automated release on tags.
Key features:
- Cross-platform compatibility (Linux-focused).
- Dynamic Python version detection.
- Automated Debian packaging using PyInstaller and fpm.
- Direct Gitea API integration for releases (bypasses artifact issues).
## Prerequisites
### Gitea Setup
1. **Actions Enabled**: Ensure Actions are enabled in Gitea Site Administration.
2. **Runner**: Use `act_runner` or compatible runner.
3. **Secrets**: Set `GITEA_TOKEN` in repository secrets (generate a token with `repo` and `write:packages` permissions).
### Dependencies
- **Python**: 3.13 (or compatible version).
- **Tools**: PyInstaller, fpm (Ruby gem), curl, jq.
- **Libraries**: PyQt6, requests, etc. (as per `requirements.txt`).
## Workflow Files
### `.github/workflows/develop.yml`
- **Trigger**: Push to `develop` branch (ignores `release` and tags).
- **Job**: `build-linux`
- Builds Python wheel.
- Uploads artifact (for testing).
### `.github/workflows/release.yml`
- **Trigger**: Push to tags (e.g., `v1.0.0`).
- **Job**: `build-deb`
- Builds PyInstaller binary.
- Creates Debian package using fpm.
- Calls Gitea API to create release and upload `.deb`.
## Key Components
### Dynamic Python Detection
```python
py_version = platform.python_version_tuple()[1]
binaries=[(f'/lib/x86_64-linux-gnu/libpython3.{py_version}.so', '.'), ...]
```
Ensures compatibility with different Python versions.
### Debian Packaging
- Uses PyInstaller to create standalone binary.
- fpm packages into `.deb` with proper file structure:
- Binary: `/opt/<app>/<app>`
- Desktop file: `/usr/share/applications/`
- Icon: `/usr/share/pixmaps/`
- Version extracted from tag: `${{github.ref_name#v}}`
### Gitea API Integration
```bash
# Create release
curl -X POST -H "Authorization: token $GITEA_TOKEN" \
-d '{"tag_name": "'$GITHUB_REF_NAME'", "name": "Release '$GITHUB_REF_NAME'", "body": "Automated release"}' \
$GITEA_URL/api/v1/repos/$OWNER/$REPO/releases
# Upload asset
curl -X POST -H "Authorization: token $GITEA_TOKEN" \
--data-binary @dist/app.deb \
$GITEA_URL/api/v1/repos/$OWNER/$REPO/releases/$ID/assets?name=app.deb
```
Bypasses Gitea's artifact limitations.
## Usage
### Releasing
1. Update version in code/files as needed.
2. Run `./release.sh v1.0.0 "Release notes"`
3. Workflow builds and releases automatically.
### Customization
- **App Name**: Update `gotify-tray` references.
- **Files**: Modify PyInstaller spec, fpm commands.
- **Gitea URL**: Change API endpoints for different instances.
- **Dependencies**: Adjust `requirements.txt` and build steps.
## Troubleshooting
### Build Failures
- **PyInstaller**: Check Python version and lib paths.
- **fpm**: Ensure Ruby and gem are installed.
- **API Errors**: Verify `GITEA_TOKEN` and permissions.
### Icon Issues
- Use PNG icons in `/usr/share/pixmaps/`.
- Update desktop file with correct `Icon=` path.
### Artifact Alternatives
If Gitea artifacts work in your setup, replace API calls with upload/download actions.
## Benefits
- **Automation**: Zero manual intervention for releases.
- **Reusability**: Adapt for other Python/Qt apps.
- **Reliability**: Handles version detection and packaging.
For questions or adaptations, refer to the workflow YAML files.

View File

@@ -3,7 +3,7 @@ Name=Gotify Tray
Comment=A tray notification application for receiving messages from a Gotify server. Comment=A tray notification application for receiving messages from a Gotify server.
Path=/opt/gotify-tray Path=/opt/gotify-tray
Exec=/opt/gotify-tray/gotify-tray Exec=/opt/gotify-tray/gotify-tray
Icon=/usr/share/icons/gotify-tray.ico Icon=/usr/share/pixmaps/gotify-tray.png
Terminal=false Terminal=false
Type=Application Type=Application
Categories=Network; Categories=Network;

21
release.sh Executable file
View File

@@ -0,0 +1,21 @@
#!/bin/bash
# Script to create and push a release tag
# Usage: ./release.sh <version> [message]
if [ $# -lt 1 ]; then
echo "Usage: $0 <version> [message]"
echo "Example: $0 v0.5.22 'Release v0.5.22'"
exit 1
fi
VERSION=$1
MESSAGE=${2:-"Release $VERSION"}
echo "Creating tag $VERSION with message: $MESSAGE"
git tag -a "$VERSION" -m "$MESSAGE"
echo "Pushing tag $VERSION"
git push local "$VERSION"
echo "Tag $VERSION pushed. Workflow will build and release automatically."