注:文尾有代码样例链接
背景
长时间以来,我们团队基于Flyway的约定方式来管理SQL,即通过文件名的前缀来区分当前的DB中的schema的版本。如下图:
这些文件被存储在Git仓库中。任何希望对schema进行修改的人,都可以提MR。
但是,时间长了,reviewer无法通过大脑来判断MR中的SQL能否在实际的环境成功执行。所以,我决定实现SQL的持续集成测试。
工具列表
构建工具:Bazel。
数据库的启动与初始化实现:testcontainers
虽然基于maven就可以实现本文所说的功能,但是由于我正在学习Bazel,所以,决定使用Bazel实现。
具体步骤
步骤1:准备存放SQL的git仓库
当前的目录结构:
-
sqls目录:存放SQL;
-
MainTest.java:通过testContainers启动一个PostgreSQL数据库,并执行flyway;
-
BUILD.bazel:构建逻辑;
-
WORKSPACE:Bazel的工作空间定义。
MainTest代码如下:
@ClassRule
public static PostgreSQLContainer postgreSQLContainer
= new PostgreSQLContainer("postgres:12.8")
.withDatabaseName("integration-tests-db")
.withUsername("sa")
.withPassword("sa");
@Test
public void testMain() {
Flyway flyway = Flyway.configure()
.locations("sqls")
.dataSource(postgreSQLContainer.getJdbcUrl(),
postgreSQLContainer.getUsername(),
postgreSQLContainer.getPassword()).load();
MigrateResult migrate = flyway.migrate();
Assert.assertEquals(2, migrate.migrationsExecuted);
Assert.assertTrue(migrate.success);
}
步骤2:集成到CI平台
我们以Github Actions为例:
name: CI with Bazel
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
test_sql:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
- name: Mount bazel cache
uses: actions/cache@v1
with:
path: "/home/runner/.cache/bazel"
key: bazel
- name: Setup bazel
uses: jwlawson/actions-setup-bazel@v1
with:
bazel-version: '4.0.0'
- name: test all
run: bazel test //...
部分执行日志:
本方案的不足
目录结构中太多无用的内容。因为我们要测试的是SQL的正确性,代码仓库中还会出现java代码文件?解决方案实现一个flyway的Bazel rule。
代码样例:https://github.com/zacker330/bazel-flyway-demo
推荐阅读:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/70961.html