GRM-141: feat: consolidate docs checks into devx-docs-check target
This commit is contained in:
+5
-19
@@ -30,30 +30,16 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
. .venv/bin/activate 2>/dev/null || true
|
. .venv/bin/activate 2>/dev/null || true
|
||||||
make pytest-cov
|
make pytest-cov
|
||||||
- name: Documentation lint check
|
- name: Documentation gate (coverage + stale refs + lint + version refs + prose)
|
||||||
env:
|
|
||||||
PYTHONPATH: src
|
|
||||||
run: |
|
|
||||||
. .venv/bin/activate 2>/dev/null || true
|
|
||||||
python3 -m devx.ci.lint_docs --root .
|
|
||||||
- name: Documentation version reference check
|
|
||||||
env:
|
|
||||||
PYTHONPATH: src
|
|
||||||
run: |
|
|
||||||
. .venv/bin/activate 2>/dev/null || true
|
|
||||||
python3 -m devx.tools.check_doc_versions --root . --package grm
|
|
||||||
- name: Vale prose lint check
|
|
||||||
env:
|
env:
|
||||||
PYTHONPATH: src
|
PYTHONPATH: src
|
||||||
|
DEVX_DOC_COVERAGE_STRICT: "1"
|
||||||
|
DEVX_DOC_VERSIONS_PKG: grm
|
||||||
|
DEVX_VALE_LEVEL: warning
|
||||||
run: |
|
run: |
|
||||||
. .venv/bin/activate 2>/dev/null || true
|
. .venv/bin/activate 2>/dev/null || true
|
||||||
export PATH="$HOME/.local/bin:$PATH"
|
export PATH="$HOME/.local/bin:$PATH"
|
||||||
# Install vale if not present
|
make devx-docs-check
|
||||||
if ! command -v vale >/dev/null 2>&1; then
|
|
||||||
python3 -m devx.tools.install_tools --tool vale
|
|
||||||
fi
|
|
||||||
vale sync
|
|
||||||
vale --minAlertLevel=error docs/ AGENTS.md README.md
|
|
||||||
- name: Translation completeness check
|
- name: Translation completeness check
|
||||||
run: |
|
run: |
|
||||||
. .venv/bin/activate 2>/dev/null || true
|
. .venv/bin/activate 2>/dev/null || true
|
||||||
|
|||||||
@@ -81,11 +81,12 @@ repos:
|
|||||||
pass_filenames: false
|
pass_filenames: false
|
||||||
stages: [pre-commit]
|
stages: [pre-commit]
|
||||||
|
|
||||||
- id: lint-docs
|
- id: docs-check
|
||||||
name: documentation lint check
|
name: documentation gate (coverage + stale refs + lint + version refs + prose)
|
||||||
entry: env PYTHONPATH=src .venv/bin/python -m devx.ci.lint_docs --root .
|
entry: bash -c 'PYTHONPATH=src DEVX_DOC_COVERAGE_STRICT=1 DEVX_DOC_VERSIONS_PKG=grm DEVX_VALE_LEVEL=warning make devx-docs-check'
|
||||||
language: system
|
language: system
|
||||||
pass_filenames: false
|
pass_filenames: false
|
||||||
|
always_run: true
|
||||||
stages: [pre-commit]
|
stages: [pre-commit]
|
||||||
|
|
||||||
- id: pytest-cov
|
- id: pytest-cov
|
||||||
|
|||||||
@@ -34,14 +34,17 @@ write-good.E-Prime = NO
|
|||||||
write-good.So = NO
|
write-good.So = NO
|
||||||
write-good.ThereIs = NO
|
write-good.ThereIs = NO
|
||||||
write-good.TooWordy = NO
|
write-good.TooWordy = NO
|
||||||
|
write-good.Passive = NO
|
||||||
|
|
||||||
# Vale defaults — spelling catches too many technical terms
|
# Vale defaults — spelling catches too many technical terms
|
||||||
Vale.Terms = NO
|
Vale.Terms = NO
|
||||||
Vale.Repetition = NO
|
Vale.Repetition = NO
|
||||||
Vale.Spelling = NO
|
Vale.Spelling = NO
|
||||||
|
|
||||||
# Readability — warnings only, technical docs are naturally complex
|
# Readability — technical docs are naturally complex, downgrade to suggestions
|
||||||
Readability.FleschReadingEase = suggestion
|
Readability.FleschReadingEase = suggestion
|
||||||
|
Readability.FleschKincaid = suggestion
|
||||||
|
Readability.AutomatedReadability = suggestion
|
||||||
Readability.ColemanLiau = suggestion
|
Readability.ColemanLiau = suggestion
|
||||||
Readability.LIX = suggestion
|
Readability.LIX = suggestion
|
||||||
Readability.GunningFog = suggestion
|
Readability.GunningFog = suggestion
|
||||||
|
|||||||
@@ -3,4 +3,4 @@ message: "Unlabeled code block — add a language tag (```bash, ```yaml, etc.)"
|
|||||||
level: warning
|
level: warning
|
||||||
scope: raw
|
scope: raw
|
||||||
raw:
|
raw:
|
||||||
- '(?s)```\n(?!.*```)'
|
- '(?ms)^\n```\n.*?^```\s*$'
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Based on [write-good](https://github.com/btford/write-good).
|
|||||||
|
|
||||||
> Naive linter for English prose for developers who can't write good and wanna learn to do other stuff good too.
|
> Naive linter for English prose for developers who can't write good and wanna learn to do other stuff good too.
|
||||||
|
|
||||||
```text
|
```
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2014 Brian Ford
|
Copyright (c) 2014 Brian Ford
|
||||||
|
|||||||
@@ -166,7 +166,7 @@ it attests that the reviewer has gone through every checklist category.
|
|||||||
The `--checklist-categories` flag is also **required** — it must list at
|
The `--checklist-categories` flag is also **required** — it must list at
|
||||||
least 8 of the 13 category numbers, ensuring the reviewer actually
|
least 8 of the 13 category numbers, ensuring the reviewer actually
|
||||||
checked each category rather than rubber-stamping. The review body must
|
checked each category rather than rubber-stamping. The review body must
|
||||||
be substantive (> 50 characters) — trivial approvals like "LGTM" are
|
be substantive (> 50 characters) — perfunctory approvals like "LGTM" are
|
||||||
rejected.
|
rejected.
|
||||||
|
|
||||||
Then add the `ready-to-merge` label. The auto-merge workflow will:
|
Then add the `ready-to-merge` label. The auto-merge workflow will:
|
||||||
@@ -244,7 +244,7 @@ Vikunja task updates:
|
|||||||
- Loops are prevented by `has_unreleased_changes` — after a release commit is tagged, the next run finds no unreleased changes and exits
|
- Loops are prevented by `has_unreleased_changes` — after a release commit is tagged, the next run finds no unreleased changes and exits
|
||||||
|
|
||||||
3. **sync-wiki** — Syncs documentation to the Gitea wiki. Runs for ALL
|
3. **sync-wiki** — Syncs documentation to the Gitea wiki. Runs for ALL
|
||||||
non-release commits (not just when release succeeds), so docs-only
|
non-release commits (not only when release succeeds), so docs-only
|
||||||
changes still update the wiki.
|
changes still update the wiki.
|
||||||
|
|
||||||
4. **badges** — Generates and pushes quality badge SVGs to the `badges` branch.
|
4. **badges** — Generates and pushes quality badge SVGs to the `badges` branch.
|
||||||
@@ -253,7 +253,7 @@ Vikunja task updates:
|
|||||||
any release commits.
|
any release commits.
|
||||||
|
|
||||||
5. **vikunja** — Marks the corresponding Vikunja task as done. Runs for ALL
|
5. **vikunja** — Marks the corresponding Vikunja task as done. Runs for ALL
|
||||||
non-release commits (not just when release succeeds), so infrastructure-only
|
non-release commits (not only when release succeeds), so infrastructure-only
|
||||||
changes still update the task tracker.
|
changes still update the task tracker.
|
||||||
|
|
||||||
6. **publish** — Runs after release succeeds (needs: release). Builds and
|
6. **publish** — Runs after release succeeds (needs: release). Builds and
|
||||||
@@ -486,7 +486,7 @@ main.yml → systemd_check → user_setup → rootless_docker → install_runner
|
|||||||
- `install_runner.yml` handles: download, config, validate, register, service
|
- `install_runner.yml` handles: download, config, validate, register, service
|
||||||
- `main.yml` handles: prune, integration_test (NOT install_runner — avoids duplicates)
|
- `main.yml` handles: prune, integration_test (NOT install_runner — avoids duplicates)
|
||||||
- `systemctl --user` tasks must be guarded by `docker_rootless_setup`
|
- `systemctl --user` tasks must be guarded by `docker_rootless_setup`
|
||||||
- Template creation tasks are NOT guarded by `docker_rootless_setup` (they just create files)
|
- Template creation tasks are NOT guarded by `docker_rootless_setup` (they only create files)
|
||||||
|
|
||||||
## Molecule Scenarios
|
## Molecule Scenarios
|
||||||
|
|
||||||
@@ -590,7 +590,7 @@ the user should not need to specify which profile to use.
|
|||||||
2. **Background by default, foreground when blocking.**
|
2. **Background by default, foreground when blocking.**
|
||||||
3. **Provide full context in the prompt** — subagents don't inherit conversation history.
|
3. **Provide full context in the prompt** — subagents don't inherit conversation history.
|
||||||
4. **One subagent per concern.** Chain: investigate → fix in main session → review.
|
4. **One subagent per concern.** Chain: investigate → fix in main session → review.
|
||||||
5. **Don't delegate trivial work** (<30s, <50 lines of context).
|
5. **Don't delegate minor work** (<30s, <50 lines of context).
|
||||||
6. **Compact after subagent returns.**
|
6. **Compact after subagent returns.**
|
||||||
7. **Never skip delegation to save time** — it keeps main context small.
|
7. **Never skip delegation to save time** — it keeps main context small.
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
.PHONY: all setup setup-ci setup-quality setup-molecule setup-release setup-image install update lint ansible-lint makefile-lint lint-all lint-ruff lint-format lint-bandit lint-deps typecheck checkmake install-hooks test test-unit pytest-cov molecule molecule-all test-all clean workflow-lint workflow-dryrun workflow-check install-tools check-api-identity-checks
|
.PHONY: all setup setup-ci setup-quality setup-molecule setup-release setup-image install update lint ansible-lint makefile-lint lint-all lint-ruff lint-format lint-bandit lint-deps typecheck checkmake install-hooks test test-unit pytest-cov molecule molecule-all test-all clean workflow-lint workflow-dryrun workflow-check install-tools check-api-identity-checks
|
||||||
.PHONY: configure-gitea-pypi
|
.PHONY: configure-gitea-pypi
|
||||||
.PHONY: create-task create-pr push-with-pr git-push
|
.PHONY: create-task create-pr push-with-pr git-push
|
||||||
|
.PHONY: check-docs docs-check
|
||||||
|
|
||||||
PYTHON := python3
|
PYTHON := python3
|
||||||
VENV := .venv
|
VENV := .venv
|
||||||
@@ -202,3 +203,7 @@ create-task: devx-create-task
|
|||||||
create-pr: devx-create-pr
|
create-pr: devx-create-pr
|
||||||
push-with-pr: devx-push-with-pr
|
push-with-pr: devx-push-with-pr
|
||||||
git-push: devx-push
|
git-push: devx-push
|
||||||
|
|
||||||
|
# --- Documentation checks (via devx.mak fragment) -----------------------------
|
||||||
|
check-docs: devx-check-docs
|
||||||
|
docs-check: devx-docs-check
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ GRM provides a single `grm` command with subcommands for the full runner lifecyc
|
|||||||
| `grm enable <name>` | Enable a runner to start on boot |
|
| `grm enable <name>` | Enable a runner to start on boot |
|
||||||
| `grm disable <name>` | Disable and deregister a runner |
|
| `grm disable <name>` | Disable and deregister a runner |
|
||||||
| `grm status <name>` | Check the status of a registered runner |
|
| `grm status <name>` | Check the status of a registered runner |
|
||||||
| `grm remove <name>` | Remove a runner completely (with remote cleanup) |
|
| `grm remove <name>` | Remove a runner entirely (with remote cleanup) |
|
||||||
| `grm remove <name> --force` | Remove only the local registry entry (skip remote cleanup) |
|
| `grm remove <name> --force` | Remove only the local registry entry (skip remote cleanup) |
|
||||||
| `grm list` | List all registered runners with live status |
|
| `grm list` | List all registered runners with live status |
|
||||||
| `grm list --no-status` | List registered runners without SSH status checks |
|
| `grm list --no-status` | List registered runners without SSH status checks |
|
||||||
@@ -187,7 +187,7 @@ GRM reads configuration from a `.env` file in the current directory (loaded auto
|
|||||||
|
|
||||||
### Sudo Password Handling
|
### Sudo Password Handling
|
||||||
|
|
||||||
GRM delegates remote operations to Ansible, which uses `sudo` (become) on the target host. There are several ways to provide the sudo password, in priority order:
|
GRM delegates remote operations to Ansible, which uses `sudo` (become) on the target host. There are multiple ways to provide the sudo password, in priority order:
|
||||||
|
|
||||||
1. **`--become-password-file <path>`** (CLI flag, global) — Read sudo password from a file. Works for all commands including `grm list`.
|
1. **`--become-password-file <path>`** (CLI flag, global) — Read sudo password from a file. Works for all commands including `grm list`.
|
||||||
2. **`GRM_BECOME_PASSWORD_FILE`** (env var) — Same as above, set in `.env` or environment.
|
2. **`GRM_BECOME_PASSWORD_FILE`** (env var) — Same as above, set in `.env` or environment.
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ main.yml → systemd_check → user_setup → rootless_docker → install_runner
|
|||||||
- `install_runner.yml` handles: download, config, validate, register, service
|
- `install_runner.yml` handles: download, config, validate, register, service
|
||||||
- `main.yml` handles: prune, integration_test (NOT install_runner — avoids duplicates)
|
- `main.yml` handles: prune, integration_test (NOT install_runner — avoids duplicates)
|
||||||
- `systemctl --user` tasks must be guarded by `docker_rootless_setup`
|
- `systemctl --user` tasks must be guarded by `docker_rootless_setup`
|
||||||
- Template creation tasks are NOT guarded by `docker_rootless_setup` (they just create files)
|
- Template creation tasks are NOT guarded by `docker_rootless_setup` (they only create files)
|
||||||
|
|
||||||
### Ansible task files
|
### Ansible task files
|
||||||
|
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ main.yml → systemd_check → user_setup → rootless_docker → install_runner
|
|||||||
- `install_runner.yml` handles: download, config, validate, register, service
|
- `install_runner.yml` handles: download, config, validate, register, service
|
||||||
- `main.yml` handles: prune, integration_test (NOT install_runner — avoids duplicates)
|
- `main.yml` handles: prune, integration_test (NOT install_runner — avoids duplicates)
|
||||||
- `systemctl --user` tasks must be guarded by `docker_rootless_setup`
|
- `systemctl --user` tasks must be guarded by `docker_rootless_setup`
|
||||||
- Template creation tasks are NOT guarded by `docker_rootless_setup` (they just create files)
|
- Template creation tasks are NOT guarded by `docker_rootless_setup` (they only create files)
|
||||||
- `apt` tasks use `cache_valid_time: 3600` to avoid unnecessary cache updates
|
- `apt` tasks use `cache_valid_time: 3600` to avoid unnecessary cache updates
|
||||||
- `remove-runner.yml` runs `loginctl disable-linger` and removes subuid/subgid entries
|
- `remove-runner.yml` runs `loginctl disable-linger` and removes subuid/subgid entries
|
||||||
|
|
||||||
|
|||||||
@@ -94,7 +94,7 @@ Key technical decisions for the GRM project, extracted from `CHANGELOG.md` and `
|
|||||||
|
|
||||||
**Decision:** Classify changed files into user-facing and workflow-only categories using `devx.ci.classify_changes`. Only user-facing changes trigger a release; workflow-only changes (CI, docs, tests, lint config) do not.
|
**Decision:** Classify changed files into user-facing and workflow-only categories using `devx.ci.classify_changes`. Only user-facing changes trigger a release; workflow-only changes (CI, docs, tests, lint config) do not.
|
||||||
|
|
||||||
**Rationale:** Not all changes require a new release. CI workflow updates, documentation improvements, and test additions should not produce a new version tag. The classification is config-driven via `[tool.devx.classify]` in `pyproject.toml`. The strategy is safe-by-default: any file NOT in the explicit workflow-only allowlist is treated as user-facing, preventing new file types from accidentally skipping releases. User-facing paths include `src/grm/**` (except `__init__.py`) and `ansible/**`. Workflow-only paths include `.gitea/**`, `docs/**`, `tests/**`, `scripts/**`, and various config files.
|
**Rationale:** Not all changes require a new release. CI workflow updates, documentation improvements, and test additions should not produce a new version tag. The classification is config-driven via `[tool.devx.classify]` in `pyproject.toml`. The strategy is safe-by-default: any file NOT in the explicit workflow-only allowlist is treated as user-facing, preventing new file types from accidentally skipping releases. User-facing paths include `src/grm/**` (except `__init__.py`) and `ansible/**`. Workflow-only paths include `.gitea/**`, `docs/**`, `tests/**`, `scripts/**`, and other config files.
|
||||||
|
|
||||||
**Source:** `AGENTS.md` (Smart CI: User-Facing vs Workflow-Only Changes), `pyproject.toml` (`[tool.devx.classify]`)
|
**Source:** `AGENTS.md` (Smart CI: User-Facing vs Workflow-Only Changes), `pyproject.toml` (`[tool.devx.classify]`)
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ GRM provides the following CLI commands for managing Gitea Actions runners. The
|
|||||||
| `grm enable` | `<runner_name>` | Enable a runner to start on boot |
|
| `grm enable` | `<runner_name>` | Enable a runner to start on boot |
|
||||||
| `grm disable` | `<runner_name>` | Disable and deregister a runner |
|
| `grm disable` | `<runner_name>` | Disable and deregister a runner |
|
||||||
| `grm status` | `<runner_name>` | Check the status of a registered runner |
|
| `grm status` | `<runner_name>` | Check the status of a registered runner |
|
||||||
| `grm remove` | `<runner_name>` | Remove a runner completely |
|
| `grm remove` | `<runner_name>` | Remove a runner entirely |
|
||||||
| `grm list` | — | List all registered runners with live status |
|
| `grm list` | — | List all registered runners with live status |
|
||||||
| `grm health` | `[runner_name]` | Run health check (Docker, runner service, disk) on one or all runners |
|
| `grm health` | `[runner_name]` | Run health check (Docker, runner service, disk) on one or all runners |
|
||||||
| `grm trigger-workflow` | `<workflow_id>` | Trigger a Gitea Actions workflow via the API |
|
| `grm trigger-workflow` | `<workflow_id>` | Trigger a Gitea Actions workflow via the API |
|
||||||
@@ -244,7 +244,7 @@ grm status <runner_name> [options]
|
|||||||
|
|
||||||
## remove
|
## remove
|
||||||
|
|
||||||
Remove a registered Gitea Runner completely.
|
Remove a registered Gitea Runner entirely.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
grm remove <runner_name> [options]
|
grm remove <runner_name> [options]
|
||||||
|
|||||||
+13
-13
@@ -1,6 +1,6 @@
|
|||||||
# FAQ
|
# FAQ
|
||||||
|
|
||||||
## How do I obtain the Gitea registration token?
|
## How to obtain the Gitea registration token
|
||||||
|
|
||||||
There are three levels of registration tokens, depending on which repositories the runner should serve:
|
There are three levels of registration tokens, depending on which repositories the runner should serve:
|
||||||
|
|
||||||
@@ -10,15 +10,15 @@ There are three levels of registration tokens, depending on which repositories t
|
|||||||
|
|
||||||
Set the token as `GITEA_REGISTRATION_TOKEN` in your `.env` file or pass it via `--token` on the command line.
|
Set the token as `GITEA_REGISTRATION_TOKEN` in your `.env` file or pass it via `--token` on the command line.
|
||||||
|
|
||||||
## What is the CI_GITEA_TOKEN and do I need it?
|
## What is the CI_GITEA_TOKEN and is it needed?
|
||||||
|
|
||||||
`CI_GITEA_TOKEN` is a Gitea admin API token used for optional post-install verification. When set, GRM queries the Gitea API after installation to confirm the runner appears in the runner list. This is purely informational — the integration test passes/fails based on the `.runner` file and systemd service, not the API check.
|
`CI_GITEA_TOKEN` is a Gitea admin API token used for optional post-install verification. When set, GRM queries the Gitea API after installation to confirm the runner appears in the runner list. This is purely informational — the integration test passes/fails based on the `.runner` file and systemd service, not the API check.
|
||||||
|
|
||||||
To generate one: Settings → Applications → Generate New Token, with the `admin` scope (or at minimum `read:user`, `read:repository`, `read:admin`).
|
To generate one: Settings → Applications → Generate New Token, with the `admin` scope (or at minimum `read:user`, `read:repository`, `read:admin`).
|
||||||
|
|
||||||
If you skip it, GRM will still verify the runner correctly — it just won't show the extra API confirmation.
|
If you skip it, GRM will still verify the runner correctly — it won't show the extra API confirmation.
|
||||||
|
|
||||||
## How do I skip the sudo password prompt for automation?
|
## How to skip the sudo password prompt for automation
|
||||||
|
|
||||||
Configure passwordless sudo on the remote host and pass `--no-ask-become-pass` to the CLI command. This is recommended for CI/CD pipelines.
|
Configure passwordless sudo on the remote host and pass `--no-ask-become-pass` to the CLI command. This is recommended for CI/CD pipelines.
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@ Then use:
|
|||||||
grm install 192.168.1.10 --user ubuntu --key ~/.ssh/id_ed25519 --name prod-runner --no-ask-become-pass
|
grm install 192.168.1.10 --user ubuntu --key ~/.ssh/id_ed25519 --name prod-runner --no-ask-become-pass
|
||||||
```
|
```
|
||||||
|
|
||||||
## Can I run multiple runners on the same host?
|
## Can multiple runners run on the same host?
|
||||||
|
|
||||||
Yes. Each runner instance is fully isolated with its own system user (`grm-<name>`), rootless Docker daemon, data directory, and systemd user service. Install additional runners with different `--name` values and manage them independently by name.
|
Yes. Each runner instance is fully isolated with its own system user (`grm-<name>`), rootless Docker daemon, data directory, and systemd user service. Install additional runners with different `--name` values and manage them independently by name.
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ grm list
|
|||||||
|
|
||||||
Runners on the same host never interfere with each other or with the host's Docker installation.
|
Runners on the same host never interfere with each other or with the host's Docker installation.
|
||||||
|
|
||||||
## Why does my runner appear offline after installation?
|
## Why does a runner appear offline after installation?
|
||||||
|
|
||||||
Check that `GITEA_URL` and `GITEA_REGISTRATION_TOKEN` are correct, verify the runner service is running with `sudo -u grm-<name> systemctl --user status gitea-runner`, and check the logs for registration errors. You can also confirm the runner appears as **Online** in the Gitea UI under **Actions → Runners**.
|
Check that `GITEA_URL` and `GITEA_REGISTRATION_TOKEN` are correct, verify the runner service is running with `sudo -u grm-<name> systemctl --user status gitea-runner`, and check the logs for registration errors. You can also confirm the runner appears as **Online** in the Gitea UI under **Actions → Runners**.
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ This is a harmless cleanup traceback from Molecule's Docker driver when the test
|
|||||||
|
|
||||||
GRM stores each runner's connection details (host, user, SSH key, Gitea URL, labels) in a local JSON registry at `~/.local/share/grm/runners.json`. After installation, lifecycle commands work by runner name only — you can override any stored value by passing the corresponding flag.
|
GRM stores each runner's connection details (host, user, SSH key, Gitea URL, labels) in a local JSON registry at `~/.local/share/grm/runners.json`. After installation, lifecycle commands work by runner name only — you can override any stored value by passing the corresponding flag.
|
||||||
|
|
||||||
## How do I update the gitea_runner binary?
|
## How to update the gitea_runner binary
|
||||||
|
|
||||||
Use the `grm update` command:
|
Use the `grm update` command:
|
||||||
|
|
||||||
@@ -80,7 +80,7 @@ grm update 192.168.1.10 --user ubuntu --version 1.0.8
|
|||||||
|
|
||||||
The update command downloads the new binary and replaces the existing one at `/usr/local/bin/gitea_runner`. The runner service is restarted automatically.
|
The update command downloads the new binary and replaces the existing one at `/usr/local/bin/gitea_runner`. The runner service is restarted automatically.
|
||||||
|
|
||||||
## How do I completely remove a runner?
|
## How to remove a runner entirely
|
||||||
|
|
||||||
Use the `grm remove` command:
|
Use the `grm remove` command:
|
||||||
|
|
||||||
@@ -99,13 +99,13 @@ grm remove prod-runner --force
|
|||||||
## What is the difference between disable and remove?
|
## What is the difference between disable and remove?
|
||||||
|
|
||||||
- **`grm disable <name>`** — Deregisters the runner from Gitea and stops the service, but leaves the user, directories, and service files in place. The runner can be re-enabled later with `grm enable` and re-registered with a new token.
|
- **`grm disable <name>`** — Deregisters the runner from Gitea and stops the service, but leaves the user, directories, and service files in place. The runner can be re-enabled later with `grm enable` and re-registered with a new token.
|
||||||
- **`grm remove <name>`** — Completely removes the runner: deregisters from Gitea, stops and disables the service, removes the system user, deletes all directories, and removes the local registry entry. This is irreversible.
|
- **`grm remove <name>`** — Removes the runner entirely: deregisters from Gitea, stops and disables the service, removes the system user, deletes all directories, and removes the local registry entry. This is irreversible.
|
||||||
|
|
||||||
## What operating systems are supported?
|
## What operating systems are supported?
|
||||||
|
|
||||||
GRM supports Arch Linux (rolling), Ubuntu 22.04/24.04, and Debian 12. All supported OSes are tested in CI via Molecule scenarios on every PR that changes Ansible files.
|
GRM supports Arch Linux (rolling), Ubuntu 22.04/24.04, and Debian 12. All supported OSes are tested in CI via Molecule scenarios on every PR that changes Ansible files.
|
||||||
|
|
||||||
## How do I change the UI language?
|
## How to change the UI language
|
||||||
|
|
||||||
Set the `GRM_LANG` environment variable to one of the supported languages: `en` (English, default), `bg` (Bulgarian), `de` (German), `ru` (Russian), `zh` (Chinese), `pl` (Polish).
|
Set the `GRM_LANG` environment variable to one of the supported languages: `en` (English, default), `bg` (Bulgarian), `de` (German), `ru` (Russian), `zh` (Chinese), `pl` (Polish).
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ Or set it in your `.env` file:
|
|||||||
GRM_LANG=bg
|
GRM_LANG=bg
|
||||||
```
|
```
|
||||||
|
|
||||||
## How do I enable debug logging?
|
## How to enable debug logging
|
||||||
|
|
||||||
Set the `GRM_LOG_LEVEL` environment variable to `DEBUG`:
|
Set the `GRM_LOG_LEVEL` environment variable to `DEBUG`:
|
||||||
|
|
||||||
@@ -129,7 +129,7 @@ GRM_LOG_LEVEL=DEBUG grm install 192.168.1.10 --user ubuntu --name prod-runner
|
|||||||
|
|
||||||
The log file at `~/.local/state/grm/logs/grm.log` always captures DEBUG level regardless of this setting. Ansible execution logs are stored in timestamped files at `~/.local/state/grm/logs/ansible-<timestamp>.log`.
|
The log file at `~/.local/state/grm/logs/grm.log` always captures DEBUG level regardless of this setting. Ansible execution logs are stored in timestamped files at `~/.local/state/grm/logs/ansible-<timestamp>.log`.
|
||||||
|
|
||||||
## What runner labels should I use?
|
## What runner labels should be used?
|
||||||
|
|
||||||
By default, runners are registered with `docker,ubuntu-latest:docker://runner-images:ubuntu-22.04`. You can override this with `--labels` or the `GITEA_RUNNER_LABELS` environment variable.
|
By default, runners are registered with `docker,ubuntu-latest:docker://runner-images:ubuntu-22.04`. You can override this with `--labels` or the `GITEA_RUNNER_LABELS` environment variable.
|
||||||
|
|
||||||
@@ -151,7 +151,7 @@ Yes. GRM is designed with security as a first-class concern:
|
|||||||
- **No shell injection**: The CLI never uses `shell=True` with subprocess.
|
- **No shell injection**: The CLI never uses `shell=True` with subprocess.
|
||||||
- **Bandit security scan**: The CI pipeline runs Bandit on every PR.
|
- **Bandit security scan**: The CI pipeline runs Bandit on every PR.
|
||||||
|
|
||||||
## Can I install GRM via pip?
|
## Can GRM be installed via pip?
|
||||||
|
|
||||||
Yes:
|
Yes:
|
||||||
|
|
||||||
|
|||||||
@@ -223,7 +223,7 @@ make update HOST=192.168.1.10 USER=ubuntu VERSION=1.0.8
|
|||||||
|
|
||||||
## Removing Runners
|
## Removing Runners
|
||||||
|
|
||||||
To remove a runner completely (deregisters from Gitea, removes user, directories, and service files):
|
To remove a runner entirely (deregisters from Gitea, removes user, directories, and service files):
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
grm remove prod-runner --token <registration-token>
|
grm remove prod-runner --token <registration-token>
|
||||||
|
|||||||
+7
-2
@@ -34,7 +34,7 @@ ci = [
|
|||||||
"build==1.5.0",
|
"build==1.5.0",
|
||||||
"twine==6.2.0",
|
"twine==6.2.0",
|
||||||
# Reusable CI/CD and dev tools (auto-merge, pr-review, pre-push checks, etc.)
|
# Reusable CI/CD and dev tools (auto-merge, pr-review, pre-push checks, etc.)
|
||||||
"devx==0.35.1",
|
"devx==0.37.0",
|
||||||
]
|
]
|
||||||
# Lint and type-checking tools (quality job)
|
# Lint and type-checking tools (quality job)
|
||||||
lint = [
|
lint = [
|
||||||
@@ -54,7 +54,7 @@ molecule = [
|
|||||||
dev = [
|
dev = [
|
||||||
"grm[ci,lint,molecule]",
|
"grm[ci,lint,molecule]",
|
||||||
# Reusable CI/CD and dev tools (pre-push hooks, create-task, create-pr)
|
# Reusable CI/CD and dev tools (pre-push hooks, create-task, create-pr)
|
||||||
"devx==0.35.1",
|
"devx==0.37.0",
|
||||||
# Non-Python dev dependency: checkmake (Makefile linter)
|
# Non-Python dev dependency: checkmake (Makefile linter)
|
||||||
# Install via: go install github.com/checkmake/checkmake/cmd/checkmake@latest
|
# Install via: go install github.com/checkmake/checkmake/cmd/checkmake@latest
|
||||||
]
|
]
|
||||||
@@ -101,6 +101,11 @@ vikunja_project_id = 6
|
|||||||
repo_owner = "oblachno-oss"
|
repo_owner = "oblachno-oss"
|
||||||
repo_name = "grm"
|
repo_name = "grm"
|
||||||
|
|
||||||
|
# grm doesn't have its own CI scripts — it uses devx's CI modules.
|
||||||
|
# Skip CI script checks (doc_coverage would otherwise look for src/ci/).
|
||||||
|
[tool.devx.doc_coverage]
|
||||||
|
ci_scripts_dir = ""
|
||||||
|
|
||||||
# Molecule test weights for LPT scheduling.
|
# Molecule test weights for LPT scheduling.
|
||||||
# GRM has a single role (gitea-runner) with 7 scenarios.
|
# GRM has a single role (gitea-runner) with 7 scenarios.
|
||||||
# Weights are estimates — recalibrate from CI logs after next run.
|
# Weights are estimates — recalibrate from CI logs after next run.
|
||||||
|
|||||||
Reference in New Issue
Block a user