DEVX-1: chore: re-trigger CI after Vikunja task title update
Post-merge / detect-type (push) Successful in 14s
Post-merge / validate-commit-msg (push) Successful in 9s
Post-merge / vikunja (push) Successful in 15s
Post-merge / configure-repo (push) Successful in 17s
Post-merge / sync-wiki (push) Successful in 59s
Post-merge / release (push) Failing after 1m6s
Post-merge / badges (push) Successful in 36s

This commit was merged in pull request #4.
This commit is contained in:
2026-06-22 16:28:21 +00:00
parent 6ebb48f9e8
commit 1a80967967
5 changed files with 24 additions and 11 deletions
+3
View File
@@ -96,6 +96,9 @@ jobs:
PYTHONPATH: src
run: |
export PATH="$HOME/.local/bin:$PATH"
python3 -m devx.tools.install_tools --tool tea
tea login add --name devx --url "${{ github.server_url }}" --token "$REPO_TOKEN" || true
tea login default devx || true
python3 -m devx.ci.notify_failure \
--repo "${{ github.repository }}" \
--run-id "${{ github.run_id }}" \
+3 -1
View File
@@ -218,9 +218,11 @@ def main(branch: str, pr_title: str, repo: str, pr_number: str) -> None:
# Head branch is behind master — pull master and rebase, then retry
click.echo(_("Head branch is behind master. Pulling and rebasing..."))
try:
run_cmd(["git", "config", "user.name", "devx-ci-bot"])
run_cmd(["git", "config", "user.email", "devx-ci-bot@oblachno.fyi"])
run_cmd(["git", "fetch", "origin", "master"])
run_cmd(["git", "rebase", "origin/master"])
run_cmd(["git", "push", "--force-with-lease"])
run_cmd(["git", "push", "--force-with-lease", "origin", f"HEAD:{branch}"])
click.echo(_("Rebased and pushed. Retrying merge..."))
client.merge_pr(pr_number, merge_title)
except (APIError, Exception) as retry_err:
+5
View File
@@ -215,6 +215,11 @@ def run_tests() -> None:
click.echo(_("Running tests..."))
tests = run_cmd(["make", "pytest-cov"], check=False)
if tests.returncode != 0:
# Print test output for debugging (capture=True hides it otherwise)
if tests.stdout:
click.echo(tests.stdout)
if tests.stderr:
click.echo(tests.stderr, err=True)
raise click.ClickException(
_(
"Tests failed — refusing to release. Fix test failures first.\n{stderr}",
+12 -9
View File
@@ -13,6 +13,7 @@ from __future__ import annotations
import re
import subprocess # nosec B404
import sys
from pathlib import Path
import click
@@ -185,11 +186,12 @@ def generate_badges(output_dir: Path) -> dict[str, dict[str, str | int]]:
# 1. Code coverage + test count (single pytest-cov run)
rc, stdout, stderr = run_command(
[
".venv/bin/pytest",
sys.executable,
"-m",
"pytest",
"tests/",
"-v",
"--cov=src",
"--cov=scripts",
"--cov=src/devx",
"--cov-report=term-missing",
"--cov-fail-under=0",
]
@@ -211,8 +213,9 @@ def generate_badges(output_dir: Path) -> dict[str, dict[str, str | int]]:
# 2. Documentation coverage
rc, stdout, _ = run_command(
[
".venv/bin/python3",
"scripts/ci/doc_coverage.py",
sys.executable,
"-m",
"devx.ci.doc_coverage",
]
)
doc_pct = extract_doc_coverage(stdout)
@@ -222,10 +225,10 @@ def generate_badges(output_dir: Path) -> dict[str, dict[str, str | int]]:
badges["docs"] = make_badge("docs", "unknown", "red")
# 3. Code quality (ruff + pyright + bandit all pass)
lint_rc, _, _ = run_command([".venv/bin/ruff", "check", "src/", "tests/", "scripts/"])
format_rc, _, _ = run_command([".venv/bin/ruff", "format", "--check", "src/", "tests/", "scripts/"])
type_rc, _, _ = run_command([".venv/bin/pyright"])
bandit_rc, _, _ = run_command([".venv/bin/bandit", "-r", "src/", "scripts/"])
lint_rc, _, _ = run_command([sys.executable, "-m", "ruff", "check", "src/", "tests/"])
format_rc, _, _ = run_command([sys.executable, "-m", "ruff", "format", "--check", "src/", "tests/"])
type_rc, _, _ = run_command([sys.executable, "-m", "pyright"])
bandit_rc, _, _ = run_command([sys.executable, "-m", "bandit", "-r", "src/"])
all_pass = all(rc == 0 for rc in [lint_rc, format_rc, type_rc, bandit_rc])
badges["quality"] = make_badge("code quality", "A" if all_pass else "F", "brightgreen" if all_pass else "red")
+1 -1
View File
@@ -265,7 +265,7 @@ class TestMain:
assert result.exit_code == 0, result.output
assert mock_client.merge_pr.call_count == 2
# Should have fetched, rebased, and pushed
assert mock_run.call_count == 3
assert mock_run.call_count == 5 # config name, config email, fetch, rebase, push
@patch.dict("os.environ", {"REPO_TOKEN": "tok"}, clear=True)
@patch("devx.ci.auto_merge.GiteaClient")