New versioning

This commit is contained in:
Edward Firmo
2024-12-21 10:17:32 +01:00
parent ee8ff66add
commit 35bf4bc0ec
5 changed files with 142 additions and 6 deletions

55
versioning/README.md Normal file
View File

@@ -0,0 +1,55 @@
# Versioning
## Overview
This project uses a time-based versioning scheme: `year.month.sequential_number`.
This scheme makes it easy to identify when a version was released and provides a clear order for releases within a given month.
### Examples
- `2024.12.01` First release of December 2024.
- `2024.12.02` Second release of December 2024.
- `2025.01.01` First release of January 2025.
## Files
- **`VERSION`**: Contains the current version of the project as plain text.
- **`bump_version.sh`**: A script to increment the version based on the current date and release sequence.
- **`README.md`**: Documentation for the versioning process.
## Versioning Rules
1. The version format is `YYYY.MM.NN`, where:
- `YYYY` is the current year.
- `MM` is the current month (two digits).
- `NN` is the sequential release number within the month (starting at `01`).
2. On each new merge to the `main` branch:
- If the month hasnt changed, the sequential number (`NN`) is incremented.
- If the month has changed, the sequential number resets to `01`.
## Usage
### Automatically Managed
The versioning process is fully integrated into the workflow. Developers do not need to manually increment or manage versions.
Simply push your changes, and the system will handle version updates and tagging automatically.
### Access Version in Code
The version is accessible in the ESPHome YAML configuration file (`TX-Ultimate-Easy-ESPHome_core.yaml`) using the following syntax:
```yaml
substitutions:
version: <<: !include ../versioning/VERSION
```
This ensures the correct version is used directly in the ESPHome setup without requiring manual updates.
## Benefits of this Versioning Approach
1. **Clarity**: Each version is tied to a specific point in time, making it easy to track releases.
2. **Automation**: The process is seamless and reduces manual effort.
3. **Scalability**: Supports frequent releases while keeping the versioning system organized.
4. **Traceability**: Git tags and the `VERSION` file ensure releases are well-documented and easily accessible.
## Extending the System
- Add more scripts to handle additional automation tasks, such as generating changelogs or notifying stakeholders of new releases.
- Enhance the `bump_version.sh` script to support different versioning schemes if needed.
- Integrate versioning information into your deployment pipelines to label builds with their corresponding version.
### GitHub Actions Workflow Adjustment
The GitHub Actions workflow for versioning runs only when changes are merged into the `main` branch, ensuring no premature version updates during PR creation.
This behavior is automatically handled by the integrated workflow.

View File

@@ -0,0 +1,39 @@
#!/bin/bash
VERSION_FILE="./versioning/VERSION"
VERSION_YAML_FILE="./versioning/VERSION_YAML"
# Read the current version
if [ -f "$VERSION_FILE" ]; then
CURRENT_VERSION=$(cat $VERSION_FILE)
else
CURRENT_VERSION="0.0.0" # Default if file doesn't exist
fi
# Extract components
CURRENT_YEAR=$(date +%Y)
CURRENT_MONTH=$(date +%m)
CURRENT_SEQ=$(echo "$CURRENT_VERSION" | awk -F. '{print $3}')
VERSION_YEAR=$(echo "$CURRENT_VERSION" | awk -F. '{print $1}')
VERSION_MONTH=$(echo "$CURRENT_VERSION" | awk -F. '{print $2}')
# Determine new version
if [[ "$CURRENT_YEAR" == "$VERSION_YEAR" && "$CURRENT_MONTH" == "$VERSION_MONTH" ]]; then
NEW_SEQ=$(printf "%02d" $((10#$CURRENT_SEQ + 1))) # Increment sequence
else
NEW_SEQ="01" # Reset sequence for a new month
fi
NEW_VERSION="${CURRENT_YEAR}.${CURRENT_MONTH}.${NEW_SEQ}"
# Update the plain text VERSION file
echo "$NEW_VERSION" > "$VERSION_FILE"
# Update the YAML VERSION_YAML file
echo "version: $NEW_VERSION" > "$VERSION_YAML_FILE"
# Commit and tag
git add "$VERSION_FILE" "$VERSION_YAML_FILE"
git commit -m "Bump version to $NEW_VERSION"
git tag "v$NEW_VERSION"