Die drei Messungen aus Lauf 375 aufnehmen, die Offen-Liste kuerzen

Lauf 375 des ersten Abnehmers (jlab-cluster/helm-charts, Push auf main) hat
drei der vier offenen Punkte von sonar-analysis beantwortet, alle drei positiv.
Sie stehen jetzt auf Gemessenes-Verhalten, wo Gemessenes hingehoert:

- Eine Repository-Variable erreicht einen aus einem fremden Repository
  aufgerufenen Workflow. Der Beleg ist der Waechter, der durchlief, und der
  Scanner, der startete. Damit ist dieselbe Frage fuer OP_CONNECT_HOST in
  publish-helm-chart beantwortet; offen bleibt dort nur noch der Upload selbst.
- Der 59-MiB-Scanner-Download kommt durch, Archiv und Signatur in etwa drei
  Sekunden. Der MTU-Vorfall mit der 17-MB-Datei wiederholt sich nicht; die
  knotenseitige Behebung haelt beim Dreifachen der Groesse.
- node24 ist im Runner-Image vorhanden, die JavaScript-Action lief.

Dazu ein Satz im Vorspann, dass auch Bestaetigungen auf die Seite gehoeren: Eine
ungeschriebene harmlose Eigenheit kostet dieselbe zweite Messung wie eine
gefaehrliche.

Die Abschlussliste von sonar-analysis ist von vier Punkten auf einen gekuerzt.
Offen bleibt, was eine Analyse ueberhaupt meldet - Lauf 375 hat das nicht
beantwortet, obwohl der Scan lief: Der Bericht wurde erzeugt (603 kB) und nie
hochgeladen. Neu dort der Punkt, der von Anfang an auf der Liste gehoert
haette: welche Analysatoren die Instanz tatsaechlich hat. Analysatoren sind
server-seitige Plugins, und eine Sprachliste aus der Dokumentation sagt darueber
nichts.
jklein committed 2026-10-02 00:16:27 +00:00
1 parent a1a4b7e924
commit 6a09a2682e
2 files changed
+115 -35

No files matched your search

