Close

Como usar sinalizadores de funcionalidade do Split com o Bitbucket Pipelines

Foto de rosto de Warren Marusiak
Warren Marusiak

Evangelista tecnológico sênior

Implementar um novo código em um ambiente de produção é arriscado. Os bugs podem entrar na produção mesmo após o código ser testado por unidade, testado na integração e testado pelo sistema em ambientes de teste e staging. Em geral, os desenvolvedores têm duas opções quando um bug chega à produção e os usuários são afetados. Eles podem reverter o código com bug ou adiantar uma correção. Ambas as soluções levam tempo. Agora, os desenvolvedores podem ativar ou desativar uma funcionalidade em um ambiente com o clique de um botão, agrupando as alterações de código relacionadas em um sinalizador de funcionalidade. O impacto do código com bug nos usuários pode ser mitigado de imediato e uma correção pode ser desenvolvida e implementada com segurança. Este artigo demonstra isso usando o Bitbucket Pipelines e os sinalizadores de funcionalidade do Split no aplicativo de demonstração ImageLabeller.

Uma demonstração do sinalizador de funcionalidade do ImageLabeller

O ImageLabeller é um pequeno aplicativo que usa aprendizado de máquina para rotular imagens. O ImageLabeller é implementado em cinco ambientes. Teste, Staging, Production-us-west-2, Production-us-east-1 e Production-ca-central-1. Este artigo demonstra como usar sinalizadores de funcionalidade para gerenciar alterações no componente SubmitImage do ImageLabeller. O SubmitImage é um AWS Lambda escrito em Go. Esta demonstração usa o Split para gerenciar sinalizadores de recursos, o Bitbucket para controle de origem e o Bitbucket Pipelines para funcionalidade de IC/CD (integração/implementação contínuas).

Como usar sinalizadores de funcionalidade do Split com o Bitbucket Pipelines

Crie uma conta no Split, acesse Configurações do administrador e, em seguida, Áreas de trabalho. Clique em Exibir na área de trabalho padrão para ver os ambientes disponíveis.

Captura de tela das áreas de trabalho nas configurações do administrador

Renomeie os ambientes padrão e adicione novos ambientes de acordo com seu caso de uso. O ImageLabeller é implementado em cinco ambientes. Teste, Staging e três ambientes de produção correspondentes a três regiões da AWS. US-WEST-2, US-EAST-1 e CA-CENTRAL-1.

Opção Editar área de trabalho

Clique em Divisões e, em seguida, em Criar divisão no painel de navegação esquerdo para criar uma nova divisão, que é um sinalizador de funcionalidade.

Janela pop-up para criar uma divisão

Dê um nome à divisão e altere o Tipo de tráfego para usuário.

Como inserir o tipo de tráfego na criação de janela dividida

Clique em Adicionar regras para adicionar regras de segmentação à divisão após sua criação. Crie regras de segmentação para o ambiente Teste. Cada ambiente pode ter regras de segmentação separadas. As regras de segmentação definem os dados retornados pela divisão quando ela é acessada no código. Este guia define a divisão para retornar desativada por padrão e ativada quando um usuário específico estiver acessando a divisão.

Como adicionar regras

Expanda Definir a regra padrão e defina como desativada.

Como definir a regra padrão

Expanda Definir alvos individuais, clique em Adicionar alvo e, em seguida, defina Servir como ativado. Defina Para usuários para algum usuário que seja parte do processo de controle de qualidade. Este guia usa AtlassianDemoUser@atlassian.com como usuário de teste.

Criar listas de permissões

Salve as alterações. A divisão agora tem regras de segmentação para o ambiente Teste. Clique no menu suspenso Ambiente em outra região. Staging, por exemplo.

Menu suspenso de ambiente

Clique em Copiar regras de segmentação de e escolha Teste para copiar as regras de segmentação que foram criadas antes. Repita esse processo para cada ambiente. É possível ter regras de segmentação muito diferentes por ambiente. Este guia mantém as mesmas regras de segmentação em todos os ambientes.

Como copiar as regras de destino

Acesse Configurações do administrador e, em seguida, chaves de API para obter uma lista das chaves de API para cada ambiente. Essas chaves de API são enviadas de volta para divisão durante chamadas de API em código para obter a versão correta de uma divisão. Este guia usa as chaves do lado do Server para cada ambiente.

Configurações do administrador

Vá para o repositório do Bitbucket, depois para Configurações do repositório, depois para Variáveis do repositório e adicione variáveis para cada chave de API.

Variáveis do repositório nas configurações do repositório

Edite o arquivo bitbucket-pipelines.yml e adicione STACK_PARAMETERS à etapa de implementação do AWS SAM. Isso é feito por ambiente. O trecho YAML abaixo mostra a etapa de implementação para a região TEST que está no AWS US-WEST-1. Portanto, a etapa faz referência à configuração da variável de repositório split_test_env acima. Use a variável de repositório apropriada para cada ambiente.

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

Edite o arquivo template.yml do AWS CloudFormation e adicione uma seção de parâmetros fazendo referência à chave Split SDK.

Parameters:
  SplitIOSDKKey:
    Type: String

No arquivo template.yml, adicione uma seção Ambiente a cada recurso do AWS Lambda que precisa acessar o Split. Este guia demonstra

Environment:
  Variables:
    SplitIOSDKKey:
      Ref: SplitIOSDKKey

Importe as seguintes dependências para o arquivo Go que vai usar o SDK Split.

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

Essa função cria um cliente e recupera o valor do sinalizador de funcionalidade para o “SubmitImageDemoSplit” criado na interface do usuário do Split. É necessário um único parâmetro: nome de usuário.

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
}

Chame a função com um endereço de e-mail. Nesse caso, someRandomUser@atlassian.com vai extrair o valor padrão do sinalizador de funcionalidade, pois ele não é membro de uma lista de permissões associada ao sinalizador de funcionalidade. AtlassianTestUser@atlassian.com vai extrair o valor do sinalizador de funcionalidade associado à lista de permissões da qual é membro.

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

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

Veja a saída nos logs do AWS CloudWatch após a execução do código. Observe que o sinalizador de funcionalidade retorna desativado quando é acessado por someRandomUser@atlassian.com, e o sinalizador de funcionalidade retorna ativado quando acessado por AtlassianTestUser@atlassian.com.

Eventos de registro

Dessa forma, os desenvolvedores podem controlar a execução de seu código sem precisar fazer outra implementação. Se forem encontrados bugs em um ambiente, o sinalizador de funcionalidade nesse ambiente vai poder ser desativado e o código antigo pode ser executado.

Conclusão

Os sinalizadores de funcionalidade do Split se integram fácil a um aplicativo implementado por meio do Bitbucket Pipelines. Os sinalizadores de funcionalidade permitem que os desenvolvedores controlem a execução do código implementado. Isso pode agilizar a resposta a implementações com bugs, reduzindo os impactos sobre os usuários. Reserve um tempo para criar uma instância do Bitbucket e do Split e testar os recursos para sua equipe.

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.


Compartilhe este artigo

Leitura recomendada

Marque esses recursos para aprender sobre os tipos de equipes de DevOps ou para obter atualizações contínuas sobre DevOps na Atlassian.

Ilustração do DevOps

Comunidade de DevOps

Ilustração do DevOps

Caminho de aprendizagem de DevOps

Ilustração do mapa

Comece gratuitamente

Inscreva-se para receber a newsletter de DevOps

Thank you for signing up