使用 CI/CD 工具加速洞察共享

Matthew Brodeur 拍摄于Unsplash

简介

数据科学家和分析师是许多组织的宝贵资源。他们大部分时间都在了解业务需求,并通过数据收集、整理、清理和建模来寻找洞察力。支持此类数据专家的工具非常丰富,例如 Jupyter 和 Colab 等笔记本、Python 或 R 库以及其他数据技术。

另一方面,在与利益相关者分享重要发现和有价值的见解时,选择是有限的。笔记本可能不是非技术观众的最佳选择;在 Word 和 PowerPoint 等办公文档中分享您的发现通常无法描述您的发现的动态和交互性质。数据专家通常很难找到以合适的格式快速有效地向决策者展示调查结果的最佳方式。

在本文中,我们想展示一种使用 CI/CD(持续集成和持续交付)工具(如 Terraform、GitHub Actions 和 Docker)与可以加速原型设计的 Streamlit 应用程序的利益相关者分享数据科学发现的方法。我们会将代码部署到 Google Cloud Platform (GCP) 中的虚拟机上,但您也可以将这些技术应用到其他云服务提供商。

工作流程概述

本文将指导您创建以下 CI/CD 管道。

1\。在本地编写 Terraform 文件并将其推送到 GitHub。

2\。通过 GitHub Action 使用 Terraform 自动配置 GCP。

3\。在本地编写 Streamlit 应用程序代码和 Dockerfile 并将代码推送到 GitHub。

4\。通过 GitHub Action 将代码部署到 GCP 中的虚拟机实例。

该图描述了本地、GutHub 和 GCP 环境之间的工作流程。

图 1. 工作流程概览(作者提供的图片)

先决条件

实施解决方案有四个要求。

● GitHub 账号

● Terraform 安装

● GCP 服务帐号

● Python 库

GitHub

GitHub 是使用 Git 的基于 Web 的版本控制服务。它还提供了一项名为 GitHub Actions 的服务。您无需安装第三方应用程序来自动化测试、发布和将代码部署到生产中的工作流程。您可以在GitHub 网站上创建一个帐户。

Terraform

Terraform 是一个开源 CI/CD 工具,用于管理 HashiCorp 提供的基础设施即代码 (IaC)。 IaC 使用代码来管理和配置基础架构,无需通过云供应商提供的 UI 手动配置物理硬件。

使用 Terraform 进行原型设计有一些优势。例如:

  1. 避免手动配置基础设施。

2.数据科学家和软件工程师可以自助。

  1. 对当前设置的更改变得简单明了。

  2. 易于转移知识并保持版本控制。

无需在本地安装 Terraform,就可以通过 GitHub Action 自动化该过程,因为云中的 GitHub 执行工作流。但是,在测试新资源或刚开始使用 Terraform 时,最好在本地安装软件。在这种情况下,您需要提供凭据以使用 Terraform 用户访问云资源,这在某些组织中可能是一个安全问题。您可以在Terraform 网站上找到安装说明。

GCP

服务帐户 (SA) 代表 Google Cloud 服务身份,例如,在计算引擎上运行的代码、在云存储中创建存储桶等。可以从 IAM 和 admin 控制台创建 SA。出于原型制作目的,请为帐户选择编辑角色以查看、创建、更新和删除资源。你可以参考谷歌云的官方指南。本文使用计算引擎、云存储和 VPC 网络。

蟒蛇

我们只使用三个库:Pandas、Yfinance 和 Streamlit。 Pandas 是一个开源数据操作工具。 yfinance 是一个用于从 Yahoo! 检索金融市场数据的 Python API。金融。 Streamlit 是一个基于 Python 的 Web 应用程序框架;您可以使用比 Flask 或 Django 等其他框架更少的代码来开发 Web 应用程序。

1.地形文件

Terraform 是一个 IaC 工具。您可以通过编写代码来管理云基础架构。 Terraform 可以提供各种云提供商的服务和资源。 HashiCorp 和 Terraform 社区编写和维护代码。您可以使用的提供商列表,包括 AWS、Azure 和 GCP,可在Terraform Registry网站上找到。

Terraform 的工作流程包括三个步骤:定义、计划和应用。在定义步骤中,您将编写配置文件来声明提供者、服务和资源。 Terraform 可以使用 terraform fmtterraform validate 命令对配置文件进行格式化和验证。在计划步骤中,Terraform 根据配置文件和现有基础设施的状态创建一个执行计划。它可以创建新服务或更新/删除现有服务。最后,应用步骤执行计划的操作并记录 Terraform 提供的基础设施的状态。

我们将创建三个 Terraform 文件:main.tf、variables.tf 和 terraform.tfvars。

main.tf

