Skip to content

Commit b366751

Browse files
committed
chore: add changelog and release automation
1 parent 4514aeb commit b366751

File tree

3 files changed

+167
-11
lines changed

3 files changed

+167
-11
lines changed

.github/workflows/release.yml

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,22 +40,26 @@ jobs:
4040
echo "FIRMWARE_PATH=$FIRMWARE_FILE" >> $GITHUB_OUTPUT
4141
echo "FIRMWARE_NAME=$(basename $FIRMWARE_FILE)" >> $GITHUB_OUTPUT
4242
43+
- name: Extract changelog for this release
44+
id: changelog
45+
run: |
46+
RELEASE_NUM=${{ steps.get_version.outputs.RELEASE_NUM }}
47+
# Extract section between [r$RELEASE_NUM] and next [r or end of file
48+
CHANGELOG=$(awk "/## \[r${RELEASE_NUM}\]/,/## \[r[0-9]/" CHANGELOG.md | sed '1d;$d')
49+
# If empty, use default message
50+
if [ -z "$CHANGELOG" ]; then
51+
CHANGELOG="See commit history for details."
52+
fi
53+
# Save to file to preserve formatting
54+
echo "$CHANGELOG" > /tmp/release_notes.txt
55+
echo "NOTES_FILE=/tmp/release_notes.txt" >> $GITHUB_OUTPUT
56+
4357
- name: Create Release
4458
uses: softprops/action-gh-release@v1
4559
with:
4660
files: ${{ steps.find_binary.outputs.FIRMWARE_PATH }}
4761
name: Release ${{ steps.get_version.outputs.RELEASE_NUM }}
48-
body: |
49-
## SpojBoard Firmware Release ${{ steps.get_version.outputs.RELEASE_NUM }}
50-
51-
**Firmware:** `${{ steps.find_binary.outputs.FIRMWARE_NAME }}`
52-
53-
### Installation
54-
1. Download the `.bin` file below
55-
2. Upload via web interface at `http://[device-ip]/ota` or use `pio run -t upload`
56-
57-
### Changes
58-
See commit history for details.
62+
body_path: ${{ steps.changelog.outputs.NOTES_FILE }}
5963
draft: false
6064
prerelease: false
6165
env:

CHANGELOG.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Changelog
2+
3+
All notable changes to SpojBoard firmware will be documented in this file.
4+
5+
## [r3] - 2026-01-10
6+
7+
### Added
8+
- **Demo Mode**: Standalone demo mode with customizable sample departures
9+
- Web interface to edit sample departures (line, destination, ETA, A/C status)
10+
- Available in both AP and STA modes
11+
- **Smart ETA Updates**: 10-second ETA recalculation from cached timestamps
12+
- Reduces API calls by 6x while keeping display fresh
13+
- Allows longer refresh intervals (up to 300s)
14+
- **Telnet Logging**: Remote debugging via telnet (port 23)
15+
- Enable via debugMode config field in settings
16+
- **Extended Departure Buffer**: Increased from 6 to 12 departures
17+
- Provides 8-12 minute buffer during peak times
18+
- **Condensed Font Support**: Automatic font switching for long destinations
19+
- DepartureMonoCondensed5pt8b for destinations >16 chars (23 char capacity)
20+
- **API Retry Logic**: Improved error handling and user feedback
21+
- **Factory Reset**: Reset to defaults via settings page
22+
- **Custom Line Colors**: User-configurable color mapping system
23+
- Pattern matching with trailing asterisk (e.g., "9*=CYAN")
24+
25+
### Changed
26+
- **API Optimization**: Always fetch MAX_DEPARTURES (12) per stop for optimal caching
27+
- Increased JSON buffer to 12KB for busy stops
28+
- **Web UI Improvements**
29+
- **Display Improvements**
30+
- **Logging**: All Serial.println() converted to debugPrintln() for consistent logging
31+
32+
### Fixed
33+
- **OTA Handler**: Split handleUpdateUpload into separate progress/complete handlers
34+
- **Stack Overflow**: Made tempDepartures static (~2KB moved off stack)
35+
- **API Query**: minDepartureTime now queried in API, removed unnecessary filtering in parser
36+
- **Font Metrics**: Fixed xAdvance values in DepartureMono5pt8b
37+
38+
## [r2] - 2026-01-09
39+
40+
### Fixed
41+
- Enable HTTP redirect following for GitHub asset downloads
42+
43+
## [r1] - Initial Release
44+
45+
Initial public release of SpojBoard firmware.

