Commit Graph
66 Commits
Author SHA1 Message Date
grm-ci-bot 488a7ee048 release: v0.6.3 [skip ci] 2026-06-22 23:13:00 +02:00
grm-ci-bot f14ef14dc6 release: v0.6.2 [skip ci] 2026-06-22 22:28:42 +02:00
emil 6758b69a5f GRM-65: fix: pin devx to v0.4.0, fix cliff.toml preprocessor, bump to v0.7.0 2026-06-22 20:27:11 +00:00
emil c9c46e88ac GRM-61: refactor: separate GRM and CI translations with validation 2026-06-22 12:13:58 +00:00
emil 8e532839fd GRM-57: refactor: fully automate PR merge — no manual label/review needed 2026-06-22 10:45:26 +00:00
grm-ci-bot f5177c823c release: v0.6.1 [skip ci] 2026-06-22 12:27:47 +02:00
emil f649120172 GRM-59: fix: post-merge workflow failures (4 jobs) 2026-06-22 10:26:28 +00:00
emil 7d3cf999d6 GRM-58: fix: enforce commit message convention on master with CI validation 2026-06-22 10:12:01 +00:00
grm-ci-bot d1531ac81f release: v0.6.0 [skip ci] 2026-06-22 10:06:13 +02:00
emil 599fc17dd3 GRM-51: fix: API resilience with retry, idempotent releases, and graceful Vikunja errors 2026-06-22 01:22:45 +00:00
Emil SimeonovandDevin <158243242+devin-ai-integration[bot]@users.noreply.github.com> 1b3c3f6ca8 chore: align version and changelog with actual tags/releases
v0.6.0 tag was deleted (no user-facing changes). Revert version
in __init__.py and remove v0.6.0 section from CHANGELOG.md to
match the actual state: latest tag/release is v0.5.0.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-06-22 02:49:06 +02:00
emil 7591c99c02 GRM-50: fix: workflow timing, timeouts, status polling, and release classification 2026-06-22 00:44:35 +00:00
grm-ci-bot 789890b9ea release: v0.6.0 [skip ci] 2026-06-22 02:15:34 +02:00
Emil SimeonovandDevin <158243242+devin-ai-integration[bot]@users.noreply.github.com> f8327a8e89 revert: remove v0.6.0 release (no user-facing changes)
The v0.6.0 release contained only infrastructure changes (CI
workflows, badges, review scripts, test fixes). The only
user-facing file changed was api_clients.py, which was modified
to fix the Gitea review API event name — an internal CI fix,
not a user-facing feature.

Reverting the version bump and CHANGELOG entry. The tag and
release have been deleted from the remote.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-06-22 02:13:43 +02:00
grm-ci-bot c8e12dc722 release: v0.6.0 2026-06-22 01:25:07 +02:00
emil 9959b9c4ed GRM-46: feat: enforce mandatory PR reviews with automated checks 2026-06-21 23:22:08 +00:00
grm-ci-bot a0b03f01ef release: v0.5.0
Publish Release / publish (push) Failing after 15s
Sync Wiki / sync-wiki (push) Successful in 1m43s
2026-06-22 00:00:01 +02:00
emil 3f5808d6be GRM-42: fix: rewrite changelog and re-tag releases at user-facing milestones 2026-06-21 21:58:29 +00:00
emil 60c94b2b93 GRM-42: fix: clean up infrastructure-only releases and fix release classification 2026-06-21 21:46:37 +00:00
grm-ci-bot fb76ac91ef release: v0.4.0
Publish Release / publish (push) Failing after 16s
Sync Wiki / sync-wiki (push) Successful in 1m58s
2026-06-21 23:25:29 +02:00
grm-ci-bot 713e752860 release: v0.3.2
Publish Release / publish (push) Failing after 24s
Sync Wiki / sync-wiki (push) Successful in 1m46s
2026-06-21 22:51:43 +02:00
grm-ci-bot 6b3f2a5866 release: v0.3.1
Publish Release / publish (push) Failing after 16s
Sync Wiki / sync-wiki (push) Successful in 1m49s
2026-06-21 21:56:44 +02:00
grm-ci-bot 539bfea516 release: v0.3.0
Publish Release / publish (push) Failing after 21s
Sync Wiki / sync-wiki (push) Failing after 1m30s
2026-06-21 21:47:07 +02:00
grm-ci-bot 7fe85423b4 release: v0.2.2
Publish Release / publish (push) Failing after 25s
2026-06-21 21:17:11 +02:00
grm-ci-bot 2e5ca5a88f release: v0.2.1
Publish Release / publish (push) Failing after 25s
2026-06-21 19:53:32 +02:00
grm-ci-bot a1b493f2a3 release: v0.2.0
Publish Release / publish (push) Failing after 25s
2026-06-21 19:49:23 +02:00
emil 63e25d1245 GRM-35: fix: release push permission and notify_failure label IDs
Fix two issues found during release workflow testing.