main.tf 是一个包含主要配置集的文件。它定义了所需的提供者、提供者变量和资源。该文件的内容如下:

首先,定义提供者。我们将在本文中使用 google。

提供者的变量被定义。 var.* 将从单独的文件 variables.tf 中导入值。

credentials_file 应该是从 GCP 下载的 json 中服务帐户密钥的路径。

接下来的脚本创建一个 VPC 网络。

然后,我们配置一个 VM 实例。

我们指定 VM 实例名称、机器类型、磁盘映像和网络接口。我们还添加标签并定义启动脚本。标签允许您制定适用于 VM 实例的防火墙规则。我们创建了三个标签,分别对应于下面定义的三个防火墙规则。 metadata_startup_script 在启动时运行 shell 脚本。在我们的例子中,我们将运行脚本在 VM 中预安装 Docker 引擎。

下一个特定的 http 访问防火墙规则。

您可以通过 CIDAR 格式的 source_ranges 来限制访问。

我们可能希望通过 SSH 访问 VM 实例。

第三条防火墙规则适用于 Streamlit Web 应用程序。 8501 端口将被打开。

最终的资源定义适用于 Cloud Storage。它使用从 variables.tf 文件中读取的变量创建新存储桶。

变量.tf

main.tf 中 var.* 的值由 variables.tf 文件提供。

每个变量都可以有一个默认值。在我们的示例中,一些变量没有默认值。因为它们是必需的参数,所以 Terraform 需要提供它们。提供变量的方法之一是通过 *.tfvar 文件,这减少了一些敏感信息的暴露。

terraform.tfvars

我们在 terraform.tfvars 文件中有三行。请用您的值替换“***”。

GCP机器类型和镜像列表

在 main.tf 中,我们指定了机器类型和磁盘映像。接受的值可能并不总是与您在 GCP 控制台上看到的描述相同。您可以使用以下 gcloud 命令检索机器类型和计算引擎映像的列表。 (必须安装Google Cloud SDK,如果没有,请参考官方指南)

gcloud 计算图像列表

Docker 安装脚本

我们将文档安装到 VM 实例。在与 main.tf 文件相同的目录中找到安装脚本 install_docker.sh。 Ubuntu的安装脚本复制自官方Docker Doc网站。

2. GitHub 操作 - GCP

GitHub Actions 允许您构建自动化 CI/CD 管道。公共存储库免费,私有存储库[1]包括 2,000 分钟。

GitHub Action 读取存储库中 .github/workflows/ 目录下保存的YAML文件,并执行文件中定义的工作流。一个工作流可以有多个作业,每个作业都有一个或多个步骤。一个步骤可以有动作,但不是所有的步骤都可以执行一个动作。

文件内容如下:

首先,我们定义工作流名称和触发器,即_push_到主分支。接下来,我们添加有关作业的信息

上面的作业在服务器端的 ubuntu 机器上运行。每个作业都在一个新实例上运行;因此,每个作业下定义的环境变量不能用于另一个作业。

接下来,我们指定步骤和操作。

在第二步中,我们将使用 secrets.GCP_SA_KEY。机密存储在存储库的操作机密中。 GitHub 支持 base64 编码的机密。您可以使用 Python 在 base64 中以 JSON 格式对 GCP 服务帐户密钥进行编码:

Terraform init 步骤通过下载提供程序插件来启动工作目录的准备工作。我们还在后端配置中指定了 GCS 存储桶名称。

如果您从本地驱动器提交到目前为止准备好的文件并推送到主驱动器,GitHub 工作流程会自动运行并提供服务。您可以在 GitHub Action 页面上查看执行日志。

图片是来自 GitHub Actions UI 的屏幕截图,显示了“terraform”工作流程步骤。

图 2. GitHub Action 工作流日志(作者提供的图片)

3. Streamlit 和 Dockerfile

在前面的部分中,我们使用 Terraform 和 GitHub Actions 准备了基础设施。我们现在使用 Streamlit 和 Docker 准备在 GCP 中的 VM 实例上运行的 Web 应用程序代码。

作为一个简单的例子,我们将为来自 Yahoo Finance 的时间序列数据创建一个仪表板,显示每日回报率,以便用户可以比较不同的指数或外汇汇率。仪表板用户还可以修改日期范围。

我们要创建的仪表板的图像如下所示:

图片是Streamlit创建的Web应用的截图。屏幕有四个部分:一个用于选择货币索引,两个用于输入 from_date 值,三个用于 to_date 值,最后一部分是根据用户选择显示折线图。

图 3. Streamlit Web App UI(作者提供的图片)

Python 脚本

上面显示的应用程序可以使用 Streamlit 创建。

首先,我们导入三个库。如果未安装,请使用 pip(或 pip3)安装命令进行安装。

