ci: enforce complete security audit coverage
Some checks failed
Dependency Audit / dependency-audit (push) Has been cancelled
Security Audit / security-audit (push) Has been cancelled

This commit is contained in:
2026-07-30 01:40:36 +02:00
parent 1aea3e7c4f
commit f2e2eb5517
6 changed files with 315 additions and 42 deletions

View File

@@ -253,6 +253,12 @@ class SecurityAuditWrapperTests(unittest.TestCase):
self.assertEqual(0, manifest["overall_status"])
self.assertEqual(1, manifest["finding_status"])
self.assertEqual(0, manifest["execution_error_status"])
self.assertEqual("complete", manifest["coverage_status"])
scanner_results = {
result["id"]: result["status"]
for result in manifest["scanner_coverage"]["results"]
}
self.assertEqual("findings", scanner_results["semgrep"])
self.assertIn(
"Semgrep SAST\t1\tfindings", (reports / "step-status.tsv").read_text()
)
@@ -312,6 +318,86 @@ class SecurityAuditWrapperTests(unittest.TestCase):
)
self.assertEqual(1, self._manifest(invalid_reports)["execution_error_status"])
def test_missing_tool_is_machine_readable_and_strictly_enforced(self) -> None:
gitleaks_stub = self.stub_bin / "gitleaks"
disabled_stub = self.stub_bin / "gitleaks.disabled"
gitleaks_stub.rename(disabled_stub)
try:
result, reports = self._run(
"--report-only",
SECURITY_AUDIT_REQUIRE_TOOLS="0",
CI="false",
GITEA_ACTIONS="false",
)
self.assertEqual(0, result.returncode, result.stderr)
manifest = self._manifest(reports)
self.assertEqual("incomplete", manifest["coverage_status"])
self.assertEqual(["gitleaks"], manifest["scanner_coverage"]["incomplete"])
scanner_results = {
item["id"]: item for item in manifest["scanner_coverage"]["results"]
}
self.assertEqual("skipped", scanner_results["gitleaks"]["status"])
self.assertEqual(127, scanner_results["gitleaks"]["exit_code"])
self.assertIn(
"gitleaks\tmissing",
(reports / "tool-versions.txt").read_text(encoding="utf-8"),
)
strict_result, strict_reports = self._run(
"--strict",
SECURITY_AUDIT_REQUIRE_TOOLS="0",
CI="false",
GITEA_ACTIONS="false",
)
self.assertEqual(1, strict_result.returncode)
self.assertEqual(
"incomplete",
self._manifest(strict_reports)["coverage_status"],
)
ci_result, ci_reports = self._run(
"--report-only",
SECURITY_AUDIT_REQUIRE_TOOLS="0",
CI="true",
GITEA_ACTIONS="false",
)
self.assertEqual(1, ci_result.returncode)
self.assertEqual(
"incomplete",
self._manifest(ci_reports)["coverage_status"],
)
finally:
disabled_stub.rename(gitleaks_stub)
def test_full_mode_records_every_required_scanner(self) -> None:
self._install_full_mode_stubs()
result, reports = self._run("--report-only", mode="full")
self.assertEqual(0, result.returncode, result.stderr)
manifest = self._manifest(reports)
self.assertEqual("complete", manifest["coverage_status"])
required = manifest["scanner_coverage"]["required"]
results = manifest["scanner_coverage"]["results"]
self.assertEqual(
{
"semgrep",
"bandit",
"ruff-security",
"gitleaks",
"trivy",
"pip-audit",
"npm-audit",
"osv-scanner",
"jscpd",
"radon",
"xenon",
},
set(required),
)
self.assertEqual(set(required), {item["id"] for item in results})
self.assertTrue(all(item["status"] == "no-findings" for item in results))
def test_workspace_mutation_invalidates_the_audit(self) -> None:
result, reports = self._run(
"--report-only",
@@ -498,6 +584,7 @@ class SecurityAuditContainerRunnerTests(unittest.TestCase):
else []
)
self.assertEqual(expected_roots, repository_roots)
self.assertIn("SECURITY_AUDIT_REQUIRE_TOOLS=1", run_command)
def test_non_actions_runner_keeps_the_scoped_bind_mount(self) -> None:
result, commands = self._run(scope="govoplan")