Como usar sinalizadores de funcionalidade do Split com o Bitbucket Pipelines
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.
Pré-requisitos
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.
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.
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.
Dê um nome à divisão e altere o Tipo de tráfego para usuário.
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.
Expanda Definir a regra padrão e defina como desativada.
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.
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.
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.
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.
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.
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.
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.
Compartilhe este artigo
Próximo tópico
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.