Spring til indhold

Har prøvekørt forgens CI‑hook og fundet 2 fejl

Har prøvekørt CI‑hooken på forge‑siden og fundet to fejl, som ikke kunne findes ved at læse filen: en fallback, der sendte et argument, som ikke kunne opløses, ind i hookens input, og gits egen miljøvariabel, der fulgte gaten ind i checkouten og gjorde 19 tests røde.

  • Stage curtain, curtain, stage
    Foto: nachrichten_muc / Pixabay
  • Open theater, amphitheater, seats
    Foto: dimitrisvetsikas1969 / Pixabay

19 tests gjort røde af gits eget miljø

Situation. Den selvhostede git‑forge tager imod pushes og kan køre en hook på serversiden for at afvise arbejde, der ikke består porten. En hook på serversiden er det ene stykke automatik, der ikke kan testes ved at køre den lokalt: den udføres i et bart repository uden arbejdstræ, i et miljø, som forgen sætter op, og læser de pushede referencer fra sin standardinddata. At læse scriptet og konkludere, at det er korrekt, er et gæt.

Opgave. Hooken skulle prøves af mod et rigtigt bart repository og et rigtigt push, før man stolede på den, og ikke udrulles først og afsløre sine fejl bagefter.

Handling. Prøven opretter et bart repository, installerer hooken, kloner det, committer, pusher og efterprøver både accept- og afvisningsvejen. Den fandt to defekter, og ingen af dem var synlige i filen. Den første var en fallback i argumenthåndteringen: når hooken ikke kunne bestemme en reference, indsatte den en pladsholder, der ikke var et objekt, der kunne slås op, og fordi værdien ankommer på hookens standardinddata og ikke som en parameter, viste fejlen sig som en urelateret fejl meget længere nede. Den anden er den, der er værd at huske. Git eksporterer en miljøvariabel med repositoryets mappe, når den kalder en hook, og den variabel nedarves af alt, hvad hooken kører. Porten tjekker den pushede revision ud og kører testsuiten inde i den, og testsuiten nedarvede henvisningen til det bare repository — så nitten test, der rører git, blev slået op mod det forkerte repository og gik røde på kode, der var korrekt. Miljøet skal ryddes ved grænsen, og den grænse er usynlig, medmindre tingen reelt køres.

Resultat. Hooken virker på begge veje, og begge defekter blev fundet, før noget rigtigt push mødte dem. Begrænsningen er, at en prøve stadig er en simulering: den beviser, at hooken overlever én type push, og forgen ser i drift pushes, som denne prøve ikke konstruerer, herunder tvungne opdateringer og sletning af grene.

Ét stykke af en længere fortegnelse — og det hele ligger her på sitet.

Hver post er skrevet på samme måde: situationen, opgaven, hvad vi gjorde, og hvad der ændrede sig.

Se hele fortegnelsen