ci: ci_marge_queue.py
authorDavid Heidelberg <david.heidelberg@collabora.com>
Thu, 15 Dec 2022 23:22:46 +0000 (00:22 +0100)
committerMarge Bot <emma+marge@anholt.net>
Sat, 14 Oct 2023 11:28:56 +0000 (11:28 +0000)
Show currently assigned jobs to Marge and return 0 when it's free.

Useful for combination with ci_run_n_monitor.py .

Signed-off-by: David Heidelberg <david.heidelberg@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20347>

bin/ci/marge_queue.py [new file with mode: 0755]
bin/ci/marge_queue.sh [new file with mode: 0755]

diff --git a/bin/ci/marge_queue.py b/bin/ci/marge_queue.py
new file mode 100755 (executable)
index 0000000..ef9edec
--- /dev/null
@@ -0,0 +1,65 @@
+#!/usr/bin/env python3
+# Copyright © 2020 - 2023 Collabora Ltd.
+# Authors:
+#   David Heidelberg <david.heidelberg@collabora.com>
+#
+# SPDX-License-Identifier: MIT
+
+"""
+Monitors Marge-bot and return number of assigned MRs.
+"""
+
+import argparse
+import time
+import sys
+from datetime import datetime, timezone
+from dateutil import parser
+
+import gitlab
+from gitlab_common import read_token
+
+REFRESH_WAIT = 30
+MARGE_BOT_USER_ID = 9716
+
+
+def parse_args() -> None:
+    """Parse args"""
+    parse = argparse.ArgumentParser(
+        description="Tool to show merge requests assigned to the marge-bot",
+    )
+    parse.add_argument(
+        "--wait", action="store_true", help="wait until CI is free",
+    )
+    parse.add_argument(
+        "--token",
+        metavar="token",
+        help="force GitLab token, otherwise it's read from ~/.config/gitlab-token",
+    )
+    return parse.parse_args()
+
+
+if __name__ == "__main__":
+    args = parse_args()
+    token = read_token(args.token)
+    gl = gitlab.Gitlab(url="https://gitlab.freedesktop.org", private_token=token)
+
+    project = gl.projects.get("mesa/mesa")
+
+    while True:
+        mrs = project.mergerequests.list(assignee_id=MARGE_BOT_USER_ID, scope="all", state="opened", get_all=True)
+
+        jobs_num = len(mrs)
+        for mr in mrs:
+            updated = parser.parse(mr.updated_at)
+            now = datetime.now(timezone.utc)
+            diff = str(now - updated).split('.', maxsplit=1)[0]
+            print(f"{diff} | \u001b]8;;{mr.web_url}\u001b\\{mr.title}\u001b]8;;\u001b\\")
+
+        print("Job waiting: " + str(jobs_num))
+
+        if jobs_num == 0:
+            sys.exit(0)
+        if not args.wait:
+            sys.exit(min(jobs_num, 127))
+
+        time.sleep(REFRESH_WAIT)
diff --git a/bin/ci/marge_queue.sh b/bin/ci/marge_queue.sh
new file mode 100755 (executable)
index 0000000..80f4667
--- /dev/null
@@ -0,0 +1,10 @@
+#!/usr/bin/env bash
+set -eu
+
+this_dir=$(dirname -- "$(readlink -f -- "${BASH_SOURCE[0]}")")
+readonly this_dir
+
+exec \
+  "$this_dir/../python-venv.sh" \
+  "$this_dir/requirements.txt" \
+  "$this_dir/marge_queue.py" "$@"