| <!-- | |
| Licensed under the Apache License, Version 2.0 (the "License"); | |
| you may not use this file except in compliance with the License. | |
| You may obtain a copy of the License at | |
| http://www.apache.org/licenses/LICENSE-2.0 | |
| Unless required by applicable law or agreed to in writing, software | |
| distributed under the License is distributed on an "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| See the License for the specific language governing permissions and | |
| limitations under the License. | |
| --> | |
| # Committer Guide | |
| This guide is for | |
| [committers](https://www.apache.org/foundation/how-it-works.html#committers) | |
| and covers Beam's guidelines for reviewing and merging code. | |
| ## Pull request review objectives | |
| The review process aims for: | |
| - Review iterations should be efficient, timely and of quality (avoid tiny or | |
| out-of-context changes or huge mega-changes) | |
| - Support efficiency of authoring (don't want to wait on a review for a tiny | |
| bit because GitHub makes it very hard to stack up reviews in sequence / | |
| don't want to have major changes blocked because of difficulty of review) | |
| - Ease of first-time contribution (encourage to follow [contribution | |
| guildelines](/contribute/#contributing-code) but committer may absorb some | |
| extra effort for new contributors) | |
| - Pull requests and commit messages establish a clear history with purpose and | |
| origin of changes | |
| - Ability to perform a granular rollback, if necessary (also see | |
| [policies](/contribute/postcommits-policies/)) | |
| Granularity of changes: | |
| - We prefer small independent, incremental PRs with descriptive, isolated | |
| commits. Each commit is a single clear change | |
| - It is OK to keep separate commits for different logical pieces of the code, | |
| if they make reviewing and revisiting code easier | |
| - Making commits isolated is a good practice, authors should be able to | |
| relatively easily split the PR upon reviewer's request | |
| - Generally, every commit should compile and pass tests. | |
| - Avoid keeping in history formatting messages such as checkstyle or spotless | |
| fixes. Squash such commits with previous one. | |
| ## Always get to LGTM ("Looks good to me!") | |
| After a pull request goes through rounds of reviews and revisions, it will | |
| become ready for merge. A reviewer signals their approval either by GitHub | |
| "approval" or by a comment such as "Looks good to me!" (LGTM). | |
| - If the author of the pull request is not a committer, a committer must be | |
| the one to approve the change. | |
| - If the author of the pull request is a committer, approval from their chosen | |
| reviewer is enough. A committer is trusted to choose an appropriate | |
| reviewer, even if the reviewer is not a committer. | |
| Once a pull request is approved, any committer can merge it. | |
| Exceptions to this rule are rare and made on a case-by-case basis. A committer | |
| may use their discretion for situations such as when the build is broken on the | |
| main branch, blocking all code contributions. In this case, you should still | |
| seek a review on the pull request! A common acronym you may see is "TBR" -- | |
| "to be reviewed". | |
| **Always go through a pull request, even if you won’t wait for the code | |
| review.** Committers should never commit anything without going through a pull | |
| request, even when it is an urgent fix or rollback due to build breakage. | |
| Skipping pull request bypasses test coverage and could potentially cause the | |
| build to fail, or fail to fix breakage. In addition, pull requests ensure that | |
| changes are communicated properly and potential flaws or improvements can be | |
| spotted, even after the merge happens. | |
| ## Contributor License Agreement | |
| If you are merging a larger contribution, please make sure that the contributor | |
| has an ICLA on file with the Apache Secretary. You can view the list of | |
| committers [here](https://home.apache.org/phonebook.html?unix=committers), as | |
| well as [ICLA-signers who aren’t yet | |
| committers](https://home.apache.org/unlistedclas.html). | |
| For smaller contributions, however, this is not required. In this case, we rely | |
| on [clause five](https://www.apache.org/licenses/LICENSE-2.0#contributions) of | |
| the Apache License, Version 2.0, describing licensing of intentionally | |
| submitted contributions. | |
| ## Tests | |
| Before merging, please make sure that Jenkins tests pass, as visible in the | |
| GitHub pull request. Do not merge the pull request if there are test failures. | |
| If the pull request contains changes that call for extra test coverage, you can | |
| ask Jenkins to run an extended test suite. For example, if the pull request | |
| modifies a runner, you can run the full `ValidatesRunner` suite with a comment | |
| such as "Run Spark ValidatesRunner". You can run the examples and some IO | |
| integration tests with "Run Java PostCommit". | |
| ## Finishing touches | |
| At some point in the review process, the change to the codebase will be | |
| complete. However, the pull request may have a collection of review-related | |
| commits that are not meaningful to preserve in the history. The reviewer should | |
| give the LGTM and then request that the author of the pull request rebase, | |
| squash, split, etc, the commits, so that the history is most useful: | |
| - Favor commits that do just one thing. The commit is the smallest unit of | |
| easy rollback; it is easy to roll back many commits, or a whole pull | |
| request, but harder to roll back part of a commit. | |
| - Commit messages should be descriptive and should reference the issue number | |
| that they address. It should later not be necessary to find a merge commit or | |
| first PR commit to find out what caused a change. | |
| - Pull request descriptions should contain a link to the issue being addressed by the changes. | |
| - `CHANGES.md` file should be updated with noteworthy changes (e.g. new features, backward | |
| incompatible changes, dependency changes, etc.). | |
| - Squash the "Fixup!", "Address comments" type of commits that resulted from review iterations. | |
| ## Merging it! | |
| While it is preferred that authors squash commits after review is complete, | |
| there may be situations where it is more practical for the committer to handle | |
| this (such as when the action to be taken is obvious or the author isn't | |
| available). The committer may use the "Squash and merge" option in Github (or | |
| modify the PR commits in other ways). The committer is ultimately responsible | |
| and we "trust the committer's judgment"! | |
| After all the tests pass, there should be a green merge button at the bottom of | |
| the pull request. There are multiple choices. Unless you want to squash commits | |
| as part of the merge (see above) you should choose "Merge pull request" and | |
| ensure "Create a merge commit" is selected from the drop down. This preserves | |
| the commit history and adds a merge commit, so be sure the commit history has | |
| been curated appropriately. | |
| Do _not_ use the default GitHub commit message, which looks like this: | |
| Merge pull request #1234 from some_user/transient_branch_name | |
| [BEAM-7873] Fix the foo bizzle bazzle | |
| Instead, pull it all into the subject line: | |
| Merge pull request #1234: [BEAM-7873] Fix the foo bizzle bazzle | |
| If you have comments to add, put them in the body of the commit message. |