From fd9096d2558c1f63f074c67aa6a86e2f44adbe00 Mon Sep 17 00:00:00 2001 From: Tom Cools Date: Sat, 21 Aug 2021 01:28:56 +0200 Subject: [PATCH 1/3] Add Automerge workflow The automerge workflow will check for complete and approved pull requests and will merge them automatically. Sources: - For the python script to execute the merge: https://raw.githubusercontent.com/dapr/dapr/master/.github/scripts/automerge.py (only changed the label from "automerge" to "auto-merge") - https://raw.githubusercontent.com/dapr/dapr/master/.github/workflows/dapr-bot-schedule.yml (only copied the automerge part, not the prune_stale part as that was not part of the issue. Resolves https://github.com/dapr/java-sdk/issues/603 --- .github/scripts/automerge.py | 60 +++++++++++++++++++++++++++++ .github/workflows/automerge-bot.yml | 26 +++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 .github/scripts/automerge.py create mode 100644 .github/workflows/automerge-bot.yml diff --git a/.github/scripts/automerge.py b/.github/scripts/automerge.py new file mode 100644 index 0000000000..3518579d9d --- /dev/null +++ b/.github/scripts/automerge.py @@ -0,0 +1,60 @@ +# ------------------------------------------------------------ +# Copyright (c) Microsoft Corporation and Dapr Contributors. +# Licensed under the MIT License. +# ------------------------------------------------------------ + +# This script automerges PRs + +import os + +from github import Github + + +g = Github(os.getenv("GITHUB_TOKEN")) +repo = g.get_repo(os.getenv("GITHUB_REPOSITORY")) +maintainers = [m.strip() for m in os.getenv("MAINTAINERS").split(',')] + +def fetch_pulls(mergeable_state): + return [pr for pr in repo.get_pulls(state='open', sort='created') \ + if pr.mergeable_state == mergeable_state and 'auto-merge' in [l.name for l in pr.labels]] + +def is_approved(pr): + approvers = [r.user.login for r in pr.get_reviews() if r.state == 'APPROVED' and r.user.login in maintainers] + return len([a for a in approvers if repo.get_collaborator_permission(a) in ['admin', 'write']]) > 0 + +# First, find a PR that can be merged +pulls = fetch_pulls('clean') +print(f"Detected {len(pulls)} open pull requests in {repo.name} to be automerged.") +merged = False +for pr in pulls: + if is_approved(pr): + # Merge only one PR per run. + print(f"Merging PR {pr.html_url}") + try: + pr.merge(merge_method='squash') + merged = True + break + except: + print(f"Failed to merge PR {pr.html_url}") + +if len(pulls) > 0 and not merged: + print("No PR was automerged.") + +# Now, update all PRs that are behind. +pulls = fetch_pulls('behind') +print(f"Detected {len(pulls)} open pull requests in {repo.name} to be updated.") +for pr in pulls: + if is_approved(pr): + # Update all PRs since there is no guarantee they will all pass. + print(f"Updating PR {pr.html_url}") + try: + pr.update_branch() + except: + print(f"Failed to update PR {pr.html_url}") + +pulls = fetch_pulls('dirty') +print(f"Detected {len(pulls)} open pull requests in {repo.name} to be automerged but are in dirty state.") +for pr in pulls: + print(f"PR is in dirty state: {pr.html_url}") + +print("Done.") \ No newline at end of file diff --git a/.github/workflows/automerge-bot.yml b/.github/workflows/automerge-bot.yml new file mode 100644 index 0000000000..10b70d32ae --- /dev/null +++ b/.github/workflows/automerge-bot.yml @@ -0,0 +1,26 @@ +# ------------------------------------------------------------ +# Copyright (c) Microsoft Corporation and Dapr Contributors. +# Licensed under the MIT License. +# ------------------------------------------------------------ + +name: dapr-java-sdk-automerge-bot + +on: + schedule: + - cron: '*/10 * * * *' + workflow_dispatch: +jobs: + automerge: + if: github.repository_owner == 'dapr' + name: Automerge and update PRs. + runs-on: ubuntu-latest + steps: + - name: Checkout repo + uses: actions/checkout@v2 + - name: Install dependencies + run: pip install PyGithub + - name: Automerge and update + env: + MAINTAINERS: yaron2,youngbupark,artursouza + GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} + run: python ./.github/scripts/automerge.py \ No newline at end of file From 120696251993833e7794a1d1c1bb8d857b3cd981 Mon Sep 17 00:00:00 2001 From: Artur Souza Date: Fri, 20 Aug 2021 17:04:30 -0700 Subject: [PATCH 2/3] Update automerge-bot.yml --- .github/workflows/automerge-bot.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/automerge-bot.yml b/.github/workflows/automerge-bot.yml index 10b70d32ae..5a6698994e 100644 --- a/.github/workflows/automerge-bot.yml +++ b/.github/workflows/automerge-bot.yml @@ -21,6 +21,6 @@ jobs: run: pip install PyGithub - name: Automerge and update env: - MAINTAINERS: yaron2,youngbupark,artursouza + MAINTAINERS: artursouza,mukundansundar GITHUB_TOKEN: ${{ secrets.DAPR_BOT_TOKEN }} - run: python ./.github/scripts/automerge.py \ No newline at end of file + run: python ./.github/scripts/automerge.py From dc7df88ffdbbcc567098e15bc9f100b256d0e5e4 Mon Sep 17 00:00:00 2001 From: Artur Souza Date: Fri, 20 Aug 2021 17:05:32 -0700 Subject: [PATCH 3/3] Update automerge-bot.yml --- .github/workflows/automerge-bot.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/automerge-bot.yml b/.github/workflows/automerge-bot.yml index 5a6698994e..554e0ce5f4 100644 --- a/.github/workflows/automerge-bot.yml +++ b/.github/workflows/automerge-bot.yml @@ -7,7 +7,7 @@ name: dapr-java-sdk-automerge-bot on: schedule: - - cron: '*/10 * * * *' + - cron: '*/30 * * * *' workflow_dispatch: jobs: automerge: