Hoppa till innehållet

Repeterade CI‑hooken på forge‑sidan och hittade två fel som inte gick att se genom att läsa filen: en reservväg som lade ett argument som inte gick att lösa upp i hookens indata, och en miljövariabel från git själv som följde med grinden in i utcheckningen och gjorde 19 tester röda.

19 tester som blev röda av miljön från git själv

Situation. Den egenhostade git‑plattformen tar emot pushar och kan köra en hook på serversidan som avvisar arbete som inte klarar grinden. En hook på serversidan är den enda del av automatiseringen som inte går att testa genom att köra den lokalt: den körs i ett bare‑repo utan arbetskatalog, i en miljö som plattformen sätter upp, och läser de pushade referenserna från standard in. Att läsa skriptet och dra slutsatsen att det är korrekt är en gissning.

Uppgift. Hooken måste provköras mot ett riktigt bare‑repo och en riktig push innan den kunde betraktas som pålitlig, i stället för att driftsättas och visa sina brister först i skarp drift.

Handling. Provkörningen skapar ett bare‑repo, installerar hooken, klonar repot, committar, pushar och verifierar både fallet där pushen godtas och fallet där den avvisas. Den hittade två fel, och inget av dem syntes i filen. Det första var en reservlösning i argumenthanteringen: när hooken inte kunde avgöra en referens satte den in en platshållare som inte gick att slå upp som objekt, och eftersom värdet kommer in på hookens standard in och inte som en parameter, visade sig felet som ett helt annat fel mycket längre ned. Det andra är det som är värt att komma ihåg. Git exporterar en miljövariabel som pekar ut repots katalog när det anropar en hook, och den variabeln ärvs av allt som hooken kör. Grinden checkar ut den pushade revisionen och kör testsviten i den, och testsviten ärvde pekaren till bare‑repot — så nitton tester som rör git slogs upp mot fel repo och blev röda, trots att koden var korrekt. Miljön måste rensas vid gränsen, och den gränsen syns inte förrän saken faktiskt körs.

Resultat. Hooken fungerar i båda fallen, och båda felen hittades innan någon riktig push stötte på dem. Begränsningen är att en provkörning fortfarande är en simulering: den bevisar att hooken klarar en sorts push, och plattformen i produktion tar emot pushar som den här provkörningen inte konstruerar, bland annat tvingade uppdateringar och borttagna grenar.

En del av en längre historik — och den finns i sin helhet här.

Varje post är skriven på samma sätt: situationen, uppgiften, vad vi gjorde och vad som förändrades.

Se hela historiken