Eksperymentowanie progresywne z flagami funkcji

Gdy zespoły DevOps przeniosą się do metodologii Agile, która koncentruje się na ciągłym dostarczaniu funkcji, potrzeba kontrolowania, jak stają się one dostępne dla użytkowników, stają się coraz ważniejsze. Flagi funkcji to doskonałe rozwiązanie do ograniczania dostępu użytkowników do nowych funkcji w celach marketingowych lub do testowania w środowisku produkcyjnym.

Oddzielenie wdrożenia i ekspozycji

Dzięki flagom funkcji zespół może wybrać, czy dany zestaw funkcji jest widoczny w środowisku użytkownika i/lub wywoływany w ramach funkcji. Nowe funkcje można kompilować i wdrażać w ramach zwykłego procesu programowania bez udostępniania tych funkcji w celu uzyskania szerokiego dostępu. Wdrażanie funkcji jest wygodnie oddzielone od ich ekspozycji.

Flagi zapewniają kontrolę środowiska uruchomieniowego w dół do poszczególnych użytkowników

Flagi zapewniają również szczegółową kontrolę aż do poszczególnych użytkowników. Gdy nadszedł czas na włączenie funkcji, niezależnie od tego, czy dla jednego użytkownika, małej grupy, czy wszystkich, zespół może po prostu zmienić flagę funkcji, aby rozświetlić ją bez konieczności ponownego wdrażania.

Zakres flagi funkcji będzie się różnić w zależności od charakteru funkcji i odbiorców. W niektórych przypadkach flaga funkcji automatycznie włączy funkcję dla wszystkich użytkowników. W innych przypadkach funkcja zostanie włączona dla użytkownika przez użytkownika. Zespoły mogą również używać flag funkcji, aby umożliwić użytkownikom możliwość włączenia funkcji, jeśli taka potrzeba. Naprawdę nie ma żadnego limitu sposobu implementacji flag funkcji.

Obsługa wczesnych opinii i eksperymentów

Flagi funkcji to doskonały sposób na obsługę wczesnych eksperymentów. Niektóre funkcje mogą mieć szorstkie krawędzie na wczesnym etapie, co może być interesujące tylko dla najwcześniejszych użytkowników. Próba wypchnięcia tych nie do końca gotowych funkcji do szerszej publiczności może produkować niezadowolenie. Jednak korzyści płynące z zbierania opinii od użytkowników, którzy chcą radzić sobie z funkcją w toku, są nieocenione.

Szybkie wyłączanie przełącznika

Czasami warto wyłączyć coś. Załóżmy na przykład, że nowa funkcja nie działa w zamierzony sposób i istnieją skutki uboczne, które powodują problemy gdzie indziej. Możesz użyć flag funkcji, aby szybko wyłączyć nowe funkcje, aby przywrócić zaufane zachowanie bez konieczności ponownego wdrażania. Flagi funkcji są często uważane za funkcje interfejsu użytkownika, ale mogą być również łatwo używane do zmian w architekturze lub infrastrukturze.

Standardowe etapy

Firma Microsoft używa standardowego procesu wdrażania, aby włączyć flagi funkcji. Istnieją dwie oddzielne koncepcje: pierścienie są przeznaczone dla wdrożeń, a etapy są przeznaczone dla flag funkcji. Dowiedz się więcej o pierścieniach i etapach.

Etapy dotyczą ujawnienia lub ujawnienia. Na przykład pierwszym etapem może być konto zespołu i osobiste konta członków. Większość użytkowników nie widzi nic nowego, ponieważ na pierwszym etapie są włączone tylko flagi miejsc. Dzięki temu zespół może w pełni korzystać z niego i eksperymentować z nim. Gdy zespół się wyłączy, wybierz klientów, którzy będą mogli wyrazić zgodę na to za pośrednictwem drugiego etapu flag funkcji.

Wyradź zgodę

Dobrym rozwiązaniem jest umożliwienie użytkownikom korzystania z flag funkcji, gdy jest to możliwe. Na przykład zespół może uwidocznić panel podglądu skojarzony z preferencjami lub ustawieniami użytkownika.

Screenshot of opt-in preview pane.

Używanie flag z telemetrią

