| import argparse |
| import logging |
| import os |
| |
| import taskcluster |
| |
| from .github_checks_output import get_gh_checks_outputter |
| |
| |
| logging.basicConfig() |
| logger = logging.getLogger() |
| |
| |
| def check_task_statuses(task_ids, github_checks_outputter): |
| """Verifies whether a set of Taskcluster tasks completed successfully or not. |
| |
| Returns 0 if all tasks passed completed successfully, 1 otherwise.""" |
| |
| queue = taskcluster.Queue({'rootUrl': os.environ['TASKCLUSTER_ROOT_URL']}) |
| failed_tasks = [] |
| for task in task_ids: |
| status = queue.status(task) |
| state = status['status']['state'] |
| if state == 'failed' or state == 'exception': |
| logger.error('Task {0} failed with state "{1}"'.format(task, state)) |
| failed_tasks.append(status) |
| elif state != 'completed': |
| logger.error('Task {0} had unexpected state "{1}"'.format(task, state)) |
| failed_tasks.append(status) |
| |
| if failed_tasks and github_checks_outputter: |
| github_checks_outputter.output('Failed tasks:') |
| for task in failed_tasks: |
| # We need to make an additional call to get the task name. |
| task_id = task['status']['taskId'] |
| task_name = queue.task(task_id)['metadata']['name'] |
| github_checks_outputter.output('* `{}` failed with status `{}`'.format(task_name, task['status']['state'])) |
| else: |
| logger.info('All tasks completed successfully') |
| if github_checks_outputter: |
| github_checks_outputter.output('All tasks completed successfully') |
| return 1 if failed_tasks else 0 |
| |
| |
| def get_parser(): |
| parser = argparse.ArgumentParser() |
| parser.add_argument("--github-checks-text-file", type=str, |
| help="Path to GitHub checks output file for Taskcluster runs") |
| parser.add_argument("tasks", nargs="+", |
| help="A set of Taskcluster task ids to verify the state of.") |
| return parser |
| |
| |
| def run(venv, **kwargs): |
| github_checks_outputter = get_gh_checks_outputter(kwargs["github_checks_text_file"]) |
| |
| if github_checks_outputter: |
| github_checks_outputter.output( |
| "This check acts as a 'sink' for all other Taskcluster-based checks. " |
| "A failure here means that some other check has failed, which is the " |
| "real blocker.\n" |
| ) |
| return check_task_statuses(kwargs['tasks'], github_checks_outputter) |