blob: 2d671245f7eccc8fc7f0bf7894e79318a92dd309 [file] [log] [blame]
<!DOCTYPE html>
<html lang="en" dir=ZgotmplZ>
<head>
<link rel="stylesheet" href="/bootstrap/css/bootstrap.min.css">
<script src="/bootstrap/js/bootstrap.bundle.min.js"></script>
<link rel="stylesheet" type="text/css" href="/font-awesome/css/font-awesome.min.css">
<script src="/js/anchor.min.js"></script>
<script src="/js/flink.js"></script>
<link rel="canonical" href="https://flink.apache.org/how-to-contribute/contribute-code/">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Contributing Code # Apache Flink is maintained, improved, and extended by code contributions of volunteers. We welcome contributions to Flink, but due to the size of the project and to preserve the high quality of the code base, we follow a contribution process that is explained in this document.
Please feel free to ask questions at any time. Either send a mail to the Dev mailing list or comment on the Jira issue you are working on.">
<meta name="theme-color" content="#FFFFFF"><meta property="og:title" content="Contribute Code" />
<meta property="og:description" content="Contributing Code # Apache Flink is maintained, improved, and extended by code contributions of volunteers. We welcome contributions to Flink, but due to the size of the project and to preserve the high quality of the code base, we follow a contribution process that is explained in this document.
Please feel free to ask questions at any time. Either send a mail to the Dev mailing list or comment on the Jira issue you are working on." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://flink.apache.org/how-to-contribute/contribute-code/" /><meta property="article:section" content="how-to-contribute" />
<title>Contribute Code | Apache Flink</title>
<link rel="manifest" href="/manifest.json">
<link rel="icon" href="/favicon.png" type="image/x-icon">
<link rel="alternate" hreflang="zh" href="https://flink.apache.org/zh/how-to-contribute/contribute-code/" title="贡献代码">
<link rel="stylesheet" href="/book.min.22eceb4d17baa9cdc0f57345edd6f215a40474022dfee39b63befb5fb3c596b5.css" integrity="sha256-IuzrTRe6qc3A9XNF7dbyFaQEdAIt/uObY777X7PFlrU=">
<script defer src="/en.search.min.2698f0d1b683dae4d6cb071668b310a55ebcf1c48d11410a015a51d90105b53e.js" integrity="sha256-Jpjw0baD2uTWywcWaLMQpV688cSNEUEKAVpR2QEFtT4="></script>
<!--
Made with Book Theme
https://github.com/alex-shpak/hugo-book
-->
<meta name="generator" content="Hugo 0.124.1">
<script>
var _paq = window._paq = window._paq || [];
_paq.push(['disableCookies']);
_paq.push(["setDomains", ["*.flink.apache.org","*.nightlies.apache.org/flink"]]);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u="//analytics.apache.org/";
_paq.push(['setTrackerUrl', u+'matomo.php']);
_paq.push(['setSiteId', '1']);
var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s);
})();
</script>
</head>
<body dir=ZgotmplZ>
<header>
<nav class="navbar navbar-expand-xl">
<div class="container-fluid">
<a class="navbar-brand" href="/">
<img src="/img/logo/png/100/flink_squirrel_100_color.png" alt="Apache Flink" height="47" width="47" class="d-inline-block align-text-middle">
<span>Apache Flink</span>
</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<i class="fa fa-bars navbar-toggler-icon"></i>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">About</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="/what-is-flink/flink-architecture/">Architecture</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/flink-applications/">Applications</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/flink-operations/">Operations</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/use-cases/">Use Cases</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/powered-by/">Powered By</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/roadmap/">Roadmap</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/community/">Community & Project Info</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/security/">Security</a>
</li>
<li>
<a class="dropdown-item" href="/what-is-flink/special-thanks/">Special Thanks</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Getting Started</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/docs/try-flink/local_installation/">With Flink<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/docs/try-flink-kubernetes-operator/quick-start/">With Flink Kubernetes Operator<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-stable/docs/get-started/introduction/">With Flink CDC<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-stable/docs/try-flink-ml/quick-start/">With Flink ML<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-stable/getting-started/project-setup.html">With Flink Stateful Functions<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/docs/learn-flink/overview/">Training Course<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">Documentation</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-stable/">Flink 1.19 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-docs-master/">Flink Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-stable/">Kubernetes Operator 1.8 (latest)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-kubernetes-operator-docs-main">Kubernetes Operator Main (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-stable">CDC 3.0 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-cdc-docs-master">CDC Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-stable/">ML 2.3 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-ml-docs-master">ML Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-stable/">Stateful Functions 3.3 (stable)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
<li>
<a class="dropdown-item" href="https://nightlies.apache.org/flink/flink-statefun-docs-master">Stateful Functions Master (snapshot)<i class="link fa fa-external-link title" aria-hidden="true"></i>
</a>
</li>
</ul>
</li>
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">How to Contribute</a>
<ul class="dropdown-menu">
<li>
<a class="dropdown-item" href="/how-to-contribute/overview/">Overview</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/contribute-code/">Contribute Code</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/reviewing-prs/">Review Pull Requests</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/code-style-and-quality-preamble/">Code Style and Quality Guide</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/contribute-documentation/">Contribute Documentation</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/documentation-style-guide/">Documentation Style Guide</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/improve-website/">Contribute to the Website</a>
</li>
<li>
<a class="dropdown-item" href="/how-to-contribute/getting-help/">Getting Help</a>
</li>
</ul>
</li>
<li class="nav-item">
<a class="nav-link" href="/posts/">Flink Blog</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/downloads/">Downloads</a>
</li>
</ul>
<div class="book-search">
<div class="book-search-spinner hidden">
<i class="fa fa-refresh fa-spin"></i>
</div>
<form class="search-bar d-flex" onsubmit="return false;"su>
<input type="text" id="book-search-input" placeholder="Search" aria-label="Search" maxlength="64" data-hotkeys="s/">
<i class="fa fa-search search"></i>
<i class="fa fa-circle-o-notch fa-spin spinner"></i>
</form>
<div class="book-search-spinner hidden"></div>
<ul id="book-search-results"></ul>
</div>
</div>
</div>
</nav>
<div class="navbar-clearfix"></div>
</header>
<main class="flex">
<section class="container book-page">
<article class="markdown"><h1 id="contributing-code">
Contributing Code
<a class="anchor" href="#contributing-code">#</a>
</h1>
<p>Apache Flink is maintained, improved, and extended by code contributions of volunteers. We welcome contributions to Flink, but due to the size of the project and to preserve the high quality of the code base, we follow a contribution process that is explained in this document.</p>
<p><strong>Please feel free to ask questions at any time.</strong> Either send a mail to the <a href="/what-is-flink/community/#mailing-lists">Dev mailing list</a> or comment on the Jira issue you are working on.</p>
<p><strong>IMPORTANT</strong>: Please read this document carefully before starting to work on a code contribution. Follow the process and guidelines explained below. Contributing to Apache Flink does not start with opening a pull request. We expect contributors to reach out to us first to discuss the overall approach together. Without consensus with the Flink committers, contributions might require substantial rework or will not be reviewed.</p>
<h2 id="looking-for-what-to-contribute">
Looking for what to contribute
<a class="anchor" href="#looking-for-what-to-contribute">#</a>
</h2>
<p>If you have a good idea for the contribution, you can proceed to <a href="#code-contribution-process">the code contribution process</a>.
If you are looking for what you could contribute, you can browse open Jira issues in <a href="/what-is-flink/community/#issue-tracker">Flink&rsquo;s bug tracker</a>,
which are not assigned, and then follow <a href="#code-contribution-process">the code contribution process</a>. If you are very new
to the Flink project and want to learn about it and its contribution process, you can check
<a href="https://issues.apache.org/jira/issues/?filter=12349196">the starter issues</a>, which are annotated with a <em>starter</em> label.</p>
<h2 id="code-contribution-process">
Code Contribution Process
<a class="anchor" href="#code-contribution-process">#</a>
</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;
border: none;
}
.contribute-grid .number {
margin-right: 0.25em;
font-size: 1.5em;
line-height: 0.9;
}
</style>
<div class="alert alert-warning" role="alert">
<b>Note:</b> The code contribution process has changed recently (June 2019). The community <a href="https://lists.apache.org/thread.html/1e2b85d0095331606ad0411ca028f061382af08138776146589914f8@%3Cdev.flink.apache.org%3E">decided</a> to shift the "backpressure" from pull requests to Jira, by requiring contributors to get consensus (indicated by being assigned to the ticket) before opening a pull request.
</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">Discuss</a></h2>
<p>Create a Jira ticket or mailing list discussion and reach consensus</p>
<p>Agree on importance, relevance, scope of the ticket, discuss the implementation approach and find a committer willing to review and merge the change.</p>
<p><b>Only committers can assign a Jira ticket.</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">Implement</a></h2>
<p>Implement the change according to the <a href="/how-to-contribute/code-style-and-quality-preamble/">Code Style and Quality Guide</a> and the approach agreed upon in the Jira ticket.</p> <br />
<p><b>Only start working on the implementation if there is consensus on the approach (e.g. you are assigned to the ticket)</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">Review</a></h2>
<p>Open a pull request and work with the reviewer.</p>
<p><b>Pull requests belonging to unassigned Jira tickets or not authored by assignee will not be reviewed or merged by the community.</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">Merge</a></h2>
<p>A committer of Flink checks if the contribution fulfills the requirements and merges the code to the codebase.</p>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-body">
Note: <i>trivial</i> hot fixes such as typos or syntax errors can be opened as a <code>[hotfix]</code> pull request, without a Jira ticket.
</div>
</div>
</div>
</div>
<p><a name="consensus"></a></p>
<h3 id="1-create-jira-ticket-and-reach-consensus">
1. Create Jira Ticket and Reach Consensus
<a class="anchor" href="#1-create-jira-ticket-and-reach-consensus">#</a>
</h3>
<p>The first step for making a contribution to Apache Flink is to reach consensus with the Flink community. This means agreeing on the scope and implementation approach of a change.</p>
<p>In most cases, the discussion should happen in <a href="/what-is-flink/community/#issue-tracker">Flink&rsquo;s bug tracker: Jira</a>.</p>
<p>The following types of changes require a <code>[DISCUSS]</code> thread on the <a href="/what-is-flink/community/#mailing-lists">Flink Dev mailing list</a>:</p>
<ul>
<li>big changes (major new feature; big refactorings, involving multiple components)</li>
<li>potentially controversial changes or issues</li>
<li>changes with very unclear approaches or multiple equal approaches</li>
</ul>
<p>Do not open a Jira ticket for these types of changes before the discussion has come to a conclusion.
Jira tickets based on a dev@ discussion need to link to that discussion and should summarize the outcome.</p>
<p><strong>Requirements for a Jira ticket to get consensus:</strong></p>
<ul>
<li>Formal requirements
<ul>
<li>The <em>Title</em> describes the problem concisely.</li>
<li>The <em>Description</em> gives all the details needed to understand the problem or feature request.</li>
<li>The <em>Component</em> field is set: Many committers and contributors only focus on certain subsystems of Flink. Setting the appropriate component is important for getting their attention.</li>
</ul>
</li>
<li>There is <strong>agreement</strong> that the ticket solves a valid problem, and that it is a <strong>good fit</strong> for Flink.
The Flink community considers the following aspects:
<ul>
<li>Does the contribution alter the behavior of features or components in a way that it may break previous users’ programs and setups? If yes, there needs to be a discussion and agreement that this change is desirable.</li>
<li>Does the contribution conceptually fit well into Flink? Is it too much of a special case such that it makes things more complicated for the common case, or bloats the abstractions / APIs?</li>
<li>Does the feature fit well into Flink’s architecture? Will it scale and keep Flink flexible for the future, or will the feature restrict Flink in the future?</li>
<li>Is the feature a significant new addition (rather than an improvement to an existing part)? If yes, will the Flink community commit to maintaining this feature?</li>
<li>Does this feature align well with Flink&rsquo;s roadmap and currently ongoing efforts?</li>
<li>Does the feature produce added value for Flink users or developers? Or does it introduce the risk of regression without adding relevant user or developer benefit?</li>
<li>Could the contribution live in another repository, e.g., Apache Bahir or another external repository?</li>
<li>Is this a contribution just for the sake of getting a commit in an open source project (fixing typos, style changes merely for taste reasons)</li>
</ul>
</li>
<li>There is <strong>consensus</strong> on how to solve the problem. This includes considerations such as
<ul>
<li>API and data backwards compatibility and migration strategies</li>
<li>Testing strategies</li>
<li>Impact on Flink&rsquo;s build time</li>
<li>Dependencies and their licenses</li>
</ul>
</li>
</ul>
<p>If a change is identified as a large or controversial change in the discussion on Jira, it might require a <a href="https://cwiki.apache.org/confluence/display/FLINK/Flink&#43;Improvement&#43;Proposals">Flink Improvement Proposal (FLIP)</a> or a discussion on the <a href="/what-is-flink/community/#mailing-lists">Dev mailing list</a> to reach agreement and consensus.</p>
<p>Contributors can expect to get a first reaction from a committer within a few days after opening the ticket. If a ticket doesn&rsquo;t get any attention, we recommend reaching out to the <a href="/what-is-flink/community/#mailing-lists">developer mailing list</a>. Note that the Flink community sometimes does not have the capacity to accept all incoming contributions.</p>
<p>Once all requirements for the ticket are met, a committer will assign somebody to the <em><code>Assignee</code></em> field of the ticket to work on it.
Only committers have the permission to assign somebody.</p>
<p><strong>Pull requests belonging to unassigned Jira tickets will not be reviewed or merged by the community</strong>.</p>
<p><a name="implement"></a></p>
<h3 id="2-implement-your-change">
2. Implement your change
<a class="anchor" href="#2-implement-your-change">#</a>
</h3>
<p>Once you&rsquo;ve been assigned to a Jira issue, you may start to implement the required changes.</p>
<p>Here are some further points to keep in mind while implementing:</p>
<ul>
<li><a href="https://cwiki.apache.org/confluence/display/FLINK/Setting&#43;up&#43;a&#43;Flink&#43;development&#43;environment">Set up a Flink development environment</a></li>
<li>Follow the <a href="/how-to-contribute/code-style-and-quality-preamble/">Code Style and Quality Guide</a> of Flink</li>
<li>Take any discussions and requirements from the Jira issue or design document into account.</li>
<li>Do not mix unrelated issues into one contribution.</li>
</ul>
<p><a name="review"></a></p>
<h3 id="3-open-a-pull-request">
3. Open a Pull Request
<a class="anchor" href="#3-open-a-pull-request">#</a>
</h3>
<p>Considerations before opening a pull request:</p>
<ul>
<li>Make sure that <strong><code>mvn clean verify</code></strong> is passing on your changes to ensure that all checks pass, the code builds and that all tests pass.</li>
<li>Execute the <a href="https://github.com/apache/flink/tree/master/flink-end-to-end-tests#running-tests">End to End tests of Flink</a>.</li>
<li>Make sure no unrelated or unnecessary reformatting changes are included.</li>
<li>Make sure your commit history adheres to the requirements.</li>
<li>Make sure your change has been rebased to the latest commits in your base branch.</li>
<li>Make sure the pull request refers to the respective Jira, and that each Jira issue is assigned to exactly one pull request (in case of multiple pull requests for one Jira; resolve that situation first)</li>
</ul>
<p>Considerations before or right after opening a pull request:</p>
<ul>
<li>Make sure that the branch is building successfully on <a href="https://dev.azure.com/apache-flink/apache-flink/_build?definitionId=2">Azure DevOps</a>.</li>
</ul>
<p>Code changes in Flink are reviewed and accepted through <a href="https://help.github.com/en/articles/creating-a-pull-request">GitHub pull requests</a>.</p>
<p>There is a separate guide on <a href="/how-to-contribute/reviewing-prs/">how to review a pull request</a>, including our pull request review process. As a code author, you should prepare your pull request to meet all requirements.</p>
<p><a name="merge"></a></p>
<h3 id="4-merge-change">
4. Merge change
<a class="anchor" href="#4-merge-change">#</a>
</h3>
<p>The code will be merged by a committer of Flink once the review is finished. The Jira ticket will be closed afterwards.</p>
</article>
<div class="edit-this-page">
<p>
<a href="https://cwiki.apache.org/confluence/display/FLINK/Flink+Translation+Specifications">Want to contribute translation?</a>
</p>
<p>
<a href="//github.com/apache/flink-web/edit/asf-site/docs/content/how-to-contribute/contribute-code.md">
Edit This Page<i class="fa fa-edit fa-fw"></i>
</a>
</p>
</div>
</section>
<aside class="book-toc">
<nav id="TableOfContents"><h3>On This Page <a href="javascript:void(0)" class="toc" onclick="collapseToc()"><i class="fa fa-times" aria-hidden="true"></i></a></h3>
<ul>
<li><a href="#contributing-code">Contributing Code</a>
<ul>
<li><a href="#looking-for-what-to-contribute">Looking for what to contribute</a></li>
<li><a href="#code-contribution-process">Code Contribution Process</a>
<ul>
<li><a href="#1-create-jira-ticket-and-reach-consensus">1. Create Jira Ticket and Reach Consensus</a></li>
<li><a href="#2-implement-your-change">2. Implement your change</a></li>
<li><a href="#3-open-a-pull-request">3. Open a Pull Request</a></li>
<li><a href="#4-merge-change">4. Merge change</a></li>
</ul>
</li>
</ul>
</li>
</ul>
</nav>
</aside>
<aside class="expand-toc hidden">
<a class="toc" onclick="expandToc()" href="javascript:void(0)">
<i class="fa fa-bars" aria-hidden="true"></i>
</a>
</aside>
</main>
<footer>
<div class="separator"></div>
<div class="panels">
<div class="wrapper">
<div class="panel">
<ul>
<li>
<a href="https://flink-packages.org/">flink-packages.org</a>
</li>
<li>
<a href="https://www.apache.org/">Apache Software Foundation</a>
</li>
<li>
<a href="https://www.apache.org/licenses/">License</a>
</li>
<li>
<a href="/zh/how-to-contribute/contribute-code/">
<i class="fa fa-globe" aria-hidden="true"></i>&nbsp;中文版
</a>
</li>
</ul>
</div>
<div class="panel">
<ul>
<li>
<a href="/what-is-flink/security">Security</a-->
</li>
<li>
<a href="https://www.apache.org/foundation/sponsorship.html">Donate</a>
</li>
<li>
<a href="https://www.apache.org/foundation/thanks.html">Thanks</a>
</li>
</ul>
</div>
<div class="panel icons">
<div>
<a href="/posts">
<div class="icon flink-blog-icon"></div>
<span>Flink blog</span>
</a>
</div>
<div>
<a href="https://github.com/apache/flink">
<div class="icon flink-github-icon"></div>
<span>Github</span>
</a>
</div>
<div>
<a href="https://twitter.com/apacheflink">
<div class="icon flink-twitter-icon"></div>
<span>Twitter</span>
</a>
</div>
</div>
</div>
</div>
<hr/>
<div class="container disclaimer">
<p>The contents of this website are © 2024 Apache Software Foundation under the terms of the Apache License v2. Apache Flink, Flink, and the Flink logo are either registered trademarks or trademarks of The Apache Software Foundation in the United States and other countries.</p>
</div>
</footer>
</body>
</html>