GRM-111: feat: unified --become-password-file, --verbose, --no-status, labels fix
Post-merge / detect-type (push) Successful in 51s
Post-merge / release (push) Successful in 1m14s
Post-merge / validate-commit-msg (push) Successful in 1m14s
Post-merge / vikunja (push) Successful in 1m14s
Post-merge / badges (push) Successful in 1m25s
Post-merge / sync-wiki (push) Successful in 1m53s
Post-merge / configure-repo (push) Successful in 1m20s
Post-merge / publish (push) Successful in 1m21s
Post-merge / detect-type (push) Successful in 51s
Post-merge / release (push) Successful in 1m14s
Post-merge / validate-commit-msg (push) Successful in 1m14s
Post-merge / vikunja (push) Successful in 1m14s
Post-merge / badges (push) Successful in 1m25s
Post-merge / sync-wiki (push) Successful in 1m53s
Post-merge / configure-repo (push) Successful in 1m20s
Post-merge / publish (push) Successful in 1m21s
This commit was merged in pull request #178.
This commit is contained in:
@@ -42,9 +42,9 @@ class RunnerManager:
|
||||
return
|
||||
fd, path = tempfile.mkstemp(suffix=".json", prefix="grm-vars-")
|
||||
try:
|
||||
os.fchmod(fd, 0o600)
|
||||
with os.fdopen(fd, "w") as f:
|
||||
json.dump(extra_vars, f)
|
||||
os.chmod(path, 0o600)
|
||||
yield path
|
||||
finally:
|
||||
with contextlib.suppress(FileNotFoundError):
|
||||
@@ -59,10 +59,21 @@ class RunnerManager:
|
||||
key: str | None = None,
|
||||
ask_become_pass: bool = False,
|
||||
description: str = "",
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> None:
|
||||
"""Build command with temp-file extra-vars and execute via executor."""
|
||||
with self._extra_vars_file(extra_vars) as vars_file:
|
||||
cmd = self._build_cmd(playbook_name, host, user, vars_file, key, ask_become_pass)
|
||||
cmd = self._build_cmd(
|
||||
playbook_name,
|
||||
host,
|
||||
user,
|
||||
vars_file,
|
||||
key,
|
||||
ask_become_pass,
|
||||
become_password_file,
|
||||
verbose,
|
||||
)
|
||||
self._executor.run(cmd, description=description)
|
||||
|
||||
def install(
|
||||
@@ -77,6 +88,8 @@ class RunnerManager:
|
||||
integration_retries: int = 3,
|
||||
ask_become_pass: bool = False,
|
||||
labels: str | None = None,
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> None:
|
||||
"""Install a runner on a remote host using Ansible."""
|
||||
if not name:
|
||||
@@ -94,7 +107,7 @@ class RunnerManager:
|
||||
}
|
||||
if admin_token:
|
||||
extra_vars["gitea_admin_token"] = admin_token
|
||||
if labels:
|
||||
if labels is not None:
|
||||
extra_vars["runner_labels"] = labels
|
||||
|
||||
with track_steps() as tracker:
|
||||
@@ -107,6 +120,8 @@ class RunnerManager:
|
||||
key,
|
||||
ask_become_pass,
|
||||
description=_("Installing Gitea Runner on {host}", host=host),
|
||||
become_password_file=become_password_file,
|
||||
verbose=verbose,
|
||||
)
|
||||
tracker.done()
|
||||
|
||||
@@ -128,6 +143,8 @@ class RunnerManager:
|
||||
key: str | None = None,
|
||||
version: str | None = None,
|
||||
ask_become_pass: bool = False,
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> None:
|
||||
"""Update the gitea_runner binary on a remote host."""
|
||||
extra_vars: dict[str, str | int] | None = None
|
||||
@@ -144,6 +161,8 @@ class RunnerManager:
|
||||
key,
|
||||
ask_become_pass,
|
||||
description=_("Updating Gitea Runner on {host}", host=host),
|
||||
become_password_file=become_password_file,
|
||||
verbose=verbose,
|
||||
)
|
||||
tracker.done()
|
||||
|
||||
@@ -187,6 +206,8 @@ class RunnerManager:
|
||||
user: str | None = None,
|
||||
key: str | None = None,
|
||||
ask_become_pass: bool = False,
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> None:
|
||||
"""Start a runner instance on a remote host."""
|
||||
actual_host, actual_user, actual_key, _gitea_url = self._resolve_runner(name, host, user, key)
|
||||
@@ -200,6 +221,8 @@ class RunnerManager:
|
||||
actual_key,
|
||||
ask_become_pass,
|
||||
description=_("Starting Gitea Runner {name} on {host}", name=name, host=actual_host),
|
||||
become_password_file=become_password_file,
|
||||
verbose=verbose,
|
||||
)
|
||||
tracker.done()
|
||||
|
||||
@@ -210,6 +233,8 @@ class RunnerManager:
|
||||
user: str | None = None,
|
||||
key: str | None = None,
|
||||
ask_become_pass: bool = False,
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> None:
|
||||
"""Stop a runner instance on a remote host."""
|
||||
actual_host, actual_user, actual_key, _gitea_url = self._resolve_runner(name, host, user, key)
|
||||
@@ -223,6 +248,8 @@ class RunnerManager:
|
||||
actual_key,
|
||||
ask_become_pass,
|
||||
description=_("Stopping Gitea Runner {name} on {host}", name=name, host=actual_host),
|
||||
become_password_file=become_password_file,
|
||||
verbose=verbose,
|
||||
)
|
||||
tracker.done()
|
||||
|
||||
@@ -233,6 +260,8 @@ class RunnerManager:
|
||||
user: str | None = None,
|
||||
key: str | None = None,
|
||||
ask_become_pass: bool = False,
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> None:
|
||||
"""Restart a runner instance on a remote host (stop, prune images, start)."""
|
||||
actual_host, actual_user, actual_key, _gitea_url = self._resolve_runner(name, host, user, key)
|
||||
@@ -246,6 +275,8 @@ class RunnerManager:
|
||||
actual_key,
|
||||
ask_become_pass,
|
||||
description=_("Restarting Gitea Runner {name} on {host}", name=name, host=actual_host),
|
||||
become_password_file=become_password_file,
|
||||
verbose=verbose,
|
||||
)
|
||||
tracker.done()
|
||||
|
||||
@@ -256,6 +287,8 @@ class RunnerManager:
|
||||
user: str | None = None,
|
||||
key: str | None = None,
|
||||
ask_become_pass: bool = False,
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> None:
|
||||
"""Enable a runner instance to start on boot."""
|
||||
actual_host, actual_user, actual_key, _gitea_url = self._resolve_runner(name, host, user, key)
|
||||
@@ -269,6 +302,8 @@ class RunnerManager:
|
||||
actual_key,
|
||||
ask_become_pass,
|
||||
description=_("Enabling Gitea Runner {name} on {host}", name=name, host=actual_host),
|
||||
become_password_file=become_password_file,
|
||||
verbose=verbose,
|
||||
)
|
||||
tracker.done()
|
||||
|
||||
@@ -281,6 +316,8 @@ class RunnerManager:
|
||||
token: str | None = None,
|
||||
gitea_url: str = "",
|
||||
ask_become_pass: bool = False,
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> None:
|
||||
"""Disable and deregister a runner instance."""
|
||||
actual_host, actual_user, actual_key, registry_gitea_url = self._resolve_runner(name, host, user, key)
|
||||
@@ -299,6 +336,8 @@ class RunnerManager:
|
||||
actual_key,
|
||||
ask_become_pass,
|
||||
description=_("Disabling Gitea Runner {name} on {host}", name=name, host=actual_host),
|
||||
become_password_file=become_password_file,
|
||||
verbose=verbose,
|
||||
)
|
||||
tracker.done()
|
||||
|
||||
@@ -309,6 +348,8 @@ class RunnerManager:
|
||||
user: str | None = None,
|
||||
key: str | None = None,
|
||||
ask_become_pass: bool = False,
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> None:
|
||||
"""Check the status of a runner instance."""
|
||||
actual_host, actual_user, actual_key, _gitea_url = self._resolve_runner(name, host, user, key)
|
||||
@@ -322,6 +363,8 @@ class RunnerManager:
|
||||
actual_key,
|
||||
ask_become_pass,
|
||||
description=_("Checking status of Gitea Runner {name} on {host}", name=name, host=actual_host),
|
||||
become_password_file=become_password_file,
|
||||
verbose=verbose,
|
||||
)
|
||||
tracker.done()
|
||||
|
||||
@@ -335,6 +378,8 @@ class RunnerManager:
|
||||
gitea_url: str = "",
|
||||
ask_become_pass: bool = False,
|
||||
force: bool = False,
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> None:
|
||||
"""Remove a runner instance completely.
|
||||
|
||||
@@ -361,6 +406,8 @@ class RunnerManager:
|
||||
actual_key,
|
||||
ask_become_pass,
|
||||
description=_("Removing Gitea Runner {name} from {host}", name=name, host=actual_host),
|
||||
become_password_file=become_password_file,
|
||||
verbose=verbose,
|
||||
)
|
||||
tracker.done()
|
||||
|
||||
@@ -368,13 +415,18 @@ class RunnerManager:
|
||||
self._registry.remove(name)
|
||||
tracker.done()
|
||||
|
||||
def list_runners(self, become_pass: str | None = None) -> list[dict[str, str]]:
|
||||
def list_runners(
|
||||
self,
|
||||
become_pass: str | None = None,
|
||||
no_status: bool = False,
|
||||
) -> list[dict[str, str]]:
|
||||
"""Return a list of registered runners with live service status.
|
||||
|
||||
Args:
|
||||
become_pass: Sudo password for ad-hoc status checks. When provided,
|
||||
it is passed via ``--become-password-file`` to avoid stdin
|
||||
consumption issues when checking multiple runners in sequence.
|
||||
no_status: Skip live SSH status checks and return ``"n/a"`` for status.
|
||||
"""
|
||||
runners = self._registry.list()
|
||||
result: list[dict[str, str]] = []
|
||||
@@ -382,6 +434,19 @@ class RunnerManager:
|
||||
host = info["host"]
|
||||
user = info["user"]
|
||||
key = info.get("key")
|
||||
|
||||
if no_status:
|
||||
result.append(
|
||||
{
|
||||
"name": name,
|
||||
"host": host,
|
||||
"user": user,
|
||||
"labels": info.get("labels", ""),
|
||||
"status": _("n/a"),
|
||||
}
|
||||
)
|
||||
continue
|
||||
|
||||
say(
|
||||
_(
|
||||
"Checking status of Gitea Runner {name} on {host} as {user} (sudo required)",
|
||||
@@ -402,7 +467,7 @@ class RunnerManager:
|
||||
f"XDG_RUNTIME_DIR=/run/user/$(id -u grm-{name}) "
|
||||
f"systemctl --user is-active gitea-runner 2>/dev/null",
|
||||
become=True,
|
||||
ask_become_pass=True,
|
||||
ask_become_pass=become_pass is not None,
|
||||
check=False,
|
||||
become_pass=become_pass,
|
||||
)
|
||||
@@ -437,6 +502,8 @@ class RunnerManager:
|
||||
extra_vars_file: str | None = None,
|
||||
key: str | None = None,
|
||||
ask_become_pass: bool = False,
|
||||
become_password_file: str | None = None,
|
||||
verbose: bool = False,
|
||||
) -> list[str]:
|
||||
"""Build the ansible-playbook command.
|
||||
|
||||
@@ -459,6 +526,10 @@ class RunnerManager:
|
||||
cmd.extend(["--extra-vars", f"@{extra_vars_file}"])
|
||||
if key:
|
||||
cmd.extend(["--private-key", key])
|
||||
if ask_become_pass:
|
||||
if become_password_file:
|
||||
cmd.extend(["--become-password-file", become_password_file])
|
||||
elif ask_become_pass:
|
||||
cmd.append("--ask-become-pass")
|
||||
if verbose:
|
||||
cmd.append("-v")
|
||||
return cmd
|
||||
|
||||
Reference in New Issue
Block a user