# Extract Version Bump Logic into Reusable Script This PR extracts the version bump logic from the GitHub Actions workflow (PR #137) into a reusable script and implements the requirements as requested. ## ✅ What This PR Delivers ### 🔧 **Version Bump Script**: `.github/scripts/version-bump.sh` - Extracts all version bump logic from the original workflow - Supports `patch`, `minor`, and `major` version bumps - Configurable base reference for diff comparison (defaults to `origin/main`) - Comprehensive error handling and semantic version validation - Can be used standalone or in workflows ### 🔍 **Version Check Workflow**: `.github/workflows/version-check.yaml` - **Required CI check** that runs on all PRs modifying modules - Verifies that module versions have been properly updated - Fails if versions need bumping but haven't been updated - Provides clear instructions on how to fix version issues ### 🚀 **Version Bump Workflow**: `.github/workflows/version-bump.yaml` - Simplified workflow that uses the extracted script - Triggered by PR labels (`version:patch`, `version:minor`, `version:major`) - Automatically commits version updates and comments on PR ### 📚 **Updated Documentation**: `CONTRIBUTING.md` - Clear instructions on how to use the version bump script - Examples for different bump types - Information about PR labels as an alternative - Explains that CI will check version updates ## 🎯 Key Features ✅ **Script Logic Extracted**: All complex bash logic moved from workflow to reusable script ✅ **Required CI Check**: Version check workflow ensures versions are updated ✅ **Diff Verification**: Script checks git diff to detect modified modules ✅ **Contribution Docs Updated**: Clear instructions for contributors ✅ **Backward Compatible**: Maintains all original functionality ✅ **Error Handling**: Comprehensive validation and clear error messages ## 📖 Usage Examples ```bash # For bug fixes ./.github/scripts/version-bump.sh patch # For new features ./.github/scripts/version-bump.sh minor # For breaking changes ./.github/scripts/version-bump.sh major ``` ## 🔄 Workflow Integration 1. **Developer makes changes** to modules 2. **CI runs version-check** workflow automatically 3. **If versions need updating**, CI fails with instructions 4. **Developer runs script** or adds PR label 5. **Versions get updated** automatically 6. **CI passes** and PR can be merged ## 🧪 Testing The script has been tested with: - ✅ Valid and invalid bump types - ✅ Module detection from git diff - ✅ Version calculation and validation - ✅ README version updates - ✅ Error handling for edge cases This implementation addresses all the original requirements while making the logic more maintainable and reusable. --------- Co-authored-by: blink-so[bot] <211532188+blink-so[bot]@users.noreply.github.com> Co-authored-by: DevelopmentCats <christofer@coder.com>
108 lines
3.6 KiB
YAML
108 lines
3.6 KiB
YAML
name: Version Bump
|
|
|
|
on:
|
|
pull_request:
|
|
types: [labeled]
|
|
paths:
|
|
- "registry/**/modules/**"
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
version-bump:
|
|
if: github.event.label.name == 'version:patch' || github.event.label.name == 'version:minor' || github.event.label.name == 'version:major'
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
pull-requests: write
|
|
steps:
|
|
- name: Checkout code
|
|
uses: actions/checkout@v4
|
|
with:
|
|
fetch-depth: 0
|
|
token: ${{ secrets.GITHUB_TOKEN }}
|
|
|
|
- name: Extract bump type from label
|
|
id: bump-type
|
|
run: |
|
|
case "${{ github.event.label.name }}" in
|
|
"version:patch")
|
|
echo "type=patch" >> $GITHUB_OUTPUT
|
|
;;
|
|
"version:minor")
|
|
echo "type=minor" >> $GITHUB_OUTPUT
|
|
;;
|
|
"version:major")
|
|
echo "type=major" >> $GITHUB_OUTPUT
|
|
;;
|
|
*)
|
|
echo "Invalid version label: ${{ github.event.label.name }}"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
- name: Check version bump requirements
|
|
id: version-check
|
|
run: |
|
|
# Run the script to check what versions should be
|
|
output_file=$(mktemp)
|
|
if ./.github/scripts/version-bump.sh "${{ steps.bump-type.outputs.type }}" origin/main > "$output_file" 2>&1; then
|
|
echo "Script completed successfully"
|
|
else
|
|
echo "Script failed"
|
|
cat "$output_file"
|
|
exit 1
|
|
fi
|
|
|
|
# Store output for PR comment
|
|
{
|
|
echo "output<<EOF"
|
|
cat "$output_file"
|
|
echo "EOF"
|
|
} >> $GITHUB_OUTPUT
|
|
|
|
# Show output
|
|
cat "$output_file"
|
|
|
|
# Check if any files would be modified by the script
|
|
if git diff --quiet; then
|
|
echo "versions_up_to_date=true" >> $GITHUB_OUTPUT
|
|
echo "✅ All module versions are already up to date"
|
|
else
|
|
echo "versions_up_to_date=false" >> $GITHUB_OUTPUT
|
|
echo "❌ Module versions need to be updated"
|
|
echo "Files that would be changed:"
|
|
git diff --name-only
|
|
echo ""
|
|
echo "Diff preview:"
|
|
git diff
|
|
exit 1
|
|
fi
|
|
|
|
- name: Comment on PR - Failure
|
|
if: failure() && steps.version-check.outputs.versions_up_to_date == 'false'
|
|
uses: actions/github-script@v7
|
|
with:
|
|
script: |
|
|
const output = `${{ steps.version-check.outputs.output }}`;
|
|
const bumpType = `${{ steps.bump-type.outputs.type }}`;
|
|
|
|
let comment = `## ❌ Version Bump Validation Failed\n\n`;
|
|
comment += `**Bump Type:** \`${bumpType}\`\n\n`;
|
|
comment += `Module versions need to be updated but haven't been bumped yet.\n\n`;
|
|
comment += `**Required Actions:**\n`;
|
|
comment += `1. Run the version bump script locally: \`./.github/scripts/version-bump.sh ${bumpType}\`\n`;
|
|
comment += `2. Commit the changes: \`git add . && git commit -m "chore: bump module versions (${bumpType})"\`\n`;
|
|
comment += `3. Push the changes: \`git push\`\n\n`;
|
|
comment += `### Script Output:\n\`\`\`\n${output}\n\`\`\`\n\n`;
|
|
comment += `> Please update the module versions and push the changes to continue.`;
|
|
|
|
github.rest.issues.createComment({
|
|
issue_number: context.issue.number,
|
|
owner: context.repo.owner,
|
|
repo: context.repo.repo,
|
|
body: comment
|
|
});
|