134 lines
3.6 KiB
Python
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
|