Triagering av biljetter¶
Django använder Trac för att hantera arbetet med kodbasen. Trac är en trädgård som sköts av gemenskapen med de buggar som folk har hittat och de funktioner som Django har beslutat att lägga till. Som i alla trädgårdar finns det ibland ogräs som ska rensas bort och ibland blommor och grönsaker som behöver plockas. Vi behöver din hjälp för att skilja det ena från det andra, och i slutändan gynnas vi alla tillsammans.
Precis som i alla trädgårdar kan vi sträva efter perfektion, men i verkligheten finns det inget sådant. Även i den mest orörda trädgård finns det fortfarande sniglar och insekter. I en gemensam trädgård finns det också hjälpsamma människor som - med de bästa avsikter - gödslar ogräset och förgiftar rosorna. Det är hela samhällets uppgift att sköta sig självt, hålla problemen på ett minimum och utbilda dem som kommer in i samhället så att de kan bli värdefulla bidragande medlemmar.
På samma sätt, även om vi strävar efter att Trac ska vara en perfekt representation av Djangos framsteg, erkänner vi att detta inte kommer att hända. Genom att distribuera belastningen av Trac-underhåll till samhället accepterar vi att det kommer att finnas misstag. Trac är ”mestadels korrekt”, och vi tar hänsyn till det faktum att det ibland kommer att vara fel. Det är helt okej. Vi är perfektionister med deadlines.
Vi förlitar oss på att communityn fortsätter att delta, håller ärenden så korrekta som möjligt och tar upp frågor för diskussion på Django Forum när det finns förvirring eller oenighet.
Django är ett community-projekt och alla bidrag hjälper till. Vi kan inte göra det här utan dig!
Arbetsflöde för triagering¶
Tyvärr innehåller inte alla rapporter i biljettspåraren alla krävda detaljer. Ett antal ärenden har föreslagna lösningar, men dessa uppfyller inte nödvändigtvis alla krav att följa riktlinjerna för att bidra.
Ett sätt att hjälpa till är att trimma ärenden som har skapats av andra användare.
Det mesta av arbetsflödet är baserat på konceptet med en biljetts triage stages. Varje steg beskriver var i sin livstid en viss biljett befinner sig vid varje tidpunkt. Tillsammans med en handfull flaggor berättar detta attribut enkelt för oss vad och vem varje ärende väntar på.
Eftersom en bild säger mer än tusen ord börjar vi där:
Vi har två roller i det här diagrammet:
Sammanslagare: personer med commit-åtkomst som är ansvariga för att fatta det slutliga beslutet att slå samman en ändring.
Ticket triagers: alla i Django-gemenskapen som väljer att engagera sig i Djangos utvecklingsprocess. Vår Trac-installation är avsiktligt öppen för allmänheten, och vem som helst kan triagera ärenden. Django är ett gemenskapsprojekt, och vi uppmuntrar triage by the community.
Som ett exempel ser vi här livscykeln för ett genomsnittligt ärende:
Alice skapar ett ärende och skickar en ofullständig pull request (inga tester, felaktig implementering).
Bob granskar pull request, markerar ärendet som ”Accepted”, ”needs tests” och ”patch needs improvement” och lämnar en kommentar där han berättar för Alice hur patchen kan förbättras.
Alice uppdaterar pull request och lägger till tester (men ändrar inte implementeringen). Hon tar bort de två flaggorna.
Charlie granskar pull request och återställer flaggan ”patch needs improvement” med ytterligare en kommentar om att förbättra implementeringen.
Alice uppdaterar pull request och fixar implementeringen. Hon tar bort flaggan ”patch needs improvement”.
Daisy granskar pull request och markerar ärendet som ”Redo för incheckning”.
Jacob, en merger, granskar pull request och slår samman den.
Vissa ärenden kräver mycket mindre feedback än så, men vissa ärenden kräver å andra sidan mycket mer.
Triage-stadier¶
Nedan beskriver vi mer i detalj de olika steg som en biljett kan gå igenom under sin livstid.
Ej Recenserade¶
Ärendet har inte granskats av någon som känner sig kvalificerad att göra en bedömning om huruvida ärendet innehöll en giltig fråga eller borde stängas av någon av de olika anledningarna.
Accepterad¶
Den stora gråzonen! Den absoluta innebörden av ”accepterad” är att det problem som beskrivs i ärendet är giltigt och befinner sig i något skede av arbetet. Utöver detta finns det flera överväganden:
Accepterat + Inga flaggor
Ärendet är giltigt, men ingen har skickat in en patch för det ännu. Ofta innebär detta att du kan börja skriva en fix för den. Detta är i allmänhet mer sant för accepterade buggar än accepterade funktioner. En biljett för en bugg som har accepterats innebär att problemet har verifierats av minst en triager som en legitim bugg - och bör förmodligen åtgärdas om möjligt.
För nya funktioner bör accepterade ärenden endast existera efter att idén har gått igenom den lämpliga processen för att föreslå nya funktioner och fått godkännande av gemenskapen och Steering Council, eller accepterats i en DEP.
Accepterad + Har Patch
Ärendet väntar på att folk ska granska den medföljande lösningen. Detta innebär att ladda ner patchen och prova den, verifiera att den innehåller tester och dokument, köra testsviten med den medföljande patchen och lämna feedback på ärendet.
Accepted + Has Patch + Needs …
Detta innebär att ärendet har granskats och att det har konstaterats att det behöver ytterligare arbete. ”Behöver testas” och ”Behöver dokumenteras” är självförklarande. ”Patch needs improvement” åtföljs i allmänhet av en kommentar i ärendet som förklarar vad som behövs för att förbättra koden.
Redo för incheckning¶
Ärendet granskades av någon annan medlem av communityn än den person som levererade patchen och ansågs uppfylla alla krav för ett commit-ready bidrag. En fusion måste nu genomgå en sista granskning innan den kan skickas in.
Det finns många pull requests. Det kan ta ett tag för din patch att bli granskad. Se :ref:``Bidra med kod FAQ<new-contributors-faq>` för några idéer här.
En dag/kanske¶
Detta steg visas inte i diagrammet. Det används sparsamt för att hålla reda på långsiktiga förändringar.
Dessa ärenden är ovanliga och generellt sett mindre användbara eftersom de inte beskriver konkreta problem som kan åtgärdas.
Andra triageattribut¶
Ett antal flaggor, som visas som kryssrutor i Trac, kan ställas in på ett ärende:
Har lapp¶
Detta innebär att ärendet har en associerad lösning. Dessa kommer att granskas för att säkerställa att de följer dokumenterade riktlinjer.
De följande tre fälten (Behöver dokumentation, Behöver tester, Patch behöver förbättras) gäller endast om en patch har levererats.
Behov av dokumentation¶
Den här flaggan används för ärenden med korrigeringar som behöver tillhörande dokumentation. Fullständig dokumentation av funktioner är en förutsättning för att vi ska kunna checka in dem i kodbasen.
Behov av tester¶
Detta flaggar för att patchen behöver associerade enhetstester. Återigen, detta är en obligatorisk del av ett giltigt bidrag.
Patch behöver förbättras¶
Den här flaggan betyder att även om ärendet har en lösning, är den inte riktigt redo för incheckning. Det kan betyda att patchen inte längre tillämpas korrekt, att det finns ett fel i implementeringen eller att koden inte uppfyller våra standarder.
Lätt att välja¶
Biljetter som skulle kräva små, enkla förändringar.
Typ¶
Biljetter bör kategoriseras efter typ mellan:
- Ny funktion
För att du tillför något nytt.
- Insekt
För när en befintlig sak är trasig eller inte beter sig som förväntat.
- Uppstädning/optimering
För när inget är trasigt men något kan göras renare, bättre, snabbare, starkare.
Komponent¶
Ärenden bör klassificeras i komponenter som indikerar vilket område av Django-kodbasen de tillhör. Detta gör att ärendena blir bättre organiserade och lättare att hitta.
Allvarlighetsgrad¶
Attributet severity används för att identifiera blockerare, det vill säga problem som bör åtgärdas innan nästa version av Django släpps. Vanligtvis är dessa problem buggar som orsakar regressioner från tidigare versioner eller potentiellt orsakar allvarliga dataförluster. Detta attribut används ganska sällan och de allra flesta ärenden har en allvarlighetsgrad på ”Normal”.
Version¶
Det är möjligt att använda attributet version för att ange i vilken version den rapporterade felaktigheten identifierades.
UI/UX¶
Den här flaggan används för ärenden som rör frågor om användargränssnitt och användarupplevelser. Den här flaggan skulle till exempel vara lämplig för användarvänliga funktioner i formulär eller administratörsgränssnittet.
Cc¶
Du kan lägga till ditt användarnamn eller din e-postadress i det här fältet för att bli meddelad när nya bidrag görs till biljetten.
Nyckelord¶
Med det här fältet kan du märka en biljett med flera nyckelord. Det kan t.ex. vara användbart för att gruppera flera biljetter på samma tema. Nyckelord kan antingen separeras med kommatecken eller mellanslag. Nyckelordssökning hittar nyckelordssträngen var som helst i nyckelorden. Om du t.ex. klickar på ett ärende med nyckelordet ”form” får du fram liknande ärenden som är märkta med nyckelord som innehåller strängar som ”formset”, ”modelformset” och ”ManagementForm”.
Biljetter till avslutning¶
När ett ärende har avslutat sin användbara livscykel är det dags att stänga det. Att stänga ett ärende är dock ett stort ansvar. Du måste vara säker på att problemet verkligen är löst, och du måste komma ihåg att den som rapporterat ärendet kanske inte är glad över att få sitt ärende stängt (om det inte är åtgärdat!). Om du inte är säker på om du ska stänga ett ärende, lämna en kommentar med dina tankar istället.
Om du stänger ett ärende bör du alltid kontrollera följande:
Försäkra dig om att problemet är löst.
Lämna en kommentar med en förklaring till beslutet att stänga ärendet.
Om det finns något sätt de kan förbättra ärendet för att öppna det igen, låt dem veta det.
Om ärendet är en dubblett ska du hänvisa till det ursprungliga ärendet. Korsreferera också det stängda ärendet genom att lämna en kommentar i det ursprungliga ärendet - detta gör det möjligt att få tillgång till mer relaterad information om den rapporterade buggen eller den begärda funktionen.
**Var artig Ingen gillar att få sitt ärende avslutat. Det kan vara frustrerande eller till och med avskräckande. Det bästa sättet att undvika att avskräcka människor från att bidra till Django är att vara artig och vänlig och att ge förslag på hur de kan förbättra detta ärende och andra ärenden i framtiden.
Ett ärende kan lösas på flera olika sätt:
- fixerad
Används när en patch har rullats in i Django och problemet är åtgärdat.
- ogiltig
Används om det visar sig att ärendet är felaktigt. Detta innebär att problemet i ärendet faktiskt är resultatet av ett användarfel, eller beskriver ett problem med något annat än Django, eller inte alls är en buggrapport eller funktionsbegäran (till exempel skickar vissa nya användare supportfrågor som ärenden).
- wontfix
Används när någon beslutar att begäran inte är lämplig för övervägande i Django. Ibland stängs ett ärende som ”wontfix” med en begäran om att rapportören ska starta en diskussion på Django Forum om de känner annorlunda än den motivering som ges av den person som stängde ärendet. Andra gånger föregås beslutet att stänga ett ärende av en diskussion. Använd alltid forumet för att få ett samförstånd innan du återöppnar ärenden som stängts som ”wontfix”.
- duplicera
Används när ett annat ärende täcker samma fråga. Genom att stänga dubbla ärenden håller vi all diskussion på ett ställe, vilket är till hjälp för alla.
- arbetar för
Används när ärendet inte innehåller tillräckligt med detaljer för att replikera den ursprungliga buggen.
- behöver information
Används när ärendet inte innehåller tillräckligt med information för att replikera det rapporterade problemet, men fortfarande kan vara giltigt. Ärendet bör öppnas på nytt när mer information har lämnats.
Om du tror att ärendet stängdes av misstag - eftersom du fortfarande har problemet, eller det har dykt upp någon annanstans, eller triagerarna har gjort ett misstag - öppna ärendet igen och ge ytterligare information. Återigen, öppna inte biljetter som har markerats som ”wontfix” och ta med problemet till Django Forum istället.
Hur kan jag hjälpa till med triagering?¶
Triageprocessen drivs främst av medlemmar i samhället. Verkligen, ** ALLA** kan hjälpa till.
Om du vill engagera dig kan du börja med att skapa ett konto på Trac. Om du har ett konto men har glömt ditt lösenord kan du återställa det genom att använda sidan för återställning av lösenord.
Då kan du hjälpa till genom att:
Stänga ”Ogranskade” ärenden som ”ogiltiga”, ”arbetsform”, ”duplikat” eller ”wontfix”.
Stänga ”Unreviewed” ärenden som ”needsinfo” när beskrivningen är för knapphändig för att kunna åtgärdas, eller när de är funktionsförfrågningar som kräver en diskussion på Django Forum.
Korrigering av flaggorna ”Behöver testas”, ”Behöver dokumenteras” eller ”Har patch” för ärenden där de är felaktigt inställda.
Ställ in flaggan ”Easy pickings” för ärenden som är små och relativt okomplicerade.
Ange typ av biljetter som fortfarande är okategoriserade.
Kontrollera att gamla ärenden fortfarande är giltiga. Om ett ärende inte har varit aktivt på länge är det möjligt att problemet har åtgärdats men att ärendet ännu inte har stängts.
Identifiera trender och teman i ärendena. Om det finns många felrapporter om en viss del av Django, kan det tyda på att vi bör överväga att refaktorisera den delen av koden. Om en trend håller på att växa fram bör du ta upp den till diskussion (med hänvisning till de relevanta ärendena) på Django Forum.
Kontrollera att de lösningar som andra har skickat in är korrekta. Om de är korrekta och även innehåller lämplig dokumentation och tester flyttar du dem till steget ”Redo för kontroll”. Om de inte är korrekta lämnar du en kommentar där du förklarar varför och sätter motsvarande flaggor (”Patch needs improvement”, ”Needs tests” etc.).
Observera
Sidan Reports innehåller länkar till många användbara Trac-frågor, inklusive flera som är användbara för att triagera ärenden och granska förslag som föreslås ovan.
Du kan också hitta fler nya bidragsgivare.
Vi ber dock alla allmänna medlemmar som arbetar i biljettdatabasen att göra följande
Främja inte dina egna ärenden till ”Redo för incheckning”. Du kan markera andras ärenden som du har granskat som ”Redo för incheckning”, men du bör få minst en annan medlem av communityn att granska en patch som du skickar in.
Reversera inte ett beslut utan att skicka ett meddelande till Django Forum för att hitta konsensus.
Om du är osäker på om du bör göra en ändring, gör inte ändringen utan lämna istället en kommentar med dina farhågor på ärendet eller skicka ett meddelande till Django Forum. Det är okej att vara osäker, men din input är fortfarande värdefull.
Bisektion av en regression¶
En regression är en bugg som finns i en nyare version av Django men inte i en äldre. En mycket användbar information är den commit som introducerade regressionen. Att veta vilken commit som orsakade förändringen i beteende hjälper till att identifiera om förändringen var avsiktlig eller om det var en oavsiktlig bieffekt. Så här kan du avgöra detta.
Börja med att skriva ett regressionstest för Djangos testsvit för den aktuella frågan. Vi låtsas till exempel att vi felsöker en regression i migreringar. När du har skrivit testet och bekräftat att det misslyckas på den senaste huvudgrenen, lägg det i en separat fil som du kan köra fristående. I vårt exempel låtsas vi att vi har skapat tests/migrations/test_regression.py
, som kan köras med:
$ ./runtests.py migrations.test_regression
Därefter markerar vi den aktuella punkten i historien som ”dålig” eftersom testet misslyckas:
$ git bisect bad
You need to start by "git bisect start"
Do you want me to do it for you [Y/n]? y
Nu måste vi hitta en punkt i git-historiken innan regressionen infördes (dvs. en punkt där testet godkänns). Använd något som git checkout HEAD~100
för att kolla in en tidigare revision (100 commits tidigare, i det här fallet). Kontrollera om testet misslyckas. Om så är fallet markerar du den punkten som ”dålig” (git bisect bad
), checkar sedan ut en tidigare revision och kontrollerar igen. När du hittar en revision där ditt test godkänns markerar du den som ”bra”:
$ git bisect good
Bisecting: X revisions left to test after this (roughly Y steps)
...
Nu är vi redo för den roliga delen: att använda git bisect run
för att automatisera resten av processen:
$ git bisect run tests/runtests.py migrations.test_regression
Du bör se git bisect
använda en binär sökning för att automatiskt kontrollera revisioner mellan de bra och dåliga begåvningarna tills den hittar den första ”dåliga” begåvningen där testet misslyckas.
Rapportera nu dina resultat på Trac-biljetten och inkludera regressionstestet som en bilaga. När någon skriver en fix för buggen kommer de redan att ha ditt test som utgångspunkt.