This document covers the release procedures for core WLAN Pi team members. For general contribution guidelines and detailed Git workflow, see Contributing.
For Git workflow details: Branching strategy, merge strategies, and troubleshooting common scenarios are covered in Contributing.
main is the only long-lived development branch. A release is a pull request into main
that sets the version. Follow Land a Fix and Cut a Release.
Today, that merge uploads the package to Packagecloud wlanpi/dev. Promotion to wlanpi/main is still manual. The planned CI is not live yet. When it is, a final version with no ~ uploads to wlanpi/main and is tagged v<version>, with no manual promote.
General branching strategy. May vary per repo.
| Branch | Purpose |
|---|---|
main |
Only long-lived development branch; PRs target it |
debian/bookworm, debian/bullseye |
Hotfix to an old release only |
feature/<desc> |
Shared long-term feature work |
fix/<desc> |
Bug fix branches |
chore/<desc>, docs/<desc>, ci/<desc> |
Non-feature maintenance |
security/<desc> |
Security fixes |
hotfix/<desc> |
Urgent fixes against main |
release/<version> |
Version bump for a release |
debian/bookwormanddebian/bullseyeexist only for a hotfix to an old release. A hotfix uses that branch and that suite's Python. Bookworm is 3.11. Bullseye is 3.9.
- No direct commits to
main- All changes come via PRs from feature, fix, or release branches
See Contributing for detailed workflow, including:
- Feature branch workflow and keeping branches in sync
- Merge strategy (squash merge into
main) - A fix branch carries no version (Land a Fix and Cut a Release)
- Branch divergence recovery
Ensure all intended changes are merged to main, then create a release branch
from it:
git checkout main
git pull origin main
git checkout -b release/1.2.3Follow Publish a Release. Use dch -v <version> with no Debian revision, then dch -a once per subject, then dch -r "". Do not use dch -i while the changelog still has a Debian revision. Set __version__.py to the same major.minor.patch (see Version gate and Source Format and Version).
Push the branch and open a PR against main. Merge it with Squash and
merge once CI passes.
The debian/changelog change reaching main triggers the
deployment workflow. Pushing the version tag does not trigger it.
- Package is built automatically with
sbuild. The.debversion is the changelog version. - Uploaded to wlanpi/dev. Packagecloud
receives that
.debunchanged. - Test the package
- After that test, ask a maintainer with Packagecloud access to copy the
package from
wlanpi/devtowlanpi/main. See Deploy to Packagecloud.
The ~gha<UTC timestamp> suffix is only on the GitHub Actions artifact
name, not on the package version. sbuild-pkg and sbuild-deploy-pkg set
the artifact name to
<package>_<changelog version>~gha<YYYYMMDD>t<HHMMSS>+<arch>_<distro>
(the timestamp is date -u +'%Y%m%dt%H%M%S'). The file inside the artifact,
and the file pushed to Packagecloud, keep the changelog version. For
changelog 1.2.3 the Packagecloud filename is wlanpi-yourapp_1.2.3_arm64.deb.
If the repo's deploy workflow calls tag-release from
gh-workflows, skip this step. After
the upload, CI tags the deployed commit as v<version>. For a native
package 1.2.3 the tag is v1.2.3. tag-release strips an epoch and a
Debian revision if one is still present, so a quilt version 1.2.3-1 is
also tagged v1.2.3.
Otherwise, after the deploy succeeds, tag the merge commit on main with an
annotated tag:
git checkout main
git pull origin main
git tag -a v1.2.3 -m "Release version 1.2.3"
git push origin v1.2.3Application deploy workflows call tag-release. See
Standards. pi-gen and wlanpi-kernel follow
Scope.
Triggered by: Changes that affect build output in PRs (most repos watch
debian/changelog; some ignore docs-only changes)
Purpose: Build packages for testing without deploying
Use this to verify builds work before tagging.
Triggered by: A debian/changelog change pushed to main.
Purpose: Builds the package and deploys it to the Packagecloud dev repository
Maintained by:
- Build logic: sbuild-debian-package
- Reusable workflow files: gh-workflows
(
sbuild-pkg,sbuild-deploy-pkg,check-py-deb-pkg-versions-match,get-formatted-version-string,tag-release) - Workflow files in each repo, which call the reusable workflows above
Promotion from Packagecloud wlanpi/dev to wlanpi/main is still a manual step.
Deploy workflows upload to wlanpi/dev. An upload to wlanpi/main when the
release pull request merges is planned. See
REPOS.md and Publish a Release.
Deploy workflows for Python repos call
check-py-deb-pkg-versions-match. The build fails unless debian/changelog
and the package's __version__.py have the same major.minor.patch and the
same pre-release (a, b, or rc and its number). Spellings are normalized,
so 1.1.0~beta3-1 matches 1.1.0b3. The Debian revision, ~dev snapshots,
and .postN are not compared. Bump both files together. See
Style/Workflow.
Every repository should run the shared lint gate:
shellcheckover tracked shell scripts and shell-shebang executablesactionlintover.github/workflows/
The canonical implementation is
wlanpi-common/.github/workflows/lint.yml.
New repositories should copy it as .github/workflows/lint.yml.
Build and Archive:
Deploy to Packagecloud:
When merging external contributions, use "Squash and merge" by default:
- Review the commit messages in the PR
- Clean up any "fix typo", "address feedback" commits
- Ensure the final commit message is descriptive
- Click "Squash and merge"
This keeps the git history clean and readable.
Use "Create a merge commit" when:
- The PR contains logically separate commits that should be preserved
- The contributor specifically requests commits be preserved (and there's good reason)
See Contributing for detailed merge strategy guidance.
If you need to replace a tag (only before pushing):
git tag -d v1.2.3
git push origin :refs/tags/v1.2.3
git tag -a v1.2.3 -m "Release version 1.2.3"
git push origin v1.2.3Check the GitHub Actions logs for:
- Missing dependencies in
debian/control - Syntax errors in
debian/rules - Missing files in
debian/install
Contact Josh Schmelzle for Packagecloud issues.
- Contributing - General contribution guidelines and detailed Git workflow
- Packaging Example - Packaging walkthrough
- Architecture/Packaging - Detailed packaging standards

