Uso de marcas de función de Split con Bitbucket Pipelines
Warren Marusiak
Divulgador técnico sénior
Implementar un nuevo código en un entorno de producción es arriesgado. Los errores pueden llegar a la producción incluso después de realizar pruebas unitarias, de integración y de sistema del código en entornos de pruebas y de ensayo. Tradicionalmente, los desarrolladores tienen dos opciones una vez que un error llega a la producción y los usuarios se ven afectados. Pueden anular el código con errores o poner en marcha una corrección. Ambas soluciones llevan tiempo. Ahora, los desarrolladores pueden activar o desactivar una función en un entorno con solo hacer clic en un botón al envolver los cambios de código relacionados en una marca de función. El impacto del código con errores en los usuarios se puede mitigar de inmediato y se puede desarrollar y aplicar una corrección de forma segura. Este artículo lo demuestra mediante Bitbucket Pipelines y las marcas de función de Split en la aplicación de demostración ImageLabeller.
Requisitos previos
Una demostración de la marca de función de ImageLabeller
ImageLabeller es una pequeña aplicación que utiliza el aprendizaje automático para etiquetar imágenes. ImageLabeller se implementa en cinco entornos: un entorno de pruebas, uno de ensayo, y los entornos de producción Production-us-west-2, Production-us-east-1 y Production-ca-central-1. Este artículo demuestra cómo utilizar las marcas de función para gestionar los cambios en el componente SubmitImage de ImageLabeller. SubmitImage es una AWS Lambda escrita en Go. Esta demostración utiliza Split para gestionar las marcas de función, Bitbucket para el control de código fuente y Bitbucket Pipelines para la funcionalidad de CI/CD.
Cómo usar las marcas de función de Split con Bitbucket Pipelines
Crea una cuenta de Split, ve a Admin settings (Configuración de administrador) y, a continuación, a Workspaces (Espacios de trabajo). Haz clic en View (Ver) en el espacio de trabajo predeterminado para ver los entornos disponibles.
Cambia el nombre de los entornos predeterminados y añade nuevos entornos para que se ajusten a tu caso práctico. ImageLabeller se implementa en cinco entornos: un entorno de pruebas, uno de ensayo y tres entornos de producción correspondientes a tres regiones de AWS. US-WEST-2, US-EAST-1 y CA-CENTRAL-1.
Haz clic en Splits (Divisiones) y, a continuación, en Create split (Crear división) en el panel de navegación de la izquierda para crear una nueva división, que es una marca de función.
Da un nombre a la división y cambia el tipo de tráfico a usuario.
Haz clic en Add rules (Añadir reglas) para añadir reglas de segmentación a la división una vez creada. Crea reglas de segmentación para el entorno de pruebas. Cada entorno puede tener reglas de segmentación diferentes. Las reglas de segmentación definen los datos que devuelve la división cuando se accede a ella en código. Esta guía establece que la división vuelva a devolver off por defecto y on cuando un usuario específico acceda a la división.
Expande Set the default rule (Establecer la regla predeterminada) y ponla en off.
Expande Set individual targets (Establecer objetivos individuales), haz clic en Add target (Añadir objetivo), establece Serve (Servir) como "on" y establece To users (Para los usuarios) como algún usuario que forme parte del proceso de control de calidad. Esta guía utiliza AtlassianDemoUser@atlassian.com como usuario de prueba.
Guarda los cambios. La división ahora tiene reglas de segmentación para el entorno de pruebas. Haz clic en el menú desplegable Environment (Entorno) de otra región. Ensayo, por ejemplo.
Haz clic en Copy targeting rules from (Copiar reglas de segmentación desde) y elige Test (Pruebas) para copiar las reglas de segmentación que se crearon anteriormente. Repite este proceso para cada entorno. Es posible que las reglas de segmentación sean muy diferentes según el entorno. Esta guía mantiene las mismas reglas de segmentación en todos los entornos.
Ve a Configuración de administrador y, a continuación, a Claves de API para obtener una lista de las claves de API de cada entorno. Estas claves de API se devuelven a Split durante las llamadas a la API en código para obtener la versión correcta de una división. Esta guía utiliza las claves del servidor para cada entorno.
Ve a tu repositorio de Bitbucket, luego a Configuración del repositorio, luego a Variables del repositorio y añade variables para cada clave de API.
Edita el archivo bitbucket-pipelines.yml y añade STACK_PARAMETERS al paso de implementación de AWS SAM. Esto se hace por entorno. El siguiente fragmento de código de YAML muestra el paso de implementación de la región de PRUEBAS, que se encuentra en AWS US-WEST-1. Por lo tanto, el paso hace referencia a la configuración anterior de variables del repositorio de split_test_env. Usa la variable de repositorio adecuada para cada entorno.
- 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 el archivo AWS CloudFormation template.yml y añade una sección de parámetros que haga referencia a la clave del SDK de Split.
Parameters:
SplitIOSDKKey:
Type: String
En el archivo template.yml, añade una sección de entorno a cada recurso de AWS Lambda que necesite acceder a Split. Esta guía demuestra
Environment:
Variables:
SplitIOSDKKey:
Ref: SplitIOSDKKey
Importa las siguientes dependencias al archivo Go que utilizará el SDK de Split.
"github.com/splitio/go-client/v6/splitio/client"
"github.com/splitio/go-client/v6/splitio/conf"
Esta función crea un cliente y recupera el valor de la marca de función para "SubmitImageDemoSplit" creado en la interfaz de usuario de Split. Se necesita un solo parámetro, el nombre de usuario.
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
}
Llama a la función con una dirección de correo electrónico. En este caso, someRandomUser@atlassian.com extraerá el valor predeterminado de la marca de función, ya que no forma parte de una lista de permitidos asociada a la marca de función. AtlassianTestUser@atlassian.com extraerá el valor de la marca de función asociada a la lista de permisos de la que es miembro.
foo, err := getSplitIOFlag("someRandomUser@atlassian.com")
_ = foo
bar, err := getSplitIOFlag("AtlassianDemoUser@atlassian.com")
_ = bar
Consulta el resultado de los registros de AWS CloudWatch una vez ejecutado el código. Ten en cuenta que la marca de función devuelve "off" cuando someRandomUser@atlassian.com accede a ella y la marca de función devuelve "on" cuando AtlassianTestUser@atlassian.com accede a ella.
De esta forma, los desarrolladores pueden controlar la ejecución de su código sin tener que realizar otra implementación. Si se encuentran errores en un entorno, se puede desactivar la marca de función de ese entorno y se puede ejecutar el código anterior.
Conclusión
Las marcas de función de Split se integran fácilmente en una aplicación implementada mediante Bitbucket Pipelines. Las marcas de función permiten a los desarrolladores controlar la ejecución del código implementado. Esto puede hacer que responder a las implementaciones con errores sea más rápido y reducir el impacto en los usuarios. Tómate tu tiempo para crear una instancia de Bitbucket y Split y poner a prueba las capacidades de tu equipo.
Compartir este artículo
Tema siguiente
Lecturas recomendadas
Consulta estos recursos para conocer los tipos de equipos de DevOps o para estar al tanto de las novedades sobre DevOps en Atlassian.