Automatically merges PRs from auto-fix bot when all checks pass. Features: - Zero manual intervention for compliant PRs - Validates all checks passed - Safe merge (squash + delete branch) - Creates issues for failed PRs - Comprehensive logging Expected Impact: - 90%+ PR automation rate - <5 minute merge time - ~10 hours/week time savings © 2025-2026 BlackRoad OS, Inc.
186 lines
6.2 KiB
YAML
186 lines
6.2 KiB
YAML
name: 🤖 BlackRoad Auto-Merge
|
||
|
||
on:
|
||
pull_request:
|
||
types: [opened, synchronize, reopened]
|
||
check_suite:
|
||
types: [completed]
|
||
workflow_run:
|
||
workflows: ["🔍 BlackRoad Compliance Check"]
|
||
types: [completed]
|
||
|
||
permissions:
|
||
contents: write
|
||
pull-requests: write
|
||
checks: read
|
||
|
||
jobs:
|
||
auto-merge:
|
||
name: Auto-Merge Compliant PRs
|
||
runs-on: ubuntu-latest
|
||
|
||
# Only run for bot-created PRs
|
||
if: |
|
||
github.event.pull_request.user.login == 'github-actions[bot]' ||
|
||
github.actor == 'github-actions[bot]'
|
||
|
||
steps:
|
||
- name: 📥 Checkout Repository
|
||
uses: actions/checkout@v4
|
||
|
||
- name: 🔍 Get PR Details
|
||
id: pr
|
||
env:
|
||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
run: |
|
||
# Get PR number
|
||
if [ -n "${{ github.event.pull_request.number }}" ]; then
|
||
PR_NUMBER="${{ github.event.pull_request.number }}"
|
||
else
|
||
# If triggered by workflow_run, find the PR
|
||
PR_NUMBER=$(gh pr list --head blackroad-auto-fix --json number --jq '.[0].number')
|
||
fi
|
||
|
||
if [ -z "$PR_NUMBER" ]; then
|
||
echo "No PR found, exiting..."
|
||
exit 0
|
||
fi
|
||
|
||
echo "number=$PR_NUMBER" >> $GITHUB_OUTPUT
|
||
|
||
# Get PR status
|
||
PR_DATA=$(gh pr view "$PR_NUMBER" --json statusCheckRollup,headRefName,mergeable,mergeStateStatus)
|
||
|
||
# Extract status
|
||
STATUS=$(echo "$PR_DATA" | jq -r '.statusCheckRollup[] | select(.conclusion != null) | .conclusion' | sort -u)
|
||
MERGEABLE=$(echo "$PR_DATA" | jq -r '.mergeable')
|
||
MERGE_STATE=$(echo "$PR_DATA" | jq -r '.mergeStateStatus')
|
||
BRANCH=$(echo "$PR_DATA" | jq -r '.headRefName')
|
||
|
||
echo "status=$STATUS" >> $GITHUB_OUTPUT
|
||
echo "mergeable=$MERGEABLE" >> $GITHUB_OUTPUT
|
||
echo "merge_state=$MERGE_STATE" >> $GITHUB_OUTPUT
|
||
echo "branch=$BRANCH" >> $GITHUB_OUTPUT
|
||
|
||
echo "PR #$PR_NUMBER status: $STATUS, mergeable: $MERGEABLE, state: $MERGE_STATE"
|
||
|
||
- name: ✅ Validate PR for Auto-Merge
|
||
id: validate
|
||
run: |
|
||
CAN_MERGE="false"
|
||
|
||
# Check 1: Is this from blackroad-auto-fix branch?
|
||
if [[ "${{ steps.pr.outputs.branch }}" == "blackroad-auto-fix" ]]; then
|
||
echo "✅ PR is from auto-fix branch"
|
||
|
||
# Check 2: Is mergeable?
|
||
if [[ "${{ steps.pr.outputs.mergeable }}" == "MERGEABLE" ]]; then
|
||
echo "✅ PR is mergeable (no conflicts)"
|
||
|
||
# Check 3: All checks passed or no checks?
|
||
if [[ -z "${{ steps.pr.outputs.status }}" ]] || [[ "${{ steps.pr.outputs.status }}" == "SUCCESS" ]]; then
|
||
echo "✅ All checks passed (or no checks required)"
|
||
CAN_MERGE="true"
|
||
else
|
||
echo "⚠️ Some checks failed or are pending: ${{ steps.pr.outputs.status }}"
|
||
fi
|
||
else
|
||
echo "⚠️ PR has merge conflicts or is not mergeable"
|
||
fi
|
||
else
|
||
echo "ℹ️ Not an auto-fix PR (branch: ${{ steps.pr.outputs.branch }}), skipping"
|
||
fi
|
||
|
||
echo "can_merge=$CAN_MERGE" >> $GITHUB_OUTPUT
|
||
|
||
- name: 🚀 Merge PR
|
||
if: steps.validate.outputs.can_merge == 'true' && steps.pr.outputs.number != ''
|
||
env:
|
||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
run: |
|
||
PR_NUMBER="${{ steps.pr.outputs.number }}"
|
||
|
||
echo "🤖 Merging PR #$PR_NUMBER..."
|
||
|
||
# Merge with squash and delete branch
|
||
gh pr merge "$PR_NUMBER" \
|
||
--squash \
|
||
--delete-branch \
|
||
--body "✅ Auto-merged by BlackRoad Auto-Merge System
|
||
|
||
This PR passed all compliance checks and was automatically merged.
|
||
|
||
🤖 Automated by BlackRoad Auto-Merge
|
||
© 2025-2026 BlackRoad OS, Inc."
|
||
|
||
echo "✅ PR #$PR_NUMBER merged successfully!"
|
||
|
||
- name: 💬 Add Success Comment
|
||
if: steps.validate.outputs.can_merge == 'true' && steps.pr.outputs.number != ''
|
||
env:
|
||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
run: |
|
||
PR_NUMBER="${{ steps.pr.outputs.number }}"
|
||
|
||
gh pr comment "$PR_NUMBER" --body "🤖 **Auto-Merge Successful**
|
||
|
||
This PR has been automatically merged because:
|
||
- ✅ Created by BlackRoad auto-fix bot
|
||
- ✅ All compliance checks passed
|
||
- ✅ No merge conflicts
|
||
- ✅ No manual review required
|
||
|
||
The changes are now live on the default branch.
|
||
|
||
---
|
||
🤖 Automated by BlackRoad Auto-Merge System
|
||
© 2025-2026 BlackRoad OS, Inc." || true
|
||
|
||
- name: 📝 Create Issue on Validation Failure
|
||
if: |
|
||
steps.validate.outputs.can_merge == 'false' &&
|
||
steps.pr.outputs.number != '' &&
|
||
steps.pr.outputs.branch == 'blackroad-auto-fix'
|
||
env:
|
||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
run: |
|
||
PR_NUMBER="${{ steps.pr.outputs.number }}"
|
||
REPO="${{ github.repository }}"
|
||
|
||
gh issue create \
|
||
--title "⚠️ Auto-Fix PR Requires Manual Review: #$PR_NUMBER" \
|
||
--body "## Auto-Fix PR Could Not Be Auto-Merged
|
||
|
||
**PR:** #$PR_NUMBER
|
||
**Status:** Manual review needed ⚠️
|
||
**Reason:** Checks failed or merge conflicts detected
|
||
|
||
### Details:
|
||
The auto-fix PR did not pass automatic validation.
|
||
|
||
**Branch:** \`${{ steps.pr.outputs.branch }}\`
|
||
**Mergeable:** \`${{ steps.pr.outputs.mergeable }}\`
|
||
**Merge State:** \`${{ steps.pr.outputs.merge_state }}\`
|
||
**Check Status:** \`${{ steps.pr.outputs.status }}\`
|
||
|
||
### Action Required:
|
||
Please review the PR manually and resolve any issues.
|
||
|
||
**PR Link:** https://github.com/$REPO/pull/$PR_NUMBER
|
||
|
||
---
|
||
🤖 Automated Alert from BlackRoad Auto-Merge System
|
||
© 2025-2026 BlackRoad OS, Inc." \
|
||
--label "auto-fix-failed,needs-review" || true
|
||
|
||
- name: 🚨 Notify on Critical Failure
|
||
if: failure()
|
||
env:
|
||
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
run: |
|
||
echo "🚨 Auto-merge workflow encountered an error"
|
||
echo "This may require manual intervention"
|
||
# If Slack webhook is configured, uncomment below:
|
||
# curl -X POST "${{ secrets.SLACK_WEBHOOK }}" -H 'Content-Type: application/json' \
|
||
# -d '{"text":"🚨 Auto-merge failed in ${{ github.repository }}"}'
|