# Changelog All notable changes to this project will be documented in this file. ## [0.5.0] - 2026-06-21 ### Packaging - `pyproject.toml` now uses `dynamic = ["version"]` with setuptools `attr` to source version from `__init__.py` (single source of truth) - Added `console_scripts` entry point (`grm = "gitea_runner_manager.cli:cli"`) ### Bug Fixes - Arch Linux: pacman cache update now runs separately before package installation (fixes idempotence) - `rootless_docker.yml`: separated `update_cache` from package installation task ### Internal - Added `GiteaClient.create_issue`, `GiteaClient.get_pr_files`, `GiteaClient.create_review` API methods - Added `VikunjaClient.get_task` method - Config URLs and repo settings now overridable via environment variables ## [0.4.0] - 2026-06-21 ### Rootless Docker Support - Full rootless Docker installation and configuration via Ansible - `docker_rootless_setup` variable controls whether rootless Docker tasks run - User setup tasks (subuid/subgid, lingering, dockerd-rootless) - Proper gating of all Docker-dependent and `systemctl --user` tasks ### Runner Labels - `--labels` option on `grm install` — specify runner labels (e.g., `--labels "ubuntu-latest:docker://node:20"`) - Labels passed through to runner config YAML ### Security Fix (CWE-214) - **Critical**: Registration tokens and admin tokens are no longer passed via `--extra-vars` on the command line - Extra-vars are now written to a temporary JSON file with `0600` permissions and passed via `--extra-vars @tempfile` - This prevents secrets from being visible in the process list (`ps aux`) ### Configuration via Environment Variables - API URLs and repo configuration in `config.py` are now overridable via environment variables: - `GRM_GITEA_API_URL` - `GRM_VIKUNJA_API_URL` - `GRM_REPO_OWNER` - `GRM_REPO_NAME` - `GRM_VIKUNJA_PROJECT_ID` ### Ansible Role Improvements - Dead code cleanup (removed `config.yml`, legacy system-level service, duplicate task includes) - `remove-runner.yml` now disables lingering and removes subuid/subgid entries for complete cleanup - Arch Linux: `gnupg` package name fix, pacman cache handling - Docker APT repository: deb822 format, proper GPG handling, arch mapping - Idempotence fixes for user_setup and download tasks ## [0.3.0] - 2026-06-21 ### New CLI Options - `--force` flag on `grm remove` — remove a runner even when the host is unreachable (skips Ansible playbook, only deregisters via API) - `--url` option — override the Gitea URL for any command (useful for multiple Gitea instances) - `--ask-become-pass` is now the default behavior (no need to pass it explicitly) ### Status Detection Fixes - `grm list` now correctly retrieves runner status (was showing "unknown" for active runners) - Docker mode status detection via `docker inspect` - Host/user context added to status output ### Output Improvements - Colorized output for better visual feedback (green/red/yellow) - Translated operation reports for success and failure cases - Dual logging: `click.echo()` for user-facing messages, `logging` for debug - `GRM_LOG_LEVEL` environment variable for controlling verbosity - Full i18n support (all user-facing strings translated) ### Internal Refactoring - Validation moved from CLI layer to business layer - Centralized API clients and HTTP status codes - User-friendly Click errors with i18n ## [0.2.0] - 2026-06-21 ### New CLI Commands - `grm start ` — start a runner's systemd service - `grm stop ` — stop a runner's systemd service - `grm enable ` — enable a runner to start on boot - `grm disable ` — disable a runner from starting on boot - `grm status ` — check runner service status - `grm remove ` — deregister and remove a runner - `grm list-runners` — list all runners from the local registry ### Runner Registry - Runners are tracked in `~/.config/grm/runners.toml` for simplified CLI usage - No need to specify `--url`, `--user`, `--key` for every command — the registry remembers ### Multi-Instance Support - systemd template units (`gitea-runner@.service`) for running multiple runners per host - Per-instance config and data directories ### Ansible Role Improvements - Parameterized all hardcoded configuration values as Ansible variables - Idempotence fixes for repeated runs - Runner config converted from TOML to YAML format - Registration timeout to prevent indefinite hangs - Docker container entrypoint override and working directory fix for `.runner` persistence ## [0.1.0] - 2026-06-21 ### Initial Release The first release of GRM, a lean CLI for managing Gitea Actions runners via SSH. ### CLI Commands - `grm install ` — install and register a Gitea Runner on a remote host via SSH - `grm token` — generate a registration token via the Gitea API - `grm list` — list all registered runners - `grm update ` — update a runner to the latest version ### Ansible Role - Installs Gitea Runner binary in binary or Docker mode - Registers runner with Gitea instance - Configures systemd service - Supports Arch Linux, Ubuntu, and Debian ### Features - SSH-based remote execution via Ansible - Automatic registration token generation - Docker and binary installation modes - Integration test verification after installation