lint:packages — variables/schémas incorrects non détectés à la validation #7
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
Plusieurs cas où
lint:packagesvalide un package (Package xxx is valid) alors que son schéma d'options ou un template référence des variables qui ne se résolvent jamais correctement à l'exécution.1. Option
objectavecproperties.*.default— silencieusement ignoréeUn package déclarait :
Convention réellement supportée (format à plat) :
Avec le schéma
properties.*.default, les valeurs par défaut ne sont jamais appliquées : au rendu du template,values.solver_settings.ingress_classest absent et casse en mode strict, même quand le test fournit explicitement la valeur dansvalues:.Suggestion :
lint:packagesdevrait détecter/avertir sur l'usage deproperties:dans une optiontype: object(motif non supporté par le moteur de fusion d'options), ou la doc devrait explicitement interdire ce style JSON-Schema imbriqué.2. Variable absente du contexte de rendu dans un partial Handlebars
Un partial référençait
{{ instance.package.jukebox }}, mais ce chemin n'existe pas dans le contexte passé parsafe_apply(seulsname,namespace,category,pck,optionssont fournis commeparams). Résultat : échecsSystemInstance-*(Failed to access variable in strict mode Some("instance.package.jukebox")).lint:templates/lint:rhaine croisent pas les variables référencées dans un partial Handlebars avec lesparamsréellement fournis par les appels Rhai qui le rendent — ce qui aurait permis de détecter ce chemin mort avant l'exécution des tests.3. Accès à
context.namespacedepuis un packagetype: systemcontext.namespacen'existe que pour les packagestenant/service. Pour un packagetype: system,context.namespacevaut(), et l'accès.hacasse avecUnknown property 'ha' - a getter is not registered for type '()'.Ni
lint:rhainilint:packagesne vérifient la cohérence entremetadata.typedu package et les chemins de contexte (context.namespace,context.tenant, …) utilisés dans ses scripts.4. Le pipeline CI ne fait jamais échouer le job sur des assertions de test en échec
La commande
agent package testretourne toujours un code de sortie 0 — y compris quand des assertionsTest/TestSetéchouent ([FAIL] ... no objects matched selector,0/1 match, expected exactly 1, etc.). Le|| exit 1du script ne se déclenche que si l'agent plante (erreur Rhai, parsing), jamais sur un résultat de typeResults: 8 passed, 6 failed, 14 total.Conséquence concrète : un pipeline peut passer "Success" alors que le widget "Test summary" de la MR affiche de nombreux échecs réels — rendant le badge vert trompeur et masquant les régressions silencieuses.
Suggestion : faire échouer
lint:packages/lint:templatesdès qu'unTest/TestSetcontient une assertion en échec — par ex. en parsant le résuméResults: N passed, M failed, T totalet en faisant unexit 1siM > 0.Suggestion générale
Ces cas partagent un point commun : le linter valide la forme YAML/Rhai mais ne détecte pas qu'une variable référencée dans un template/script ne sera jamais peuplée à l'exécution. Une passe de lint capable de croiser "variables référencées" ↔ "variables garanties par le contexte du type de package + les
params/optionsfournis" éviterait ces régressions silencieuses.Traité dans la PR upstream : https://github.com/sebt3/vynil/pull/227
Points adressés (3/4) :
agent package testretournait toujours exit 0 même quand des assertions échouaient. Corrigé : retourne désormais exit 1 (TestFailure) sitotal_failed > 0.type: objectavecproperties.*.default(JSON Schema imbriqué) silencieusement accepté parlint:packages. Ajout du findingpackage/object-properties-unsupported(Warn).context.namespace/context.tenantdans un packagetype: systemnon détecté parlint:rhai. Étenducheck_wrong_package_typepour détecter ces accès de propriété (l'AST Rhai 1.25 est associatif à droite :context.namespace.ha→Dot(Variable("context"), Dot(Property("namespace"), Property("ha")))).Point hors scope (#2) — Croisement variables partials Handlebars ↔
paramspassés par les appelants Rhai : refactoring plus conséquent, à traiter séparément.