Close

搭配使用 Split 功能标记与 Bitbucket pipelines

Warren Marusiak 头像
Warren Marusiak

高级技术传播者

将新代码部署到生产环境是有风险的。即使在测试和暂存环境中对代码进行了单元测试、集成测试和系统测试之后,缺陷仍可能给生产带来风险。过去,一旦缺陷给生产带来风险,开发人员有两种选择,用户会受到影响。他们可以回滚缺陷的代码,或者向前推进修复。这两种解决方案都需要时间。现在,开发人员通过将相关的代码变更打包在功能标记中,只需点击一个按钮,即可在环境中开启或关闭功能。缺陷代码对用户的影响可以立即得到缓解,并且可以安全地开发和向前推进修复。本文使用 Bitbucket Pipelines 和 ImageLabeller 演示应用中的 Split 功能标记对此进行了演示。

ImageLabeller 功能标记演示

ImageLabeller 是一款使用机器学习来标记图像的小应用。ImageLabeller 部署到五个环境。测试、暂存、Production-us-west-2、Production-us-east-1 和 Production-ca-central-1。本文演示了如何使用功能标记来管理对 ImageLabeller 的 SubmitImage 组件的变更。SubmitImage 是用 Go 编写的 AWS Lambda。此演示使用 Split 来管理功能标记。Bitbucket 用于源控制,Bitbucket pipelines 用于 CI/CD 功能。

搭配使用 Split 功能标记与 Bitbucket pipelines

创建 Split 帐户,转到“管理员设置”,然后转到“工作区”。在默认工作区上单击“查看”以查看可用环境。

管理员设置中工作区的屏幕截图

重命名默认环境,并添加适合您的用例的新环境。ImageLabeller 部署到五个环境。对应于三个 AWS 区域的测试、暂存和三个生产环境。US-WEST-2、US-EAST-1 和 CA-CENTRAL-1。

“编辑工作空间”选项

单击“Splits”,然后在左侧导航面板中单击“创建 split”,以创建一个新的 split,这是一个功能标记。

用于创建 split 的弹出窗口

为 split 命名,然后将“流量类型”变更为用户。

在创建 split 窗口中输入流量类型

单击“添加规则”,在创建 split 后将目标规则添加到其中。为测试环境创建目标规则。每个环境可以有单独的目标规则。目标规则定义了在代码中访问 split 时它返回的数据。本指南将 split 设置为默认返回“关闭”,特定用户访问 split 时返回“打开”。

添加规则

展开“设置默认规则”,然后将其设置为“关闭”。

设置默认规则

展开“设置单个目标”,单击“添加目标”,然后将“服务”设置为“打开”,然后将“发送给用户”设置为属于 QA 流程一部分的某个用户。本指南使用 AtlassianDemoUser@atlassian.com 作为测试用户。

创建白名单

保存变更。split 现在有针对测试环境的目标规则。单击环境下拉列表其他区域。例如,暂存。

环境下拉列表

单击“复制目标规则”,然后选择“测试”以复制之前创建的目标规则。对每个环境重复此流程。各个环境可能有截然不同的目标规则。本指南使目标规则跨环境保持相同。

复制目标规则

转到“管理员设置”,然后转到“API 密钥”以获取每个环境的 API 密钥列表。在代码中的 API 调用期间,这些 api 密钥会被发送回 split,以获得正确的 split 版本。本指南使用每个环境的服务器端密钥。

管理员设置

转到您的 Bitbucket 存储库,再转到“存储库设置”,然后转到“存储库变量”,为每个 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}"
    }]'

编辑 AWS CloudFormation template.yml 文件并添加引用 Split SDK 密钥的“参数”部分。

Parameters:
  SplitIOSDKKey:
    Type: String

在 template.yml 文件中,向需要访问 Split 的每个 AWS Lambda 资源添加一个“环境”部分。本指南演示

Environment:
  Variables:
    SplitIOSDKKey:
      Ref: SplitIOSDKKey

将以下依赖关系导入将使用 Split SDK 的 Go 文件中。

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

此函数创建客户端,并检索 Split UI 中创建的“SubmitImageDemoSplit”的功能标记值。它取一个参数“用户名”。

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 日志中的输出。请注意,当 someRandomUser@atlassian.com 访问功能标记时,它会返回“关闭”,当 AtlassianTestUser@atlassian.com 访问功能标记时,它会返回“打开”。

日志事件

通过这种方式,开发人员可以控制其代码的执行,而无需进行另一次部署。如果在环境中发现缺陷,则可以关闭该环境中的功能标记,然后可以运行旧代码。

总结

Split 功能标记可轻松集成到通过 Bitbucket pipelines 部署的应用中。功能标记使开发人员能够控制已部署代码的执行。这可以更快响应缺陷部署,减少对用户的影响。用些时间启动 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 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。

Devops 示意图

DevOps 社区

Devops 示意图

DevOps 学习路径

地图插图

免费试用

注册以获取我们的 DevOps 新闻资讯

Thank you for signing up