功能标志和临时环境

功能标志是现代软件开发中必不可少且无处不在的部分。随着您的公司和应用程序复杂性的增长,必须能够控制您的内部开发团队、利益相关者和客户可以使用哪些功能。在很久以前,以前,我们只有一个变量,您可以在真假之间切换来控制应用程序的行为。然而,随着应用程序开发向 Web 过渡,我们需要相同类型的控制,只是硬编码的功能标志不会削减它。输入动态功能标志!

动态功能标志是对静态功能标志的重大改进,但也增加了复杂性并提出了与静态功能标志不同的挑战。硬编码的标志已经不复存在,但它们被 if 语句替换,更重要的是,为您的应用程序检索适当的标志。大多数人都是从滚动自己开始的,但是随着使用功能标志进行开发越来越受欢迎,许多不同的公司突然出现,希望解决以下问题:

  • 一个界面来管理你的标志

  • 轻松维护您的旗帜

  • 非常快速可靠地检索您的标志

  • 将流量拆分到一个或另一个功能

虽然 LaunchDarkly、Optimizely、Rollout、Split.io 等公司让创建和管理这些标志变得相当容易,但这并不能解决您的所有问题。许多软件组织,尤其是随着它们的成长,需要大量的测试环境。如果您的环境是短暂的,这对您的功能标志设置提出了挑战。

临时环境与任何环境一样,只是它们将在相对较短的时间内被删除,这与您的登台或生产环境不同。很好的例子是:

  • 特征分支

  • 销售演示

  • 负载测试

  • 重构

这些环境可能不会持续很长时间,但它们非常重要,并且可能与生产一样复杂。虽然销售演示环境可能能够使用种子数据运行,但负载测试环境将需要生产或类似生产的数据以及每个服务的许多副本才能给出有效的结果。这些创建和管理可能非常复杂,并且它们的短暂性质可能会对您的功能标志设置造成严重破坏。

功能标志环境救援......排序

LaunchDarkly(和其他人)认识到了这个问题,并在他们自己的应用程序中创建了环境概念。你可以在这里阅读他们的实现。他们有 api,允许您在一个环境的基础上创建和操作这些功能标志集。如果您有一组有限的环境并且它们的集合不经常更改,那么这非常有用,但是对于短暂的环境,上下旋转它们的能力是一个特性而不是错误。

为了简化这个问题,大多数人在他们最喜欢的 Feature Flag 提供程序中创建了两种环境:一种用于开发(或测试),一种用于生产。在较大的组织中,开发团队可能有一些,例如开发、测试、uat、登台和生产。只要您不想添加另一个,或者您永远不会冒险进入真正的短暂应用程序环境,这就可以正常工作。

一旦你转移到临时环境,大多数人都会采取捷径,将每个临时环境分配给单个 Feature Flag 环境,这很简单,但会造成人们互相踩脚的大问题。

想象一下,您有 10 个环境都指向一个数据库,并且所有这些环境都发生了写入:这里是同一个问题。功能标志的好处是能够切换它们并查看不同的行为,但是如果每个环境都指向同一个环境,那么您现在就会遇到另一个资源争用问题。如果您将功能 A 切换为“开启”,有什么可以阻止您的同事将其切换为“关闭”?您在永久暂存环境中遇到的任何问题都会在临时环境中放大。

最好的解决方案是在创建一个临时环境时,您将在 LaunchDarkly 中创建一个基于您的临时环境的独特之处的环境,并且当它出现时,您将确保它使用该特定功能标志环境的唯一 SDK api .让我们实现工作流程,看看它如何与 Release 一起工作!

FF 工作流程

使用临时环境

为了在 Release 中尝试这一点,我们需要一个包含 Docker 文件的存储库,该文件已使用 LaunchDarkly 实现了功能标志。我将在 Github 上使用这个存储库,您可以通过首先分叉存储库来执行相同操作,这样您就可以使用它来创建带有 Release 的应用程序。

分叉存储库后,您可以导航到releasehub.com并使用 github 登录,以便按照此示例进行操作。

在 Release 中创建我们的临时环境并支持 LaunchDarkly 中的环境的步骤是:

  1. 在 Release 中创建我们的应用程序

2.用Release创建job,在LaunchDarkly中创建环境

  1. 添加一些环境变量,以便应用程序可以联系 LaunchDarkly 并从我们新创建的 LaunchDarkly 环境中提取 SDK Api 密钥

  2. 部署我们的临时环境

如果您没有启动黑暗帐户,您可以免费创建一个 30 天用于此示例。您还需要创建至少一个功能标志。如果您已经有一个带有许多功能标志的启动暗帐户,则可以跳过此步骤。

LaunchDarkly 测试标志

在发布中创建应用程序

登录到 Release 后,我们要单击左侧边栏中的 Create New Application。之后,我们将看到创建新应用程序工作流。

使用刷新按钮创建应用程序

首先,我们将单击“刷新”按钮以找到我们新分叉的存储库。然后,我们将为“api”服务选择该存储库和“Docker”。最后,命名您的应用程序。完成后单击紫色的“生成应用程序模板”按钮。

选择你的存储库

最后命名您的应用程序并为您的配置生成模板。

命名您的应用程序

修改应用模板

