Close Issues with Tag Needs Repro Link #430
This file contains 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: Close Issues with Tag Needs Repro Link | |
on: | |
schedule: | |
- cron: '0 0 * * *' # Run every day at midnight | |
workflow_dispatch: | |
jobs: | |
close-issues: | |
runs-on: ubuntu-latest | |
steps: | |
- name: Checkout code | |
uses: actions/checkout@v2 | |
- name: Install Node.js | |
uses: actions/setup-node@v2 | |
- name: Install jq and date command | |
run: sudo apt-get update && sudo apt-get install -y jq dateutils | |
- name: Close Inactive Issues that are missing Repro Link | |
env: | |
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
LABEL_NAME: 'Status: Needs a reproduction link' | |
LABEL_NAME_URL: 'Status%3A%20Needs%20a%20reproduction%20link' | |
CUSTOM_MESSAGE: 'In order to investigate further we need a link to a StackBlitz project reproducing the issue. \n \n As this issue has been inactive for 1 day without a reproduction link, it will be closed to allow prioritization of other issues. /n /n If this needs additional investigation, please share a reproduction link by opening a new issue. Thanks for your diligence in helping us continuously improve the StackBlitz platform.' | |
run: | | |
set -e | |
set -x | |
page=1 | |
while : ; do | |
echo "Fetching page $page of issues..." | |
response=$(curl -sS -H "Authorization: token $GITHUB_TOKEN" \ | |
-H "Accept: application/vnd.github.v3+json" \ | |
"https://api.github.com/repos/$GITHUB_REPOSITORY/issues?state=open&labels=$LABEL_NAME_URL&per_page=100&page=$page") | |
echo $response > issues.json | |
if [ $(jq length issues.json) -eq 0 ]; then | |
echo "No more issues found." | |
break | |
fi | |
echo "Checking issues for closure..." | |
jq -c '.[] | {number: .number}' issues.json | while read -r line; do | |
issue=$(echo $line | jq -r '.number') | |
timeline=$(curl -sS -H "Authorization: token $GITHUB_TOKEN" \ | |
-H "Accept: application/vnd.github.mockingbird-preview" \ | |
"https://api.github.com/repos/$GITHUB_REPOSITORY/issues/$issue/timeline") | |
echo $timeline > timeline.json | |
# Find the time when the label was added | |
label_added_at=$(jq -c 'map(select(.event=="labeled" and (.label.name | contains("'"$LABEL_NAME"'")))) | .[0].created_at' timeline.json) | |
if [ "$label_added_at" != "null" ]; then | |
label_added_at=$(echo $label_added_at | jq -r) | |
# Check if there has been any activity after the label was added | |
has_activity_after_label=$(jq -c "map(select(.created_at > \"$label_added_at\")) | length" timeline.json) | |
# Check if at least 1 day has passed since the label was added | |
current_time=$(date --utc +'%Y-%m-%dT%H:%M:%SZ') | |
is_day_old=$(dateutils.ddiff "$label_added_at" "$current_time" -f '%H:%M:%S' | awk -F: '{if ($1 >= 24) print "yes"; else print "no";}') | |
if [ "$is_day_old" = "yes" ] && [ "$has_activity_after_label" = "0" ]; then | |
echo "Commenting and closing issue $issue..." | |
# Comment on the issue | |
COMMENT_RESPONSE=$(curl -sS -w "%{http_code}" -X POST -H "Authorization: token $GITHUB_TOKEN" \ | |
-H "Accept: application/vnd.github.v3+json" \ | |
"https://api.github.com/repos/$GITHUB_REPOSITORY/issues/$issue/comments" \ | |
-d "{\"body\": \"$CUSTOM_MESSAGE\"}") | |
HTTP_STATUS=$(echo $COMMENT_RESPONSE | rev | cut -c 1-3 | rev) | |
if [ "$HTTP_STATUS" -ge 200 ] && [ "$HTTP_STATUS" -lt 300 ]; then | |
echo "Successfully commented on issue $issue." | |
else | |
echo "Failed to comment on issue $issue. HTTP Status: $HTTP_STATUS" | |
exit 1 | |
fi | |
# Close the issue | |
RESPONSE=$(curl -sS -w "%{http_code}" -X PATCH -H "Authorization: token $GITHUB_TOKEN" \ | |
-H "Accept: application/vnd.github.v3+json" \ | |
"https://api.github.com/repos/$GITHUB_REPOSITORY/issues/$issue" \ | |
-d "{\"state\": \"closed\"}") | |
HTTP_STATUS=$(echo $RESPONSE | rev | cut -c 1-3 | rev) | |
if [ "$HTTP_STATUS" -ge 200 ] && [ "$HTTP_STATUS" -lt 300 ]; then | |
echo "Successfully closed issue $issue." | |
else | |
echo "Failed to close issue $issue. HTTP Status: $HTTP_STATUS" | |
exit 1 | |
fi | |
else | |
echo "Issue $issue does not meet closure criteria. Skipping." | |
fi | |
else | |
echo "Label not found for issue $issue. Skipping." | |
fi | |
done | |
((page++)) | |
done |