我们在 st.title('text') 中指定 Web 应用程序的名称。

然后,我们准备多项选择选项。 st.multiselect() 是创建一个下拉选择。

Streamlit 提供 date_input 选项,通过该选项可以从日历中选择日期。这里我们创建了两个变量:from_date 和 to_date。

最后,我们设计带有计算返回值的图表。

Streamlit 动态读取选择器变量中的值,然后从 yfinance API 检索收盘价数据。使用 pandas pct_change() 计算增长率。最后一步是使用 st.line_chart() 函数在折线图中表示数据框。

我们将脚本保存在 app.py 文件中。

Dockerfile

dockerfile 是一个文本文件,其中包含创建映像文件的所有命令。您可以使用 docker build 构建映像文件,并通过 docker run 命令将映像作为容器运行。

在上面的 Dockerfile 中,我们在最新的官方 Python docker 发行版上构建了自己的镜像。由于我们需要三个库来运行 Streamlit 应用程序,因此我们在文本文件中指定依赖项,然后运行 pip install 命令。 Streamlit 的默认端口是 8501。然后,我们将 app/py 文件复制到容器的 /app 目录中并运行 Streamlit Web 应用程序。

4. GitHub Action — 网络应用

在前面的部分中,我们为 GitHub 存储库中的基础设施配置准备了一个 YAML 文件。我们还必须创建一个存储库并定义一个工作流来部署一个 docker 容器,该容器在 GCP 中预置的 VM 实例上运行 Streamlit Web 应用程序。

首先,我们为 Web 应用代码创建一个新的私有 GitHub 存储库,然后重复相同的步骤在 GitHub Action Secrets 中添加 GCP 服务帐户凭据。

接下来,我们在 GitHub 中准备一个私有访问令牌。该令牌用于从 GCP 中的 VM 实例克隆 GitHub 中的此存储库。

在您的 GitHub 页面上,转到 Settings -> Developer settings -> Personal Access Tokens,然后单击 Generate new token。在_新的个人访问令牌_页面上:_repo_和_workflow_必须打勾。 workflow 选项允许您更新 GitHub Action 工作流程。您只会看到一次生成的令牌,因此请将您的令牌复制到编辑器。

图片是 GitHub 页面的屏幕截图,您可以在其中创建个人访问令牌。在选择范围部分,我们勾选了“repo”和“workflow”。

图 4. 新的个人访问令牌(作者提供的图片)

我们需要在存储库 URL 中插入您的用户名和个人访问令牌。例如,https://github.com/your-user-name/your-repository.git将是https://**your-user-name:your-access-token@* *github.com/your-user-name/your-repository.git。将完整的 URL 保存在 GitHub Action 机密中,以便我们可以在工作流 YAML 文件中调用它。

在 .github/workflows 目录下,我们创建 deploy_dokcer.yaml 文件。工作流从 Dockerfile 构建一个 docker 镜像并将其部署在 GCP 虚拟机实例中。

在作业部分下,我们设置了一些变量和权限。

在步骤部分,我们定义动作。为了通过 ssh 在 VM 实例中运行 bash,我们设置了 gcloud CLI。在命令中,我们克隆 GitHub 存储库并创建一个 docker 映像,然后从该映像运行容器。

当您将文件推送到 GitHub 存储库时,工作流会运行并将容器部署到 VM。您可以从 GitHub Actions UI 检查工作流日志。

图片是来自 GitHub Actions UI 的屏幕截图,显示“构建和部署”工作流程步骤。

图 5. GitHub Action 工作流日志(作者提供的图片)

现在您可以修改 app.py,将修改后的代码推送到存储库并确认更改已应用于 VM。

结论

本文解决了数据专家在分享数据分析阶段的宝贵见解时的痛点,并提出了一种使用 Streamlit Web 应用程序呈现发现的方法。为了部署应用程序,Terraform 和 GitHub Actions 等 CI/CD 工具和服务可帮助数据专家通过自动化工作流程来加速原型设计。

我们使用的示例是一个简单的用例;但是,Streamlit 可以做得更多。我们建议您访问Streamlit 网站以了解它可以提供什么。同样的,Terraform Registry也有很多有用的资源,并且由 HashiCorp 和提供者积极更新。值得检查您感兴趣的提供商的文档,以找出工作流自动化的其他机会。最后,GitHub Actions 允许您设计更复杂的工作流程。如果您想在原型设计之外使用 GitHub Actions,强烈建议阅读官方文档。

参考

[1] “关于 GitHub 操作的计费”,GitHub 文档。 https://docs.github.com/en/billing/managing-billing-for-github-actions/about-billing-for-github-actions[访问日期:2022 年 8 月 7 日]。

u200c

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