在我们可以部署我们的环境之前,我们需要对我们的应用程序模板进行修改并添加一些环境变量。我们还需要创建一个作业,在初始环境部署时创建我们的 LaunchDarkly 环境。 Release 中的作业在此处详细描述。 TL;DR 是通过少量配置,您可以在容器中运行任意脚本或任务。例如,这些作业对于在部署后端服务之前运行迁移非常有用。在这种情况下,我们将运行一个 rake 任务来设置我们的 LaunchDarkly 环境。

jobs:
- name: create-launch-darkly-env
  from_services: api
  args:
  - bundle
  - exec
  - rake
  - launch_darkly:create_environment

进入全屏模式 退出全屏模式

上面的yaml代表Release中的一个job

我们将在我们的应用程序模板中将上述行放在“服务”节之前。

memory:
   limits: 1Gi
   requests: 100Mi
 replicas: 1
jobs:
  - name: create-launch-darkly-env
    from_services: api
    args:
    - bundle
    - exec
    - rake
    - launch_darkly:create_environment
services:
  - name: api
    image: erik-opsnuts-test-001/rails_postgres_redis/api
    has_repo: true
    static: false

进入全屏模式 退出全屏模式

将作业片段放入应用程序模板

为了让 Release 使用此作业作为工作流的一部分来部署环境,我们需要在“工作流”部分的文件底部附近添加一行。在 'setup':'order_from' 下,我们将添加 jobs.create-launch-darkly-env。然后,单击“保存并继续”。

workflows:
- name: setup
  order_from:
  - jobs.create-launch-darkly-env
  - services.all
- name: patch
  order_from:
  - services.api
  - services.sidekiq
  - services.db
  - services.redis

进入全屏模式 退出全屏模式

将 jobs.create-launch-darkly-env 放在 services.all 之前的工作流节下

这就是所有需要的配置,现在我们只需要在部署之前添加两个环境变量!

添加环境变量

添加环境变量

单击“默认环境变量”的“编辑”以打开编辑器。我们将添加两个环境变量,其中包含有关 LaunchDarkly 的信息。他们是:

LAUNCH_DARKLY_API_KEY:您的 LaunchDarkly Api 密钥,可在此处找到。如果您没有 api 令牌,请创建“+ TOKEN”按钮来制作一个。你会想要给它管理员权限。如果您不能这样做,请联系您的管理员。 创建后,请确保将其复制并粘贴到可以检索的位置。 LaunchDarkly 会混淆您的令牌,如果您不将其保存在某处,则需要生成一个新令牌。

创建LD令牌

LAUNCH\DARKLY\PROJECT\NAME:我们将在此示例中仅使用“默认”,但如果还有其他项目您想随意测试。

defaults:
- key: POSTGRES_USER
  value: postgres
- key: POSTGRES_PASSWORD
  value: postgres
- key: LAUNCH_DARKLY_PROJECT_NAME
  value: default
- key: LAUNCH_DARKLY_API_KEY
  value: your-api-key
  secret: true

进入全屏模式 退出全屏模式

单击“保存”以将环境变量保存为应用程序配置的一部分。然后,单击“构建和部署”。您将被重定向到该应用程序的活动仪表板,并在后台启动 Docker 构建。随后将为您的应用程序部署环境。您可以分别在“构建”和“部署”部分下查看构建和部署。

左手导航

您的环境

第一次进行 docker 构建的过程需要几分钟。构建和部署完成后,您可以通过单击左侧的“环境”找到新环境的 url,然后单击进入新环境。

环境

单击新创建的临时环境的 url 后,浏览器中的另一个窗口将打开到带有 postgres 和 redis 的示例 rails 站点。它应该看起来像这样:

测试-a

如果您的启动黑暗帐户中有一个名为“test-flag”的标志,您可以继续将其从“false”切换为“true”,反之亦然,然后重新加载您的环境以查看更改。如果您想使用不同的标志,您只需在以下位置进行一项更改:app/views/welcome/index.html.erb

<% test_flag = Rails.configuration.ld_client.variation("test-flag", {key: "user@test.com"}, false) %>

将“test-flag”更改为您选择的标志名称后,您只需提交并将更改推送到 github。一旦发生这种情况,Release 将自动进行构建,然后部署您的更改。该过程完成后,您将能够看到基于您的新标志的欢迎页面更改。

在您的 LaunchDarkly 界面中,您将看到一个新创建的环境,其名称形式为“tedfe34\”。此名称与 Release 自动为您的新环境创建的 RELEASE_ENV_ID 环境变量相同。除了环境变量编辑器之外,您将在 Release UI 的几个地方看到这个值。

LD FF 环境接口

结论 - 下一步是什么?

现在您可以获得专用于您的发布环境的原始功能标志环境,下一步是什么?在这个例子中,清理工作需要手动完成,不是什么大问题,但我们可以做得更好。 Release 将在不久的将来实现与 LaunchDarkly 的更深层次的集成,以实现无缝集成,并在您的 Release 环境被删除时处理删除 LaunchDarkly 中的环境。

请继续关注未来与其他功能标志提供商的集成。如果您希望为您的应用程序提供快速、易于定义且功能强大的环境,请发送邮件至support@releasehub.com,我们将帮助您和您的团队通过 Release 更有效地利用临时环境。

关于发布

Release 是启动最复杂环境的最简单方法。我们专注于处理您复杂的应用程序和数据,并按需制作可重现的环境。

英雄形象Denys NevozhaionUnsplash

Logo

CI/CD社区为您提供最前沿的新闻资讯和知识内容

更多推荐