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:
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:
-**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
-**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
To cut a new release:
To cut a new release, just bump the version in `CMakeLists.txt` and merge to master — CI does the rest:
```bash
# 1. Update the VERSION in CMakeLists.txt
# project(cppduals VERSION 0.6.4 ...)
# project(cppduals VERSION 0.7.1 ...)
# 2. Commit the version bump
git commit -am"Bump version to 0.6.4"
# 3. Tag and push — CI does the rest
git tag v0.6.4
git push origin master --tags
# 2. Commit and merge to master — CI auto-tags and releases
git commit -am"Bump version to 0.7.1"
git push origin master
```
The tag name must match the format `vX.Y.Z` (e.g. `v0.6.4`). CI uses `$CI_COMMIT_TAG` to derive the package version.