Close

Использование флажков возможностей Split в конвейерах Bitbucket

Фото Уоррена Марусяка
Уоррен Марусяк

Старший технический эксперт

Развертывать новый код в рабочей среде всегда рискованно. Баги могут проникнуть в нее даже после модульного, интеграционного и системного тестирования кода в тестовой и промежуточной среде. Как правило, у разработчиков есть два варианта, когда баг попадает в рабочую версию и затрагивает пользователей. Можно откатить код с багом или исправить его в следующей версии. Оба этих решения требуют времени. Теперь разработчики могут включать или выключать возможности в среде одним нажатием кнопки, поместив соответствующие изменения кода во флажок возможности. Воздействие кода с багами на пользователей можно немедленно смягчить, а исправление — безопасно разработать и внедрить. В этой статье данный подход показан на примере Bitbucket Pipelines и флажков возможностей Split в демонстрационном приложении ImageLabeller.

Демонстрация флажков возможностей для ImageLabeller

ImageLabeller — это небольшое приложение, которое использует машинное обучение для маркировки изображений. ImageLabeller развертывается в пяти средах. Test, Staging, Production-us-west-2, Production-us-east-1 и Production-ca-central-1. В этой статье показано, как управлять изменениями в компоненте SubmitImage приложения ImageLabeller с помощью флажков возможностей. SubmitImage — это программа AWS Lambda, написанная на языке Go. В демонстрации используется Split для управления флажками возможностей, Bitbucket для управления исходным кодом и конвейеры Bitbucket для функциональности CI/CD.

Использование флажков возможностей Split в конвейерах Bitbucket

Создайте аккаунт Split, перейдите в раздел Admin settings (Настройки администратора), а затем выберите Workspaces (Рабочие пространства). Нажмите View (Просмотр) в рабочем пространстве по умолчанию, чтобы увидеть доступные среды.

Снимок экрана: рабочие пространства в настройках администратора

Переименуйте среды по умолчанию и добавьте новые среды по необходимости. ImageLabeller развертывается в пяти средах: тестовая, промежуточная и три рабочих среды, которые соответствуют трем регионам AWS — US-WEST-2, US-EAST-1 и CA-CENTRAL-1.

Опция редактирования рабочего пространства

Нажмите Splits (Разделения), а затем — Create split (Создать разделение) на левой панели навигации, чтобы создать разделение, то есть флажок возможности.

Всплывающее окно для создания разделения

Присвойте разделению имя и задайте для параметра Traffic Type (Тип трафика) значение user (пользователь).

Ввод типа трафика в окне создания разделения

Нажмите Add Rules (Добавить правила), чтобы добавить правила выбора после создания разделения. Создайте правила выбора для среды Test. Правила выбора можно настраивать для каждой среды по отдельности. Они определяют данные, которые будет возвращать разделение при обращении к нему в коде. В этом руководстве разделение возвращает off (отключено) по умолчанию и on (включено) — при обращении к разделению от конкретного пользователя.

Добавление правил

Раскройте раздел Set the default rule (Задать правило по умолчанию) и задайте в нем значение off (отключено).

Настройка правила по умолчанию

Раскройте раздел Set individual targets (Задать отдельные правила выбора), нажмите Add Target (Добавить правило выбора) и задайте в поле Serve (Предоставлять) значение on (включено), а в поле To Users (Для пользователей) укажите кого-нибудь из пользователей, участвующих в процессе контроля качества. В этом руководстве в качестве тестового пользователя применяется AtlassianDemoUser@atlassian.com.

Окно Create whitelists (Создать белые списки)

Сохраните изменения. Теперь в разделении есть правила выбора для среды Test. В раскрывающемся списке Environment (Среда) выберите другой регион, например Staging.

Раскрывающийся список сред

Нажмите Copy targeting rules from (Копировать правила выбора из) и выберите Test, чтобы скопировать правила выбора, созданные ранее. Повторите этот процесс для каждой среды. В разных средах можно настроить очень разные правила выбора. В этом руководстве они останутся одинаковыми для всех сред.

Копирование правил выбора

Перейдите в раздел Admin settings (Настройки администратора), а затем выберите API keys (Ключи API), чтобы получить список ключей API для каждой среды. Эти ключи API отправляются обратно в Split во время вызовов API в коде, чтобы получить правильную версию Split. В этом руководстве для каждой среды используются ключи Server-side.

Настройки администратора

Перейдите в свой репозиторий Bitbucket, затем нажмите Repository settings (Настройки репозитория), после чего выберите Repository variables (Переменные репозитория) и добавьте переменные для каждого ключа API.

Переменные в настройках репозитория

Отредактируйте файл bitbucket-pipelines.yml и добавьте переменную STACK_PARAMETERS в шаг развертывания AWS SAM. Это делается отдельно для каждой среды. В приведенном ниже фрагменте YAML показан этап развертывания в регионе для тестирования (в данном случае это AWS US-WEST-1). Поэтому в данном шаге указана ссылка на настроенную выше переменную репозитория split_test_env. Используйте соответствующую переменную репозитория для каждой среды.

- 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}"
    }]'

Отредактируйте файл template.yml для AWS CloudFormation и добавьте раздел Parameters со ссылкой на ключ Split SDK.

Parameters:
  SplitIOSDKKey:
    Type: String

В файле template.yml добавьте раздел Environment для каждого ресурса AWS Lambda, которому требуется доступ к Split. В этом руководстве показано

Environment:
  Variables:
    SplitIOSDKKey:
      Ref: SplitIOSDKKey

Импортируйте следующие зависимости в файл Go, в котором будет использоваться Split SDK.

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

Эта функция создает клиент и извлекает значение флажка возможности для параметра SubmitImageDemoSplit, созданного в пользовательском интерфейсе Split. Она принимает один аргумент — имя пользователя.

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
}

Вызовите функцию, передав ей адрес электронной почты. В этом случае для адреса someRandomUser@atlassian.com функция вернет значение по умолчанию, поскольку он не входит в список разрешенных адресов для флажка возможности. Для AtlassianTestUser@atlassian.com функция вернет значение из списка разрешенных адресов для этого флажка возможности.

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

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

Просмотрите выходные данные в журналах AWS CloudWatch после выполнения кода. Обратите внимание, что для флажка возможности указано off (отключено) при обращении с адресом someRandomUser@atlassian.com и on (включено) — при обращении с адресом AtlassianTestUser@atlassian.com.

Журнал событий

Таким образом, разработчики могут контролировать выполнение своего кода без необходимости повторного развертывания. Если в среде обнаружены ошибки, можно отключить флажок возможности в этой среде и запускать только старый код.

Заключение

Флажки возможностей Split можно легко интегрировать в приложение, развертываемое с помощью конвейеров Bitbucket. Они позволяют разработчикам контролировать выполнение развернутого кода. Это может ускорить реагирование на баги при развертывании и снизить воздействие на пользователей. Потратьте немного времени, чтобы запустить экземпляр Bitbucket со Split и протестировать возможности для вашей команды.

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.


Поделитесь этой статьей

Рекомендуемые статьи

Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.

Рисунок: DevOps

Сообщество DevOps

Рисунок: DevOps

Образовательные программы DevOps

Рисунок: карта

Начните работу бесплатно

Подпишитесь на информационную рассылку по DevOps

Thank you for signing up