Close

Uso de marcas de función de Split con Bitbucket Pipelines

Foto de Warren Marusiak
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.

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.

Captura de pantalla de los espacios de trabajo en la Configuración de administrador

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.

Opción Editar espacio de trabajo

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.

Ventana emergente para crear una división

Da un nombre a la división y cambia el tipo de tráfico a usuario.

Introducir el tipo de tráfico en la ventana Crear división

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.

Añadir reglas

Expande Set the default rule (Establecer la regla predeterminada) y ponla en off.

Establecer la regla predeterminada

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.

Crear listas blancas

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.

Menú desplegable de entornos

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.

Copiar las reglas de objetivos

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.

Configuración de administrador

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.

Variables de repositorio en la configuración del repositorio

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.

Registrar eventos

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.

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.


Compartir este artículo

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.

Ilustración de Devops

La comunidad de DevOps

Ilustración de Devops

Ruta de aprendizaje de DevOps

Ilustración de un mapa

Pruébalo gratis

Suscríbete para recibir el boletín de DevOps

Thank you for signing up