| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"> |
| <meta http-equiv="X-UA-Compatible" content="IE=edge"> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags --> |
| <title>Apache Flink: 贡献代码</title> |
| <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon"> |
| <link rel="icon" href="/favicon.ico" type="image/x-icon"> |
| |
| <!-- Bootstrap --> |
| <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"> |
| <link rel="stylesheet" href="/css/flink.css"> |
| <link rel="stylesheet" href="/css/syntax.css"> |
| |
| <!-- Blog RSS feed --> |
| <link href="/blog/feed.xml" rel="alternate" type="application/rss+xml" title="Apache Flink Blog: RSS feed" /> |
| |
| <!-- jQuery (necessary for Bootstrap's JavaScript plugins) --> |
| <!-- We need to load Jquery in the header for custom google analytics event tracking--> |
| <script src="/js/jquery.min.js"></script> |
| |
| <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries --> |
| <!-- WARNING: Respond.js doesn't work if you view the page via file:// --> |
| <!--[if lt IE 9]> |
| <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> |
| <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> |
| <![endif]--> |
| </head> |
| <body> |
| |
| |
| <!-- Main content. --> |
| <div class="container"> |
| <div class="row"> |
| |
| |
| <div id="sidebar" class="col-sm-3"> |
| |
| |
| <!-- Top navbar. --> |
| <nav class="navbar navbar-default"> |
| <!-- The logo. --> |
| <div class="navbar-header"> |
| <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| <span class="icon-bar"></span> |
| </button> |
| <div class="navbar-logo"> |
| <a href="/zh/"> |
| <img alt="Apache Flink" src="/img/flink-header-logo.svg" width="147px" height="73px"> |
| </a> |
| </div> |
| </div><!-- /.navbar-header --> |
| |
| <!-- The navigation links. --> |
| <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> |
| <ul class="nav navbar-nav navbar-main"> |
| |
| <!-- First menu section explains visitors what Flink is --> |
| |
| <!-- What is Stream Processing? --> |
| <!-- |
| <li><a href="/zh/streamprocessing1.html">What is Stream Processing?</a></li> |
| --> |
| |
| <!-- What is Flink? --> |
| <li><a href="/zh/flink-architecture.html">Apache Flink 是什么?</a></li> |
| |
| |
| |
| <!-- What is Stateful Functions? --> |
| |
| <li><a href="/zh/stateful-functions.html">What is Stateful Functions?</a></li> |
| |
| <!-- Use cases --> |
| <li><a href="/zh/usecases.html">应用场景</a></li> |
| |
| <!-- Powered by --> |
| <li><a href="/zh/poweredby.html">Flink 用户</a></li> |
| |
| |
| |
| <!-- Second menu section aims to support Flink users --> |
| |
| <!-- Downloads --> |
| <li><a href="/zh/downloads.html">下载</a></li> |
| |
| <!-- Getting Started --> |
| <li class="dropdown"> |
| <a class="dropdown-toggle" data-toggle="dropdown" href="#">教程<span class="caret"></span></a> |
| <ul class="dropdown-menu"> |
| <li><a href="https://ci.apache.org/projects/flink/flink-docs-release-1.10/zh/getting-started/index.html" target="_blank">With Flink <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> |
| <li><a href="https://ci.apache.org/projects/flink/flink-statefun-docs-release-2.0/getting-started/project-setup.html" target="_blank">With Flink Stateful Functions <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> |
| <li><a href="/zh/training.html">Training Course</a></li> |
| </ul> |
| </li> |
| |
| <!-- Documentation --> |
| <li class="dropdown"> |
| <a class="dropdown-toggle" data-toggle="dropdown" href="#">文档<span class="caret"></span></a> |
| <ul class="dropdown-menu"> |
| <li><a href="https://ci.apache.org/projects/flink/flink-docs-release-1.10" target="_blank">Flink 1.10 (Latest stable release) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> |
| <li><a href="https://ci.apache.org/projects/flink/flink-docs-master" target="_blank">Flink Master (Latest Snapshot) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> |
| <li><a href="https://ci.apache.org/projects/flink/flink-statefun-docs-release-2.0" target="_blank">Flink Stateful Functions 2.0 (Latest stable release) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> |
| <li><a href="https://ci.apache.org/projects/flink/flink-statefun-docs-master" target="_blank">Flink Stateful Functions Master (Latest Snapshot) <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> |
| </ul> |
| </li> |
| |
| <!-- getting help --> |
| <li><a href="/zh/gettinghelp.html">获取帮助</a></li> |
| |
| <!-- Blog --> |
| <li><a href="/blog/"><b>Flink 博客</b></a></li> |
| |
| |
| <!-- Flink-packages --> |
| <li> |
| <a href="https://flink-packages.org" target="_blank">flink-packages.org <small><span class="glyphicon glyphicon-new-window"></span></small></a> |
| </li> |
| |
| |
| <!-- Third menu section aim to support community and contributors --> |
| |
| <!-- Community --> |
| <li><a href="/zh/community.html">社区 & 项目信息</a></li> |
| |
| <!-- Roadmap --> |
| <li><a href="/zh/roadmap.html">开发计划</a></li> |
| |
| <!-- Contribute --> |
| <li><a href="/zh/contributing/how-to-contribute.html">如何参与贡献</a></li> |
| |
| <ul class="nav navbar-nav navbar-subnav"> |
| <li class="active"> |
| <a href="/zh/contributing/contribute-code.html">贡献代码</a> |
| </li> |
| <li > |
| <a href="/zh/contributing/reviewing-prs.html">审核 Pull Request</a> |
| </li> |
| <li > |
| <a href="/zh/contributing/code-style-and-quality-preamble.html">代码样式与质量指南</a> |
| </li> |
| <li > |
| <a href="/zh/contributing/contribute-documentation.html">贡献文档</a> |
| </li> |
| <li > |
| <a href="/zh/contributing/docs-style.html">Documentation Style Guide</a> |
| </li> |
| <li > |
| <a href="/zh/contributing/improve-website.html">贡献网站</a> |
| </li> |
| </ul> |
| |
| |
| <!-- GitHub --> |
| <li> |
| <a href="https://github.com/apache/flink" target="_blank">Flink on GitHub <small><span class="glyphicon glyphicon-new-window"></span></small></a> |
| </li> |
| |
| |
| |
| <!-- Language Switcher --> |
| <li> |
| |
| <a href="/contributing/contribute-code.html">English</a> |
| |
| </li> |
| |
| </ul> |
| |
| <ul class="nav navbar-nav navbar-bottom"> |
| <hr /> |
| |
| <!-- Twitter --> |
| <li><a href="https://twitter.com/apacheflink" target="_blank">@ApacheFlink <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> |
| |
| <!-- Visualizer --> |
| <li class=" hidden-md hidden-sm"><a href="/visualizer/" target="_blank">Plan Visualizer <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> |
| |
| <hr /> |
| |
| <li><a href="https://apache.org" target="_blank">Apache Software Foundation <small><span class="glyphicon glyphicon-new-window"></span></small></a></li> |
| |
| <li> |
| <style> |
| .smalllinks:link { |
| display: inline-block !important; background: none; padding-top: 0px; padding-bottom: 0px; padding-right: 0px; min-width: 75px; |
| } |
| </style> |
| |
| <a class="smalllinks" href="https://www.apache.org/licenses/" target="_blank">License</a> <small><span class="glyphicon glyphicon-new-window"></span></small> |
| |
| <a class="smalllinks" href="https://www.apache.org/security/" target="_blank">Security</a> <small><span class="glyphicon glyphicon-new-window"></span></small> |
| |
| <a class="smalllinks" href="https://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a> <small><span class="glyphicon glyphicon-new-window"></span></small> |
| |
| <a class="smalllinks" href="https://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a> <small><span class="glyphicon glyphicon-new-window"></span></small> |
| </li> |
| |
| </ul> |
| </div><!-- /.navbar-collapse --> |
| </nav> |
| |
| </div> |
| <div class="col-sm-9"> |
| <div class="row-fluid"> |
| <div class="col-sm-12"> |
| <h1>贡献代码</h1> |
| |
| <p>Apache Flink 是一个通过志愿者贡献的代码来维护、改进和扩展的项目。我们欢迎给 Flink 做贡献,但由于项目的规模大,以及为了保持高质量的代码库,我们要求贡献者遵循本文所阐述的贡献流程。</p> |
| |
| <p><strong>请随时提出任何问题!</strong> 可以发送邮件到 <a href="/zh/community.html#mailing-lists">dev mailing list</a>,也可以对正在处理的 Jira issue 发表评论。</p> |
| |
| <p><strong>重要提示</strong>:在开始准备代码贡献之前,请仔细阅读本文档。请遵循如下所述的流程和指南,为 Apache Flink 做贡献并不是从创建 pull request 开始的。我们希望贡献者先和我们联系,共同讨论整体方案。如果没有与 Flink committers 达成共识,那么贡献可能需要大量返工或不予审核通过。</p> |
| |
| <div class="page-toc"> |
| <ul id="markdown-toc"> |
| <li><a href="#section" id="markdown-toc-section">代码贡献步骤</a> <ul> |
| <li><a href="#jira-" id="markdown-toc-jira-">1. 创建 Jira 工单并达成共识。</a></li> |
| <li><a href="#section-1" id="markdown-toc-section-1">2. 实现你的改动</a></li> |
| <li><a href="#pull-request" id="markdown-toc-pull-request">3. 创建 Pull Request</a></li> |
| <li><a href="#section-2" id="markdown-toc-section-2">4. 合并改动</a></li> |
| </ul> |
| </li> |
| </ul> |
| |
| </div> |
| |
| <h2 id="section">代码贡献步骤</h2> |
| |
| <style> |
| .contribute-grid { |
| margin-bottom: 10px; |
| display: flex; |
| flex-direction: column; |
| margin-left: -2px; |
| margin-right: -2px; |
| } |
| |
| .contribute-grid .column { |
| margin-top: 4px; |
| padding: 0 2px; |
| } |
| |
| @media only screen and (min-width: 480px) { |
| .contribute-grid { |
| flex-direction: row; |
| flex-wrap: wrap; |
| } |
| |
| .contribute-grid .column { |
| flex: 0 0 50%; |
| } |
| |
| .contribute-grid .column { |
| margin-top: 4px; |
| } |
| } |
| |
| @media only screen and (min-width: 960px) { |
| .contribute-grid { |
| flex-wrap: nowrap; |
| } |
| |
| .contribute-grid .column { |
| flex: 0 0 25%; |
| } |
| |
| } |
| |
| .contribute-grid .panel { |
| height: 100%; |
| margin: 0; |
| } |
| |
| .contribute-grid .panel-body { |
| padding: 10px; |
| } |
| |
| .contribute-grid h2 { |
| margin: 0 0 10px 0; |
| padding: 0; |
| display: flex; |
| align-items: flex-start; |
| } |
| |
| .contribute-grid .number { |
| margin-right: 0.25em; |
| font-size: 1.5em; |
| line-height: 0.9; |
| } |
| </style> |
| |
| <div class="alert alert-warning" role="alert"> |
| <b>注意:</b>最近(2019 年 6 月),代码贡献步骤有改动。社区<a href="https://lists.apache.org/thread.html/1e2b85d0095331606ad0411ca028f061382af08138776146589914f8@%3Cdev.flink.apache.org%3E">决定</a>将原来直接提交 pull request 的方式转移到 Jira 上,要求贡献者在创建 pull request 之前需在 Jira 上达成共识(通过分配到的工单来体现),以减轻 PR review 的压力。 |
| </div> |
| |
| <div class="contribute-grid"> |
| <div class="column"> |
| <div class="panel panel-default"> |
| <div class="panel-body"> |
| <h2><span class="number">1</span><a href="#consensus">讨论</a></h2> |
| <p>在 Jira 上创建工单或邮件列表讨论并达成共识</p> |
| <p>商定重要性、相关性、工单的范围,讨论实现方案,并找到愿意审查和合并更改的 committer。</p> |
| <p><b>只有 committers 才能分配 Jira 工单。</b></p> |
| </div> |
| </div> |
| </div> |
| <div class="column"> |
| <div class="panel panel-default"> |
| <div class="panel-body"> |
| <h2><span class="number">2</span><a href="#implement">实现</a></h2> |
| <p>根据<a href="/zh/contributing/code-style-and-quality-preamble.html">代码样式和质量指南</a>,以及 Jira 工单中商定的方法去实现更改。</p> <br /> |
| <p><b>只有在达成共识时,才开始去实现(例如已经有工单分配给你了)</b></p> |
| </div> |
| </div> |
| </div> |
| <div class="column"> |
| <div class="panel panel-default"> |
| <div class="panel-body"> |
| <h2><span class="number">3</span><a href="#review">审查</a></h2> |
| <p>创建一个 pull request 并与 reviewer 一起审查。</p> |
| <p><b>未被分配 Jira 工单的 pull request 将不会被社区审查或合并。</b></p> |
| </div> |
| </div> |
| </div> |
| <div class="column"> |
| <div class="panel panel-default"> |
| <div class="panel-body"> |
| <h2><span class="number">4</span><a href="#merge">合并</a></h2> |
| <p>Flink committer 审查此贡献是否满足需求,并将代码合并到代码库中。</p> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <div class="row"> |
| <div class="col-sm-12"> |
| <div class="panel panel-default"> |
| <div class="panel-body"> |
| 注意:诸如拼写错误或语法错误之类的<i>简单</i>热修复可以不用创建 Jira 工单,直接提交 [hotfix] pull request 即可。 |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| <p><a name="consensus"></a></p> |
| |
| <h3 id="jira-">1. 创建 Jira 工单并达成共识。</h3> |
| |
| <p>向 Apache Flink 做出贡献的第一步是与 Flink 社区达成共识,这意味着需要一起商定更改的范围和实现的方法。</p> |
| |
| <p>在大多数情况下,我们应该在 <a href="https://issues.apache.org/jira/projects/FLINK/summary">Flink 的 Bug 追踪器:Jira</a> 中进行讨论。</p> |
| |
| <p>以下类型的更改需要向 Flink 的 dev@flink.apache.org 邮件列表发一封以 <code>[DISCUSS]</code> 开头的邮件:</p> |
| |
| <ul> |
| <li>重大变化(主要新功能、大重构和涉及多个组件)</li> |
| <li>可能存在争议的改动或问题</li> |
| <li>采用非常不明确的方法或有多种实现方法</li> |
| </ul> |
| |
| <p>在讨论未达成一致之前,不要为这些类型的更改创建 Jira 工单。 |
| 基于 dev 邮件讨论的 Jira 工单需要链接到该讨论,并总结结果。</p> |
| |
| <p><strong>Jira 工单获得共识的要求:</strong></p> |
| |
| <ul> |
| <li>正式要求 |
| <ul> |
| <li>描述问题的 <em>Title</em> 要简明扼要。</li> |
| <li>在 <em>Description</em> 中要提供了解问题或功能请求所需的所有详细信息。</li> |
| <li>要设置 <em>Component</em> 字段:许多 committers 和贡献者,只专注于 Flink 的某些子系统。设置适当的组件标签对于引起他们的注意很重要。</li> |
| </ul> |
| </li> |
| <li>社区<em>一致同意</em>使用工单是有效解决问题的方法,而且这<strong>非常适合</strong> Flink。 |
| Flink 社区考虑了以下几个方面: |
| <ul> |
| <li>这种贡献是否会改变特性或组件的性能,从而破坏以前的用户程序和设置?如果是,那么就需要讨论并达成一致意见,证明这种改变是可取的。</li> |
| <li>这个贡献在概念上是否适合 Flink ?这是否是一种特殊场景?支持这种场景后会导致通用的场景变得更复杂,还是使整理抽象或者 APIs 变得更臃肿?</li> |
| <li>该功能是否适合 Flink 的架构?它是否易扩展并保持 Flink 未来的灵活性,或者该功能将来会限制 Flink 吗?</li> |
| <li>该特性是一个重要的新增内容(而不是对现有内容的改进)吗?如果是,Flink 社区会承诺维护这个特性吗?</li> |
| <li>这个特性是否与 Flink 的路线图以及当前正在进行的工作内容一致?</li> |
| <li>该特性是否为 Flink 用户或开发人员带来了附加价值?或者它引入了回归的风险而没有给相关的用户或开发人员带来好处?</li> |
| <li>该贡献是否存在于其他仓库中,例如 Apache Bahir 或者其他第三方库?</li> |
| <li>这仅仅是为了在开源项目中获得提交而做出的贡献吗(仅仅是为了获得贡献而贡献,才去修复拼写错误、改变代码风格)?</li> |
| </ul> |
| </li> |
| <li>在如何解决这个问题上已有<strong>共识</strong>,包括以下需要考虑的因素 |
| <ul> |
| <li>API、数据向后兼容性和迁移策略</li> |
| <li>测试策略</li> |
| <li>对 Flink 构建时间的影响</li> |
| <li>依赖关系及其许可证</li> |
| </ul> |
| </li> |
| </ul> |
| |
| <p>如果在 Jira 的讨论中发现改动是一个大的或有争议的变更,则可能需要起草 <a href="https://cwiki.apache.org/confluence/display/FLINK/Flink+Improvement+Proposals">Flink 改动建议(FLIP)</a> 或在 <a href="/zh/community.html#mailing-lists"> dev 邮件列表</a> 中讨论以达成一致的意见。</p> |
| |
| <p>一般 Committer 会在几天内对工单进行回应。如果工单没有得到任何关注,我们建议你联系 <a href="/zh/community.html#mailing-lists">dev 邮件列表</a>。请注意,Flink 社区有时无法处理发来的所有贡献信息。</p> |
| |
| <p>一旦满足了工单的所有条件后,Committer 就会将工单<em><code>分配</code></em>给某个人,然后被分配到工单的人就可以继续后续的工作了。 |
| 只有 Committer 才能分配工单(包括分配给他自己和其他人)。</p> |
| |
| <p><strong>社区不会审查或合并未关联 Jira 工单的 pull request!</strong></p> |
| |
| <p><a name="implement"></a></p> |
| |
| <h3 id="section-1">2. 实现你的改动</h3> |
| |
| <p>你一旦被分配到了 Jira issue,那么你就可以开始去实现所需的改动了。</p> |
| |
| <p>以下是在实现时要注意的一些要点:</p> |
| |
| <ul> |
| <li><a href="https://cwiki.apache.org/confluence/display/FLINK/Setting+up+a+Flink+development+environment">设置 Flink 的开发环境</a></li> |
| <li>遵循 Flink 的<a href="/zh/contributing/code-style-and-quality-preamble.html">代码风格和质量指南</a></li> |
| <li>接受来自 Jira issue 或设计文档中的任何讨论和要求。</li> |
| <li>不要将不相关的问题混合到一个贡献中。</li> |
| </ul> |
| |
| <p><a name="review"></a></p> |
| |
| <h3 id="pull-request">3. 创建 Pull Request</h3> |
| |
| <p>在创建 pull request 之前的注意事项:</p> |
| |
| <ul> |
| <li>确保 <strong><code>mvn clean verify</code></strong> 成功执行,以保证所有检查都通过、代码成功构建和所有测试用例都成功执行。</li> |
| <li>执行 <a href="https://github.com/apache/flink/tree/master/flink-end-to-end-tests#running-tests">Flink 的端到端测试</a>。</li> |
| <li>确保不包含任何不相关或不必要的格式化更改。</li> |
| <li>确保你的提交历史符合要求。</li> |
| <li>确保你的改动是基于最新的 base 分支提交的。</li> |
| <li>确保 pull request 引用的是相应的 Jira,并且每个 Jira issue 都对应一个 pull request(如果一个 Jira 有多个 pull requests,首先解决这种情况)</li> |
| </ul> |
| |
| <p>创建 pull request 之前或之后的注意事项:</p> |
| |
| <ul> |
| <li>确保分支在 <a href="https://travis-ci.org/">Travis</a> 上已经成功构建。</li> |
| </ul> |
| |
| <p>Flink 中的代码更改将通过 <a href="https://help.github.com/en/articles/creating-a-pull-request">GitHub pull request</a> 进行审查和合并。</p> |
| |
| <p>这里有关于<a href="/zh/contributing/reviewing-prs.html">如何审查 pull request</a> 的单独指南,包括我们的 pull request 审核流程。作为代码作者,在你准备 pull request 前,应该满足以上所有要求。</p> |
| |
| <p><a name="merge"></a></p> |
| |
| <h3 id="section-2">4. 合并改动</h3> |
| |
| <p>审核完成后,代码将由 Flink 的 committer 合并。Jira 工单将在合并之后关闭。</p> |
| |
| |
| |
| </div> |
| </div> |
| |
| </div> |
| </div> |
| |
| <hr /> |
| |
| <div class="row"> |
| <div class="footer text-center col-sm-12"> |
| <p>Copyright © 2014-2019 <a href="http://apache.org">The Apache Software Foundation</a>. All Rights Reserved.</p> |
| <p>Apache Flink, Flink®, Apache®, the squirrel logo, and the Apache feather logo are either registered trademarks or trademarks of The Apache Software Foundation.</p> |
| <p><a href="/privacy-policy.html">Privacy Policy</a> · <a href="/blog/feed.xml">RSS feed</a></p> |
| </div> |
| </div> |
| </div><!-- /.container --> |
| |
| <!-- Include all compiled plugins (below), or include individual files as needed --> |
| <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script> |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.matchHeight/0.7.0/jquery.matchHeight-min.js"></script> |
| <script src="/js/codetabs.js"></script> |
| <script src="/js/stickysidebar.js"></script> |
| |
| <!-- Google Analytics --> |
| <script> |
| (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ |
| (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), |
| m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) |
| })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); |
| |
| ga('create', 'UA-52545728-1', 'auto'); |
| ga('send', 'pageview'); |
| </script> |
| </body> |
| </html> |