GRM-130: refactor: align venv management to devx.mak targets
Post-merge / detect-type (push) Successful in 53s
Post-merge / release (push) Successful in 59s
Post-merge / publish (push) Has been skipped
Post-merge / validate-commit-msg (push) Successful in 1m32s
Post-merge / configure-repo (push) Successful in 1m34s
Post-merge / vikunja (push) Successful in 1m38s
Post-merge / badges (push) Successful in 1m46s
Post-merge / sync-wiki (push) Successful in 2m34s

This commit was merged in pull request #195.
This commit is contained in:
2026-07-01 22:22:50 +00:00
parent 34954aa396
commit d32bb40cbd
8 changed files with 124 additions and 36 deletions
+6 -5
View File
@@ -34,12 +34,13 @@ permissions:
You are a CI failure investigator for the grm repo. You are a CI failure investigator for the grm repo.
## Working Directory ## Working Directory & Virtual Environment
The grm repo is at `/home/emo/dev/ideas/oblachno/grm`. Always `cd` there first: The grm repo is at `/home/emo/dev/ideas/oblachno/grm`. Always `cd` there first.
```bash
cd /home/emo/dev/ideas/oblachno/grm All Python tools run inside `.venv`. `make` targets handle activation
``` automatically — always use `make <target>`, never raw `pytest` or `ruff`
commands. If `.venv` doesn't exist, run `make setup` first.
## CI Job Dependency Graph ## CI Job Dependency Graph
+7 -3
View File
@@ -31,10 +31,14 @@ permissions:
You are a dependency upgrade specialist for the grm repo. You are a dependency upgrade specialist for the grm repo.
## Working Directory ## Working Directory & Virtual Environment
The grm repo is at `/home/emo/dev/ideas/oblachno/grm`. Always `cd` there first. The grm repo is at `/home/emo/dev/ideas/oblachno/grm`. Always `cd` there first.
All Python tools run inside `.venv`. `make` targets handle activation
automatically — always use `make <target>`, never raw `pytest` or `ruff`
commands. If `.venv` doesn't exist, run `make setup` first.
## Dependency Reference Locations ## Dependency Reference Locations
- **Python deps**: `pyproject.toml``[project] dependencies` and `[project.optional-dependencies]` - **Python deps**: `pyproject.toml``[project] dependencies` and `[project.optional-dependencies]`
@@ -88,8 +92,8 @@ pip install -e .[dev] # reinstall with new deps
ansible-galaxy install -r ansible/requirements.yml # update collections ansible-galaxy install -r ansible/requirements.yml # update collections
make pytest-cov # 100% coverage make pytest-cov # 100% coverage
make lint-all # ruff + pyright + bandit + ansible-lint + checkmake + actionlint make lint-all # ruff + pyright + bandit + ansible-lint + checkmake + actionlint
python3 -m devx.tools.check_pyproject_deps .venv/bin/python -m devx.tools.check_pyproject_deps
python3 -m devx.tools.check_test_speed --max-seconds 4 --max-single-seconds 0.5 .venv/bin/python -m devx.tools.check_test_speed --max-seconds 4 --max-single-seconds 0.5
``` ```
If the dependency affects Ansible behavior, also run molecule: If the dependency affects Ansible behavior, also run molecule:
+8 -4
View File
@@ -25,10 +25,14 @@ permissions:
You are a documentation sync specialist for the grm repo. You are a documentation sync specialist for the grm repo.
## Working Directory ## Working Directory & Virtual Environment
The grm repo is at `/home/emo/dev/ideas/oblachno/grm`. Always `cd` there first. The grm repo is at `/home/emo/dev/ideas/oblachno/grm`. Always `cd` there first.
All Python tools run inside `.venv`. `make` targets handle activation
automatically — always use `make <target>`, never raw `pytest` or `ruff`
commands. If `.venv` doesn't exist, run `make setup` first.
## Documentation Structure ## Documentation Structure
``` ```
@@ -54,14 +58,14 @@ docs/
### Step 1: Check documentation coverage ### Step 1: Check documentation coverage
```bash ```bash
python3 -m devx.ci.doc_coverage --fail-on-missing .venv/bin/python -m devx.ci.doc_coverage --fail-on-missing
``` ```
Fix undocumented CLI commands, modules, or CI scripts by adding entries Fix undocumented CLI commands, modules, or CI scripts by adding entries
to the appropriate docs file. to the appropriate docs file.
### Step 2: Lint documentation structure ### Step 2: Lint documentation structure
```bash ```bash
python3 -m devx.ci.lint_docs --root . .venv/bin/python -m devx.ci.lint_docs --root .
``` ```
Fix: broken internal links, heading hierarchy skips, TODO/FIXME markers, Fix: broken internal links, heading hierarchy skips, TODO/FIXME markers,
trailing whitespace. trailing whitespace.
@@ -74,7 +78,7 @@ Update any references to files that were renamed or deleted.
### Step 4: Verify wiki sync (if investigating a sync failure) ### Step 4: Verify wiki sync (if investigating a sync failure)
```bash ```bash
python3 -m devx.ci.sync_wiki --repo oblachno-oss/grm --strict .venv/bin/python -m devx.ci.sync_wiki --repo oblachno-oss/grm --strict
``` ```
Check `docs/mapping.json` — every docs file should have a mapping entry. Check `docs/mapping.json` — every docs file should have a mapping entry.
If adding a new docs file, add it to mapping.json with a wiki-compatible If adding a new docs file, add it to mapping.json with a wiki-compatible
+5 -1
View File
@@ -25,10 +25,14 @@ permissions:
You are a molecule test runner for the grm repo. You are a molecule test runner for the grm repo.
## Working Directory ## Working Directory & Virtual Environment
The grm repo is at `/home/emo/dev/ideas/oblachno/grm`. Always `cd` there first. The grm repo is at `/home/emo/dev/ideas/oblachno/grm`. Always `cd` there first.
All Python tools run inside `.venv`. `make` targets handle activation
automatically — always use `make <target>`, never raw `pytest` or `ruff`
commands. If `.venv` doesn't exist, run `make setup` first.
## Available Scenarios (7 total) ## Available Scenarios (7 total)
| Scenario | Purpose | Makefile target | | Scenario | Purpose | Makefile target |
+5 -1
View File
@@ -27,10 +27,14 @@ permissions:
You are a Gitea Actions workflow validator for the grm repo. You are a Gitea Actions workflow validator for the grm repo.
## Working Directory ## Working Directory & Virtual Environment
The grm repo is at `/home/emo/dev/ideas/oblachno/grm`. Always `cd` there first. The grm repo is at `/home/emo/dev/ideas/oblachno/grm`. Always `cd` there first.
All Python tools run inside `.venv`. `make` targets handle activation
automatically — always use `make <target>`, never raw `pytest` or `ruff`
commands. If `.venv` doesn't exist, run `make setup` first.
## Key Files ## Key Files
- `.gitea/workflows/ci.yml` — PR pipeline (quality, detect-changes, pre-merge-check, discover-runners, molecule-tests, molecule-report, release-dry-run, pr-review, auto-merge) - `.gitea/workflows/ci.yml` — PR pipeline (quality, detect-changes, pre-merge-check, discover-runners, molecule-tests, molecule-report, release-dry-run, pr-review, auto-merge)
@@ -0,0 +1,71 @@
# testing-and-debugging
Make targets for testing, debugging, and CI investigation. **Use these
instead of raw `pytest`, `ruff`, or `molecule` commands.**
## Why Make Targets
Make targets encapsulate the correct venv activation, PYTHONPATH, env
vars, and flags. Running raw commands bypasses venv activation and
produces false failures (missing dependencies, wrong Python version).
## Unit Tests
| Task | Command | Notes |
|------|---------|-------|
| Run all unit tests | `make test-unit` | Fast, no coverage |
| Run with coverage | `make pytest-cov` | **Required before push** — enforces 100% |
| Run single test | `make pytest-cov TEST=tests/test_foo.py::test_bar` | |
## Linting
| Task | Command | Notes |
|------|---------|-------|
| Full lint | `make lint-all` | ruff + pyright + bandit + ansible-lint + checkmake + actionlint |
| Ruff only | `make lint-ruff` | |
| Type check | `make typecheck` | pyright |
| Bandit | `make lint-bandit` | Security linter |
| Workflow lint | `make workflow-check` | actionlint + act_runner dry-run |
## Molecule Tests
| Task | Command | Notes |
|------|---------|-------|
| All scenarios | `make molecule` | All 6 scenarios on Ubuntu 22.04 |
| All platforms | `make molecule-all` | All 6 scenarios on all 4 OSes |
| Parallel | `make molecule-all-parallel` | MOLECULE_JOBS=4 |
## Pre-Push Verification
**Before pushing any branch:**
```bash
make pre-push
```
This runs `lint-all` + `pytest-cov`. The pre-push git hook only
validates the Vikunja task exists — it does NOT run tests. You must
run `make pre-push` manually.
## CI Failure Investigation
When investigating a CI failure:
1. **Fetch logs via MCP** — use `mcp_call_tool` with gitea server,
`actions_run_read` method, `download_job_log` tool
2. **Reproduce locally** — use `make pytest-cov` or `make lint-ci`
depending on which CI job failed
3. **Never run raw pytest** — always use the make target
## Virtual Environment
All commands run inside `.venv`. `make` targets handle activation
automatically. For raw commands (rare), activate first:
```bash
source activate.sh # bash/zsh
source activate.fish # fish
source activate.zsh # zsh
```
If `.venv` doesn't exist, run `make setup` first.
+14
View File
@@ -1,5 +1,19 @@
# AGENTS.md — Project Conventions for GRM # AGENTS.md — Project Conventions for GRM
## Virtual Environment
All Python tools, tests, and scripts run inside a standard `.venv` directory.
Activate it before running any non-`make` command:
```bash
source activate.sh # bash/zsh
source activate.fish # fish
source activate.zsh # zsh
```
If `.venv` doesn't exist, run `make setup` first. The `make` targets handle
venv activation automatically — always prefer `make <target>` over raw commands.
## Build & Test Commands ## Build & Test Commands
```bash ```bash
+8 -22
View File
@@ -77,28 +77,14 @@ setup-image:
pip install -e .$(if $(EXTRAS),[$(EXTRAS)],); \ pip install -e .$(if $(EXTRAS),[$(EXTRAS)],); \
else echo "[setup-image] /opt/venv not found — falling back to setup-ci"; $(MAKE) setup-ci; fi else echo "[setup-image] /opt/venv not found — falling back to setup-ci"; $(MAKE) setup-ci; fi
# Helper: run pip install with Gitea registry configured # venv, .env, activate-scripts, and PIP_INSTALL are provided by devx.mak
# Usage: $(PIP_INSTALL) install -e '.[ci,lint]' # (devx-venv, devx-env, devx-activate-scripts, DEVX_PIP_INSTALL)
PIP_INSTALL := if [ -z "$$CI_GITEA_TOKEN" ]; then . ./.env 2>/dev/null; fi; \ # Aliases for convenience and backward compatibility:
CI_GITEA_TOKEN="$$CI_GITEA_TOKEN"; \ .PHONY: venv activate-scripts
if [ -n "$$CI_GITEA_TOKEN" ]; then export PIP_EXTRA_INDEX_URL="https://$$CI_GITEA_USERNAME:$$CI_GITEA_TOKEN@git.oblachno.oblachno.fyi/api/packages/oblachno-oss/pypi/simple/"; fi; \ PIP_INSTALL := $(DEVX_PIP_INSTALL)
$(BIN)/pip venv: devx-venv
.env: devx-env
$(VENV)/bin/activate: activate-scripts: devx-activate-scripts
@python3 -c "import sys; v=sys.version_info; assert v >= (3, 12), f'Python 3.12+ required, found {v.major}.{v.minor}'; print(f'Python {v.major}.{v.minor}.{v.micro} OK')"
$(PYTHON) -m venv $(VENV)
$(BIN)/pip install --upgrade pip setuptools wheel
.env:
@if [ ! -f .env ]; then \
cp .env.example .env; \
echo "Created .env from .env.example — please edit it with your credentials."; \
fi
activate-scripts: $(VENV)/bin/activate
@test -f activate.sh || (echo '#!/usr/bin/env bash' > activate.sh && echo 'source "$$(cd "$$(dirname "$${BASH_SOURCE[0]}")" && pwd)/.venv/bin/activate"' >> activate.sh && chmod +x activate.sh)
@test -f activate.fish || (echo '#!/usr/bin/env fish' > activate.fish && echo 'set -l script_dir (dirname (status --current-filename))' >> activate.fish && echo 'source "$$script_dir/.venv/bin/activate.fish"' >> activate.fish && chmod +x activate.fish)
@test -f activate.zsh || (echo '#!/usr/bin/env zsh' > activate.zsh && echo '0="$${ZERO:-$${0:#$$ZSH_ARGZERO}}"' >> activate.zsh && echo '0="$${$${(M)0:#/*}:-$$PWD/$$0}"' >> activate.zsh && echo 'source "$${0:A:h}/.venv/bin/activate"' >> activate.zsh && chmod +x activate.zsh)
install: install:
@if [ -z "$(HOST)" ]; then echo "HOST is required. Example: make install HOST=192.168.1.10"; exit 1; fi @if [ -z "$(HOST)" ]; then echo "HOST is required. Example: make install HOST=192.168.1.10"; exit 1; fi