Flagi funkcji umożliwiają przyrostowe uwidacznianie aktualizacji. Jednak zespoły muszą stale monitorować odpowiednie metryki, aby ocenić gotowość do szerszego narażenia. Te metryki powinny obejmować zachowanie użycia, a także wpływ aktualizacji na kondycję systemu. Ważne jest, aby uniknąć pułapki przy założeniu, że wszystko jest w porządku tylko dlatego, że nic złego wydaje się się dziać.

Przykład flagi funkcji

Rozważmy poniższy przykład. Zespół dodał kilka przycisków tutaj dla Cherry-pick i Revert w interfejsie użytkownika żądania ściągnięcia. Zostały one wdrożone przy użyciu flag funkcji.

Screenshot of pull request UI example.

Definiowanie flag funkcji

Pierwsza uwidoczniona funkcja to przycisk Przywróć . Rozwiązanie używa pliku XML do zdefiniowania wszystkich flag funkcji. W tym przypadku istnieje jeden plik na usługę, co tworzy zachętę do usunięcia starych flag, aby uniemożliwić naprawdę długie działanie sekcji. Zespół usunie stare flagi, ponieważ istnieje naturalna motywacja do kontrolowania rozmiaru tego pliku.

<?xml version="1.0" encoding="utf-8"?>
<!--
  In this group we should register Azure DevOps specific features and sets their states.
-->
<ServicingStepGroup name="AzureDevOpsFeatureAvailability" … >
  <Steps>
    <!-- Feature Availability -->
    <ServicingStep name="Register features" stepPerformer="FeatureAvailability" … >
      <StepData>
        <!--specifying owner to allow implicit removal of features -->
        <Features owner="AzureDevOps">
           <!-- Begin TFVC/Git -->
           <Feature name="SourceControl.Revert" description="Source control revert features" />

Wspólna struktura serwerów zachęca do ponownego użycia i korzyści skali w całym zespole. W idealnym przypadku projekt będzie miał infrastrukturę, aby deweloper mógł po prostu zdefiniować flagę w magazynie centralnym i obsługiwać resztę infrastruktury.

Sprawdzanie flag funkcji w czasie wykonywania

Flaga funkcji używana w tym miejscu nosi nazwę SourceControl.Revert. Oto rzeczywisty kod TypeScript z tej strony, który ilustruje wywołanie sprawdzania dostępności funkcji.

private addRevertButton(): void {
 if (FeatureAvailability.isFeatureEnabled(Flags.SourceControlRevert)) {
     this._calloutButtons.unshift(
         <button onClick={ () => Dialogs.revertPullRequest(
             this.props.repositoryContext,
             this.props.pullRequest.pullRequestContract(),
             this.props.pullRequest.branchStatusContract().sourceBranchStatus,
             this.props.pullRequest.branchStatusContract().targetBranchStatus)
         }
         >
             {VCResources.PullRequest_Revert_Button}
         </button>
        );
     }
}

W powyższym przykładzie pokazano użycie w języku TypeScript, ale może być tak samo łatwo dostępne przy użyciu języka C#. Kod sprawdza, czy funkcja jest włączona, a jeśli tak, renderuje przycisk zapewniający funkcjonalność. Jeśli flaga nie jest włączona, przycisk zostanie pominięty.

Kontrolowanie flagi funkcji

Dobra platforma flagi funkcji zapewnia wiele sposobów zarządzania tym, czy dana flaga jest ustawiona. Zazwyczaj istnieją scenariusze użycia flagi, które mają być kontrolowane za pośrednictwem programu PowerShell i interfejsu internetowego. W przypadku programu PowerShell wszystko, co naprawdę musi być uwidocznione, to sposoby uzyskiwania i ustawiania stanu flagi funkcji wraz z opcjonalnymi parametrami dotyczącymi elementów, takich jak określone identyfikatory kont użytkowników, jeśli ma to zastosowanie.

Flagi funkcji sterowania za pośrednictwem internetowego interfejsu użytkownika

W poniższym przykładzie użyto internetowego interfejsu użytkownika udostępnianego dla tego produktu przez zespół. Zwróć uwagę na flagę funkcji SourceControl.Revert. Istnieją dwa osobiste konta wymienione tutaj: hallux i buckh-westeur. Stan jest ustawiony dla hallux, który ma się znajdować w północno-środkowej części, i czyszczone dla innego konta w Europie Zachodniej.

Screenshot of controlling feature flags through web UI.

