bot/tools/restart_tasks.py (88 lines of code) (raw):
# -*- coding: utf-8 -*-
import argparse
import os
from taskcluster.utils import slugId
from code_coverage_bot.secrets import secrets
from code_coverage_bot.taskcluster import taskcluster_config
CODECOV_URL = "https://codecov.io/api/gh/marco-c/gecko-dev/commit"
HOOK_GROUP = "project-relman"
HOOK_ID = "code-coverage-{app_channel}"
taskcluster_config.auth(
os.environ.get("TASKCLUSTER_CLIENT_ID"), os.environ.get("TASKCLUSTER_ACCESS_TOKEN")
)
secrets.load(os.environ["TASKCLUSTER_SECRET"])
queue = taskcluster_config.get_service("queue")
def list_commits(tasks):
"""
Read the revision from an existing code coverage task
"""
for task_id in tasks:
try:
task = queue.task(task_id)
env = task["payload"]["env"]
yield env["REPOSITORY"], env["REVISION"]
except Exception as e:
print("Failed to load task {}: {}".format(task_id, e))
def trigger_task(task_group_id, repository, commit):
"""
Trigger a code coverage task to build covdir at a specified revision
"""
assert isinstance(commit, str)
name = "covdir {} - {} - {}".format(
secrets[secrets.APP_CHANNEL], repository, commit
)
hooks = taskcluster_config.get_service("hooks")
payload = {
"REPOSITORY": repository,
"REVISION": commit,
"taskGroupId": task_group_id,
"taskName": name,
}
hook_id = HOOK_ID.format(app_channel=secrets[secrets.APP_CHANNEL])
return hooks.triggerHook(HOOK_GROUP, hook_id, payload)
def main():
# CLI args
parser = argparse.ArgumentParser()
parser.add_argument("--nb-tasks", type=int, default=5, help="NB of tasks to create")
parser.add_argument(
"--group", type=str, default=slugId(), help="Task group to create/update"
)
parser.add_argument(
"--dry-run",
action="store_true",
default=False,
help="List actions without triggering any new task",
)
parser.add_argument("tasks", nargs="+", help="Existing tasks to retrigger")
args = parser.parse_args()
# List existing tags & commits
print("Group", args.group)
try:
group = queue.listTaskGroup(args.group)
commits = set(
[
(
task["task"]["payload"]["env"]["REPOSITORY"],
task["task"]["payload"]["env"]["REVISION"],
)
for task in group["tasks"]
if task["status"]["state"] not in ("failed", "exception")
]
)
print(
"Found {} commits processed in task group {}".format(
len(commits), args.group
)
)
except Exception as e:
print("Invalid task group : {}".format(e))
commits = set()
# Trigger a task for each commit
triggered = 0
for repository, commit in list_commits(args.tasks):
if (repository, commit) in commits:
print("Skipping existing commit {} {}".format(repository, commit))
continue
print("Triggering {} : {}".format(repository, commit))
if args.dry_run:
print(">>> No trigger on dry run")
else:
out = trigger_task(args.group, repository, commit)
print(">>>", out["status"]["taskId"])
triggered += 1
commits.add((repository, commit))
if triggered >= args.nb_tasks:
print("Max nb tasks reached !")
break
if __name__ == "__main__":
main()