Tento příspěvek se původně objevil na mém osobním blogu.
Používám příkaz cli ember serve
nebo zkrácený tvar ember s
každý den k vytváření a obsluze lokálně ember aplikací pro vývoj. Všiml jsem si, že ember s --path dist
a ember t --path dist
jejich zahájení trvalo dlouho. --path
flag umožňuje znovu použít existující sestavení na dané cestě.
➜ ~ ember help | grep -- "--path\|^\w" | grep -B1 -- "--path"
ember serve <options...>
--path (Path) Reuse an existing build at given path.
ember test <options...>
--path (Path) Reuse an existing build at given path.
Pomalá kontinuální integrace
Tato dlouhá doba startu také výrazně prodloužila celkovou dobu běhu kontinuální integrace, CI, testovacího běhu projektu, na kterém jsem pracoval. Sestavení CI bylo rozděleno do fáze kompilace a fáze testování. Fáze kompilace načte závislosti a zkompiluje aplikaci pomocí ember b
a připravuje API na straně serveru pro naše testy kouře plného zásobníku. Aplikace používá ember-cli-typescript a sestavení může trvat asi 2 minuty kompilace strojopisu na CI. Testovací fáze se skládá ze 7 souběžných úloh, které všechny využívají kompilovaná aktiva z fáze kompilace. Díky jedné fázi kompilace a 7 fázím testování bude čas začátku do konce rychlejší. Celková doba běhu bude o něco delší kvůli několika 7 dalším krokům spouštění testovacího prostředí.
Celková doba běhu testovacího běhu CI se však prodloužila více, než by bylo možné přičíst dodatečným spouštěcím krokům, tj. celková doba dokončení všech úloh trvala přibližně o 14 minut déle, než se očekávalo. Díky použití souběžných úloh se zkracuje čas od zahájení sestavení a dokončení sestavení, došlo ke zkrácení doby do zpětné vazby, ale ne očekávané a celková doba běhu se prodloužila více, než se očekávalo.
Co se stane, když spustíte ember t
?
ember
je rozhraní příkazového řádku pro Ember.js whereis ember
vám řekne, kde je spustitelný soubor, v mém případě ~/.yarn/bin/ember
. Otevírám ~/yarn/bin/ember
první řádek je #!/usr/bin/env node
říká nám, že jde o aplikaci uzlu, která vytvoří ember-cli CLI
a run
je to. Analýza argumentů příkazového řádku a vytvoření objektu Command zase vytvoří příslušný objekt Task a spustí jej. V tomto případě je to TestTask, který při spuštění vyvolá testem, testovací běh JS používaný Ember.js. TestTask také umožňuje ember addonům vložit middleware do testemu. Toto je velmi podobné ServerTask, který se spouští při použití ember s
, s také umožňuje ember addonům vložit middleware do vývojového serveru.
Identifikace fáze pomalého sestavení
Zde a v dokumentech ember-cli je nějaká užitečná dokumentace popisující, jak vysledovat problémy s výkonem sestavení. Pomocí jedné z popsaných technik přidám DEBUG
proměnná prostředí před ember s
$ DEBUG==ember-cli:* ember s --path dist
ember-cli:test-server isForTests: false +10s
ember-cli:broccoli-watcher serving: /admin/index.html +37s
ember-cli:broccoli-watcher serving: (prefix stripped) /index.html, was: /admin/index.html +1ms
Proč to u isForTests trvá 10 s a co dělá brokolice, myslel jsem, že sloužíme předkompilované prostředky? Chcete-li se trochu více prohrabat a vytvořit mnohem více informací o ladění, spustili jste DEBUG=*:* ember s --path dist
$ DEBUG=*:* ember s --path dist
...
– Serving on http://localhost:4200/admin/
...
ember-cli-typescript:typecheck-worker Typecheck complete (0 diagnostics) +49s
...
Není to ember-cli:broccoli-watcher
ale ember-cli-typescript:typecheck-worker
zabírající celou dobu. Skutečným viníkem je middleware typu ember-cli-typescript. Kontrola typu se provádí, i když je kód již transpilován, v případě použití --path
vlajka.
Zlepšení výkonu
Změna kódu pro zlepšení výkonu byla malá. Při přidávání middlewaru serveru nebo middlewaru testemu zkontrolujte možnosti předané ember-cli a pokud obsahují příznak cesty, nespouštějte kontrolu typu. Malý ember-cli
aktualizace byla také nutná. ember-cli by předal všechny příznaky CLI serverovému middlewaru, ale ne middlewaru testemu. Bez aktualizace ember-cli by ember-cli-typechecking nebyl schopen provést kontrolu, když byl přidán middleware testem. Zajímavé je, že u každého PR jsem strávil mnohem více času zjišťováním, jak efektivně testovat změny, než je implementovat.
Tyto aktualizace výrazně zrychlily dobu sestavení CI a znatelněji zlepšily můj pracovní postup tím, že drasticky zkrátily dobu provádění příkazů ember při použití --path
vlajka.