Repository navigation
Releases
This document describes the release process, versioning strategy, branching model, tagging conventions, and hotfix workflow for this project.
main is the primary development branch and always contains the next version under development.
Examples:
| Branch | Purpose |
|---|---|
main |
Ongoing development |
release/1.0 |
Stabilization and maintenance of the 1.0 release line |
release/1.1 |
Stabilization and maintenance of the 1.1 release line |
The app follows Semantic Versioning:
MAJOR.MINOR.PATCH
Examples:
1.0.0
1.0.1
1.1.0
2.0.0
The version shown in Xcode and App Store Connect uses the full semantic version.
Examples:
| Release | Version |
|---|---|
| Initial Release | 1.0.0 |
| Bug Fix Release | 1.0.1 |
| Feature Release | 1.1.0 |
| Major Release | 2.0.0 |
| Change Type | Example |
|---|---|
| New features | 1.0.0 → 1.1.0 |
| Bug fixes | 1.0.0 → 1.0.1 |
| Breaking changes | 1.0.0 → 2.0.0 |
Build numbers are managed automatically by Xcode Cloud.
Examples:
| Version | Build |
|---|---|
| 1.0.0 | 1024 |
| 1.0.0 | 1025 |
| 1.0.0 | 1026 |
| 1.0.1 | 1030 |
Requirements:
- Build numbers must always increase.
- Multiple builds may exist for the same version.
- Only one build is ultimately released.
Release branches are created when development for a release is complete and the app enters stabilization.
Format:
release/<major>.<minor>
Examples:
release/1.0
release/1.1
release/2.0
Release branches may contain:
- Bug fixes
- App Store review fixes
- Localization updates
- Release-specific changes
Release branches should not contain:
- New features
- Large refactors
- Experimental work
Create a release branch from main.
git checkout main
git pull
git checkout -b release/1.0
git push -u origin release/1.0Update the app version in Xcode.
Example:
1.0.0
Commit the version update.
git add .
git commit -m "Prepare 1.0.0 release"
git pushPush changes to the release branch.
Xcode Cloud will:
- Build the app
- Run tests
- Upload to TestFlight
- Prepare App Store submission
Submit the desired build for review.
During review:
- Fix review issues on the release branch.
- Create additional builds as needed.
- Do not merge new features into the release branch.
After approval (or immediately before release), tag the exact commit that ships.
git checkout release/1.0
git tag v1.0.0
git push origin v1.0.0Tags represent shipped releases.
Examples:
v1.0.0
v1.0.1
v1.1.0
Create a GitHub Release using the newly created tag.
GitHub → Releases → Draft a new release
Use:
Tag: v1.0.0
Title: v1.0.0
Add release notes describing user-facing changes.
## What's Changed
- Added onboarding flow
- Improved performance of photo uploads
- Fixed login issue affecting some usersAfter release:
git checkout main
git merge release/1.0
git push origin mainThis ensures any release fixes are preserved.
Continue development on main.
Example:
Current Release: 1.0.0
Next Development Version: 1.1.0
Hotfixes are created when a production issue must be fixed after release.
Current production version:
1.0.0
A critical issue is discovered.
git checkout release/1.0
git checkout -b hotfix/1.0.1Apply the fix.
Update version:
1.0.1
Push and submit for review.
After approval:
git tag v1.0.1
git push origin v1.0.1git checkout main
git merge hotfix/1.0.1
git push origin mainTags identify exactly what was released.
Format:
v<major>.<minor>.<patch>
Examples:
v1.0.0
v1.0.1
v1.1.0
v2.0.0
Rules:
- Every App Store release gets a tag.
- Tags are created after approval.
- Tags point to the exact commit that shipped.
Release workflows should trigger on:
release/*
Examples:
| Branch | Action |
|---|---|
main |
Development builds |
release/* |
TestFlight / App Store builds |
This allows any release branch to automatically generate release candidates.
main
└── release/1.0
└── v1.0.0
release/1.0
└── v1.0.1
main
└── release/1.1
└── v1.1.0
| Item | Convention |
|---|---|
| Development Branch | main |
| Release Branch | release/<major>.<minor> |
| App Version | 1.0.0 |
| Build Number | Xcode Cloud-generated |
| Release Tag | v1.0.0 |
| Tag Timing | After approval |
| Hotfix Branch | hotfix/<version> |
Release branches represent a release line, while tags represent the exact versions that ship to customers.