towerops-agent/VERSION_FIX.md

152 lines
3.8 KiB
Markdown

# Agent Version Update Fix
## Problem
The agent's version checking wasn't working properly because:
1. **Cargo.toml** had hardcoded version `0.1.0`
2. **Binary** had `0.1.0` baked in at compile time via `env!("CARGO_PKG_VERSION")`
3. **Docker images** were tagged with Cargo.toml version
4. **Git tags** (for releases) used different versions than Cargo.toml
5. Result: Version mismatch between binary version and actual Docker image tag
## Solution
Implemented **dynamic version injection** via `build.rs`:
### How It Works
1. **During Build** (`build.rs`):
- Checks if building from a git tag → use tag version (e.g., `v0.2.0``0.2.0`)
- Checks commit hash → use Cargo version + hash (e.g., `0.1.0-831588e`)
- Fallback → use Cargo.toml version (`0.1.0`)
- Injects version as `BUILD_VERSION` env var
2. **In Code** (`version.rs`):
- Uses `BUILD_VERSION` if available
- Falls back to `CARGO_PKG_VERSION`
- Version computed at runtime (not compile-time const)
### Version Formats
| Build Context | Version Format | Example |
|---------------|----------------|---------|
| Git tag (release) | `X.Y.Z` (stripped 'v') | `0.2.0` |
| Dev build | `X.Y.Z-HASH` | `0.1.0-831588e` |
| No git | `X.Y.Z` | `0.1.0` |
### CI/CD Integration
**For Main Branch** (`.gitlab-ci.yml` line 71):
```bash
VERSION=$(grep '^version = ' Cargo.toml | head -1 | sed 's/version = "\(.*\)"/\1/')
# Tags: gmcintire/towerops-agent:0.1.0, :latest
```
**For Git Tags** (`.gitlab-ci.yml` line 104):
```bash
VERSION=${CI_COMMIT_TAG#v} # Strips 'v' prefix
# Tags: gmcintire/towerops-agent:0.2.0, :v0.2.0, :latest
```
**Binary Version** (via `build.rs`):
- On tag: Uses git tag → `0.2.0`
- On main: Uses Cargo.toml → `0.1.0`
- Both match their Docker image tags!
## Testing
### Local Development
```bash
# Build shows version with commit hash
cargo build --release
# Binary reports: 0.1.0-831588e
# (if not on a tag)
```
### After Git Tag
```bash
# Create tag
git tag v0.2.0
# Build
cargo build --release
# Binary reports: 0.2.0
# Matches Docker image: gmcintire/towerops-agent:0.2.0
```
### Version Check
```bash
# Run agent (will check Docker Hub on startup)
cargo run -- --api-url http://localhost:4000 --token <token>
# Logs should show:
# Current version: 0.1.0-831588e
# ✓ Running latest version (or newer available)
```
## Deployment Workflow
### Releasing New Version
1. **Update Cargo.toml version**:
```toml
[package]
version = "0.2.0" # <-- Update this
```
2. **Commit and tag**:
```bash
git add Cargo.toml
git commit -m "chore: bump version to 0.2.0"
git tag v0.2.0
git push origin main --tags
```
3. **CI automatically**:
- Builds Docker image
- Binary has version `0.2.0` (from git tag)
- Tags image as `:0.2.0` and `:latest`
4. **Agent detects update**:
- Queries Docker Hub tags
- Finds `0.2.0` > current version
- Pulls new image and restarts
### Version Bumping Strategy
Use semantic versioning:
- **Patch** (0.1.0 → 0.1.1): Bug fixes
- **Minor** (0.1.0 → 0.2.0): New features
- **Major** (0.1.0 → 1.0.0): Breaking changes
Always bump Cargo.toml **before** creating git tag.
## Files Modified
1. **`build.rs`** - Added version injection logic
2. **`src/version.rs`** - Changed to use BUILD_VERSION
3. **`.gitlab-ci.yml`** - Already correct (no changes needed)
## Benefits
✅ Binary version matches Docker image tag
✅ Auto-updates work correctly
✅ Dev builds show commit hash
✅ Release builds show clean version
✅ No manual version syncing needed
## Next Steps
1. **Bump version to 0.2.0** when ready for next release
2. **Create git tag** (`git tag v0.2.0`)
3. **Push tag** → CI builds and publishes
4. **Deployed agents** detect and auto-update
---
**Status**: ✅ Fixed
**Date**: January 16, 2026
**Issue**: Version checking now works correctly with git-based versioning