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 是一位由开发人员转型的技术布道师,于 2021 年加入 Atlassian。他的职业履历涵盖从大型机运行的 COBOL 电信软件,到 AWS 现代云基础架构等各种工作。他不仅对技术充满热忱,还具备机器学习领域的研究背景。作为技术布道师,Warren 通过演示、文章和视频,提升市场对 Atlassian 产品及其合作伙伴集成能力的认知。他还负责策划《开发人员前沿》系列视频。闲暇之余,他常沉浸在巴西柔术的训练中。


分享这篇文章

推荐阅读

将这些资源加入书签,以了解 DevOps 团队的类型,或获取 Atlassian 关于 DevOps 的持续更新。

Devops 示意图

DevOps 社区

Devops 示意图

DevOps 学习路径

地图插图

免费试用

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

Thank you for signing up