Ein Testlauf, ein Urteil
Was du davon hast
Dein Agent startet Build, Test oder Linter wie gewohnt, nur mit greppy bash-smart -- davor. Die erste Zeile ist das Urteil, darunter stehen genau die Fehler und Warnungen. Der Rest des Logs liegt eingeklappt hinter einer expand-ID bereit. Exit-Code und Rohausgabe bleiben, wie der Befehl sie geliefert hat.
Vorher und nachher
Ein kleines Python-Projekt hat 300 Tests. Die Tests loggen auf DEBUG-Level, einer schlägt fehl. Die Frage: Was ist kaputt?
Ohne greppy
Der Agent startet die Tests und bekommt das ganze Log: jeden Test, jede Logzeile, am Ende den Fehler.
$ python3 -m unittest -v
test_empty_text_gives_defaults (tests.test_config.TestParseConfig.test_empty_text_gives_defaults) ... ok
test_port_override (tests.test_config.TestParseConfig.test_port_override) ... FAIL
test_tax_percent_00 (tests.test_config.TestParseConfig.test_tax_percent_00) ... ok
…
test_line_total_000 (tests.test_pricing.TestLineTotal.test_line_total_000) ... DEBUG shopcart.pricing: line_total: unit=100 qty=1
INFO shopcart.pricing: line_total: computed 100 cents
ok
…
FAIL: test_port_override (tests.test_config.TestParseConfig.test_port_override)
…
AssertionError: 80 != 8080
…
FAILED (failures=1)
Mit greppy
$ greppy bash-smart -- python3 -m unittest -v
FAILED — exit 1: 4 errors, 0 warnings
723 FAIL: test_port_override (tests.test_config.TestParseConfig.test_port_override)
725 Traceback (most recent call last):
…
727 self.assertEqual(cfg["port"], 8080)
728 ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
729 AssertionError: 80 != 8080
730
734 FAILED (failures=1)
…
test_tax_percent_18 (tests.test_config.TestParseConfig.test_tax_percent_18) ... ok
… lines 22-105 (84 collapsed lines) — greppy expand bbb7266558408ac3
…
… lines 199-674 (476 collapsed lines) — greppy expand bbb7266558408ac3
…
Urteil und Fehlerblock stehen ganz oben, mit ihrer Zeilennummer im Log. Danach folgen Anfang und Ende der Ausgabe; die Mitte ist eingeklappt.
| ohne greppy | mit greppy | |
|---|---|---|
| Aufrufe | 1 | 1 |
| Zeilen Ausgabe | 734 | 98 |
| Zeichen Ausgabe | 48.605 | 6.078 |
| Token | 13.094 | 1.651 |
| Exit-Code | 1 | 1 |
Braucht der Agent doch das ganze Log, holt er den eingeklappten Teil mit der expand-ID aus derselben Ausgabe. Jede Seite nennt am Ende die ID der nächsten.
$ greppy expand bbb7266558408ac3
test_tax_percent_19 (tests.test_config.TestParseConfig.test_tax_percent_19) ... ok
test_tax_percent_20 (tests.test_config.TestParseConfig.test_tax_percent_20) ... ok
…
test_line_total_081 (tests.test_pricing.TestLineTotal.test_line_total_081) ... DEBUG shopcart.pricing: line_total: unit=181 qty=5
… 250 lines — greppy expand 6e6a4500016662ed continues at 425
So funktioniert es
bash-smart startet den Befehl unverändert und fängt stdout und stderr byte-genau ab. Sein Exit-Code ist der Exit-Code des Befehls, Skripte und CI behandeln ihn also wie das Original. Die erste Zeile nennt das Ergebnis, den Exit-Code und die Zahl der Fehler und Warnungen. Darauf folgen die Fehler- und Warnungsblöcke mit ihrer Zeilennummer im Log, danach Anfang und Ende der Ausgabe. Die Mitte liegt hinter einer expand-ID, greppy expand ID gibt sie byte-genau und seitenweise zurück. Mit -e REGEX hebst du zusätzlich jede Zeile heraus, die auf ein eigenes Muster passt. Ausgaben bis 80 Zeilen erscheinen vollständig nach dem Urteil. Pipelines übergibst du als einen quotierten Ausdruck, sie laufen mit pipefail: Ein fehlschlagender Befehl vor | tail bleibt ein Fehlschlag.
Die Befehle
| Befehl | was er tut |
|---|---|
greppy bash-smart -- CMD |
führt CMD unverändert aus: Urteil, Fehler und Warnungen zuerst, der Rest eingeklappt, Exit-Code wie das Original |
greppy bash-smart -e REGEX -- CMD |
hebt zusätzlich jede Zeile, die auf REGEX passt, mit ihrer Zeilennummer heraus; mehrfach verwendbar |
greppy bash-smart -- 'AUSDRUCK' |
Shell-Ausdrücke wie Pipelines als ein quotierter Ausdruck, ausgeführt in Bash mit pipefail |
greppy expand ID |
den eingeklappten Teil des Logs, byte-genau und seitenweise |
Mehr in der Doku
- Builds und Tests ausführen: Urteil, Faltung, Umgebungsvariablen, Pipelines und lange Läufe
- Eingebauter Agent: der Agent führt jeden Befehl über
bash-smartaus