Skip to content
111 changes: 111 additions & 0 deletions .github/workflows/rebase-upstream.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
name: Rebase on Upstream

on:
workflow_dispatch:
schedule:
# Run weekly on Mondays at 9am UTC
- cron: '0 9 * * 1'

jobs:
rebase:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
token: ${{ secrets.GITHUB_TOKEN }}

- name: Setup git
run: |
git config user.name "GitHub Actions"
git config user.email "actions@github.com"

- name: Add upstream remote
run: |
git remote add upstream https://github.com/moby/buildkit.git || true
git fetch upstream master
git fetch origin master

- name: Rebase master on upstream
id: rebase
run: |
git checkout master

# Count our patches before rebase
BEFORE_COUNT=$(git rev-list upstream/master..HEAD --count)
echo "Patches before rebase: $BEFORE_COUNT"

# Perform rebase
if git rebase upstream/master; then
echo "✅ Rebase successful"

# Count our patches after rebase
AFTER_COUNT=$(git rev-list upstream/master..HEAD --count)
echo "Patches after rebase: $AFTER_COUNT"

# Check what changed
if [ "$BEFORE_COUNT" -ne "$AFTER_COUNT" ]; then
echo ""
echo "🎉 Patch count changed from $BEFORE_COUNT to $AFTER_COUNT"
echo "This likely means some of your patches were merged upstream!"
fi

# Push the rebased master
if ! git push origin master --force-with-lease; then
echo "❌ Rebase succeeded locally but failed to push to remote"
echo ""
echo "To push manually:"
echo " git push origin master --force-with-lease"
echo ""
echo "rebase_status=failed" >> $GITHUB_OUTPUT
exit 1
fi

echo "✅ Successfully pushed rebased master to origin"
echo "rebase_status=success" >> $GITHUB_OUTPUT
echo "patch_count=$AFTER_COUNT" >> $GITHUB_OUTPUT
else
echo "❌ Rebase failed - manual intervention required"
echo ""
echo "To resolve manually:"
echo "1. git checkout master"
echo "2. git rebase upstream/master"
echo "3. Resolve conflicts"
echo "4. git push origin master --force-with-lease"

echo "rebase_status=failed" >> $GITHUB_OUTPUT
exit 1
fi

- name: Create issue on failure
if: failure()
uses: actions/github-script@v7
with:
script: |
await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: 'Manual rebase required: conflicts with upstream',
body: `The automated rebase on upstream has failed due to conflicts.

## Action Required

Please manually rebase the master branch:

\`\`\`bash
git checkout master
git fetch upstream
git rebase upstream/master
# Resolve any conflicts
git push origin master --force-with-lease
\`\`\`

## Workflow Run

[View failed workflow run](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})

---
*This issue was automatically created by the rebase workflow.*`,
labels: ['upstream-sync', 'needs-attention']
});
Loading
Loading