Close

Używanie flag funkcji Split w Bitbucket Pipelines

Warren Marusiak — zdjęcie portretowe
Warren Marusiak

Starszy propagator techniczny

Wdrażanie nowego kodu w środowisku produkcyjnym bywa ryzykowne. Błędy mogą trafić do środowiska produkcyjnego pomimo wykonania testów jednostkowych, integracyjnych oraz systemowych kodu w środowiskach testowych i przejściowych. Dotychczas gdy błąd trafił do środowiska produkcyjnego, a użytkownicy zostali poszkodowani, programiści mieli dwa wyjścia. Mogli wycofać błędny kod lub wdrożyć poprawkę. Jednak każde z tych rozwiązań wymagało czasu. Teraz programiści mogą włączać i wyłączać funkcję w środowisku jednym kliknięciem, oznaczając odpowiednie zmiany w kodzie jako flagi funkcji. Pozwala to błyskawicznie wyeliminować wpływ błędnego kodu na użytkowników, dając czas na opracowanie poprawki i bezpieczne ponowne wdrożenie. W tym artykule przedstawiono ten proces z wykorzystaniem Bitbucket Pipelines oraz flag funkcji Split w aplikacji demonstracyjnej ImageLabeller.

Demonstracja flag funkcji w aplikacji ImageLabeller

ImageLabeller jest niewielką aplikacją, która wykorzystuje uczenie maszynowe do oznaczania obrazów etykietami. Aplikacja ImageLabeller jest wdrażana w pięciu środowiskach: testowym Test, przejściowym Staging oraz trzech produkcyjnych — Production-us-west-2, Production-us-east-1 i Production-ca-central-1. W tym artykule przedstawiono, jak wykorzystać flagi funkcji do zarządzania zmianami w komponencie SubmitImage aplikacji ImageLabeller. SubmitImage jest funkcją AWS Lambda napisaną w Go. W tej demonstracji do zarządzania flagami funkcji użyto aplikacji Split. Do kontroli kodu źródłowego wykorzystano Bitbucket, a do obsługi funkcji CI/CD — Bitbucket Pipelines.

Używanie flag funkcji Split w Bitbucket Pipelines

Utwórz konto Split, wybierając kolejno opcje Admin settings (Ustawienia administratora), a następnie Workspaces (Przestrzenie robocze). Kliknij opcję View (Wyświetl) w domyślnej przestrzeni roboczej, aby wyświetlić dostępne środowiska.

Zrzut ekranu przestrzeni roboczych w ustawienia administratora

Zmień nazwy środowisk domyślnych i dodaj nowe środowiska pasujące do Twojego przypadku użycia. Aplikacja ImageLabeller jest wdrażana w pięciu środowiskach: testowym, przejściowym oraz trzech środowiskach produkcyjnych odpowiadających trzem regionom AWS — US-WEST-2, US-EAST-1 i CA-CENTRAL-1.

Opcja edycji przestrzeni roboczej

Kliknij kolejno opcje Splits (Podziały), a następnie Create split (Utwórz podział) w lewym panelu nawigacyjnym, aby utworzyć nowy podział, czyli flagę funkcji.

Wyskakujące okienko tworzenia podziału

Nadaj podziałowi nazwę i zmień wartość ustawienia Traffic Type (Typ ruchu) na user (użytkownik).

Wprowadzanie typu ruchu w oknie tworzenia podziału

Kliknij przycisk Add rules (Dodaj reguły), aby dodać reguły kierowania podziału po jego utworzeniu. Utwórz reguły kierowania dla środowiska testowego. Każde środowisko może mieć oddzielne reguły kierowania. Reguły kierowania definiują dane zwracane przez podział po uzyskaniu do niego dostępu w kodzie. W tym przewodniku podział domyślnie zwraca wartość off, a w przypadku dostępu przez konkretnego użytkownika — wartość on.

Dodawanie reguł

Rozwiń sekcję Set the default rule (Ustaw regułę domyślną) i wybierz ustawienie off (wył.).

Ustawianie reguły domyślnej

Rozwiń sekcję Set individual targets (Ustaw pojedyncze przypadki kierowania), a następnie kliknij przycisk Add Target (Dodaj przypadek kierowania) i na liście Serve (Zwracaj) wybierz opcję on (wł.), a w polu To Users (Dla użytkowników) wskaż użytkownika należącego do procesu QA. W tym przewodniku użytkownikiem testowym jest AtlassianDemoUser@atlassian.com.

Tworzenie list dozwolonych

Zapisz zmiany. Podział zawiera teraz reguły kierowania dla środowiska testowego. Kliknij menu rozwijane Environment (Środowisko) i wybierz inny region, na przykład środowisko przejściowe (Staging).

Lista rozwijana środowisk

Kliknij opcję Copy targeting rules from (Kopiuj reguły kierowania z) i wybierz Test, aby skopiować utworzone wcześniej reguły kierowania. Powtórz ten proces dla każdego środowiska. Do każdego środowiska można przypisać całkiem odmienne reguły kierowania. W tym przewodniku zastosujemy takie same reguły kierowania do wszystkich środowisk.

Kopiowanie reguł kierowania

Przejdź do sekcji Admin settings (Ustawienia administratora), a następnie do obszaru API keys (Klucze API), aby uzyskać listę kluczy API do każdego środowiska. W trakcie wywołań interfejsu API w kodzie klucze te są wysyłane z powrotem do podziału w celu pobrania jego poprawnej wersji. W tym przewodniku w przypadku każdego środowiska wykorzystano klucze po stronie serwera Server-side.

Ustawienia administratora

Przejdź do repozytorium Bitbucket, a następnie wybierz kolejno Repository settings (Ustawienia repozytorium) i Repository variables (Zmienne repozytorium), aby dodać zmienne dla każdego klucza API.

