🔧 New tool: gen-family - generate/view Happy Family keys - Supports --force flag to overwrite existing keys without backup prompt 🐳 Dockerfiles: gen-family in both Dockerfile and Dockerfile.edge 🔧 Entrypoint: - Phase 2: detect *.secret_family_key, log found keys (informational only) - Guard/exit config gen: append FamilyId + MyFamily from ENV vars - Bridge intentionally excluded 📊 Status tool: show family key count + Happy Family config state 📚 Docs: - README: Happy Family section (generate / import), persistence table, flowchart - ARCHITECTURE: all mermaid diagrams updated (Phase 2, config gen, tools, dirs) - TOOLS: full gen-family reference with examples and exit codes - DEPLOYMENT, MIGRATION, MIGRATION-V1.1.X, TROUBLESHOOTING: 5 -> 6 tools - FAQ, example configs: version bump + FamilyId/MyFamily placeholders - Directory authority voting: how 9 dirauths vote on relay flags (5/9 consensus) - CIISS v2 ContactInfo: field reference, generator link, proof:uri-rsa verification - All TOR_CONTACT_INFO examples updated to CIISS v2 format across templates and docs 📋 Templates: - Guard/exit/multi-relay compose: TOR_FAMILY_ID + TOR_MY_FAMILY env vars - All cosmos-compose + docker-compose versions -> 1.1.7 👷 CI: validate.yml gen-family in 8 spots (threshold 6), security tests, quick-test 🛡️ SECURITY.md: 1.1.7 active, 1.1.6 maintenance, gen-family in tools list 🔖 Version bump 1.1.6 -> 1.1.7 across 30+ files, tool count 5 -> 6, CHANGELOG entry No breaking changes. TOR_FAMILY_ID and TOR_MY_FAMILY are optional.
Release Automation Scripts
This directory contains automation scripts for managing releases, version updates, and release notes generation.
Overview
The release automation includes three main components:
- Auto-generate release notes from conventional commits
- Auto-update version numbers across all documentation
- SBOM generation (CycloneDX & SPDX) integrated into CI/CD
Scripts
generate-release-notes.sh
Auto-generate release notes from git commit history using conventional commit format.
Features:
- Parses conventional commits (feat, fix, docs, chore, etc.)
- Categorizes changes by type with emojis
- Detects breaking changes automatically
- Supports multiple output formats (markdown, github, plain)
- Falls back to all commits if no conventional commits found
Usage:
# Auto-detect previous version and generate notes
./scripts/release/generate-release-notes.sh 1.1.2
# Specify previous version explicitly
./scripts/release/generate-release-notes.sh 1.1.2 1.1.1
# Save to file
./scripts/release/generate-release-notes.sh -o RELEASE_NOTES.md 1.2.0
# GitHub format (used by CI)
./scripts/release/generate-release-notes.sh --format github 1.2.0
# Show only breaking changes
./scripts/release/generate-release-notes.sh --breaking-only 1.2.0
# Disable emojis
./scripts/release/generate-release-notes.sh --no-emoji 1.2.0
Conventional Commit Types:
| Type | Emoji | Description |
|---|---|---|
feat: |
✨ | New features |
fix: |
🐛 | Bug fixes |
docs: |
📚 | Documentation changes |
perf: |
⚡ | Performance improvements |
refactor: |
♻️ | Code refactoring |
test: |
✅ | Testing changes |
build: |
🏗️ | Build system changes |
ci: |
👷 | CI/CD changes |
chore: |
🔧 | Maintenance tasks |
style: |
💄 | Code style changes |
revert: |
⏪ | Reverts |
Breaking Changes:
Breaking changes are detected in two ways:
- Type suffix:
feat!:orfix!:(exclamation mark after type) - Body keyword:
BREAKING CHANGE:in commit body
Example Commits:
# Feature
git commit -m "feat: add migration assistant script"
# Bug fix
git commit -m "fix: resolve OBFS4V parsing issue with spaces"
# Breaking change (method 1)
git commit -m "feat!: remove legacy ENV variable support"
# Breaking change (method 2)
git commit -m "feat: redesign configuration system
BREAKING CHANGE: Old ENV variables are no longer supported.
Use TOR_* prefix instead."
# Documentation
git commit -m "docs: update README with migration guide"
# Multiple types in one commit
git commit -m "feat: add SBOM generation
- Generates CycloneDX and SPDX formats
- Integrates with CI/CD workflow
- Attaches to GitHub releases"
Output Example:
## 🧅 Tor Guard Relay v1.2.0
### ✨ Features
- Add migration assistant script (`a1b2c3d4`) by John Doe
- Add SBOM generation to CI/CD (`e5f6g7h8`) by Jane Smith
### 🐛 Bug Fixes
- Resolve OBFS4V parsing issue with spaces (`i9j0k1l2`) by John Doe
- Fix Mermaid diagram rendering in GitHub (`m3n4o5p6`) by Jane Smith
### 📚 Documentation
- Update README with migration guide (`q7r8s9t0`) by John Doe
- Add comprehensive FAQ (`u1v2w3x4`) by Jane Smith
---
**Full Changelog**: v1.1.1...v1.2.0
update-version.sh
Auto-update version numbers across all documentation, templates, and configuration files.
Features:
- Updates version in README.md (badges, examples)
- Updates CHANGELOG.md (adds new version header)
- Updates templates/*.yml (Docker Compose image tags)
- Updates templates/*.json (Cosmos Cloud templates)
- Updates docs/*.md (all documentation)
- Updates CLAUDE.md (project documentation)
- Creates backups by default (.bak files)
- Dry-run mode to preview changes
Usage:
# Update version (creates .bak backups)
./scripts/release/update-version.sh 1.1.2
# Preview changes without modifying files
./scripts/release/update-version.sh --dry-run 1.2.0
# Update without creating backups
./scripts/release/update-version.sh --no-backup 1.1.2
# Works with or without 'v' prefix
./scripts/release/update-version.sh v1.1.2
What Gets Updated:
-
README.md
- Version badges
- Docker image tags in examples
- Version references in text
-
CHANGELOG.md
- Adds new version header after
## [Unreleased]section - Format:
## [v1.1.2] - 2025-01-14
- Adds new version header after
-
templates/*.yml (Docker Compose)
image:tags fromonion-relay:1.1.6→onion-relay:1.1.7
-
templates/*.json (Cosmos Cloud)
"image":fields in JSON templates
-
docs/*.md (All documentation)
- Version references throughout docs
-
CLAUDE.md (Project instructions)
- Version references for Claude Code
Example Output:
ℹ Current version detected: 1.1.1
ℹ New version: 1.1.2
ℹ Updating README.md...
✅ Updated: README.md
ℹ Updating CHANGELOG.md...
✅ Added version 1.1.2 to CHANGELOG.md
ℹ Updating Docker Compose templates...
✅ Updated: templates/docker-compose-guard-env.yml
✅ Updated: templates/docker-compose-exit.yml
✅ Updated: templates/docker-compose-bridge.yml
...
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ Version Update Complete
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Current Version: 1.1.1
New Version: 1.1.2
Files Updated: 15
🔵 Backup files created with .bak extension
🔵 To restore: for f in *.bak; do mv "$f" "${f%.bak}"; done
Next Steps:
1. Review changes: git diff
2. Update CHANGELOG.md with release notes
3. Commit changes: git add -A && git commit -m "chore: bump version to 1.1.2"
4. Create tag: git tag -a v1.1.2 -m "Release v1.1.2"
5. Push: git push && git push --tags
Rollback:
If you need to undo changes:
# Restore from .bak files
for f in *.bak **/*.bak; do
[ -f "$f" ] && mv "$f" "${f%.bak}"
done
# Or use git to reset
git checkout -- .
CI/CD Integration
The release workflow (.github/workflows/release.yml) integrates all three automation components:
Automated SBOM Generation
When a release tag is pushed, the workflow automatically:
- Builds Docker image with multi-arch support (AMD64, ARM64)
- Generates SBOM in multiple formats:
- CycloneDX JSON (
sbom-cyclonedx-v1.1.2.json) - CycloneDX XML (
sbom-cyclonedx-v1.1.2.xml) - SPDX JSON (
sbom-spdx-v1.1.2.json) - SPDX tag-value (
sbom-spdx-v1.1.2.spdx) - Human-readable table (
sbom-table-v1.1.2.txt)
- CycloneDX JSON (
- Uploads SBOM as workflow artifacts (90-day retention)
- Attaches SBOM to GitHub release as downloadable assets
Automated Release Notes
The workflow generates release notes with this priority:
-
CHANGELOG.md (preferred)
- Extracts section for specific version
- Format:
## [v1.1.2] - 2025-01-14or## v1.1.2
-
Auto-generated from commits (fallback)
- Uses
generate-release-notes.shscript - Parses conventional commits
- Categorizes by type with emojis
- Uses
-
Simple commit list (last resort)
- Basic git log output
- Shows commit messages with hashes
Release Note Sections:
Every release includes:
- 📦 Changes (categorized by type)
- 🐳 Docker Images (pull commands for GHCR and Docker Hub)
- 📋 SBOM (links to downloadable SBOM files)
- 🔗 Full Changelog (compare link)
Release Workflow
Manual Release Process
For creating a new release manually:
# 1. Update version numbers across all files
./scripts/release/update-version.sh 1.2.0
# 2. Review changes
git diff
# 3. Generate release notes (optional, to preview)
./scripts/release/generate-release-notes.sh 1.2.0
# 4. Update CHANGELOG.md with detailed notes
vim CHANGELOG.md
# Add release notes under ## [v1.2.0] - 2025-01-14
# 5. Commit version bump
git add -A
git commit -m "chore: bump version to 1.2.0"
# 6. Create annotated tag
git tag -a v1.2.0 -m "Release v1.2.0"
# 7. Push to trigger release workflow
git push origin main
git push origin v1.2.0
# GitHub Actions will:
# - Build multi-arch Docker images
# - Generate SBOM files
# - Create GitHub release with notes
# - Attach SBOM to release
# - Push images to GHCR and Docker Hub
Automated Release (CI/CD)
The workflow triggers on:
-
Git tag push (
v*.*.*)- Full release with SBOM generation
- Release notes from CHANGELOG.md or auto-generated
- Updates
:latesttag
-
Weekly schedule (Sundays 18:30 UTC)
- Rebuilds last release with updated packages
- No release notes or SBOM (not a new release)
- Overwrites version tag with fresh build
-
Manual dispatch (workflow_dispatch)
- Test builds with version suffix
- Useful for testing release process
SBOM (Software Bill of Materials)
What is SBOM?
SBOM provides transparency about software components and dependencies:
- Security: Identify vulnerable packages quickly
- Compliance: Meet regulatory requirements (NTIA, EO 14028)
- Supply chain: Track third-party components
- Auditing: Know exactly what's in your container
SBOM Formats
CycloneDX (OWASP standard)
- JSON: Machine-readable, API-friendly
- XML: Enterprise tooling compatibility
SPDX (Linux Foundation standard)
- JSON: Modern, developer-friendly
- Tag-value: Traditional, widely supported
Table (Human-readable)
- Plain text listing of all packages
- Quick manual inspection
Using SBOM Files
Check for vulnerabilities:
# Download SBOM from GitHub release
wget https://github.com/r3bo0tbx1/test-0f376e81/releases/download/v1.1.2/sbom-cyclonedx-v1.1.2.json
# Scan with Grype
grype sbom:sbom-cyclonedx-v1.1.2.json
# Scan with Trivy
trivy sbom sbom-cyclonedx-v1.1.2.json
Integrate with security tools:
# Import into Dependency-Track
curl -X POST "https://dtrack.example.com/api/v1/bom" \
-H "X-Api-Key: $API_KEY" \
-F "bom=@sbom-cyclonedx-v1.1.2.json"
# Analyze with Syft
syft sbom-cyclonedx-v1.1.2.json
# View package list
jq '.components[] | {name, version, type}' sbom-cyclonedx-v1.1.2.json
Example SBOM Content:
{
"bomFormat": "CycloneDX",
"specVersion": "1.4",
"version": 1,
"metadata": {
"component": {
"type": "container",
"name": "onion-relay",
"version": "1.1.2"
}
},
"components": [
{
"type": "library",
"name": "alpine-baselayout",
"version": "3.4.3-r2",
"purl": "pkg:apk/alpine/alpine-baselayout@3.4.3-r2"
},
{
"type": "library",
"name": "tor",
"version": "0.4.8.10-r0",
"purl": "pkg:apk/alpine/tor@0.4.8.10-r0"
}
]
}
Best Practices
Conventional Commits
Follow the Conventional Commits specification:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
Benefits:
- Automated changelog generation
- Semantic versioning hints
- Better commit history readability
- Easier rollback and debugging
Version Numbering
Follow Semantic Versioning (SemVer):
- MAJOR (1.0.0 → 2.0.0): Breaking changes
- MINOR (1.1.0 → 1.2.0): New features (backward compatible)
- PATCH (1.1.1 → 1.1.2): Bug fixes (backward compatible)
Examples:
feat!: remove old ENV variables→ MAJOR bumpfeat: add migration script→ MINOR bumpfix: resolve parsing error→ PATCH bump
CHANGELOG.md Format
Use Keep a Changelog format:
# Changelog
All notable changes to this project will be documented in this file.
## [Unreleased]
## [v1.2.0] - 2025-01-14
### Added
- Migration assistant script for official Tor bridge image migration
- SBOM generation in CI/CD workflow
- Auto-generated release notes from conventional commits
### Changed
- Updated release workflow with SBOM integration
- Improved release notes generation with fallback mechanism
### Fixed
- OBFS4V parsing issue with values containing spaces
- Mermaid diagram rendering on GitHub
## [v1.1.1] - 2025-01-10
### Fixed
- Busybox compatibility in OBFS4V validation
- Numeric sanitization in diagnostic tools
Troubleshooting
Release Notes Not Generating
Problem: Auto-generation finds no commits
Solution:
# Check git history
git log --oneline
# Verify previous tag exists
git describe --tags --abbrev=0
# Specify previous version explicitly
./scripts/release/generate-release-notes.sh 1.1.2 1.1.1
Version Update Missing Files
Problem: Not all files were updated
Solution:
# Check what current version was detected
./scripts/release/update-version.sh --dry-run 1.1.2
# Search for old version manually
grep -r "1.1.1" . --exclude-dir=.git
# Update manually missed files
sed -i 's/1.1.1/1.1.2/g' path/to/file
SBOM Generation Fails
Problem: Syft can't access image
Solution:
# Ensure image exists locally or in registry
docker pull ghcr.io/r3bo0tbx1/onion-relay:1.1.7
# Generate SBOM locally for testing
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
anchore/syft:latest \
ghcr.io/r3bo0tbx1/onion-relay:1.1.7 \
-o cyclonedx-json
Workflow Permission Errors
Problem: Resource not accessible by integration
Solution: Ensure workflow has correct permissions:
permissions:
contents: write # Create releases
packages: write # Push to GHCR
security-events: write # Upload SARIF
Additional Resources
- Conventional Commits: https://www.conventionalcommits.org/
- Semantic Versioning: https://semver.org/
- Keep a Changelog: https://keepachangelog.com/
- CycloneDX: https://cyclonedx.org/
- SPDX: https://spdx.dev/
- NTIA SBOM: https://www.ntia.gov/sbom
Contributing
When adding new release automation features:
- Update this README with usage examples
- Add tests for new functionality
- Update
.github/workflows/release.ymlif needed - Follow existing script patterns (POSIX sh, color output, error handling)
- Document all environment variables and options