| name | qtpass-releasing |
| description | Release workflow for QtPass - versioning, builds, publishing |
| license | GPL-3.0-or-later |
| metadata | {"audience":"developers","workflow":"release"} |
Release Workflow for QtPass
Release Checklist
1. Version Bump
Update version in all build files:
qtpass.pri - VERSION = X.Y.Z (note: .pri not .pro, unquoted number)
qtpass.spec - Version:
qtpass.iss - AppVerName=
Doxyfile - PROJECT_NUMBER
downloads.html (gh-pages) - multiple references
index.html (gh-pages)
getting-started.html (gh-pages)
changelog.html (gh-pages)
changelog.1.4.html (gh-pages)
old.html (gh-pages)
NOTE: qtpass.appdata.xml and appdmg.json don't have version fields to update.
grep -rn "X\.Y" qtpass.pri qtpass.spec qtpass.iss Doxyfile
2. Changelog
Update CHANGELOG.md:
- Add release date
- List all merged PRs and fixed issues
- Group by: Added, Changed, Fixed, Removed
3. Tests
make check
4. Build Artifacts
Linux
./scripts/release-linux.sh
git archive --prefix=qtpass-x.y.z/ -o qtpass-x.y.z.tar.gz HEAD
macOS
./scripts/release-mac.sh
Windows
qtpass.iss
5. Git Tags
git tag -a vX.Y.Z -m "QtPass vX.Y.Z Release"
git push origin vX.Y.Z
6. GitHub Release
gh release create vX.Y.Z \
--title "QtPass vX.Y.Z" \
--notes-file CHANGELOG.md \
qtpass-x.y.z.tar.gz
7. GitHub Pages (site)
Update version in HTML files on gh-pages branch:
git checkout gh-pages
git add -A
git commit -m "Release vX.Y.Z"
git push origin gh-pages
Common version search:
grep -rn "1\.5" *.html
Version Numbering
Follow semantic versioning: MAJOR.MINOR.PATCH
- MAJOR: Breaking changes
- MINOR: New features, backward compatible
- PATCH: Bugfixes, backward compatible
Build Locations
| Platform | Output |
|---|
| Linux | qtpass-x.y.z.tar.gz |
| macOS | QtPass-x.y.z.dmg |
| Windows | QtPass-Setup-x.y.z.exe |
CI/CD
Release workflow via GitHub Actions: .github/workflows/release-installers.yml
Linting
See qtpass-linting skill for full CI workflow. Pattern:
act push -W .github/workflows/linter.yml -j build
Protected Main Branch
main is protected - cannot push directly. Must create PR from a release branch:
git checkout -b release/vX.Y.Z
git add -A
git commit -m "Release vX.Y.Z"
git fetch upstream
git rebase upstream/main
git push origin release/vX.Y.Z --force-with-lease
gh pr create --base main --head release/vX.Y.Z --title "Release vX.Y.Z"
Script Best Practices
Dry Run Option
For scripts that modify remote state (uploading releases, signing files), add a --dryrun flag to enable testing without making changes:
dryrun=false
while [ $# -gt 0 ]; do
case "$1" in
--dryrun)
dryrun=true
shift
;;
*)
break
;;
esac
done
if [ "$dryrun" = true ]; then
echo "[dryrun] Would upload files: ${files[*]}"
else
gh release upload ...
fi
Glob Handling
When iterating over files matched by a glob pattern, use array assignment to handle the case where no files match:
for file in *; do
[ -f "$file" ] || continue
files=(*)
for file in "${files[@]}"; do
[ -f "$file" ] || continue