Zmienne repozytorium w ustawieniach repozytorium

Edytuj plik bitbucket-pipelines.yml i dodaj zmienną STACK_PARAMETERS do kroku wdrożenia AWS SAM. Tę operację trzeba wykonać dla każdego środowiska. Poniższy fragment kodu YAML przedstawia krok wdrożenia dla środowiska TEST znajdującego się w regionie AWS US-WEST-1. W związku z tym krok ten odnosi się do skonfigurowanej wyżej zmiennej repozytorium split_test_env. Dla każdego środowiska należy użyć odpowiedniej zmiennej repozytorium.

- pipe: atlassian/aws-sam-deploy:1.2.0
  variables:
    AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
    AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
    AWS_DEFAULT_REGION: 'us-west-1'
    STACK_NAME: 'OpenDevOpsSubmitImage'
    CAPABILITIES: [ 'CAPABILITY_IAM', 'CAPABILITY_NAMED_IAM', 'CAPABILITY_AUTO_EXPAND' ]
    TEMPLATE: 'https://s3.amazonaws.com/open-devops-code-us-west-1-${AWS_ACCOUNT_ID}/submit-image-packaged.yml'
    WAIT: 'true'
    DEBUG: 'true'
    S3_BUCKET: 'open-devops-code-us-west-1-${AWS_ACCOUNT_ID}'
    SAM_TEMPLATE: 'build/template.yaml'
    STACK_PARAMETERS: '[{
      "ParameterKey": "SplitIOSDKKey",
      "ParameterValue": "${split_test_env}"
    }]'

Edytuj plik template.yml AWS CloudFormation i dodaj sekcję Parameters odwołującą się do klucza zestawu SDK aplikacji Split.

Parameters:
  SplitIOSDKKey:
    Type: String

W pliku template.yml dodaj sekcję Environment do każdego zasobu AWS Lambda, który musi uzyskać dostęp do aplikacji Split. W tym przewodniku pokazano

Environment:
  Variables:
    SplitIOSDKKey:
      Ref: SplitIOSDKKey

Zaimportuj poniższe zależności do pliku Go, który będzie używał zestawu SDK aplikacji Split.

"github.com/splitio/go-client/v6/splitio/client"
"github.com/splitio/go-client/v6/splitio/conf"

Ta funkcja tworzy klienta i pobiera wartość flagi funkcji dla elementu „SubmitImageDemoSplit” utworzonego w interfejsie użytkownika aplikacji Split. Przyjmuje jeden parametr „username” — nazwę użytkownika.

func getSplitIOFlag(username string) (string, error) {
  splitIOSDKKey := os.Getenv("SplitIOSDKKey")

  cfg := conf.Default()
  factory, err := client.NewSplitFactory(splitIOSDKKey, cfg)
  if err != nil {
    fmt.Printf("SDK init error: %s\n", err)
    return "", err
  }

  splitClient := factory.Client()
  err = splitClient.BlockUntilReady(10)
  if err != nil {
    fmt.Printf("SDK timeout: %s\n", err)
    return "", err
  }

  treatment := splitClient.Treatment(username, "SubmitImageDemoSplit", nil)
  fmt.Printf("SPLIT_DEMO treatment is %s, username is %s\n", treatment, username)

  return treatment, nil
}

Wywołaj funkcję, używając adresu e-mail. W tym przypadku someRandomUser@atlassian.com spowoduje pobranie wartości domyślnej flagi funkcji, ponieważ ten adres nie należy do listy dozwolonych powiązanej z flagą funkcji. Adres AtlassianTestUser@atlassian.com spowoduje pobranie wartości flagi funkcji powiązanej z listą dozwolonych, do której należy.

foo, err := getSplitIOFlag("someRandomUser@atlassian.com")
  _ = foo

  bar, err := getSplitIOFlag("AtlassianDemoUser@atlassian.com")
  _ = bar

Po wykonaniu kodu przejrzyj wyniki w dziennikach usługi AWS CloudWatch. Zwróć uwagę, że flaga funkcji zostaje ponownie wyłączona przy próbie uzyskania dostępu z adresu someRandomUser@atlassian.com i ponownie włączona, gdy dostęp ma miejsce z adresu AtlassianTestUser@atlassian.com.

Zdarzenia w dzienniku

Dzięki temu programiści mogą kontrolować wykonywanie swojego kodu bez konieczności przeprowadzania kolejnego wdrożenia. Jeśli w środowisku zostaną wykryte błędy, można wyłączyć flagę funkcji w takim środowisku, co umożliwi aktywowanie starego kodu.

Wnioski

Flagi funkcji Split można z łatwością zintegrować z aplikacją wdrażaną za pośrednictwem Bitbucket Pipelines. Flagi funkcji umożliwiają programistom kontrolowanie wykonywania wdrażanego kodu. Pozwala to przyspieszyć reagowanie na błędne wdrożenia, ograniczając ich wpływ na użytkowników. Poświęć chwilę na uruchomienie instancji Bitbucket i Split oraz przetestowanie możliwości dla Twojego zespołu.

Warren Marusiak
Warren Marusiak

Warren is a Canadian developer from Vancouver, BC with over 10 years of experience. He came to Atlassian from AWS in January of 2021.


Udostępnij ten artykuł

Zalecane lektury

Dodaj te zasoby do zakładek, aby dowiedzieć się więcej na temat rodzajów zespołów DevOps lub otrzymywać aktualności na temat metodyki DevOps w Atlassian.

Ilustracja DevOps

Społeczność DevOps

Ilustracja DevOps

Ścieżka szkoleniowa DevOps

Ilustracja przedstawiająca mapę

Zacznij korzystać za darmo

Zapisz się do newslettera DevOps

Thank you for signing up