Flink CDC 贡献者开发指南:基于 AGENTS.md 的构建、测试与协作规范深度解析
【免费下载链接】flink-cdcFlink CDC is a streaming data integration tool项目地址: https://gitcode.com/GitHub_Trending/flin/flink-cdc
本篇指南以仓库根目录的 AGENTS.md 为骨架,系统梳理 Apache Flink CDC 面向 AI 编码代理与人类贡献者的协作规范,包括构建命令、测试策略、模块结构与编码标准。读完本文,你将掌握 Flink CDC 的快速编译方式、Flink 1.x/2.x 双版本兼容构建、JUnit 5 + AssertJ 测试编写规范,以及提交信息、Pull Request 与变更边界的完整约定,可直接用于日常开发与提交审核。
一、AGENTS.md 是什么:一份写给 AI 编码代理的协作手册
AGENTS.md 是 Flink CDC 仓库中专门面向 AI 编码代理(AI coding agents)的指导文件,目标是在 AI 生成代码进入 Apache 开源项目流程时,把"人与仓库"的隐性约定显式化:用什么 JDK、怎么编译、怎么测试、代码怎么写、提交怎么提、什么能改什么不能改。它本质上是一份可执行的仓库贡献契约,既约束 AI 代理,也约束所有参与者,确保代码风格、测试口径与流程规范的一致。
本文所有命令均以仓库根目录(当前仓库flink-cdc根目录)为执行起点,关键配置项均有仓库源码佐证。
二、开发环境前置要求(Prerequisites)
AGENTS.md 明确列出的环境基线:
- Java 11:作为编译基线,所有代码必须在 Java 11 上编译运行;
- Java 17:用于双版本验证与较新的 Flink 2.x 环境;
- Maven 3.8.6 或更高版本;
- Git;
- Unix-like 环境(Linux、macOS、WSL);
- Docker:运行集成测试(ITCase)与端到端测试(e2e tests)时必需。
仓库根 pom.xml 中java.version=11、source.java.version=11、target.java.version=11与上述基线一致;同时 Maven Enforcer 插件在构建时强制校验requireMavenVersion [3.1.1,)与requireJavaVersion ${source.java.version}(见 pom.xml)。pom 中还提供了按 JDK 自动激活的java-11-target(JDK 11~17)与java-17-target(JDK 17+)profile,自动切换编译目标。
三、构建命令速查(Build)
AGENTS.md 给出了四类典型构建命令,均可直接复制使用:
# 1. 快速开发构建:跳过测试与格式检查,追求最快反馈 mvn clean install -DskipTests -Dspotless.check.skip=true -Dcheckstyle.skip=true # 2. 针对 Flink 1.x 的完整构建(默认 profile) mvn clean package -DskipTests # 3. 针对 Flink 2.x 的完整构建 mvn clean package -DskipTests -Pflink2 # 4. 只构建单个模块(示例:flink-cdc-common,-am 表示同时构建其依赖模块) mvn clean package -DskipTests -pl flink-cdc-common -am几个值得注意的仓库级细节:
-Pflink2profile会切换一组依赖版本(如 Kafka 连接器版本、Paimon/Iceberg 的 Flink 主版本,见 pom.xml),并在测试阶段额外复制 Flink 2.x 的 shaded-guava 到target/flink2-extra-libs加入测试 classpath;- Spotless 全限定名问题:根 pom 中有一条注释明确指出,由于 Flink 构建环境设置,直接执行
mvn spotless:apply/mvn spotless:check可能失效,需使用全限定插件名mvn com.diffplug.spotless:spotless-maven-plugin:apply(见 pom.xml)。AGENTS.md 中mvn spotless:apply的写法在实际执行受阻时可切换为该全限定形式; - 根 pom 通过
flatten-maven-plugin与maven-shade-plugin为所有子模块生成固定的dependency-reduced-pom.xml,确保${flink.version}在子模块中被解析为实际版本号(pom.xml)。
四、测试命令与测试策略(Testing)
AGENTS.md 提供的测试命令矩阵:
# 运行某个模块的全部测试 mvn verify -pl flink-cdc-common # 针对 Flink 2.x 运行模块全部测试 mvn verify -pl flink-cdc-common -Pflink2 # 运行单个测试类 mvn -pl flink-cdc-common -Dtest=MyTest test # 运行单个测试方法 mvn -pl flink-cdc-common -Dtest=MyTest#myMethod test从根 pom 的 surefire 配置可以印证其运行机制(pom.xml):
- 默认
test阶段只执行**/*Test.java与**/*Test.scala(单元测试); - 单独的
integration-testsexecution 绑定在integration-test阶段,只执行**/*ITCase.java与**/*ITCase.scala(需要 Docker / 真实数据库的集成测试); - 为控制 MiniCluster 资源,默认
forkCount=1、reuseForks=true; - 测试 JVM 追加了大量
--add-opens/--add-exports参数,并针对 Oracle 时区问题设置了-Doracle.jdbc.timezoneAsRegion=false。
因此:如果只想跑单测,用mvn test或-Dtest=...;要跑 Docker 集成测试,需要mvn verify(或显式触发 integration-test 阶段)且本机具备 Docker 环境。
五、代码质量与格式化(Code Quality)
AGENTS.md 规定提交前必须执行:
# 应用代码风格规则(如失败改用全限定名,见第三节) mvn spotless:apply mvn spotless:check- Spotless:基于 Google Java Format(AOSP 风格,版本 1.24.0)格式化,并配置了 import 顺序
org.apache.flink, org.apache.flink.shaded, , javax, java, scala, #(静态导入),同时自动移除未使用的 import(pom.xml); - Checkstyle:在
validate阶段执行,规则文件为 tools/maven/checkstyle.xml,包含文件行数上限、禁止尾随空白、禁止Throwables.propagate(、禁止Boolean/Integer/Long.getXxx等规则,并提供 tools/maven/suppressions.xml 作为豁免清单; - License 头:所有新增文件必须包含 ASF Apache License 2.0 头,根 pom 的 apache-rat-plugin 会在
verify阶段强制检查(pom.xml)。
六、仓库结构总览:围绕 Pipeline 抽象的模块化设计
AGENTS.md 指出,Flink CDC 围绕Pipeline 抽象组织代码:一条用户定义的管道从一个或多个 Source 读取数据,可选地做 transform,再写入一个或多个 Sink。核心模块实现这一抽象,连接器模块提供具体的源端与目标端实现。
核心模块(Core Modules)
| 模块 | 职责 |
|---|---|
flink-cdc-common | 跨模块共享的 API 与数据模型:CDC 事件类型(DataChangeEvent、SchemaChangeEvent等)、schema 模型、数据类型、source/sink 接口、FactorySPI、路由定义、UDF 接口与工具类。大多数新抽象从这里开始。 |
flink-cdc-runtime | Pipeline 的运行时实现:读取、路由、transform(基于 Calcite + Janino 的表达式求值)、写出 CDC 事件所需的算子。 |
flink-cdc-composer | 管道装配与部署层:把PipelineDefinition翻译成可运行的 Flink 作业,串联 sources/operators/sinks,支持 Flink 原生、Kubernetes、YARN 部署。 |
flink-cdc-cli | 命令行入口(flink-cdc.sh),解析 YAML 管道定义并委托给flink-cdc-composer。 |
flink-cdc-dist | 发行打包,产出flink-cdc-<version>-bin发布归档。 |
以 CLI 模块为例,源码可以印证这一职责描述:CliFrontend.java 是入口类,解析命令行参数、打印帮助、创建 executor 并执行;CliFrontendOptions.java 定义了全部命令行选项:--flink-home、-h/--help、--global-config、--jar、-t/--target(支持local、remote、yarn-session、yarn-application、kubernetes-application)、--use-mini-cluster、-s/--from-savepoint、-cm/--claim-mode、-n/--allow-nonRestored-state、-D(动态覆盖 Flink 配置)。
管道级全局配置样例可在 flink-cdc.yaml 中找到,其核心字段与常见取值如下:
# 管道并行度 parallelism: 4 # 处理源端 schema change 事件的行为 schema.change.behavior: EVOLVEFlink 版本兼容(Flink Version Compatibility)
AGENTS.md 强调 Flink CDC 同时支持两代 Flink:
flink-cdc-flink1-compat—— Flink 1.x 兼容层(当前为1.20.3),默认 profile;flink-cdc-flink2-compat—— Flink 2.x 兼容层(当前为2.2.0),通过-Pflink2激活。
根 pom.xml 中flink.1.x.version=1.20.3、flink.2.x.version=2.2.0、flink.version=${flink.1.x.version}与此一致。所有依赖 Flink API 的模块必须将 Flink 依赖声明为providedscope,并引用${flink.version}占位符,由激活的 profile 解析(pom.xml)。改动请在 Flink 1.20(LTS)与 Flink 2.x 上分别验证。
连接器模块(flink-cdc-connect/)
连接器分为两类:
- Source Connectors(
flink-cdc-connect/flink-cdc-source-connectors/):面向 DataStream 与 Flink SQL 作业的 CDC 源,例如flink-connector-mysql-cdc、flink-connector-oracle-cdc、flink-connector-mongodb-cdc等,每个源还配套发布对应的flink-sql-connector-*-cdcshaded 产物; - Pipeline Connectors(
flink-cdc-connect/flink-cdc-pipeline-connectors/):面向 YAML API 的管道连接器,例如flink-cdc-pipeline-connector-doris、flink-cdc-pipeline-connector-kafka、flink-cdc-pipeline-connector-paimon等。
测试模块与文档
flink-cdc-e2e-tests/:端到端测试父模块,包含共享测试工具flink-cdc-e2e-utils(容器管理、断言)、源端 E2E 测试flink-cdc-source-e2e-tests与管道 E2E 测试flink-cdc-pipeline-e2e-tests;- 文档:
docs/为基于 Hugo 的文档站点,docs/content/存放英文文档,docs/content.zh/存放中文文档,新增特性时两者都要同步更新。
七、编码规范细节(Coding Standards)
AGENTS.md 对代码风格给出如下强制要求,均可与仓库工具链对应:
提交前用 Spotless 格式化 Java 文件:
mvn spotless:apply(失败时用全限定名,见第三节);Import 顺序(Checkstyle 强制):
org.apache.flink.cdc→org.apache.flink→ 其他第三方 →javax→java,静态导入放最后,禁止星号导入;禁止使用的 import(Checkstyle 强制):
- JUnit 4(
org.junit.*,org.junit.jupiter.*除外)——改用 JUnit 5 Jupiter; org.junit.jupiter.api.Assertions与org.hamcrest——改用 AssertJ;com.google.common.*——改用flink-shaded-guava;com.google.common.base.Preconditions——改用 Flink CDC 自带的Preconditions(见 flink-cdc-common);com.google.common.annotations.VisibleForTesting——改用org.apache.flink.cdc.common.annotation下的@VisibleForTesting;
- JUnit 4(
API 稳定性注解:面向用户的 API 类型应携带稳定性注解,仅当方法/字段/构造器与所在类型不一致时才需显式标注:
@Public:跨大版本稳定;@PublicEvolving:小版本内可能变化;@Experimental:随时可能变化;@Internal:无稳定性保证,用户不应依赖。
上述注解定义在 flink-cdc-common 的 annotation 包 下,包含
Public.java、PublicEvolving.java、Experimental.java、Internal.java、VisibleForTesting.java五个文件;日志:使用 SLF4J 带参数占位符的写法(
LOG.info("foo {}", bar)),禁止字符串拼接;大括号:
if/else/for/while/do一律使用大括号;注释:全部使用英文且保持简洁,仅在必要时书写,避免琐碎的
@param/@returnJavadoc;License:所有新文件必须带 Apache License 2.0 头。
八、测试编写规范(Testing Standards)
AGENTS.md 对测试的约束非常具体:
- 新测试一律使用JUnit 5(
org.junit.jupiter)与AssertJ(org.assertj.core.api.Assertions),禁止 JUnit 4 与 Hamcrest; - 测试类为包私有(类上不加
public); - 命名约定:
- 单元测试:
*Test.java(例如SchemaUtilsTest); - 集成测试(需要 Docker / 真实数据库):
*ITCase.java(例如MySqlSourceITCase);
- 单元测试:
- 新行为必须覆盖成功、失败与边界用例;测试应自解释,避免冗长注释;
- Bug 修复:先确认新测试在无修复时失败(红),再确认带修复后通过(绿),以证明测试的有效性。
仓库中可观察到这一命名体系的实际落地:flink-cdc-common测试目录下既有SelectorsTest.java、TableIdHashFunctionProviderTest.java这类单元测试,也有JdbcTableDiscovererITCase.java这类需要真实环境的集成测试(参见 flink-cdc-common/src/test)。
九、提交信息与 Pull Request 约定(Commits and PRs)
Commit message 格式
[FLINK-XXXX][component] DescriptionFLINK-XXXX为 JIRA issue 编号,component为受影响区域(例如connect/mysql、pipeline-connector/kafka、docs、runtime);- 无需 JIRA 的小修复使用
[hotfix][component] ...或[docs][component] ...; - 纯 CI 改动使用
[ci] Description。
Pull Request 约定
- PR 标题格式与 commit message 保持一致:
[FLINK-XXXX][component] Title; - 除琐碎改动外必须关联 JIRA issue;
- 完整填写 PR 模板:目的、变更日志、测试方式、文档影响;
- 请求 review 前确保 CI 通过;
- 在 fork 上启用 GitHub Actions 再开 PR(不得直接 push 上游);
- 使用 AI 工具时:勾选 AI disclosure 复选框,并在 PR 模板中取消注释
Generated-by行,遵循 ASF Generative Tooling Guidance。
十、变更边界:先询问与禁止事项(Boundaries)
AGENTS.md 明确划分了"动手前必须先确认"与"绝对禁止"两类边界,这对 AI 代理尤其关键。
先询问(Ask first)的变更类型
- 新增或修改
@Public/@PublicEvolving注解(即面向用户的 API 承诺); - 新增依赖;
- 大型跨模块重构;
- 变更序列化格式或 checkpoint 行为;
- 变更热路径(逐记录处理、状态访问)从而影响性能。
绝对禁止(Never)
- 提交密钥、凭据或 token;
- 直接 push 到
apache/flink-cdc,必须始终从自己的 fork 工作; - 在一个 PR 中混入无关改动;
- 在新测试代码中使用 JUnit 4 或 Hamcrest;
- 使用
org.junit.jupiter.api.Assertions(应改用 AssertJ); - 在 commit message 中添加带 AI 代理的
Co-Authored-By,应改用Generated-by: <Tool Name and Version>。
结语
AGENTS.md 是 Flink CDC 仓库中一份信息密度极高的工程协作契约:它同时回答了"环境怎么搭、构建怎么跑、测试怎么分、代码怎么写、提交怎么提、边界在哪里"六类问题,并为 AI 编码代理划出了清晰的责任红线。对贡献者而言,将本文梳理的构建命令(含-Pflink2双版本策略)、JUnit 5 + AssertJ 测试规范、Checkstyle/Spotless 工具链与FLINK-XXXX提交格式固化为日常工作流,即可与 Flink CDC 的既有工程文化无缝衔接。
【免费下载链接】flink-cdcFlink CDC is a streaming data integration tool项目地址: https://gitcode.com/GitHub_Trending/flin/flink-cdc
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考