Source code for idiap_devtools.gitlab.runners
# Copyright © 2022 Idiap Research Institute <contact@idiap.ch>
#
# SPDX-License-Identifier: BSD-3-Clause
import logging
import pathlib
import typing
import gitlab
import gitlab.v4.objects
logger = logging.getLogger(__name__)
[docs]
def get_runner_from_description(
gl: gitlab.Gitlab, descr: str
) -> gitlab.v4.objects.runners.Runner:
"""Retrieve a runner object matching the description, or raises.
Arguments:
gl: gitlab service instance
descr: the runner description
Returns
-------
The runner object, if one is found matching the description
Raises
------
RuntimeError: if no runner matching the description is found.
"""
# search for the runner to affect
runners = [
k for k in gl.runners.list(all=True) if k.attributes["description"] == descr
]
if not runners:
raise RuntimeError("Cannot find runner with description = %s", descr)
the_runner = typing.cast(gitlab.v4.objects.runners.Runner, runners[0])
logger.info(
"Found runner %s (id=%d)",
the_runner.attributes["description"],
the_runner.attributes["id"],
)
return the_runner
[docs]
def get_project(gl: gitlab.Gitlab, name: str) -> gitlab.v4.objects.projects.Project:
"""Retrieve one single project."""
retval = gl.projects.get(name)
logger.debug(
"Found gitlab project %s (id=%d)",
retval.attributes["path_with_namespace"],
retval.id,
)
return retval
[docs]
def get_projects_from_group(
gl: gitlab.Gitlab, name: str
) -> list[gitlab.v4.objects.projects.Project]:
"""Return a list with all projects in a GitLab group."""
group = gl.groups.get(name)
logger.debug(
"Found gitlab group %s (id=%d)",
group.attributes["path"],
group.id,
)
projects = group.projects.list(all=True, simple=True)
logger.info(
"Retrieving details for %d projects in group %s (id=%d). "
"This may take a while...",
len(projects),
group.attributes["path"],
group.id,
)
packages = []
for k, proj in enumerate(projects):
packages.append(get_project(gl, proj.id))
logger.debug("Got data from project %d/%d", k + 1, len(projects))
return packages
[docs]
def get_projects_from_runner(
gl: gitlab.Gitlab, runner: gitlab.v4.objects.runners.Runner
) -> list[gitlab.v4.objects.projects.Project]:
"""Retrieve a list of all projects that include a particular runner."""
the_runner = gl.runners.get(runner.id)
logger.info(
"Retrieving details for %d projects using runner %s (id=%d). "
"This may take a while...",
len(the_runner.projects),
the_runner.description,
the_runner.id,
)
packages = []
for k, proj in enumerate(the_runner.projects):
packages.append(get_project(gl, proj["id"]))
logger.debug("Got data from project %d/%d", k + 1, len(the_runner.projects))
return packages
[docs]
def get_projects_from_file(
gl: gitlab.Gitlab, filename: pathlib.Path
) -> list[gitlab.v4.objects.projects.Project]:
"""Retrieve a list of projects based on lines of a file."""
packages = []
with filename.open("rt") as f:
lines = [k.strip() for k in f.readlines()]
lines = [k for k in lines if k and not k.startswith("#")]
logger.info("Loaded %d entries from file %s", len(lines), filename)
for k, proj in enumerate(lines):
packages.append(get_project(gl, proj))
logger.debug("Got data from project %d/%d", k + 1, len(lines))
return packages