+68
@@ -9,6 +9,12 @@ Gemeinsames Muster, das sie teuer macht: Keiner dieser Fehler ist rot. Der Lauf
bleibt grün oder sieht harmlos aus, und erst viel später sucht jemand das bleibt grün oder sieht harmlos aus, und erst viel später sucht jemand das
Ergebnis dort, wo es hätte landen sollen. Ergebnis dort, wo es hätte landen sollen.
Es stehen auch **Bestätigungen** hier, nicht nur Fallen. Eine Eigenheit, die
sich als harmlos herausgestellt hat, kostet ungeschrieben dasselbe wie eine
gefährliche: Die nächste Person misst sie erneut, oder — schlimmer — baut einen
Umweg um ein Problem, das es nicht gibt. Jeder Eintrag nennt deshalb den Lauf,
an dem er gemessen ist.
## Boolesche `workflow_call`-Eingaben kommen nicht an ## Boolesche `workflow_call`-Eingaben kommen nicht an
Gemessen an **Gitea 1.27.0**, Gemessen an **Gitea 1.27.0**,
@@ -93,3 +99,65 @@ auf einen Zweig, während die übrigen Actions auf Hauptversionen gepinnt sind.
Festgehalten als bekannte Schwachstelle unter Festgehalten als bekannte Schwachstelle unter
[docker-build-push](docker-build-push), damit sie nicht erneut entdeckt werden [docker-build-push](docker-build-push), damit sie nicht erneut entdeckt werden
muss. muss.
## Eine Repository-Variable erreicht einen fremd aufgerufenen Workflow
Gemessen in `jlab-cluster/helm-charts`, **Lauf 375** (Push auf `main`), an
[sonar-analysis](sonar-analysis).
`vars.<NAME>` wird in einem Workflow, der per `uses:` aus einem **anderen**
Repository geholt wird, im Kontext des **Aufrufers** aufgelöst. Dass es so
dokumentiert ist, war bekannt; auf dieser Forge-Fassung gemessen war es nicht.
Der Beleg ist indirekt und trotzdem eindeutig: `sonar-analysis` prüft
`vars.SONAR_HOST_URL` in einem Wächter und bricht **vor** dem Scan ab, wenn der
Wert leer ist. In Lauf 375 ist der Wächter durchgelaufen und der Scanner
gestartet — bei leerer Variable hätte es den Scan nie gegeben. Dasselbe gilt für
das `uses:` selbst: Der Baustein liegt in diesem Repository, der Aufruf kam aus
einem anderen, und er wurde aufgelöst.
**Damit ist dieselbe Frage für `OP_CONNECT_HOST` in
[publish-helm-chart](publish-helm-chart) beantwortet.** Gleiche Gitea-Fassung,
gleicher Mechanismus: eine Repository-Variable, gelesen in einem aus einem
fremden Repository aufgerufenen Workflow. Dort muss nichts zweites gemessen
werden, und der vorgesehene Ausweg — die Adresse als **Eingabe** übergeben, im
Aufrufer ausgewertet, wie es für das Eigentümer-Segment schon getan wurde —
wird nicht gebraucht.
Was an der Publish-Strecke offen bleibt, ist etwas anderes und nur das: **der
Upload selbst hat nie stattgefunden.** Kein Chart ist durch den geteilten
Baustein veröffentlicht worden.
## Der Scanner-Download kommt durch — 59 MiB in etwa drei Sekunden
Gemessen in `jlab-cluster/helm-charts`, **Lauf 375**.
`SonarSource/sonarqube-scan-action` lädt den Sonar-Scanner-CLI zur Laufzeit von
`binaries.sonarsource.com` und prüft dessen GPG-Signatur. Archiv und Signatur,
rund **59 MiB**, waren in etwa **drei Sekunden** da.
Das war die erwartete Stelle für den ersten Fehlschlag, und zwar mit
Vorgeschichte: Auf demselben Runner kam einmal eine **17-MB-Datei nicht durch**,
weil die Docker-Brücke mit MTU 1500 gegen ein Pod-Netz mit MTU 1450 lief —
kleine Antworten passten in ein Paket, die große nicht, und der Fehlschlag sah
nach einem kaputten Spiegel aus, nicht nach Netz. Festgehalten im README von
`jlab-cluster/helm-charts`, Abschnitt „What a GitHub runner had been providing
quietly".
**Die knotenseitige Behebung hält, und sie hält beim Dreifachen der damaligen
Größe.** Ein Download in dieser Größenordnung ist auf diesem Runner kein Risiko
mehr und braucht keinen Zwischenspeicher und keinen eigenen Spiegel.
## `node24` ist im Runner-Image vorhanden
Gemessen in `jlab-cluster/helm-charts`, **Lauf 375**.
`SonarSource/sonarqube-scan-action` deklariert `runs: using: node24` und ist
damit eine JavaScript-Action, keine Docker-Action. Sie lief. Zwei Folgen:
- **JavaScript-Actions mit `node24` sind hier benutzbar.** Fehlte die
Laufzeitumgebung, scheiterte die Action mit einer Meldung über **sich selbst**
und nicht über das Image — deshalb stand die Frage vorher aufgeschrieben.
- `runs-on: ubuntu-latest` genügt für so eine Action. Das Label
`ubuntu-docker`, das den Docker-Socket mitbringt, braucht nur, wer wirklich
eine Docker-Action oder einen Build ausführt.
+47 -35
@@ -63,8 +63,9 @@ im Node des Runners und nicht in einem Container. Kein Socket, kein Daemon,
`ubuntu-latest` genügt. `ubuntu-latest` genügt.
Das hat eine Kehrseite, die man im Blick behalten muss. Eine JavaScript-Action Das hat eine Kehrseite, die man im Blick behalten muss. Eine JavaScript-Action
verlangt ihre Node-Hauptversion **im Runner-Image**. Ob diese dort vorhanden verlangt ihre Node-Hauptversion **im Runner-Image**. Die ist dort vorhanden:
ist, ist **nicht geprüft** — siehe unten. `node24` ist in Lauf 375 gemessen, siehe
[Gemessenes-Verhalten](Gemessenes-Verhalten).
## Was der Scanner zur Laufzeit holt ## Was der Scanner zur Laufzeit holt
@@ -73,17 +74,20 @@ Lauf** von `binaries.sonarsource.com` und prüft dessen GPG-Signatur. Das ist
nichts Kleines: Bei der Messung für diese Seite lag das Linux-Archiv bei rund nichts Kleines: Bei der Messung für diese Seite lag das Linux-Archiv bei rund
**59 MiB** (`Content-Length` 61 626 644). **59 MiB** (`Content-Length` 61 626 644).
Damit ist das die wahrscheinlichste Stelle für den ersten Fehlschlag auf dieser Das war die erwartete Stelle für den ersten Fehlschlag auf dieser Infrastruktur,
Infrastruktur, und zwar aus einem konkreten, bereits einmal bezahlten Grund. Im und zwar aus einem konkreten, bereits einmal bezahlten Grund. Im README des
README des ersten Abnehmers steht gemessen: Auf diesem Runner kam einmal eine ersten Abnehmers steht gemessen: Auf diesem Runner kam einmal eine
**17-MB-Datei nicht durch**, weil eine Docker-Brücke mit MTU 1500 gegen ein **17-MB-Datei nicht durch**, weil eine Docker-Brücke mit MTU 1500 gegen ein
Pod-Netz mit 1450 lief. Kleine Antworten passten in ein Paket, die große nicht — Pod-Netz mit 1450 lief. Kleine Antworten passten in ein Paket, die große nicht —
und es sah aus wie ein gesperrter Host, nicht wie ein MTU-Problem. Behoben wurde und es sah aus wie ein gesperrter Host, nicht wie ein MTU-Problem. Behoben wurde
das auf der Knoten-Seite, nicht in einem Workflow. das auf der Knoten-Seite, nicht in einem Workflow.
Der Scanner-CLI ist ein Mehrfaches dieser 17 MB. Wenn ein Lauf dieses Bausteins **Der Download kommt durch.** In Lauf 375 waren Archiv und Signatur in etwa drei
beim Download hängt oder abbricht, ist das die erste Spur, die man verfolgt — Sekunden da; die knotenseitige Behebung hält beim Dreifachen der damaligen
und man sucht sie auf der Knoten-Seite, nicht im YAML. Größe. Nachzulesen unter [Gemessenes-Verhalten](Gemessenes-Verhalten). Wenn ein
Lauf dieses Bausteins trotzdem einmal beim Download hängt oder abbricht, ist die
MTU-Geschichte die erste Spur, die man verfolgt — und man sucht sie auf der
Knoten-Seite, nicht im YAML.
Zwei weitere Folgen des Laufzeit-Downloads, nebenbei: Der Baustein hängt an der Zwei weitere Folgen des Laufzeit-Downloads, nebenbei: Der Baustein hängt an der
Erreichbarkeit eines fremden Hosts, und er hängt an einer Signaturprüfung. Beide Erreichbarkeit eines fremden Hosts, und er hängt an einer Signaturprüfung. Beide
@@ -144,31 +148,39 @@ und ändert das Verhalten aller Aufrufer, ohne dass hier etwas angefasst wurde.
## Was an diesem Baustein nicht gemessen ist ## Was an diesem Baustein nicht gemessen ist
Diese Liste ist der eigentliche Grund für die Seite. Sie steht hier, damit Diese Liste stand hier mit vier Punkten. **Drei davon hat Lauf 375 des ersten
niemand sie zweimal zusammentragen muss, und sie gehört abgearbeitet, sobald der Abnehmers (`jlab-cluster/helm-charts`, Push auf `main`) beantwortet, alle drei
erste Lauf da ist — die Ergebnisse dann auf positiv** — `node24` im Runner-Image, der 59-MiB-Scanner-Download, und dass eine
[Gemessenes-Verhalten](Gemessenes-Verhalten). Repository-Variable einen aus einem fremden Repository aufgerufenen Workflow
erreicht. Sie stehen jetzt dort, wo Gemessenes hingehört: auf
[Gemessenes-Verhalten](Gemessenes-Verhalten), mit je einem Abschnitt. Der dritte
hat dabei dieselbe Frage für `OP_CONNECT_HOST` in
[publish-helm-chart](publish-helm-chart) mitbeantwortet.
1. **Ist `node24` im Runner-Image vorhanden?** Die Scan-Action verlangt es. Wenn Offen bleibt genau einer, und es ist der inhaltliche:
nicht, scheitert sie — und zwar mit einer Meldung über die Action, nicht über
das Image. Wer das ohne diese Zeile liest, sucht den Fehler in der Action. 1. **Was eine Analyse überhaupt meldet**, insbesondere aus Helm-Templates. Der
2. **Kommt der Scanner-Download durch?** Siehe oben; die wahrscheinlichste Analysator trifft dort auf Dateien, die wegen `{{ }}` kein gültiges YAML
Stelle, und eine mit Vorgeschichte. sind. Was er damit macht, bekommt man nur heraus, indem man ihn einmal darauf
3. **Kommt `vars.SONAR_HOST_URL` in einem aus einem fremden Repository laufen lässt — deshalb beginnt der erste Abnehmer **ohne Ausschlüsse**. Das
aufgerufenen Workflow an?** Dass der Variablen-Kontext der des Aufrufers Ergebnis entscheidet, ob Ausschlüsse nachträglich nötig sind, und es gehört in
bleibt, ist dokumentiert, auf dieser Forge-Fassung aber nicht gemessen — die `sonar-project.properties` des jeweiligen Repositories, nicht in diesen
dasselbe Offene wie bei `OP_CONNECT_HOST` in Baustein.
[publish-helm-chart](publish-helm-chart), wo es ebenfalls noch unbelegt ist.
Wenn es nicht ankommt, ist das immerhin laut: Der Wächter greift und benennt Lauf 375 hat das **nicht** beantwortet, obwohl der Scan lief: Der Bericht
die Variable. Das Gegenstück dort hat sich für die andere Richtung wurde erzeugt — 603 kB — und nie hochgeladen, weil der Upload an einem
entschieden — der Eigentümer ist eine **Eingabe**, weil er im Aufrufer falschen Projektschlüssel scheiterte. Das Protokoll nennt keine
ausgewertet und nicht auf eine Kontext-Semantik gesetzt wird. Käme `vars` Einzelbefunde. Es braucht also einen erfolgreichen Lauf, nicht nur einen
nicht an, wäre dieselbe Umstellung auch hier der Weg: die Adresse als gestarteten.
Eingabe.
4. **Was der erste Lauf überhaupt meldet**, insbesondere aus Helm-Templates. Der **Eine Sache, die nicht auf der Liste stand und auf ihr hätte stehen müssen:
Helm-Analysator trifft dort auf Dateien, die wegen `{{ }}` kein gültiges YAML welche Analysatoren die Instanz tatsächlich hat.** Analysatoren sind
sind. Was er damit macht, bekommt man nur heraus, indem man ihn einmal **server-seitige Plugins**; der Scanner lädt eine CLI, keine Sprachen. Eine
darauf laufen lässt — deshalb beginnt der erste Abnehmer **ohne Ausschlüsse**. Sprachliste aus der Dokumentation beschreibt die neueste SonarQube-Fassung und
Das Ergebnis entscheidet, ob Ausschlüsse nachträglich nötig sind, und es sagt über eine konkrete Instanz nichts. Lauf 375 lud **zwei** Qualitätsprofile,
gehört in die `sonar-project.properties` des jeweiligen Repositories, nicht `json` und `yaml`; gearbeitet haben der IaC-Kubernetes-Sensor und die
in diesen Baustein. Geheimnis-Erkennung. Shell und GitHub Actions waren nicht dabei, obwohl der
erste Abnehmer dafür geplant war. **Jeder Aufrufer dieses Bausteins muss also
damit rechnen, dass ein Teil seines Baums ungeprüft bleibt** — und was geprüft
wird, steht erst nach dem ersten Lauf fest. Dieser Baustein kann daran nichts
ändern, und `sonar-project.properties` auch nicht.