page_title: Make a project contribution page_description: Basic workflow for Docker contributions page_keywords: contribute, pull request, review, workflow, white-belt, black-belt, squash, commit # Make a project contribution Contributing is a process where you work with Docker maintainers and the community to improve Docker. There is a formal process for contributing. We try to keep our contribution process simple so you want to come back. In this section, you will create a new branch and work on some Docker code that you choose. Before you work through this process, take a few minutes to read through the next section which explains our basic contribution workflow. ## The basic contribution workflow You are about to work through our basic contribution workflow by fixing a single *white-belt* issue in the `docker/docker` repository. The workflow for fixing simple issues looks like this:  All Docker repositories have code and documentation. This workflow works for either content type. For example, you can find and fix doc or code issues. Also, you can propose a new Docker feature or propose a new Docker tutorial. Some workflow stages have slight differences for code or documentation contributions. When you reach that point in the flow, we make sure to tell you. ## Find and claim an existing issue An existing issue is something reported by a Docker user. As issues come in, our maintainers triage them. Triage is its own topic. For now, it is important for you to know that triage includes ranking issues according to difficulty. Triaged issues have either a white-belt or black-belt label. A white-belt issue is considered an easier issue. Issues can have more than one label, for example, bug, improvement, project/doc, and so forth. These other labels are there for filtering purposes but you might also find them helpful. In the next procedure, you find and claim an open white-belt issue. 1. Go to the `docker/docker` repository. 2. Click on the "Issues" link. A list of the open issues appears.  3. Look for the white-belt items on the list. 4. Click on the "labels" dropdown and select white-belt. The system filters to show only open white-belt issues. 5. Open an issue that interests you. The comments on the issues can tell you both the problem and the potential solution. 6. Make sure that no other user has chosen to work on the issue. We don't allow external contributors to assign issues to themselves, so you need to read the comments to find if a user claimed an issue by saying: - "I'd love to give this a try~" - "I'll work on this!" - "I'll take this." The community is very good about claiming issues explicitly. 7. When you find an open issue that both interests you and is unclaimed, claim it yourself by adding a comment.  This example uses issue 11038. Your issue # will be different depending on what you claimed. 8. Make a note of the issue number; you'll need it later. ## Sync your fork and create a new branch If you have followed along in this guide, you forked the `docker/docker` repository. Maybe that was an hour ago or a few days ago. In any case, before you start working on your issue, sync your repository with the upstream `docker/docker` master. Syncing ensures your repository has the latest changes. To sync your repository: 1. Open a terminal on your local host. 2. Change directory to the `docker-fork` root. $ cd ~/repos/docker-fork 3. Checkout the master branch. $ git checkout master Switched to branch 'master' Your branch is up-to-date with 'origin/master'. Recall that `origin/master` is a branch on your remote GitHub repository. 4. Make sure you have the upstream remote `docker/docker` by listing them. $ git remote -v origin https://github.com/moxiegirl/docker.git (fetch) origin https://github.com/moxiegirl/docker.git (push) upstream https://github.com/docker/docker.git (fetch) upstream https://github.com/docker/docker.git ( If the `upstream` is missing, add it. $ git remote add upstream https://github.com/docker/docker.git 5. Fetch all the changes from the `upstream/master` branch. $ git fetch upstream/master remote: Counting objects: 141, done. remote: Compressing objects: 100% (29/29), done. remote: Total 141 (delta 52), reused 46 (delta 46), pack-reused 66 Receiving objects: 100% (141/141), 112.43 KiB | 0 bytes/s, done. Resolving deltas: 100% (79/79), done. From github.com:docker/docker 9ffdf1e..01d09e4 docs -> upstream/docs 05ba127..ac2521b master -> upstream/master This command says get all the changes from the `master` branch belonging to the `upstream` remote. 7. Rebase your local master with the `upstream/master`. $ git rebase upstream/master First, rewinding head to replay your work on top of it... Fast-forwarded master to upstream/master. This command writes all the commits from the upstream branch into your local branch. 8. Check the status of your local branch. $ git status On branch master Your branch is ahead of 'origin/master' by 38 commits. (use "git push" to publish your local commits) nothing to commit, working directory clean Your local repository now has any changes from the `upstream` remote. You need to push the changes to your own remote fork which is `origin/master`. 9. Push the rebased master to `origin/master`. $ git push Username for 'https://github.com': moxiegirl Password for 'https://moxiegirl@github.com': Counting objects: 223, done. Compressing objects: 100% (38/38), done. Writing objects: 100% (69/69), 8.76 KiB | 0 bytes/s, done. Total 69 (delta 53), reused 47 (delta 31) To https://github.com/moxiegirl/docker.git 8e107a9..5035fa1 master -> master 9. Create a new feature branch to work on your issue. Your branch name should have the format `XXXX-descriptive` where `XXXX` is the issue number you are working on. For example: $ git checkout -b 11038-fix-rhel-link Switched to a new branch '11038-fix-rhel-link' Your branch should be up-to-date with the upstream/master. Why? Because you branched off a freshly synced master. Let's check this anyway in the next step. 9. Rebase your branch from upstream/master. $ git rebase upstream/master Current branch 11038-fix-rhel-link is up to date. At this point, your local branch, your remote repository, and the Docker repository all have identical code. You are ready to make changesfor your issues. ## Work on your issue The work you do for your issue depends on the specific issue you picked. This section gives you a step-by-step workflow. Where appropriate, it provides command examples. However, this is a generalized workflow, depending on your issue you may you may repeat steps or even skip some. How much time it takes you depends on you --- you could spend days or 30 minutes of your time. Follow this workflow as you work: 1. Review the appropriate style guide. If you are changing code, review the coding style guide. Changing documentation? Review the documentation style guide. 2. Make changes in your feature branch. Your feature branch you created in the last section. Here you use the development container. If you are making a code change, you can mount your source into a development container and iterate that way. For documentation alone, you can work on your local host. Review if you forgot the details of working with a container. 3. Test your changes as you work. If you have followed along with the guide, you know the `make test` target runs the entire test suite and `make docs` builds the documentation. If you forgot the other test targets, see the documentation for testing both code and documentation. 4. For code changes, add unit tests if appropriate. If you add new functionality or change existing functionality, you should add a unit test also. Use the existing test files for inspiration. Aren't sure if you need tests? Skip this step; you can add them later in the process if necessary. 5. Format your source files correctly.
| File type | How to format |
|---|---|
.go |
Format
Most file editors have a plugin to format for you. Check your editor's documentation. |
.md and non-.go files |
Wrap lines to 80 characters. |