Browse Source

feat: add automatic version bumping to CI/CD workflow

Auto Version Bump:
- Automatically bumps version when PRs are merged to main
- Detects version bump type from commit message:
  - feat: → minor bump (v0.1.0 → v0.2.0)
  - fix: → patch bump (v0.1.0 → v0.1.1)
  - feat!: → major bump (v0.1.0 → v1.0.0)
  - [alpha] → alpha bump (v0.1.0-alpha.1 → v0.1.0-alpha.2)
  - [beta] → beta bump
  - [rc] → rc bump
  - default → minor bump (if no type specified)

Automatic Actions:
- Updates VERSION file
- Updates package.json version
- Updates CHANGELOG.md with commit message
- Creates git tag (e.g., v0.2.0)
- Pushes changes back to main
- Adds [skip ci] to prevent infinite loop

Documentation:
- Added VERSION_BUMP_GUIDE.md with examples
- Clear commit message format guidelines
- Manual override instructions

Benefits:
- No manual version bumping needed
- Consistent versioning across the project
- Automatic changelog updates
- Git tags for every release
- Follows semantic versioning conventions
darrenhinde 4 months ago
parent
commit
9c68f9d8be
2 changed files with 186 additions and 0 deletions
  1. 84 0
      .github/workflows/VERSION_BUMP_GUIDE.md
  2. 102 0
      .github/workflows/test-agents.yml

+ 84 - 0
.github/workflows/VERSION_BUMP_GUIDE.md

@@ -0,0 +1,84 @@
+# Version Bump Guide
+
+This workflow automatically bumps versions when PRs are merged to main.
+
+## How It Works
+
+When you merge a PR to main, the version is automatically bumped based on your commit message:
+
+### Commit Message Format
+
+Use conventional commits to control version bumping:
+
+| Commit Message | Version Bump | Example |
+|----------------|--------------|---------|
+| `feat: add feature` | **Minor** | v0.1.0 → v0.2.0 |
+| `feat!: breaking change` | **Major** | v0.1.0 → v1.0.0 |
+| `fix: bug fix` | **Patch** | v0.1.0 → v0.1.1 |
+| `[alpha] message` | **Alpha** | v0.1.0-alpha.1 → v0.1.0-alpha.2 |
+| `[beta] message` | **Beta** | v0.1.0-beta.1 → v0.1.0-beta.2 |
+| `[rc] message` | **RC** | v0.1.0-rc.1 → v0.1.0-rc.2 |
+| Any other message | **Minor** (default) | v0.1.0 → v0.2.0 |
+
+### Examples
+
+```bash
+# Feature (minor bump)
+git commit -m "feat: add new agent capability"
+# Result: v0.1.0 → v0.2.0
+
+# Bug fix (patch bump)
+git commit -m "fix: correct context loading"
+# Result: v0.1.0 → v0.1.1
+
+# Breaking change (major bump)
+git commit -m "feat!: redesign agent API"
+# Result: v0.1.0 → v1.0.0
+
+# Alpha release
+git commit -m "[alpha] improve prompt"
+# Result: v0.1.0-alpha.1 → v0.1.0-alpha.2
+
+# Default (minor bump)
+git commit -m "improve documentation"
+# Result: v0.1.0 → v0.2.0
+```
+
+## What Happens Automatically
+
+1. ✅ Tests run (smoke tests for both agents)
+2. ✅ Version is bumped based on commit message
+3. ✅ CHANGELOG.md is updated with changes
+4. ✅ Git tag is created (e.g., v0.2.0)
+5. ✅ Changes are pushed back to main
+6. ✅ GitHub release can be created (optional)
+
+## Manual Override
+
+If you want to bump version manually:
+
+```bash
+# Bump specific version type
+npm run version:bump alpha
+npm run version:bump beta
+npm run version:bump rc
+npm run version:bump patch
+npm run version:bump minor
+npm run version:bump major
+
+# Commit and push
+git add VERSION package.json CHANGELOG.md
+git commit -m "chore: bump version to vX.Y.Z"
+git tag vX.Y.Z
+git push origin main --tags
+```
+
+## Skipping Auto-Bump
+
+Add `[skip ci]` to your commit message:
+
+```bash
+git commit -m "docs: update README [skip ci]"
+```
+
+This will skip both tests and version bumping.

+ 102 - 0
.github/workflows/test-agents.yml