Closes GRM-35
2026-06-21 17:49:12 +00:00
emil 996a8dc806 GRM-35: feat: fix 12 critical workflow gaps in release pipeline
Addresses all 12 critical gaps in the automated semantic versioning, tagging, and release workflow.

Closes GRM-35
2026-06-21 17:44:27 +00:00
emil 5c1d848311 GRM-33: feat: add mandatory PR review step to workflow 2026-06-21 06:02:50 +00:00
emil 1717d55013 GRM-32: fix: security, dead code, idempotence, and documentation cleanup
Post-merge Vikunja update / vikunja (push) Successful in 5s
CI / quality (push) Successful in 1m5s
CI / molecule-tests (0) (push) Successful in 18m37s
CI / molecule-tests (2) (push) Successful in 18m51s
CI / molecule-tests (1) (push) Successful in 19m6s
Publish Release / publish (push) Failing after 9s
2026-06-21 00:14:31 +00:00
Emil SimeonovandDevin <158243242+devin-ai-integration[bot]@users.noreply.github.com> 55c2746569 refactor: rootless Docker, fix auto-merge, molecule platform matrix
CI / molecule-tests (0) (pull_request) Has been skipped
CI / molecule-tests (1) (pull_request) Has been skipped
CI / molecule-tests (2) (pull_request) Has been skipped
CI / quality (pull_request) Failing after 1m4s
Three major improvements:

1. Rootless Docker refactor: Removes docker/binary modes, unifies to
   rootless Docker with per-runner system users. Each runner gets its
   own rootless Docker daemon, systemd user service, and isolated
   environment. Simplifies CLI (removes --mode option), Ansible role
   (single code path), and molecule scenarios (removes binary scenario).

2. Auto-merge fix: Fixes status check context mismatch in branch
   protection (was requiring "lint", "unit-tests", "molecule-tests" but
   actual contexts are "CI / quality", "CI / molecule-tests*"). Adds
   retry/wait logic to auto_merge.py that polls commit statuses for up
   to 15 minutes before attempting merge, eliminating the chicken-and-egg
   problem where auto-merge would fail because CI hadn't completed yet.

