blob: 947a188b724f964f8cec41a23ba0bc47ee75fa6c [file] [log] [blame]
<!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>
&nbsp;
<!-- 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>
&nbsp;
<!-- Third menu section aim to support community and contributors -->
<!-- Community -->
<li><a href="/zh/community.html">社区 &amp; 项目信息</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>
&nbsp;
<!-- 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> &middot; <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>