学习

CircleCI:什么是 CircleCI 以及它为什么应该成为您 Redis CI-CD 的一部分

什么是 CircleCI?

CircleCI 是由 DevOps 专业人员构建的 CI/CD 平台,可帮助您从头到尾微调整个开发过程。 它帮助工程团队构建、测试和部署软件,同时使用 CircleCI 仪表板 UI 实时检查代码更改。 通过能够根据每个项目构建 CI/CD 过程或配置工作流来决定作业何时以及如何运行,以及优化持续交付的数据和映像缓存选项,可以实现对管道的更多控制。 


CircleCI 支持许多不同的语言和各种 云托管计算类型,例如 Docker、Linux VM、macOS、Windows 等,从而简化了基础设施的方法。 使用 CircleCI 仪表板,可以收集有关构建更改的见解,以便持续优化管道。 


要部署,CircleCI 会从您的管道获取工件,并将它们发送到您需要部署的任何地方,无论是 Docker、Heroku、Kubernetes、云平台等。


CircleCI 如何工作?

在授权 GitHub 或 Bitbucket 并将其作为项目添加到 cirlceci.com 后,每次代码更改都会触发 CircleCI 作业。 CircleCI 在测试完成后会发送成功或失败的电子邮件通知。 CircleCI 查找并运行 config.yml、测试构建、运行安全扫描、经过批准步骤,然后部署。

CircleCI 的功能是什么?

作为 DevOps 工程师或开发人员,您可以

  • SSH 到任何作业以调试构建问题。

  • 设置作业以并行运行以减少时间。

  • 使用两个简单键配置 Redis 缓存,以在工作流中重用来自先前作业的数据。

  • 为独特的平台支持配置自托管运行器。

  • 访问用于机器执行器的 Arm 资源。 

  • 使用可重复使用的配置包来与第三方集成。

  • 在各种语言中使用预构建的 Redis Docker 镜像。 

  • 使用 API 检索有关作业和工作流的信息。

  • 使用 CLI 在本地访问高级工具。 

  • 使用测试见解获得不稳定测试检测。 

使用 CircleCI 在 Heroku 上部署 Redis 速率限制应用程序

先决条件

  • CircleCI 帐户

  • GitHub 帐户

  • Heroku 帐户


入门


在本演示中,我们将使用使用 Python 和 Redis 构建的 Redis 速率限制应用程序。 

速率限制是许多开发人员在其职业生涯的某个阶段可能不得不处理的机制。 它对于各种目的很有用,例如共享对有限资源的访问或限制对 API 端点的请求数量,并使用 429 状态代码进行响应。 项目的完整源代码在 GitHub 上托管。 在此示例中,我们将配置 CircleCI 以将速率限制应用程序直接部署到 Heroku 平台上。


步骤 1. 转到 https://circleci.com 并使用您的 GitHub 帐户登录

选择您首选的登录方式。 为了方便起见,让我们选择“GitHub”进行此演示。

步骤 2. 验证您在 GitHub 上的权限

步骤 3. 选择您的项目存储库并单击“设置项目”


在本演示中,我们将使用 Redis 速率限制项目。


步骤 4. 创建一个新的 CircleCI 配置文件


CircleCI 相信 代码配置。 因此,从构建到部署的整个交付过程通过一个名为 config.yml 的文件进行编排。 config.yml 文件位于项目顶部的名为 .circleci 的文件夹中。 CircleCI 使用 YAML 语法进行配置。

由于我们尚未创建 config.yml 文件,让我们选择“快速”选项以基于可编辑的可用模板创建一个新的 config.yml。

单击“设置项目”后,它将要求您选择样本配置,如下面的屏幕截图所示
在 .circleci/config.yml 下添加以下内容并保存文件
version: 2.1
orbs:
  heroku: circleci/heroku@1.2.6
workflows:
  heroku_deploy:
    jobs:
      - heroku/deploy-via-git

