贡献代码

您可以报告bug,提交一个新的功能增强建议或者直接对以上内容提交改进补丁。

报告bug

本章节介绍如何提交一个bug。

报告一个新bug之前

  • 确定在最新版本中该bug存在。我们将不会持续维护所有的发布版本,所有的修改仅根据当前版本。
  • 确认该bug是可以复现的。请尽量提供完整的重现步骤。
  • 请确定这不是一个重复的bug。 查看Issue Page列表,搜索您要提交的bug是否已经被报告过。

如何提交一个有质量的bug

请在Issue Page页面中提交bug。

  • 使用一个清晰并有描述性的标题来定义bug。
  • 详细的描述复现bug的步骤。包括您使用的SQL,配置情况,预计产生的结果,实际产生的结果。并附加详细的TRACE日志。
  • 如果程序抛出异常,请附加完整的堆栈日志。
  • 如有可能,请附上屏幕截图或动态的GIF图,这些图片能帮助演示整个问题的产生过程。
  • 如果涉及性能问题,请附加上CPU,内存或网络磁盘IO的Profile截图。
  • 说明适用的版本,只有release版本的bug才可以提交,并且应该是当前最新版本。
  • 说明适用的操作系统,及其版本。
  • 使用bug标签(Label)来标记这个issue。

以下是bug的Markdown模板,请按照该模板填写issue。

[问题简单描述]

**问题复现步骤:**

1. [第一步]
2. [第二步]
3. [其他步骤...]

**期望的表现:**

[在这里描述期望的表现]

**观察到的表现:**

[在这里描述观察到的表现]

**屏幕截图和动态GIF图**

![复现步骤的屏幕截图和动态GIF图](图片的url)

**Elastic-Job版本:** [输入Elastic-Job的版本]
**操作系统及版本:** [输入操作系统及版本]

提交功能增强建议

本章节介绍如何提交一个功能增强建议。

提交一个功能增强建议之前

  • 请确定这不是一个重复的功能增强建议。 查看Issue Page列表,搜索您要提交的功能增强建议是否已经被提交过。

如何提交一个好的功能增强建议

请在Issue Page页面中提交功能增强建议。

  • 使用一个清晰并有描述性的标题来定义增强建议。
  • 详细描述增强功能的行为模式。
  • 解释说明为什么该功能是对大多数用户是有用的。新功能应该具有广泛的适用性。
  • 如有可能,可以列出其他数据库中间已经具备的类似功能。商用与开源软件均可。
  • 使用enhancement标签(Label)来标记这个issue。

以下是功能增强建议的Markdown模板,请按照该模板填写issue。

[简单的建议描述]

**建议的新功能行为**

[描述新功能应表现的行为模式]

**为什么这个新功能是对大多数用户有用的**

[解释这个功能为什么对大多数用户是有用的]

[列出其他的数据库中间件是否包含该功能,且如何实现的]

贡献补丁(patch)

本章节向贡献者介绍开发规范、环境、示例和文档。

开发理念

  • 用心写代码,提炼真正的非功能性需求。
  • 代码整洁干净到极致, 请参见《重构》和《代码整洁之道》。
  • 极简代码, 高度复用,无重复代码和配置。
  • 代码应在同一抽象层级。
  • 修改功能时多考虑影响面, 不可留下没修改完全的部分。
  • 只有一个需求时,不需扩展性。两个类似需求时, 再提炼扩展性。

开发行为规范

  • 提交之前先确定模块的测试套件,并使用测试覆盖率工具检查覆盖率不能低于master分支的覆盖率。
  • 使用Checkstyle检查代码, 违反验证规则的需要有特殊理由。模板位置在elastic-job/src/resources/dd_checks.xml。
  • 执行mvn clean install可以测试和编译通过。
  • 及时删除无用代码。

编码规范

  • 写代码之前看一下系统已有的代码, 保持风格和使用方式一致。
  • 变量命名要有意义, 如果方法只有唯一的返回值, 使用result命名返回值. 循环中使用each命名循环变量, map中使用entry代替each。
  • 嵌套循环尽量提成方法。
  • 优先使用卫语句。
  • 配置文件使用驼峰命名, 文件名首字母小写。
  • 类和方法的访问权限控制为最小, 例如: 可以设为包私有的就不用public。
  • 方法所用到的私有方法应紧跟着该方法, 如果有多个私有方法, 书写私有方法应与私有方法在原方法的出现顺序相同。
  • 优先使用guava而非apache commons, 如:优先使用Strings而非StringUtils。
  • 优先使用lombok代替构造器, get, set, log方法。
  • 使用linux换行符。
  • 缩进(包含空行)和上一行保持一致。
  • 不应有无意义的空行。
  • 方法入参和返回值不允许为null,如有特殊情况需注释说明。
  • 需要注释解释的代码尽量提成小方法,用方法名称解释,注释应只包含javadoc和todo,fixme等。
  • 禁止使用static import。
  • 不需要公开的类放入internal包,包中类尽量包私有。
  • 日志一律使用英文。
  • 使用annotation获取spring的业务bean。
  • 如果模块中有公用的切入点,应在模块一级路径创建pointcut包。
  • 属性配置项需要添加到各个模块的常量枚举中。

单元测试规范

  • 测试代码和生产代码需遵守相同代码规范。
  • 如无特殊理由, 测试需全覆盖。
  • 准备环境的代码和测试代码分离。
  • 单数据断言, 应使用assertTrue, assertFalse, assertNull, assertNotNull。
  • 多数据断言, 应使用assertThat。
  • 精确断言, 尽量不使用not, containsString断言。
  • 调用业务方法的变量, 应命名为actualXXX, 期望值应命名为expectedXXX。
  • 只有junit assertXXX, hamcrest, mocktio相关可以使用static import。

编译代码

Elastic-Job的代码编译需要Maven,请保证IDE中正确配置了它。 代码用到的所有依赖完全都可以从公网下载,请根据自身的网络情况选择合理的镜像。

代码使用了Lombok来生成类属性的访问方法,构造器等。 故请以上从链接内容来获取适合您的IDE的解决方法。

文档生成

文档使用博客生成引擎HUGO,请根据文档安装环境。 文档全部在elastic-job/elastic-job-doc/public目录中。

贡献代码

请按照规范贡献代码,示例和文档。

  • 所有的问题与新功能请使用Issue Page进行管理。
  • 任何人想要开发任何功能,请先回复该功能所关联的Issue,表明您当前正在这个Issue上工作。 并在回复的时候为自己设置一个deadline,并添加的回复内容中。
  • 在核心贡献者找到一个导师(shepherd),导师会在设计与功能实现上给予即时的反馈。
  • 您应该新建一个分支来开始您的工作,分支的名字为功能名称/issueId。 例如,您想完成作业依赖功能并提交了Issue 111,那么您的branch名字应为 dependency/111。 功能名称与导师讨论后确定。
  • 完成后,发送一个pull request到elasticjob/elastic-job, 接着导师做CodeReview,然后他会与您讨论一些细节(包括设计,实现,性能等)。当团队中所有人员对本次修改满意后,导师会将提交合并到master分支。
  • 最后,恭喜您已经成为了Elastic-Job的官方贡献者!