Added PR/Issue management actions

This commit is contained in:
2026-02-13 15:52:40 +00:00
parent 97354a2874
commit 07502a6b26
4 changed files with 182 additions and 12 deletions

View File

@@ -0,0 +1,98 @@
name: Close Stale Issues
on:
schedule:
- cron: '0 0 * * *' # Daily at midnight UTC
workflow_dispatch: # Manual trigger
jobs:
stale:
runs-on: ubuntu-latest
env:
API_TOKEN: ${{ secrets.BOT_ACCESS_TOKEN }}
API_BASE_URL: https://git.psmattas.com/api/v1
REPO: ${{ gitea.repository }}
steps:
- name: Mark stale issues
run: |
# Issues with no activity for 30 days
THIRTY_DAYS_AGO=$(date -u -d '30 days ago' '+%Y-%m-%dT%H:%M:%SZ')
# Get all open issues updated before 30 days ago
ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&since=$THIRTY_DAYS_AGO&sort=updated&order=asc" | jq -c '.[]')
echo "$ISSUES" | while IFS= read -r issue; do
ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
UPDATED_AT=$(echo "$issue" | jq -r '.updated_at')
HAS_STALE_LABEL=$(echo "$issue" | jq -r '.labels[] | select(.name == "status: stale") | .name')
# Skip if already has stale label
if [ -n "$HAS_STALE_LABEL" ]; then
continue
fi
echo "Marking issue #$ISSUE_NUMBER as stale (last updated: $UPDATED_AT)"
# Add stale label
LABELS='{"labels": ["status: stale"]}'
curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$LABELS" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/labels"
# Add stale comment
STALE_MSG="This issue has been automatically marked as stale because it has not had recent activity.\n\nIt will be closed in **14 days** if no further activity occurs.\n\nIf this issue is still relevant, please:\n- Add a comment with updates\n- Remove the \`status: stale\` label\n\nThank you for your contributions! 🙏"
COMMENT_JSON=$(jq -n --arg body "$STALE_MSG" '{"body": $body}')
curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$COMMENT_JSON" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/comments"
done
- name: Close stale issues
run: |
# Issues marked stale for 14+ days
FOURTEEN_DAYS_AGO=$(date -u -d '14 days ago' '+%Y-%m-%dT%H:%M:%SZ')
# Get stale issues
ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&labels=status:stale" | jq -c '.[]')
echo "$ISSUES" | while IFS= read -r issue; do
ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
UPDATED_AT=$(echo "$issue" | jq -r '.updated_at')
# Check if updated_at is older than 14 days
if [[ "$UPDATED_AT" < "$FOURTEEN_DAYS_AGO" ]]; then
echo "Closing stale issue #$ISSUE_NUMBER (last updated: $UPDATED_AT)"
# Close the issue
CLOSE_JSON='{"state": "closed"}'
curl -s -f -X PATCH -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$CLOSE_JSON" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER"
# Add closing comment
CLOSE_MSG="This issue was automatically closed due to inactivity.\n\nIf you believe this was closed in error, please:\n1. Reopen the issue\n2. Provide updated information\n3. Remove the \`status: stale\` label\n\nThank you! 🙏"
COMMENT_JSON=$(jq -n --arg body "$CLOSE_MSG" '{"body": $body}')
curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$COMMENT_JSON" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/comments"
fi
done
- name: Remove stale label on activity
run: |
# Get stale issues that were recently updated
ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&labels=status:stale" | jq -c '.[]')
echo "$ISSUES" | while IFS= read -r issue; do
ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
# Get comments
COMMENTS=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/comments")
LATEST_COMMENT_AUTHOR=$(echo "$COMMENTS" | jq -r '.[-1].user.login')
# If latest comment is not from bot, remove stale label
if [ "$LATEST_COMMENT_AUTHOR" != "EC-bot" ] && [ "$LATEST_COMMENT_AUTHOR" != "gitea-actions" ]; then
echo "Removing stale label from issue #$ISSUE_NUMBER (recent activity detected)"
# Get label ID
LABELS=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/labels")
STALE_LABEL_ID=$(echo "$LABELS" | jq -r '.[] | select(.name == "status: stale") | .id')
if [ -n "$STALE_LABEL_ID" ]; then
curl -s -f -X DELETE -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/labels/$STALE_LABEL_ID"
fi
fi
done