| # How to contribute | |
| We welcome your patches and contributions to gRPC! Please read the gRPC | |
| organization's [governance | |
| rules](https://github.com/grpc/grpc-community/blob/master/governance.md) before | |
| proceeding. | |
| If you are new to GitHub, please start by reading [Pull Request howto](https://help.github.com/articles/about-pull-requests/) | |
| ## Legal requirements | |
| In order to protect both you and ourselves, you will need to sign the | |
| [Contributor License | |
| Agreement](https://identity.linuxfoundation.org/projects/cncf). When you create | |
| your first PR, a link will be added as a comment that contains the steps needed | |
| to complete this process. | |
| ## Getting Started | |
| A great way to start is by searching through our open issues. [Unassigned issues | |
| labeled as "help | |
| wanted"](https://github.com/grpc/grpc-go/issues?q=sort%3Aupdated-desc%20is%3Aissue%20is%3Aopen%20label%3A%22Status%3A%20Help%20Wanted%22%20no%3Aassignee) | |
| are especially nice for first-time contributors, as they should be well-defined | |
| problems that already have agreed-upon solutions. | |
| ## Generative AI Policy | |
| AI tools have the ability to produce more code than is possible for the gRPC | |
| team to read, understand, review, and accept into the repository. For this | |
| reason, we request that all contributions adhere to the following rules: | |
| 1. **No AI-Generated Interactions:** All communication in the repo must be | |
| authored by a human. _Exception: AIs may be used for directed writing | |
| assistance or translation._ Absolutely no automated agents are allowed to | |
| directly publish to GitHub. | |
| 2. **Author Ownership and Accountability:** Code contributions are expected to | |
| be fully owned and understood by the human contributor. If the code was | |
| produced by generative AI, the author is expected to have reviewed and | |
| understood it in its entirety before submitting it for review. This includes | |
| all content: production code, tests, examples, tools, etc. | |
| In addition to the above requirements, any AI-assisted contributions must also | |
| comply with the [Linux Foundation Generative AI | |
| Policy](https://www.linuxfoundation.org/legal/generative-ai). This includes | |
| confirming that all contributions are legally allowed to be contributed to the | |
| gRPC project under the applicable license terms. | |
| ## Code Style | |
| We follow [Google's published Go style | |
| guide](https://google.github.io/styleguide/go/). Note that there are three | |
| primary documents that make up this style guide; please follow them as closely | |
| as possible. If a reviewer recommends something that contradicts those | |
| guidelines, there may be valid reasons to do so, but it should be rare. | |
| ## Guidelines for Pull Requests | |
| Please read the following carefully to ensure your contributions can be merged | |
| smoothly and quickly. | |
| ### PR Contents | |
| - Create **small PRs** that are narrowly focused on **addressing a single | |
| concern**. We often receive PRs that attempt to fix several things at the same | |
| time, and if one part of the PR has a problem, that will hold up the entire | |
| PR. | |
| - If your change does not address an **open issue** with an **agreed | |
| resolution**, consider opening an issue and discussing it first. If you are | |
| suggesting a behavioral or API change, consider starting with a [gRFC | |
| proposal](https://github.com/grpc/proposal). Many new features that are not | |
| bug fixes will require cross-language agreement. | |
| - If you want to fix **formatting or style**, consider whether your changes are | |
| an obvious improvement or might be considered a personal preference. If a | |
| style change is based on preference, it likely will not be accepted. If it | |
| corrects widely agreed-upon anti-patterns, then please do create a PR and | |
| explain the benefits of the change. | |
| - For correcting **misspellings**, please be aware that we use some terms that | |
| are sometimes flagged by spell checkers. As an example, "if an only if" is | |
| often written as "iff". Please do not make spelling correction changes unless | |
| you are certain they are misspellings. | |
| - **All tests need to be passing** before your change can be merged. We | |
| recommend you run tests locally before creating your PR to catch breakages | |
| early on: | |
| - `./scripts/vet.sh` to catch vet errors. | |
| - `go test -cpu 1,4 -timeout 7m ./...` to run the tests. | |
| - `go test -race -cpu 1,4 -timeout 7m ./...` to run tests in race mode. | |
| Note that we have a multi-module repo, so `go test` commands may need to be | |
| run from the root of each module in order to cause all tests to run. | |
| *Alternatively*, you may find it easier to push your changes to your fork on | |
| GitHub, which will trigger a GitHub Actions run that you can use to verify | |
| everything is passing. | |
| - Note that there are two GitHub actions checks that need not be green: | |
| 1. We test the freshness of the generated proto code we maintain via the | |
| `vet-proto` check. If the source proto files are updated, but our repo is | |
| not updated, an optional checker will fail. This will be fixed by our team | |
| in a separate PR and will not prevent the merge of your PR. | |
| 2. We run a checker that will fail if there is any change in dependencies of | |
| an exported package via the `dependencies` check. If new dependencies are | |
| added that are not appropriate, we may not accept your PR (see below). | |
| - If you are adding a **new file**, make sure it has the **copyright message** | |
| template at the top as a comment. You can copy the message from an existing | |
| file and update the year. | |
| - The grpc package should only depend on standard Go packages and a small number | |
| of exceptions. **If your contribution introduces new dependencies**, you will | |
| need a discussion with gRPC-Go maintainers. | |
| ### PR Descriptions | |
| - **PR titles** should start with the name of the component being addressed, or | |
| the type of change. Examples: transport, client, server, round_robin, xds, | |
| cleanup, deps. | |
| - Read and follow the **guidelines for PR titles and descriptions** here: | |
| https://google.github.io/eng-practices/review/developer/cl-descriptions.html | |
| *particularly* the sections "First Line" and "Body is Informative". | |
| Note: your PR description will be used as the git commit message in a | |
| squash-and-merge if your PR is approved. We may make changes to this as | |
| necessary. | |
| - **Does this PR relate to an open issue?** On the first line, please use the | |
| tag `Fixes #<issue>` to ensure the issue is closed when the PR is merged. Or | |
| use `Updates #<issue>` if the PR is related to an open issue, but does not fix | |
| it. Consider filing an issue if one does not already exist. | |
| - PR descriptions *must* conclude with **release notes** as follows: | |
| ``` | |
| RELEASE NOTES: | |
| * <component>: <summary> | |
| ``` | |
| This need not match the PR title. | |
| The summary must: | |
| * be something that gRPC users will understand. | |
| * clearly explain the feature being added, the issue being fixed, or the | |
| behavior being changed, etc. If fixing a bug, be clear about how the bug | |
| can be triggered by an end-user. | |
| * begin with a capital letter and use complete sentences. | |
| * be as short as possible to describe the change being made. | |
| If a PR is *not* end-user visible -- e.g. a cleanup, testing change, or | |
| GitHub-related, use `RELEASE NOTES: n/a`. | |
| ### PR Process | |
| - Please **self-review** your code changes before sending your PR. This will | |
| prevent simple, obvious errors from causing delays. | |
| - Maintain a **clean commit history** and use **meaningful commit messages**. | |
| PRs with messy commit histories are difficult to review and won't be merged. | |
| Before sending your PR, ensure your changes are based on top of the latest | |
| `upstream/master` commits, and avoid rebasing in the middle of a code review. | |
| You should **never use `git push -f`** unless absolutely necessary during a | |
| review, as it can interfere with GitHub's tracking of comments. | |
| - Unless your PR is trivial, you should **expect reviewer comments** that you | |
| will need to address before merging. We'll label the PR as `Status: Requires | |
| Reporter Clarification` if we expect you to respond to these comments in a | |
| timely manner. If the PR remains inactive for 6 days, it will be marked as | |
| `stale`, and we will automatically close it after 7 days if we don't hear back | |
| from you. Please feel free to ping issues or bugs if you do not get a response | |
| within a week. |