Skip to content

Commit

Permalink
[ci][tvmbot] Enable re-run for GitHub Actions
Browse files Browse the repository at this point in the history
  • Loading branch information
driazati committed Aug 3, 2022
1 parent 6f83113 commit 78c7686
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 21 deletions.
7 changes: 5 additions & 2 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,15 @@ concurrency:

jobs:
MacOS:
if: ${{ github.repository == 'apache/tvm' }}
runs-on: macOS-latest
if: ${{ github.repository == 'driazati/tvm' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
submodules: 'recursive'
- name: fail
run: |
exit 1
- name: Set up environment
uses: ./.github/actions/setup
- name: Conda Build
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/tvmbot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
issues: write
pull-requests: write
statuses: write
if: ${{ github.event.issue.pull_request && github.repository == 'apache/tvm' }}
if: ${{ github.event.issue.pull_request && github.repository == 'driazati/tvm' }}
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v2
Expand Down
72 changes: 54 additions & 18 deletions tests/scripts/github_tvmbot.py
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ def to_json_str(obj: Any) -> str:
name
checkSuite {
workflowRun {
databaseId
workflow {
name
}
Expand Down Expand Up @@ -503,6 +504,16 @@ def rerun_jenkins_ci(self) -> None:
else:
post(url, auth=("tvm-bot", TVM_BOT_JENKINS_TOKEN))

def rerun_github_actions(self) -> None:
job_ids = []
for item in self.head_commit()["statusCheckRollup"]["contexts"]["nodes"]:
if "checkSuite" in item:
job_ids.append(item["checkSuite"]["workflowRun"]["databaseId"])

logging.info(f"Rerunning GitHub Actions jobs with IDs: {job_ids}")
for job_id in job_ids:
self.github.post(f"actions/jobs/{job_id}/rerun")

def comment_failure(self, msg: str, exception: Exception):
if not self.dry_run:
exception_msg = traceback.format_exc()
Expand All @@ -514,13 +525,45 @@ def comment_failure(self, msg: str, exception: Exception):
return exception


def check_author(pr, triggering_comment, args):
comment_author = triggering_comment["user"]["login"]
if pr.author() == comment_author:
logging.info("Comment user is PR author, continuing")
return True
return False


def check_collaborator(pr, triggering_comment, args):
logging.info("Checking collaborators")
# Get the list of collaborators for the repo filtered by the comment
# author
if args.testing_collaborators_json:
collaborators = json.loads(args.testing_collaborators_json)
else:
collaborators = pr.search_collaborator(triggering_comment["user"]["login"])
logging.info(f"Found collaborators: {collaborators}")

return len(collaborators) > 0


AUTH_CHECKS = {
"anyone": lambda: True,
"collaborators": check_collaborator,
"author": check_author,
}
# Stash the keys so they're accessible from the values
AUTH_CHECKS = {k: (k, v) for k, v in AUTH_CHECKS.items()}


class Merge:
triggers = [
"merge",
"merge this",
"merge this pr",
]

auth = [AUTH_CHECKS["collaborators"], AUTH_CHECKS["author"]]

@staticmethod
def run(pr: PR):
info = None
Expand Down Expand Up @@ -548,9 +591,15 @@ class Rerun:
"run ci",
]

auth = [AUTH_CHECKS["anyone"]]

@staticmethod
def run(pr: PR):
pr.rerun_jenkins_ci()
try:
pr.rerun_jenkins_ci()
pr.rerun_github_actions()
except Exception as e:
pr.comment_failure("Failed to re-run CI", e)


if __name__ == "__main__":
Expand Down Expand Up @@ -618,24 +667,11 @@ def run(pr: PR):
# Acknowledge the comment with a react
pr.plus_one(comment)

# Check the comment author
comment_author = comment["user"]["login"]
if pr.author() == comment_author:
logging.info("Comment user is PR author, continuing")
else:
logging.info("Comment is not from PR author, checking collaborators")
# Get the list of collaborators for the repo filtered by the comment
# author
if args.testing_collaborators_json:
collaborators = json.loads(args.testing_collaborators_json)
else:
collaborators = pr.search_collaborator(comment_author)
logging.info(f"Found collaborators: {collaborators}")

if len(collaborators) > 0:
logging.info("Comment is from collaborator")
for name, check in command_to_run.auth:
if check(pr, comment, args):
logging.info(f"Passed auth check '{name}', continuing")
else:
logging.info("Comment is not from from PR author or collaborator, quitting")
logging.info(f"Failed auth check '{name}', quitting")
exit(0)

state = pr.state()
Expand Down

0 comments on commit 78c7686

Please sign in to comment.