mirror of
https://github.com/jumpserver/jumpserver.git
synced 2026-01-19 09:04:58 +00:00
124 lines
4.2 KiB
YAML
124 lines
4.2 KiB
YAML
name: Cleanup PR Branches
|
||
|
||
on:
|
||
schedule:
|
||
# 每天凌晨2点运行
|
||
- cron: '0 2 * * *'
|
||
workflow_dispatch:
|
||
# 允许手动触发
|
||
inputs:
|
||
dry_run:
|
||
description: 'Dry run mode (default: true)'
|
||
required: false
|
||
default: 'true'
|
||
type: boolean
|
||
|
||
jobs:
|
||
cleanup-branches:
|
||
runs-on: ubuntu-latest
|
||
|
||
steps:
|
||
- name: Checkout repository
|
||
uses: actions/checkout@v4
|
||
with:
|
||
fetch-depth: 0 # 获取所有分支和提交历史
|
||
|
||
- name: Setup Git
|
||
run: |
|
||
git config --global user.name "GitHub Actions"
|
||
git config --global user.email "actions@github.com"
|
||
|
||
- name: Get dry run setting
|
||
id: dry-run
|
||
run: |
|
||
if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then
|
||
echo "dry_run=${{ github.event.inputs.dry_run }}" >> $GITHUB_OUTPUT
|
||
else
|
||
echo "dry_run=false" >> $GITHUB_OUTPUT
|
||
fi
|
||
|
||
- name: Cleanup branches
|
||
env:
|
||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||
DRY_RUN: ${{ steps.dry-run.outputs.dry_run }}
|
||
run: |
|
||
echo "Starting branch cleanup..."
|
||
echo "Dry run mode: $DRY_RUN"
|
||
|
||
# 获取所有本地分支
|
||
git fetch --all --prune
|
||
|
||
# 获取以 pr 或 repr 开头的分支
|
||
branches=$(git branch -r | grep -E 'origin/(pr|repr)' | sed 's/origin\///' | grep -v 'HEAD')
|
||
|
||
echo "Found branches matching pattern:"
|
||
echo "$branches"
|
||
|
||
deleted_count=0
|
||
skipped_count=0
|
||
|
||
for branch in $branches; do
|
||
echo ""
|
||
echo "Processing branch: $branch"
|
||
|
||
# 检查分支是否有未合并的PR
|
||
pr_info=$(gh pr list --head "$branch" --state open --json number,title,state 2>/dev/null)
|
||
|
||
if [ $? -eq 0 ] && [ "$pr_info" != "[]" ]; then
|
||
echo " ⚠️ Branch has open PR(s), skipping deletion"
|
||
echo " PR info: $pr_info"
|
||
skipped_count=$((skipped_count + 1))
|
||
continue
|
||
fi
|
||
|
||
# 检查分支是否有已合并的PR(可选:如果PR已合并也可以删除)
|
||
merged_pr_info=$(gh pr list --head "$branch" --state merged --json number,title,state 2>/dev/null)
|
||
|
||
if [ $? -eq 0 ] && [ "$merged_pr_info" != "[]" ]; then
|
||
echo " ✅ Branch has merged PR(s), safe to delete"
|
||
echo " Merged PR info: $merged_pr_info"
|
||
else
|
||
echo " ℹ️ No PRs found for this branch"
|
||
fi
|
||
|
||
# 执行删除操作
|
||
if [ "$DRY_RUN" = "true" ]; then
|
||
echo " 🔍 [DRY RUN] Would delete branch: $branch"
|
||
deleted_count=$((deleted_count + 1))
|
||
else
|
||
echo " 🗑️ Deleting branch: $branch"
|
||
|
||
# 删除远程分支
|
||
if git push origin --delete "$branch" 2>/dev/null; then
|
||
echo " ✅ Successfully deleted remote branch: $branch"
|
||
deleted_count=$((deleted_count + 1))
|
||
else
|
||
echo " ❌ Failed to delete remote branch: $branch"
|
||
fi
|
||
fi
|
||
done
|
||
|
||
echo ""
|
||
echo "=== Cleanup Summary ==="
|
||
echo "Branches processed: $(echo "$branches" | wc -l)"
|
||
echo "Branches deleted: $deleted_count"
|
||
echo "Branches skipped: $skipped_count"
|
||
|
||
if [ "$DRY_RUN" = "true" ]; then
|
||
echo ""
|
||
echo "🔍 This was a DRY RUN - no branches were actually deleted"
|
||
echo "To perform actual deletion, run this workflow manually with dry_run=false"
|
||
fi
|
||
|
||
- name: Create summary
|
||
if: always()
|
||
run: |
|
||
echo "## Branch Cleanup Summary" >> $GITHUB_STEP_SUMMARY
|
||
echo "" >> $GITHUB_STEP_SUMMARY
|
||
echo "**Workflow:** ${{ github.workflow }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "**Run ID:** ${{ github.run_id }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "**Dry Run:** ${{ steps.dry-run.outputs.dry_run }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "**Triggered by:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
|
||
echo "" >> $GITHUB_STEP_SUMMARY
|
||
echo "Check the logs above for detailed information about processed branches." >> $GITHUB_STEP_SUMMARY
|