Na obsah stránky

Deploytime feature toggles

Aleš Roubíček | | # permalink

Často se při vývoji setkáme s potřebou některé featury zapínat a vypínat dle potřeby. Pokud děláme službu, tak se jistě hodí zainvestovat do systému feature toggles, které jde zapínat/vypínat on-line nejlépe z administrativního rozhraní.

Možnost výběru omezeného okruhu uživatelů a nebo vzorků podle nějakého kritéria jistě také není na škodu. Dá se tak dělat postupný deployment a featuru testovat na omezeném vzorku uživatelů, ale taky se to může hodit při A/B testování. Možnost z produkce stáhnout nefunkční/spadlou featuru bez nutného redeploye také ocení asi každý. Feature toggles jsou dobro. :)

Ale co my, co zrovna neděláme služby a deployujeme k různým zákazníkům, různé featury, nás se to netýká? Ale ano. Koukneme se na jednu z možných technik deploytime feature toggles.

Deploytime feature toggles jsou méně flexibilní, každá změna vyžaduje redeploy aplikace. Na druhou stranu nás můžou ochránit před nechtěným užíváním featur, které zákazník nemá zakoupené a náhodou objevil, jak se k nim dostat. Jak tedy na to?

MSDeploy

Začnu předpokladem, že deployment neděláte ručně přes FTP (SSH, VPN/RD) nebo E-mail. Teď neposlouchám…

Ok. :) Dobře takže každý používá nějakou automatizaci deploye, nejlépe tu, kterou mu poskytuje jeho platforma. Ve Visual Studiu/IIS7 je nástroj zvaný MsDeploy, který slouží nejen k balíčkování, konfiguraci a deploymentu na webový server. Umí toho celkem dost, ale nám bude zatím stačit schopnost vytvářet deployovací balíčky. Je to taková ta funkce, která se skrývá v kontextové nabídce webového projektu pod názvem Build Deployment Package.

Feature Toggles

Pro deploytime feature toggles nebudeme vymýšlet nějaké složitosti a využijeme to, co nám platforma nabízí. Využijeme integraci s MsBuildem. Já vím, psát deployovací scripty v XML je špatné, ale tohle je tak snadné, že to snad zvládne každý. Jdeme trošku pod povrch, takže zamávejte dialogům a GUI a zapněte si svůj oblíbený XML editor a otevřete si projektový soubor webového projektu (nebo prostě dejte Unload Project a pak Edit *FooBar*.csproj přes kontextovou nabídku nad projektem). Taky vám začalo být srdce rychleji? :)

Dalším předpokladem je, že vývojová verze obsahuje všechny featury a toggles slouží jen k odebírání. Proto si nadefinujeme vlastnosti, které budou sloužit jako příznak pro odebrání featury.

<PropertyGroup>
  <RemoveFoo Condition=" '$(RemoveFoo)'=='' ">false</RemoveFoo>
  <RemoveBar Condition=" '$(RemoveBar)'=='' ">false</RemoveBar>
</PropertyGroup>

V aplikaci máme dvě featury Foo a Bar. Foo je featura, která je třeba jednou ASPX stránkou. Bar je pro změnu složena z controlleru a sady jeho views.

<PropertyGroup>
  <ExcludeFilesFromDeployment Condition=" '$(RemoveFoo)' == 'true' ">
      $(ExcludeFilesFromDeployment);Foo.aspx</ExcludeFilesFromDeployment>
  <ExcludeFoldersFromDeployment Condition=" '$(RemoveBar)' == 'true' ">
      $(ExcludeFoldersFromDeployment);Views\Bar</ExcludeFoldersFromDeployment>
</PropertyGroup>

ExcludeFilesFromDeployment a ExcludeFoldersFromDeployment jsou extension pointy pro balíčkovací target, kde můžete říct, co nemá být součástí výsledného balíčku. Můžete tak odebírat nejen stránky, ale i styly, scripty, assemblies… Prostě, co zrovna nepotřebujete. V ukázce používám Conditional atribut, kde se ptáme na hodnotu vlastností definovaných výše. Navíc, díky zanořené referenci $(ExcludeFilesFromDeployment); můžete mít takových toggles kolik potřebujete a hezky se poskládají podle konfigurace.

Dost bylo hrabání se v XML a přejděme k té hezčí práci. :) K příkazové řádce.

msbuild FooBar.csproj /t:Package /p:RemoveFoo=true

Vypínání jednotlivých featur v balíčku řídíme pomocí parametrů MsBuildu, zde konkrétně máme vypnutou featuru Foo. S příchodem deployovacích profilů ve VS 2012, to možná půjde udělat ještě líp, ale to jsem zatím nezkoumal.

Závěr

Tohle samozřejmě funguje jen na fyzické odebírání featur z aplikace. Pokud potřebujete i logické odebírání, můžete k tomu využít třeba vlastní transformace konfigurace.

Příjemné deployování!

Našli jste v článku chybu? Máte námět na reportáž? Založte mi ticket.