3. Molecule platform matrix: Adds OS platform matrix to CI — all 6
   scenarios now run on all 4 supported OSes (ubuntu-2204, ubuntu-2404,
   debian-12, archlinux) = 24 test pairs distributed across 3 parallel
   runners. Updates distribute_molecule.py to distribute (scenario,
   platform) pairs. Updates Makefile with molecule-all target for
   local multi-platform testing.

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-06-20 21:02:52 +02:00
emil 0c6c735000 GRM-30: feat: add runner labels support and refactor i18n to JSON
Post-merge Vikunja update / vikunja (push) Successful in 7s
CI / quality (push) Successful in 1m5s
CI / molecule-tests (1) (push) Successful in 6m26s
CI / molecule-tests (0) (push) Successful in 8m50s
CI / molecule-tests (2) (push) Successful in 5m55s
2026-06-20 18:42:39 +00:00
emil c8970da942 GRM-29: fix: use PUT instead of POST for Vikunja task comments
Post-merge Vikunja update / vikunja (push) Successful in 5s
CI / quality (push) Successful in 1m5s
CI / molecule-tests (2) (push) Successful in 7m7s
CI / molecule-tests (1) (push) Successful in 7m13s
CI / molecule-tests (0) (push) Successful in 9m8s
2026-06-20 18:08:36 +00:00
emil 3364355c73 GRM-28: fix: Vikunja task resolution pagination in post_merge.py
Post-merge Vikunja update / vikunja (push) Failing after 8s
CI / quality (push) Successful in 1m5s
CI / molecule-tests (1) (push) Successful in 6m44s
CI / molecule-tests (2) (push) Successful in 7m7s
CI / molecule-tests (0) (push) Successful in 9m35s
2026-06-20 17:48:08 +00:00
emil 0fadb7c504 GRM-27: fix: CI workflows for rootless runner compatibility
Post-merge Vikunja update / vikunja (push) Failing after 5s
CI / quality (push) Successful in 1m3s
CI / molecule-tests (0) (push) Failing after 3m35s
CI / molecule-tests (1) (push) Failing after 5m53s
CI / molecule-tests (2) (push) Failing after 5m59s
2026-06-20 17:01:55 +00:00
emil ea18793963 GRM-26: fix: CI pipeline for rootless Docker runners
Post-merge Vikunja update / vikunja (push) Failing after 5s
CI / quality (push) Successful in 1m3s
CI / molecule-tests (2) (push) Successful in 6m57s
CI / molecule-tests (1) (push) Successful in 7m3s
CI / molecule-tests (0) (push) Successful in 9m17s
2026-06-20 16:16:05 +00:00
emil 9c51c8b62c GRM-25: feat: auto-delete branch after merge in configure_repo script
CI / lint (push) Has been cancelled
CI / unit-tests (push) Has been cancelled
CI / molecule-tests (push) Has been cancelled
Post-merge Vikunja update / vikunja (push) Has been cancelled
2026-06-19 21:46:45 +00:00
emilandEmil Simeonov d949bd3444 GRM-24: feat: bandit integration (#1)
CI / lint (push) Has been cancelled
CI / unit-tests (push) Has been cancelled
CI / molecule-tests (push) Has been cancelled
Post-merge Vikunja update / vikunja (push) Has been cancelled
Co-authored-by: Emil Simeonov <emil@theliberatededge.org>
Reviewed-on: #1
2026-06-19 21:17:39 +00:00
Emil Simeonov ae27417a5f GRM-24: fix: resolve bandit security warnings in source code and tests 2026-06-19 21:13:42 +02:00
Emil Simeonov fefddda715 GRM-20: refactor(scripts): centralize constants, API clients, and HTTP status codes
- Add shared config.py with API URLs, regexes, timeouts, pagination
- Add GiteaClient and VikunjaClient in api_clients.py with pooled sessions
- Add APIError exception for unified HTTP error handling
- Refactor all scripts to use shared modules and http.HTTPStatus
- Rewrite unit tests to mock clients and use HTTPStatus constants
- Add tests for api_clients and config modules
- Achieve 100% test coverage
2026-06-19 21:00:21 +02:00
Emil Simeonov 790b5c3769 GRM-20: refactor: rework all scripts to use click and i18n
CI / lint (push) Has been cancelled
CI / unit-tests (push) Has been cancelled
CI / molecule-tests (push) Has been cancelled
Post-merge Vikunja update / vikunja (push) Has been cancelled
- Replace argparse/print/sys.exit with click commands and ClickException
- Translate all user-facing messages via _()
- Add friendly Oops! / Nice! prompts
- Wrap HTTP errors in all scripts with user-friendly translated messages
- Update all unit tests to use CliRunner and expect ClickException
- Add 100% branch coverage for new HTTP error handling branches
- Add missing translation keys to i18n.py
- Fix pre-commit hook to use venv Python for validate_commit_msg.py
2026-06-19 20:11:20 +02:00
Emil Simeonov e1b589efab GRM-20: feat: user-friendly click errors with i18n in configure_repo
Post-merge Vikunja update / vikunja (push) Has been cancelled
CI / lint (push) Has been cancelled
CI / unit-tests (push) Has been cancelled
CI / molecule-tests (push) Has been cancelled
2026-06-19 19:33:04 +02:00
Emil Simeonov 3d943b57dc GRM-19: refactor: resolve_runner returns gitea_url, add --url CLI option, force remove improvements, code quality fixes
- _resolve_runner now returns gitea_url from registry so disable/remove
  can reuse the URL stored at install time without requiring env vars.
- Added --url option to install, disable, and remove CLI commands.
- remove(force=True) no longer requires gitea_url or token.
- Moved _parse_status outside the for loop in list_runners.
- Updated all translations and tests to match.
2026-06-19 03:12:04 +02:00
Emil Simeonov a9adb71a08 GRM-17: fix docker inspect Jinja2 conflict and add per-iteration exception handling
- docker inspect -f "{{.State.Status}}" used Go template braces that
  conflicted with Ansible Jinja2 templating in the shell module.
  Ansible tried to parse {{.State.Status}} as a Jinja2 variable (which
  starts with a dot, making it invalid), causing a local template error.
  The outer except Exception caught this immediately, so the fallback
  loop never reached the legacy container name or systemctl checks.

- Replaced with: docker inspect <name> | python3 -c JSON parsing,
  which avoids any brace syntax and uses python3 (already required by
  Ansible on managed nodes).

- Added per-iteration try/except inside the fallback loop so a failure
  on one container name continues to the next fallback instead of
  aborting the entire check.

- Added tests for fallback behavior and binary mode exception path.

128 tests, 100% coverage, ruff + pyright clean
2026-06-19 02:53:26 +02:00
Emil Simeonov 1bbe3b4f43 GRM-17: fix docker mode status detection and systemd template
- systemd template for docker mode now uses Type=oneshot + RemainAfterExit=yes
  so that systemctl is-active returns active when the container is running.
  Previously docker run -d exited immediately, causing systemd to mark the
  service as inactive even though the container was still up.
- grm list now tries multiple container name fallbacks for docker mode:
  1. gitea-runner-{name} (current naming)
  2. gitea-runner-{host} (legacy installs where name defaulted to host)
  3. systemctl is-active gitea-runner@{name} (for installs with fixed template)
- All tests pass, 100% coverage, ruff + pyright clean
2026-06-19 02:47:14 +02:00
Emil Simeonov 12e6ce1601 GRM-17: fix grm list status — use docker inspect for docker mode, add host/user context
- Docker mode runners now check container status via docker inspect
  instead of systemctl is-active, avoiding false unknown when systemd
  service is missing or stderr output is discarded
- Binary mode still uses systemctl is-active with stderr suppressed
- Both modes now show a translated context message before the check so
  users know which host/user each BECOME password prompt belongs to
- Better ansible output filtering: strip CHANGED/FAILED/UNREACHABLE
  header lines and separator noise
- Map Docker container states (running/exited/dead) to systemd vocabulary
- All new user-facing messages fully translated (en/bg/de/ru/zh)
- 125 tests, 100% coverage, pyright clean, ruff clean
2026-06-19 02:35:53 +02:00
Emil Simeonov 51f204f90a GRM-17: fix grm list still showing unknown status for active runners
- run_ad_hoc() now accepts ask_become_pass and check parameters
- list_runners() passes ask_become_pass=True so --ask-become-pass is
  added when running in a TTY, matching playbook behavior
- list_runners() passes check=False so systemctl is-active non-zero
  exit codes (inactive=3, unknown=4) don't raise exceptions; the
  actual status string is parsed from stdout instead
- TTY guard prevents --ask-become-pass from hanging in non-interactive
  environments (CI, scripts)
- 123 tests, 100% coverage, pyright clean, ruff clean
2026-06-19 02:24:03 +02:00
Emil Simeonov ebb1088a8c GRM-18: feat: make --ask-become-pass the default behavior
- Change --ask-become-pass from opt-in to opt-out across all commands
  (install, update, start, stop, enable, disable, status, remove)
- Use Click toggle pattern: --ask-become-pass/--no-ask-become-pass with
  default=True so users are always prompted for sudo unless they
  explicitly opt out
- Update i18n translations for both help texts
- Update all CLI tests to expect ask_become_pass=True as default and
  add test for --no-ask-become-pass
- Update README: remove --ask-become-pass from examples, document
  --no-ask-become-pass for passwordless-sudo setups
- 120 tests, 100% coverage, pyright clean, ruff clean
2026-06-19 02:11:38 +02:00
Emil Simeonov 18760f6a2a GRM-17: fix: make grm list retrieve runner status correctly
- run_ad_hoc() now raises AnsibleError on non-zero exit, surfacing
  stderr instead of silently returning empty stdout
- list_runners() passes become=True to run_ad_hoc since systemctl
  is-active requires root privileges
- Add i18n translations for ad-hoc failure messages
- Add unit test for run_ad_hoc failure case
- Update list_runners test to expect become=True
- 119 tests, 100% coverage, pyright clean, ruff clean
2026-06-19 02:05:06 +02:00
Emil Simeonov 677745ac99 GRM-16: feat: add --force flag to grm remove for unreachable runners
- Add force parameter to RunnerManager.remove() — skips remote Ansible
  playbook and only removes the local registry entry
- Add --force/-f CLI flag to grm remove command
- Add translations for --force help text across all 5 languages
- Add unit tests for force skip and CLI flag propagation
- 118 tests, 100% coverage, pyright clean, ruff clean
2026-06-19 02:00:45 +02:00