在上面的配置中,我们引入了 Heroku orb circleci/heroku@1.2.6,它会自动让我们访问一组强大的 Heroku 作业和命令。

其中一项作业是 heroku/deploy-via-git,它将您的应用程序直接从您的 GitHub 存储库部署到您的 Heroku 帐户。

步骤 5. 合并拉取请求


完成新更改后,系统将提示您创建新的 PR。现在请继续合并更改。

步骤 6. 设置 Heroku 帐户

按照以下步骤 设置 Heroku 帐户并创建一个新的应用程序 `rate-limit-python`。您将需要 Heroku API 密钥来进行此演示。

在 CircleCI 上配置 Heroku 访问权限

在您从 CircleCI 将项目推送到 Heroku 之前,您需要在 CircleCI 和 Heroku 之间配置经过身份验证的握手。通过创建两个 环境变量 在 CircleCI 项目的设置中进行配置:

  • HEROKU_APP_NAME 是您的 Heroku 应用程序的名称(在本例中为 simple-node-api-circleci)

  • HEROKU_API_KEY 是您的 Heroku 帐户 API 密钥。您可以在 Heroku 帐户的“帐户”选项卡下的“帐户设置”中找到它。滚动到“API 密钥”部分,然后单击 显示 以复制您的 API 密钥。

步骤 7. 在 CircleCI 上设置环境变量


在设置页面的侧边栏菜单中,单击 环境变量 在“构建设置”下。在环境变量页面上,创建两个名为 HEROKU_APP_NAMEHEROKU_API_KEY 的变量,并输入它们的值。

有了这些设置,我们的 CircleCI 配置将能够对 Heroku 平台进行经过身份验证的部署。

步骤 8. 触发构建

一旦您合并拉取请求,该工具将自动触发构建。

到目前为止,您应该能够访问您的应用程序。
remote:        Collecting attrs>=19.2.0        
remote:          Downloading attrs-21.4.0-py2.py3-none-any.whl (60 kB)        
remote:        Collecting wrapt<2,>=1.10        
remote:          Downloading wrapt-1.14.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (77 kB)        
remote:        Collecting pyparsing!=3.0.5,>=2.0.2        
remote:          Downloading pyparsing-3.0.7-py3-none-any.whl (98 kB)        
remote:        Installing collected packages: wrapt, pyparsing, typing-extensions, sqlparse, packaging, deprecated, async-timeout, asgiref, tomli, redis, py, pluggy, iniconfig, h11, Django, click, attrs, uvloop, uvicorn, urllib3, sniffio, rfc3986, pytz, python-dotenv, pytest, django-redis, django-ipware, django-cors-headers        
remote:        Successfully installed Django-4.0.3 asgiref-3.5.0 async-timeout-4.0.2 attrs-21.4.0 click-8.1.0 deprecated-1.2.13 django-cors-headers-3.11.0 django-ipware-4.0.2 django-redis-5.2.0 h11-0.13.0 iniconfig-1.1.1 packaging-21.3 pluggy-1.0.0 py-1.11.0 pyparsing-3.0.7 pytest-7.1.1 python-dotenv-0.20.0 pytz-2022.1 redis-4.2.0 rfc3986-2.0.0 sniffio-1.2.0 sqlparse-0.4.2 tomli-2.0.1 typing-extensions-4.1.1 urllib3-1.26.9 uvicorn-0.17.6 uvloop-0.16.0 wrapt-1.14.0        
remote: -----> $ python server/manage.py collectstatic --noinput        
remote:        133 static files copied to '/tmp/build_3850bcfb/server/static_root'.        
remote: 
remote: -----> Discovering process types        
remote:        Procfile declares types -> web        
remote: 
remote: -----> Compressing...        
remote:        Done: 75.3M        
remote: -----> Launching...        
remote:        Released v11        
remote:        https://*****************.herokuapp.com/ deployed to Heroku