Co to znamená
MJ_TEST_JOBS=4 bash test/run.sh spouští případy po čtyřech a znamená přesně to, co bash test/run.sh: každý případ běží v jednorázovém repozitáři, selhávající případ zčervená běh s vlastním výstupem před svým verdiktem, souhrn je jeden deterministický blok v pořadí jmen, filtr, který nic neodpovídá, je chyba použití, stejně jako prázdný adresář případů. Každý případ už běží ve vlastním repozitáři, což je to, co je činí nezávislými; jediné, co sdílejí, je checkout, z něhož čtou, takže případ, který do něj musí zapisovat, to říká pomocí # majordomus-exclusive: <reason> a běží po poolu, sám.
Princip
Runner klasifikuje případy podle jejich hlavičky, paralelní předává xargs -P (omezeně; nikdy holé &), každý pracovník zapisuje log, stav a dobu trvání případu do souborů, pak spouští exkluzivní jeden po druhém a pak vykreslí verdikty v pořadí jmen ze souborů. Před paralelní fází a po ní vezme git status checkoutu a selže se jmenováním cest, které se liší. Případ spuštěný kdekoli jinde než ve fixture, kterou pro něj runner vytvořil, nikdy nedosáhne prvního řádku: test/lib.sh jej odmítne s run this case through test/run.sh, pokud nejsou nastaveny $T a $ROOT, případ nestojí v $T a $T není ani checkoutem, ani uvnitř něj, ani jiným checkoutem tohoto repozitáře. MJ_TEST_REPORT zapíše jeden řádek na případ (jméno, výsledek, sekundy, fáze) pro souhrn jobu. Bez MJ_TEST_JOBS je runner sériový, jaký byl vždy, streamující. test/cases/94_ci_plan.sh dokazuje sémantiku na soukromém harnessu jednorázových případů: červený běh s vykresleným logem, exkluzivní fáze, zpráva, omezený pool rychlejší než sériový, ochrana checkoutu jmenující cestu, chyby použití; test/cases/26_ci_wiring.sh dokazuje sémantiku selhání přes oba režimy.
Jak to vidět
MJ_TEST_JOBS=4 MJ_TEST_REPORT=/tmp/suite.tsv bash test/run.sh
sort -t "$(printf '\t')" -k3,3nr /tmp/suite.tsv | head # the slowest cases
bash test/run.sh # serially, streaming
grep -l '^# majordomus-exclusive:' test/cases/*.sh # the cases that run alone
just test-shell 94_ci_planCo nepokrývá
Hlídač vidí sledované i nesledované soubory checkoutu, ne ignorované: případ zapisující pod site/public/ nebo apps/majordomus-cli/target/ jím zachycen není a oba případy webu se z toho důvodu deklarují jako výlučné. Případ, který závisí na nečinnosti stroje (tvrzení o reálném čase), runner deterministickým neudělá; případ 65 byl kvůli tomu normalizován. Počet workerů je měřená volba pro každý runner, zaznamenaná v modelu CI a v baseline, ne příslib o jiném stroji.
Proč existuje
Sada spouštěla jeden případ po druhém a na runneru trvala půl hodiny, přičemž případy dohromady dávají jen pár minut práce každý; dlouhý ocas je široký a plochý, takže omezený pool zkrátí reálný čas, aniž by se změnilo, co se dokazuje. Exkluzivní hlavička činí explicitní a kontrolovaný invariant, který uvádí project.tests-run-in-disposable-repos: případy nikdy nezapisují do tohoto checkoutu, zatímco ho jiné čtou, místo aby se to jen předpokládalo.