Charakter flagi funkcji będzie napędzać sposób, w jaki funkcje są widoczne. W niektórych przypadkach narażenie będzie zgodne z modelem pierścieniowym i etapowym. W innych przypadkach użytkownicy mogą wyrazić zgodę za pośrednictwem interfejsu użytkownika konfiguracji, a nawet wysyłając wiadomość e-mail do zespołu w celu uzyskania dostępu.

Zagadnienia dotyczące flag funkcji

Większość flag funkcji można wycofać po wdrożeniu funkcji dla wszystkich użytkowników. W tym momencie zespół może usunąć wszystkie odwołania do flagi w kodzie i konfiguracji. Dobrym rozwiązaniem jest uwzględnienie przeglądu flagi funkcji, na przykład na początku każdego przebiegu.

Jednocześnie może istnieć zestaw flag funkcji, które utrzymują się z różnych powodów. Na przykład zespół może chcieć zachować flagę funkcji, która rozgałęzia coś infrastrukturalnego przez pewien czas po pełnym przełączeniu usługi produkcyjnej. Należy jednak pamiętać, że potencjalna ścieżka kodu może zostać ponownie aktywowana w przyszłości podczas jawnego wyczyszczenia flagi funkcji, dlatego należy ją przetestować i utrzymać do momentu usunięcia opcji.

Flagi funkcji i strategia rozgałęziania

Flagi funkcji umożliwiają zespołom deweloperów dołączanie niekompletnych funkcji main bez wpływu na nikogo innego. Tak długo, jak ścieżka kodu jest odizolowana za flagą funkcji, ogólnie bezpieczne jest skompilowanie i opublikowanie tego kodu bez skutków ubocznych wpływających na normalne użycie. Jeśli jednak istnieją przypadki, w których funkcja wymaga zależności, takich jak podczas uwidaczniania punktu końcowego REST, zespoły muszą rozważyć, w jaki sposób te zależności mogą tworzyć zabezpieczenia lub konserwację nawet bez uwidocznienia funkcji.

Flagi funkcji w celu ograniczenia ryzyka

Czasami nowe funkcje mogą wprowadzać destrukcyjne lub destrukcyjne zmiany. Na przykład produkt może przechodzić transformację z szerokiego schematu bazy danych do długiego. W tym scenariuszu deweloper powinien utworzyć gałąź funkcji przez niewielki czas. Następnie wprowadzają destabilizujące zmiany w gałęzi i zachowują funkcję za flagą. Popularną praktyką jest to, że zespoły mogą następnie scalić zmiany tak main szybko, jak tylko nie powodują żadnych szkód. Nie byłoby to możliwe bez możliwości zachowania niedokończonej funkcji ukrytej za flagą funkcji.

Flagi funkcji pomagają w pracy głównej

Jeśli zastosujesz się do praktyk zdrowych rozsądku omówionych w fazie opracowywania , praca w main programie jest dobrym sposobem na zaostrzenie cyklu DevOps. W połączeniu z flagami funkcji deweloperzy mogą szybko scalać funkcje nadrzędne i wypychać je przez rękawicę testowa. Kod jakości może szybko być publikowany na potrzeby testowania w środowisku produkcyjnym. Po kilku przebiegach deweloperzy będą rozpoznawać zalety flag funkcji i aktywnie ich używać.

Jak zdecydować, czy używać flagi funkcji

Zespoły funkcji są właścicielami decyzji, czy potrzebują flagi funkcji, czy nie dla danej zmiany. Nie każda zmiana wymaga jednej, więc jest to osąd dla dewelopera, gdy wybierają daną zmianę. W przypadku omówionej wcześniej funkcji Przywracania ważne było, aby użyć flagi funkcji do kontrolowania ekspozycji. Umożliwienie zespołom posiadania kluczowych decyzji dotyczących ich obszaru funkcji jest częścią umożliwienia autonomii w efektywnej organizacji DevOps.

Kompilowanie a kupowanie

Chociaż istnieje możliwość utworzenia własnej infrastruktury flag funkcji, wdrożenie platformy takiej jak LaunchDarkly lub Split jest zwykle zalecane. Lepiej jest zainwestować w funkcje tworzenia zamiast odbudowywać funkcje flag funkcji.

Następne kroki

Dowiedz się więcej o korzystaniu z flag funkcji w aplikacji ASP.NET Core.