This document outlines the standardized release process for llmcpp to ensure safe, reproducible, and reviewed releases.
The release process follows a structured workflow to guarantee that:
- All code in a release is properly reviewed and merged to
main - Version bumps are tracked and reviewed
- Releases are always built from the
mainbranch - Release artifacts are consistent and reproducible
- All feature work is complete and merged to
main - CI is passing on
main - You have the necessary permissions to create tags and releases
Ensure all features for this release are complete:
- Develop features on separate branches
- Open PRs to
mainand merge after review - Verify CI passes on
main
From main, create a new branch for the release:
git checkout main
git pull origin main
git checkout -b release/v1.0.4 # Replace with your versionOn the release branch, use the release script to bump the version:
# For patch releases (1.0.3 -> 1.0.4)
./scripts/release.sh patch
# For minor releases (1.0.3 -> 1.1.0)
./scripts/release.sh minor
# For major releases (1.0.3 -> 2.0.0)
./scripts/release.sh major
# For custom versions
./scripts/release.sh custom 1.0.4The script will:
- Update version in
CMakeLists.txtandvcpkg.json - Create a commit with the version changes
- Push the branch to origin
- Create and push a tag (optional - you can cancel this)
Create a Pull Request from your release branch to main:
- Ensure the PR only contains version bump changes
- Add a description explaining what's being released
- Wait for CI to pass
After review and CI pass:
- Merge the PR into
main - Delete the release branch
On main, create and push the release tag:
git checkout main
git pull origin main
git tag v1.0.4 # Replace with your version
git push origin v1.0.4This triggers the release pipeline which:
- Builds and tests on all platforms (Windows, macOS, Linux)
- Generates changelog and release notes
- Creates release artifacts (.tar.gz, .zip)
- Publishes to GitHub Releases
Follow Semantic Versioning:
- MAJOR version for incompatible API changes
- MINOR version for backwards-compatible functionality additions
- PATCH version for backwards-compatible bug fixes
For testing releases, use pre-release suffixes:
1.0.4-rc1(Release Candidate)1.0.4-alpha.1(Alpha)1.0.4-beta.1(Beta)
- Always create release tags from
main - The release pipeline will fail if the tag is not on
main - This ensures releases always match the main branch code
The release pipeline includes version validation:
- Tag version must be newer than the current version in
CMakeLists.txt - This prevents accidental releases of older versions
- Use the release script to properly bump versions
Each release includes:
- Source code archives
- Pre-built binaries for all supported platforms
- Generated changelog and release notes
- CMake package configuration files
If the release pipeline fails:
- Check the logs for specific error messages
- Verify version consistency between tag and
CMakeLists.txt - Ensure the tag is on
main - Check that all dependencies are available
If you get a version mismatch error:
- Ensure you used the release script to bump the version
- Verify the tag version is newer than the current version
- Check that the version bump PR was merged to
main
If you need to create a release manually:
- Follow the same workflow steps
- Ensure all version files are updated
- Create the tag from
main - Monitor the release pipeline
The release process is partially automated:
scripts/release.sh- Version bumping and taggingscripts/update-changelog.py- Changelog generation- GitHub Actions - Build, test, and package releases
Future improvements may include:
- Automated PR creation for version bumps
- Automated release notes generation
- Integration with issue tracking systems
If you encounter issues with the release process:
- Check this documentation
- Review recent successful releases
- Check the GitHub Actions logs
- Open an issue for persistent problems