module

Beryl::BuildReport

État LISIBLE des builds de paquets d'un builder poudriere géré par la primitive poudriere-build (cf. Beryl::Apply::PoudriereBuild), utilisé par beryl build-status. Tout est PUR ici (aucun SSH) : script de lecture envoyé au builder, analyse de sa sortie, du journal de build, de poudriere status, calcul de l'état et rendu texte/JSON.

Fichiers de la primitive, dans le répertoire des paquets :

  • .beryl-build-<majeur>.lock : présent pendant un build ;
  • .beryl-build-<majeur>.log : sortie du script de build (dont celle de poudriere bulk), écrasé à chaque build ;
  • .beryl-build-<majeur>.overlays : une ligne <overlay> <commit> par overlay, écrit seulement en fin de build RÉUSSI (sa date = fin du dernier build réussi).

Formats poudriere lus (src/share/poudriere/common.sh, job_msg_status) :

[00:07:46] [01] [00:00:00] Building   lang/crystal | crystal-1.21.0
[00:14:03] [01] [00:06:17] Finished   lang/crystal | crystal-1.21.0: Success
[00:20:11] [02] [00:03:02] Finished   www/foo | foo-1.2: Failed: build

1ʳᵉ durée = temps écoulé depuis le début du bulk, 2ᵉ = durée du paquet sur son builder. Journal d'erreur d'un paquet : <LOGS>/logs/errors/<pkg>.log.

Constants

DURATION = /(?:\d+D:)?\d+:\d\d:\d\d/

Durée poudriere : [ND:]HH:MM:SS (calculate_duration).

EVENT = /\A(?:\[(?<at>#{DURATION.source})\]\s+)?(?:=>>\s+)?(?:\[(?<builder>\d+)\]\s+)?(?:\[(?<job>#{DURATION.source})\]\s+)?(?<kind>Building|Finished|Crashed|Skipping|Ignoring)\s+(?<origin>\S+) \| (?<pkg>[^\s:]+)(?::\s*(?<msg>.*))?\z/

Ligne d'événement d'un paquet. Les préfixes [écoulé], [builder] et [durée du paquet] sont optionnels (absents hors builder, ou remplacés par =>> quand poudriere n'affiche pas le temps écoulé).

LOG_PATTERN = "(Building|Finished|Crashed|Skipping|Ignoring) +[^ ]+ [|] |Logs: |Error:|Queued: [0-9]|Time: [0-9]|packages using up to|poudriere-build [^ ]+ OK|en cours [(]lock[)]"

Motif grep -E côté builder : seules les lignes utiles du journal voyagent (événements des paquets, chemin des journaux, bilan, erreurs, fin du script). ASCII seulement (le journal peut être en C locale).

TAIL_LINES = 20

Lignes de fin de journal rapportées (dernières lignes du script).

TOP = 10

Paquets terminés affichés sans --all (les plus longs).

Instance methods

counters_from_packages(pkgs : Array(Package), to_build : Int32 | Nil) : Counters

Compteurs recomptés depuis les événements du journal (dernier recours).

Source
counters_from_row(row : StatusRow) : Counters
Source
date(epoch : Int64 | Nil, location : Time::Location) : String
Source
exit_code(reports : Array(Report)) : Int32

0 = succès / en cours / jamais construit ; 1 = un build en échec.

Source
human(secs : Int32 | Int64 | Nil) : String

377 → "6 min 17 s" ; 21 → "21 s" ; 3900 → "1 h 05 min".

Source
majors(remote : Remote) : Array(String)

Majeurs présents (d'après les fichiers trouvés), triés numériquement.

Source
parse_log(text : String) : LogInfo

Lignes du journal (filtrées ou non) → paquets, chemin des journaux, bilan, erreurs. Un paquet relancé (même nom) remplace le précédent.

Source
parse_overlays(text : String) : Array(Tuple(String, String))

.overlays → [{nom, commit}] dans l'ordre du fichier.

Source
parse_remote(text : String) : Remote

Sortie du script → fichiers + sections.

Source
parse_status(text : String) : Array(StatusRow)

poudriere status -H (tabulations) ou affichage normal (espaces). L'en-tête et les lignes illisibles sont ignorés.

Source
pick_row(rows : Array(StatusRow), major : String, logs_dir : String | Nil, running : Bool) : StatusRow | Nil

Ligne de poudriere status correspondant au build : même nom de build que le journal (Logs: …/<BUILD>), sinon — build en cours seulement — la plus récente non terminée d'une jail du majeur (fbsd<majeur><mineure><arch>).

Source
remote_script(pkgdir : String, major : String | Nil = nil) : String

Script (sh POSIX, lecture seule) qui rassemble en UNE connexion : dates et tailles des fichiers de la primitive, contenu de .overlays, lignes utiles et fin du journal, poudriere status. major nil = tous les majeurs présents. Multi-ligne : transporté par Apply.sh_line (base64), donc sûr sous un shell de connexion csh.

Source
render(label : String, pkgdir : String, reports : Array(Report), all : Bool = false, sort : String = "duration", location : Time::Location = Time::Location.local) : String

Rendu texte de tous les majeurs. all = liste complète des paquets terminés (sinon les TOP premiers selon le tri).

Source
report(remote : Remote, major : String, pkgdir : String = "") : Report

Rapport d'un majeur à partir de la lecture distante.

Source
reports(remote : Remote, major : String | Nil, pkgdir : String = "") : Array(Report)

Tous les majeurs demandés (major nil = ceux présents).

Source
seconds(text : String | Nil) : Int32 | Nil

"00:06:17" → 377 ; "1D:02:00:00" → 93600. nil si illisible.

Source
sorted(pkgs : Array(Package), sort : String) : Array(Package)

Tri des paquets terminés : durée décroissante (défaut) ou origine.

Source
strip_ansi(text : String) : String
Source
to_json(label : String, pkgdir : String, reports : Array(Report)) : String

Sortie machine (--json). Dates en secondes epoch (UTC).

Source

Nested types