The version is defined in the top-level `CMakeLists.txt` (`project(cppduals VERSION X.Y.Z ...)`). GitLab CI (`.gitlab-ci.yml`) handles tagging, packaging, and release creation automatically:
The version is defined in the top-level `CMakeLists.txt` (`project(cppduals VERSION X.Y.Z ...)`). GitLab CI (`.gitlab-ci.yml`) handles packaging and release creation automatically when a tag is pushed:
-**auto-tag** stage: when a commit lands on master, reads the version from `CMakeLists.txt` and creates a `vX.Y.Z` tag if it doesn't already exist
-**upload** stage: on tag push, creates a header-only tarball and publishes it to the GitLab package registry
-**release** stage: on tag push, creates a GitLab release linked to the package
-**upload** stage: creates a header-only tarball and publishes it to the GitLab package registry
-**release** stage: creates a GitLab release linked to the package
To cut a new release, just bump the version in `CMakeLists.txt` and merge to master — CI does the rest:
To cut a new release:
```bash
# 1. Update the VERSION in CMakeLists.txt
# project(cppduals VERSION 0.7.1 ...)
# 2. Commit and merge to master — CI auto-tags and releases
git commit -am"Bump version to 0.7.1"
git push origin master
# 2. Commit the version bump and merge to master
# 3. Tag and push — CI does the rest
git tag v0.7.1
git push origin v0.7.1
```
**IMPORTANT:** After merging an MR that bumps the version, you must manually push a tag matching `vX.Y.Z` to trigger the release pipeline. The tag name must match the version in `CMakeLists.txt`.