Files
grm/src/gitea_runner_manager/cli.py
T

134 lines
3.6 KiB
Python

"""Click CLI for Gitea Runner Manager."""
from __future__ import annotations
import os
import click
from dotenv import load_dotenv # pyright: ignore[reportMissingImports,reportUnknownVariableType]
from .exceptions import GRMError
from .runner_manager import RunnerManager
load_dotenv(override=True)
@click.group()
@click.version_option(version="0.1.0")
def cli() -> None:
"""Gitea Runner Manager — manage Gitea Actions runners."""
pass
@cli.command()
@click.argument("host")
@click.option(
"--user",
"-u",
default=lambda: os.getenv("GITEA_RUNNER_USER", os.getlogin()),
help="SSH user",
)
@click.option("--key", "-k", default=lambda: os.getenv("GITEA_RUNNER_KEY"), help="Path to SSH private key")
@click.option("--name", "-n", help="Runner name (default: host)")
@click.option(
"--token",
"-t",
default=lambda: os.getenv("GITEA_REGISTRATION_TOKEN"),
help="Registration token (env: GITEA_REGISTRATION_TOKEN)",
)
@click.option(
"--mode",
"-m",
type=click.Choice(["docker", "binary"]),
default="docker",
help="Runner deployment mode (default: docker)",
)
@click.option(
"--admin-token",
"-a",
default=lambda: os.getenv("GITEA_ADMIN_TOKEN"),
help="Gitea admin API token for integration test (env: GITEA_ADMIN_TOKEN)",
)
@click.option(
"--integration-retries",
"-r",
type=int,
default=lambda: int(os.getenv("GITEA_INTEGRATION_RETRIES", "3")),
help="Integration test API retries (default: 3, env: GITEA_INTEGRATION_RETRIES)",
)
@click.option("--ask-become-pass", is_flag=True, help="Prompt for sudo password")
def install(
host: str,
user: str,
key: str | None,
name: str | None,
token: str | None,
mode: str,
admin_token: str | None,
integration_retries: int,
ask_become_pass: bool,
) -> None:
"""Install and configure a runner on a remote host."""
gitea_url = os.getenv("GITEA_URL", "")
if not gitea_url:
raise click.ClickException("GITEA_URL must be set")
if not token:
raise click.ClickException("GITEA_REGISTRATION_TOKEN must be set (or pass --token)")
manager = RunnerManager()
try:
manager.install(
host=host,
user=user,
key=key,
name=name,
token=token,
gitea_url=gitea_url,
mode=mode,
admin_token=admin_token,
integration_retries=integration_retries,
ask_become_pass=ask_become_pass,
)
except GRMError as e:
raise click.ClickException(str(e)) from e
@cli.command()
@click.argument("host")
@click.option(
"--user",
"-u",
default=lambda: os.getenv("GITEA_RUNNER_USER", os.getlogin()),
help="SSH user",
)
@click.option("--key", "-k", default=lambda: os.getenv("GITEA_RUNNER_KEY"), help="Path to SSH private key")
@click.option("--version", "-v", help="Specific gitea_runner version")
@click.option(
"--mode",
"-m",
type=click.Choice(["docker", "binary"]),
default="docker",
help="Runner deployment mode (default: docker)",
)
@click.option("--ask-become-pass", is_flag=True, help="Prompt for sudo password")
def update(
host: str,
user: str,
key: str | None,
version: str | None,
mode: str,
ask_become_pass: bool,
) -> None:
"""Update the gitea_runner binary on a remote host."""
manager = RunnerManager()
try:
manager.update(
host=host,
user=user,
key=key,
version=version,
mode=mode,
ask_become_pass=ask_become_pass,
)
except GRMError as e:
raise click.ClickException(str(e)) from e