Scheduled Dependabot PRs Auto-Merge #1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: Scheduled Dependabot PRs Auto-Merge | |
on: | |
schedule: | |
- cron: '0 0 * * *' # Runs once a day at midnight UTC | |
workflow_dispatch: | |
permissions: | |
contents: write | |
pull-requests: write | |
jobs: | |
merge-dependabot: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout repository | |
uses: actions/checkout@v4 | |
- name: Install GitHub CLI | |
run: | | |
sudo apt update | |
sudo apt install -y gh | |
- name: Fetch & Filter Dependabot PRs | |
env: | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
echo "π Fetching all Dependabot PRs targeting 'dependabotchanges'..." | |
> matched_prs.txt | |
pr_batch=$(gh pr list --state open --json number,title,author,baseRefName,url \ | |
--jq '.[] | "\(.number)|\(.title)|\(.author.login)|\(.baseRefName)|\(.url)"') | |
while IFS='|' read -r number title author base url; do | |
author=$(echo "$author" | xargs) | |
base=$(echo "$base" | xargs) | |
if [[ "$author" == "app/dependabot" && "$base" == "dependabotchanges" ]]; then | |
echo "$url" >> matched_prs.txt | |
echo "β Matched PR #$number - $title" | |
else | |
echo "β Skipped PR #$number - $title (Author: $author, Base: $base)" | |
fi | |
done <<< "$pr_batch" | |
echo "π Matched PRs:" | |
cat matched_prs.txt || echo "None" | |
- name: Rebase PR if Conflicts Exist | |
if: success() | |
env: | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
if [[ ! -s matched_prs.txt ]]; then | |
echo "β οΈ No matching PRs to process." | |
exit 0 | |
fi | |
while IFS= read -r pr_url; do | |
pr_number=$(basename "$pr_url") | |
echo "π Rebasing PR #$pr_number if conflicts exist" | |
mergeable=$(gh pr view "$pr_number" --json mergeable --jq '.mergeable') | |
if [[ "$mergeable" == "CONFLICTING" ]]; then | |
echo "β Merge conflicts detected. Rebasing PR #$pr_number" | |
gh pr update-branch "$pr_url" || echo "β Rebase (update-branch) failed." | |
fi | |
done < matched_prs.txt | |
- name: Auto-Merge if Mergeable | |
if: success() | |
env: | |
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
run: | | |
if [[ ! -s matched_prs.txt ]]; then | |
echo "β οΈ No matching PRs to process." | |
exit 0 | |
fi | |
while IFS= read -r pr_url; do | |
echo "π Checking mergeability for $pr_url" | |
pr_number=$(basename "$pr_url") | |
attempt=0 | |
max_attempts=8 | |
mergeable="" | |
sleep 5 # Initial delay to allow GitHub to compute mergeability | |
while [[ $attempt -lt $max_attempts ]]; do | |
mergeable=$(gh pr view "$pr_number" --json mergeable --jq '.mergeable' 2>/dev/null || echo "UNKNOWN") | |
echo "π Attempt $((attempt+1))/$max_attempts: mergeable=$mergeable" | |
if [[ "$mergeable" == "MERGEABLE" ]]; then | |
echo "π Enabling auto-merge..." | |
set -x | |
merge_output=$(gh pr merge --auto --merge "$pr_url" 2>&1) | |
merge_status=$? | |
set +x | |
echo "$merge_output" | |
if [[ $merge_status -ne 0 ]]; then | |
echo "β Auto-merge failed. Output: $merge_output" | |
else | |
echo "β Auto-merge succeeded!" | |
fi | |
break | |
elif [[ "$mergeable" == "CONFLICTING" ]]; then | |
echo "β Cannot merge due to conflicts. Skipping." | |
break | |
else | |
echo "π Waiting for GitHub to determine mergeable status..." | |
sleep 15 | |
fi | |
((attempt++)) | |
done | |
if [[ "$mergeable" != "MERGEABLE" && "$mergeable" != "CONFLICTING" ]]; then | |
echo "β Mergeability undetermined after $max_attempts attempts. Skipping PR #$pr_number" | |
fi | |
done < matched_prs.txt || echo "β οΈ Completed loop with some errors, but continuing gracefully." |