跳到主要内容

持续集成

为确保软件质量,团队通常采用 持续集成 工作流(简称CI)。 通过 CI,团队会对代码库的每次变更持续运行一系列自动化验证。 在 CI 过程中,团队可能执行多种验证:

  • 编译或构建最新版本以确保其正常运行。
  • 通过代码检查工具强制执行任何已接受的代码风格规范。
  • 单元测试用于验证各个组件是否按预期运行,并确保代码库的变更不会导致其他区域出现回归问题。
  • 安全扫描旨在确保代码库中不会引入任何已知的漏洞。
  • 还有更多!

通过在 Ent 社区的交流,我们了解到许多使用 Ent 的团队已采用 CI ,并希望在其工作流中强制执行一些 Ent 特有的验证机制。

为支持社区开展这项工作,我们启动了本指南,其中记录了在 CI 中验证过的常见最佳实践, 并介绍了由我们维护的 GitHub Action —— ent/contrib/ci 收录了以上内容。

验证所有生成的文件都已提交

Ent 项目高度依赖代码生成。 根据我们的经验,生成的代码应始终提交到源代码控制系统。这样做有两个原因:

  • 若生成的代码被提交至源代码控制系统,则可与主应用程序代码一同查阅。 在代码审查或浏览代码库时,生成代码的存在对于全面理解系统运作机制至关重要。
  • 团队成员之间开发环境的差异能够被轻松发现并解决。 由于所有人都在运行相同的代码,这进一步降低了“在我机器上运行正常”这类问题的发生概率。

若您使用 GitHub 进行源代码管理,可轻松通过 ent/contrib/ci GitHub Action 验证所有生成的文件是否已提交。 否则,我们提供了一个简单的 Bash 脚本,您可将其集成到现有的 CI 流程中。

只需简单地在仓库中添加名为 .github/workflows/ent-ci.yaml 的文件:

name: EntCI
on:
push:
# Run whenever code is changed in the master.
branches:
- master
# Run on PRs where something changed under the `ent/` directory.
pull_request:
paths:
- 'ent/*'
jobs:
ent:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3.0.1
- uses: actions/setup-go@v3
with:
go-version-file: 'go.mod'
- uses: ent/contrib/ci@master

迁移文件静态代码分析

变更项目 Ent 模式几乎总会导致数据库的修改。 若你正在采用 版本化迁移 来管理数据库模式变更, 可以运行 迁移静态代码分析 作为持续集成工作流的一部分。 这样做出于多重考量:

  • 代码静态分析在 数据库容器 上回放迁移目录,以确保所有的 SQL 语句有效并是正确顺序。
  • 迁移目录完整性 是强制的 —— 确保历史不会被意外更改并使规划的迁移统一到纯净的历史记录中。
  • 在迁移方式产生的潜在数据丢失影响生产数据库之前,破坏性变更会被检测到并通知你。
  • 代码静态分析会检测 可能 因部署失败导致的数据依赖变更,并要求你更加仔细地审核代码.

如果你正在使用 GitHub,你可以使用 官方 Atlas Action 在 CI 期间运行迁移代码静态分析。

添加包含如下内容的 .github/workflows/atlas-ci.yaml 到你的代码仓库:

name: Atlas CI
on:
# Run whenever code is changed in the master branch,
# change this to your root branch.
push:
branches:
- master
# Run on PRs where something changed under the `ent/migrate/migrations/` directory.
pull_request:
paths:
- 'ent/migrate/migrations/*'
jobs:
lint:
services:
# Spin up a mysql:8.0.29 container to be used as the dev-database for analysis.
mysql:
image: mysql:8.0.29
env:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: test
ports:
- "3306:3306"
options: >-
--health-cmd "mysqladmin ping -ppass"
--health-interval 10s
--health-start-period 10s
--health-timeout 5s
--health-retries 10
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ariga/setup-atlas@v0
with:
cloud-token: ${{ secrets.ATLAS_CLOUD_TOKEN }}
- uses: ariga/atlas-action/migrate/lint@v1
with:
dir: 'file://ent/migrate/migrations'
dir-name: 'my-project' # The name of the project in Atlas Cloud
dev-url: "mysql://root:pass@localhost:3306/dev"

需注意运行 atlas migrate lint 时需要一个纯净的 开发数据库, 开发数据库在上述示例代码中由 services 模块提供。