学习

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/[email protected]
workflows:
  heroku_deploy:
    jobs:
      - heroku/deploy-via-git

在上面的配置中,我们引入了 Heroku Orb circleci/[email protected],它自动为我们提供了强大的 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