release.sh

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
#!/bin/bash
2+
# SpojBoard Release Helper Script
3+
# Usage: ./release.sh <release_number>
4+
# Example: ./release.sh 3
5+
6+
set -e
7+
8+
if [ -z "$1" ]; then
9+
echo "Usage: ./release.sh <release_number>"
10+
echo "Example: ./release.sh 3"
11+
exit 1
12+
fi
13+
14+
RELEASE_NUM=$1
15+
TAG_NAME="r${RELEASE_NUM}"
16+
17+
echo "=== SpojBoard Release Helper ==="
18+
echo "Release number: ${RELEASE_NUM}"
19+
echo "Tag name: ${TAG_NAME}"
20+
echo ""
21+
22+
# Check if tag already exists
23+
if git rev-parse "$TAG_NAME" >/dev/null 2>&1; then
24+
echo "ERROR: Tag ${TAG_NAME} already exists!"
25+
echo "To delete it locally: git tag -d ${TAG_NAME}"
26+
echo "To delete it remotely: git push origin :refs/tags/${TAG_NAME}"
27+
exit 1
28+
fi
29+
30+
# Check if working directory is clean
31+
if [ -n "$(git status --porcelain)" ]; then
32+
echo "WARNING: Working directory is not clean!"
33+
echo ""
34+
git status --short
35+
echo ""
36+
read -p "Continue anyway? (y/N) " -n 1 -r
37+
echo
38+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
39+
echo "Aborted."
40+
exit 1
41+
fi
42+
fi
43+
44+
# Check if CHANGELOG.md has entry for this release
45+
if ! grep -q "## \[r${RELEASE_NUM}\]" CHANGELOG.md; then
46+
echo "WARNING: No changelog entry found for [r${RELEASE_NUM}] in CHANGELOG.md"
47+
echo ""
48+
read -p "Continue anyway? (y/N) " -n 1 -r
49+
echo
50+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
51+
echo "Aborted."
52+
echo "Please add a changelog entry for [r${RELEASE_NUM}] in CHANGELOG.md"
53+
exit 1
54+
fi
55+
fi
56+
57+
# Show what will be in the release
58+
echo ""
59+
echo "=== Commits since last release ==="
60+
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
61+
if [ -n "$LAST_TAG" ]; then
62+
git log --oneline ${LAST_TAG}..HEAD
63+
else
64+
echo "No previous tags found. This will be the first release."
65+
git log --oneline HEAD~10..HEAD
66+
fi
67+
68+
echo ""
69+
echo "=== Changelog for r${RELEASE_NUM} ==="
70+
awk "/## \[r${RELEASE_NUM}\]/,/## \[r[0-9]/" CHANGELOG.md | sed '1d;$d' | head -20
71+
echo ""
72+
73+
read -p "Create and push tag ${TAG_NAME}? (y/N) " -n 1 -r
74+
echo
75+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
76+
echo "Aborted."
77+
exit 1
78+
fi
79+
80+
# Update CHANGELOG date if it says "Unreleased"
81+
if grep -q "## \[r${RELEASE_NUM}\] - Unreleased" CHANGELOG.md; then
82+
TODAY=$(date +%Y-%m-%d)
83+
sed -i.bak "s/## \[r${RELEASE_NUM}\] - Unreleased/## [r${RELEASE_NUM}] - ${TODAY}/" CHANGELOG.md
84+
rm CHANGELOG.md.bak
85+
git add CHANGELOG.md
86+
git commit -m "chore: update CHANGELOG for release r${RELEASE_NUM}" || true
87+
echo "Updated CHANGELOG.md with release date: ${TODAY}"
88+
fi
89+
90+
# Create and push tag
91+
git tag -a "${TAG_NAME}" -m "Release ${RELEASE_NUM}"
92+
git push origin "${TAG_NAME}"
93+
94+
echo ""
95+
echo "=== Success! ==="
96+
echo "Tag ${TAG_NAME} created and pushed."
97+
echo "GitHub Actions will now:"
98+
echo " 1. Build the firmware"
99+
echo " 2. Create a GitHub release"
100+
echo " 3. Upload the .bin file"
101+
echo " 4. Add changelog from CHANGELOG.md"
102+
echo ""
103+
echo "Monitor progress at:"
104+
echo "https://github.com/xbach/spojboard-firmware/actions"
105+
echo ""
106+
echo "Release will be available at:"
107+
echo "https://github.com/xbach/spojboard-firmware/releases/tag/${TAG_NAME}"

0 commit comments

Comments
 (0)