@@ -126,3 +126,105 @@ jobs:
             echo "### OpenCoder" >> $GITHUB_STEP_SUMMARY
             cat results/opencoder/latest.json | jq -r '"- Passed: \(.passed)\n- Failed: \(.failed)\n- Total: \(.total)"' >> $GITHUB_STEP_SUMMARY
           fi
+
+  auto-version-bump:
+    name: Auto Version Bump
+    runs-on: ubuntu-latest
+    needs: [test-openagent, test-opencoder]
+    if: github.event_name == 'push' && github.ref == 'refs/heads/main'
+    
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v4
+        with:
+          fetch-depth: 0
+          token: ${{ secrets.GITHUB_TOKEN }}
+      
+      - name: Setup Node.js
+        uses: actions/setup-node@v4
+        with:
+          node-version: '20'
+      
+      - name: Configure Git
+        run: |
+          git config user.name "github-actions[bot]"
+          git config user.email "github-actions[bot]@users.noreply.github.com"
+      
+      - name: Determine version bump type
+        id: bump-type
+        run: |
+          # Get the last commit message
+          COMMIT_MSG=$(git log -1 --pretty=%B)
+          
+          # Determine bump type from commit message
+          if echo "$COMMIT_MSG" | grep -qiE "^(feat|feature)\(.*\)!:|^BREAKING CHANGE:|^[a-z]+!:"; then
+            echo "type=major" >> $GITHUB_OUTPUT
+            echo "Detected BREAKING CHANGE - bumping major version"
+          elif echo "$COMMIT_MSG" | grep -qiE "^(feat|feature)(\(.*\))?:"; then
+            echo "type=minor" >> $GITHUB_OUTPUT
+            echo "Detected feature - bumping minor version"
+          elif echo "$COMMIT_MSG" | grep -qiE "^(fix|bugfix)(\(.*\))?:"; then
+            echo "type=patch" >> $GITHUB_OUTPUT
+            echo "Detected fix - bumping patch version"
+          elif echo "$COMMIT_MSG" | grep -qiE "^\[alpha\]"; then
+            echo "type=alpha" >> $GITHUB_OUTPUT
+            echo "Detected [alpha] tag - bumping alpha version"
+          elif echo "$COMMIT_MSG" | grep -qiE "^\[beta\]"; then
+            echo "type=beta" >> $GITHUB_OUTPUT
+            echo "Detected [beta] tag - bumping beta version"
+          elif echo "$COMMIT_MSG" | grep -qiE "^\[rc\]"; then
+            echo "type=rc" >> $GITHUB_OUTPUT
+            echo "Detected [rc] tag - bumping rc version"
+          else
+            echo "type=minor" >> $GITHUB_OUTPUT
+            echo "No specific type detected - defaulting to minor version bump"
+          fi
+      
+      - name: Bump version
+        run: |
+          BUMP_TYPE="${{ steps.bump-type.outputs.type }}"
+          
+          # Get current version
+          CURRENT_VERSION=$(cat VERSION)
+          echo "Current version: $CURRENT_VERSION"
+          
+          # Bump version in package.json
+          npm run version:bump:$BUMP_TYPE
+          
+          # Get new version
+          NEW_VERSION=$(cat VERSION)
+          echo "New version: $NEW_VERSION"
+          
+          # Update CHANGELOG.md
+          DATE=$(date +%Y-%m-%d)
+          COMMIT_MSG=$(git log -1 --pretty=%B)
+          
+          # Create changelog entry
+          cat > /tmp/changelog_entry.md << EOF
+          ## [$NEW_VERSION] - $DATE
+          
+          ### Changes
+          - $COMMIT_MSG
+          
+          EOF
+          
+          # Prepend to CHANGELOG.md (after the header)
+          if [ -f CHANGELOG.md ]; then
+            # Insert after the first occurrence of "## ["
+            awk '/^## \[/ && !found {print; system("cat /tmp/changelog_entry.md"); found=1; next} 1' CHANGELOG.md > /tmp/changelog_new.md
+            mv /tmp/changelog_new.md CHANGELOG.md
+          fi
+      
+      - name: Commit version bump
+        run: |
+          NEW_VERSION=$(cat VERSION)
+          
+          git add VERSION package.json CHANGELOG.md
+          git commit -m "chore: bump version to v$NEW_VERSION [skip ci]"
+          git tag "v$NEW_VERSION"
+      
+      - name: Push changes
+        run: |
+          git push origin main --tags
+        env:
+          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}