Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pr manager temp #4279

Closed
wants to merge 10 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions .github/workflows/automated-prs-manager.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: Automated PRs Manager

on:
# TODO NOW: remove pull_request and uncomment schedule
pull_request:
# schedule:
# - cron: "0 0 * * *"

jobs:
list-prs:
runs-on: ubuntu-latest
outputs:
prs: ${{ steps.list-prs.outputs.prs }}
steps:
- name: Checkout
uses: actions/checkout@v4

- name: List PRs
id: list-prs
env:
GH_TOKEN: ${{ secrets.NIGHTLY_GH_PAT }}
run: |
set -euo pipefail

# list dependabot and automated prs that are less than 24h old

dependabot_prs=$(gh pr list --label dependabot --json url,headRefName,createdAt -q '.[] | select(.createdAt | fromdateiso8601 > now - 86400)')
automated_prs=$(gh pr list --label automated-pr --json url,headRefName,createdAt -q '.[] | select(.createdAt | fromdateiso8601 > now - 86400)')
prs=$(echo "$dependabot_prs" "$automated_prs" | jq -sc '. | unique')

echo "prs=$prs" >> "$GITHUB_OUTPUT"

process-prs:
needs: list-prs
runs-on: ubuntu-latest
strategy:
matrix:
pr: ${{ fromJson(needs.list-prs.outputs.prs) }}
steps:
- name: Checkout
uses: actions/checkout@v4
with:
ref: ${{ matrix.pr.headRefName }}

- name: Process PR
env:
GH_TOKEN: ${{ secrets.NIGHTLY_GH_PAT }}
run: |
set -euo pipefail

echo "Ensuring required labels..."
gh pr edit ${{ matrix.pr.url }} --add-label "type::security"

echo "Checking status of tests..."
run_id=$(gh run list --branch ${{ matrix.pr.headRefName }} --workflow build-test --limit 1 --json databaseId -q '.[0].databaseId')

# If there are still pending jobs, skip.

num_of_pending_jobs=$(gh run view $run_id --json jobs -q '.jobs[] | select(.conclusion == "") | .name' | wc -l)
if [ $num_of_pending_jobs -gt 0 ]; then
echo "There are still pending jobs. Skipping."
exit 0
fi

# If all tests and required checks passed, approve and merge.

if gh run view $run_id --json jobs -q '.jobs[] | select(.name == "validate-success") | .conclusion' | grep -q "success"; then
if gh pr checks ${{ matrix.pr.url }} --required; then
echo "All tests and required checks passed. Approving and merging."
gh pr review --approve ${{ matrix.pr.url }} --body "LGTM :thumbsup:"
gh pr merge --auto --squash ${{ matrix.pr.url }}
exit 0
else
echo "All tests passed, but some required PR checks have not. Skipping."
exit 0
fi
fi

# If more than half of the validate-* jobs are successful, re-run the failed jobs.

num_of_jobs=$(gh run view $run_id --json jobs -q '.jobs[] | select(.name | startswith("validate-")) | .name' | wc -l)
num_of_successful_jobs=$(gh run view $run_id --json jobs -q '.jobs[] | select((.name | startswith("validate-")) and (.conclusion == "success")) | .name' | wc -l)

if [ $num_of_successful_jobs -gt $((num_of_jobs / 2)) ]; then
echo "More than half of the validate-* jobs are successful. Re-running failed jobs."
gh run rerun $run_id --failed
exit 0
fi

echo "Less than half of the validate-* jobs are successful. Skipping."
Loading