|  | = Working with Gerrit: An example | 
|  |  | 
|  | To understand how Gerrit works, let's follow a change through its entire | 
|  | life cycle. This example uses a Gerrit server configured as follows: | 
|  |  | 
|  | * *Hostname*: gerrithost | 
|  | * *HTTP interface port*: 80 | 
|  | * *SSH interface port*: 29418 | 
|  |  | 
|  | In this walkthrough, we'll follow two developers, Max and Hannah, as they make | 
|  | and review a change to a +RecipeBook+ project. We'll follow the change through | 
|  | these stages: | 
|  |  | 
|  | . Making the change. | 
|  | . Creating the review. | 
|  | . Reviewing the change. | 
|  | . Reworking the change. | 
|  | . Verifying the change. | 
|  | . Submitting the change. | 
|  |  | 
|  | NOTE: The project and commands used in this section are for demonstration | 
|  | purposes only. | 
|  |  | 
|  | == Making the Change | 
|  |  | 
|  | Our first developer, Max, has decided to make a change to the +RecipeBook+ | 
|  | project he works on. His first step is to get the source code that he wants to | 
|  | modify. To get this code, he runs the following `git clone` command: | 
|  |  | 
|  | ---- | 
|  | git clone ssh://gerrithost:29418/RecipeBook.git RecipeBook | 
|  | ---- | 
|  |  | 
|  | After he clones the repository, he runs a couple of commands to add a | 
|  | link:user-changeid.html[Change-Id] to his commits. This ID allows Gerrit to link | 
|  | together different versions of the same change being reviewed. | 
|  |  | 
|  | .... | 
|  | scp -p -P 29418 gerrithost:hooks/commit-msg RecipeBook/.git/hooks/ | 
|  | chmod u+x .git/hooks/commit-msg | 
|  | .... | 
|  |  | 
|  | NOTE: To learn more about adding a change-id and the commit message hook, see | 
|  | the link:cmd-hook-commit-msg.html[commit-msg Hook] topic. | 
|  |  | 
|  | == Creating the Review | 
|  |  | 
|  | Max's next step is to push his change to Gerrit so other contributors can review | 
|  | it. He does this using the `git push origin HEAD:refs/for/master` command, as | 
|  | follows: | 
|  |  | 
|  | ---- | 
|  | $ <work> | 
|  | $ git commit | 
|  | [master 3cc9e62] Change to a proper, yeast based pizza dough. | 
|  | 1 file changed, 10 insertions(+), 5 deletions(-) | 
|  | $ git push origin HEAD:refs/for/master | 
|  | Counting objects: 3, done. | 
|  | Delta compression using up to 8 threads. | 
|  | Compressing objects: 100% (2/2), done. | 
|  | Writing objects: 100% (3/3), 532 bytes | 0 bytes/s, done. | 
|  | Total 3 (delta 0), reused 0 (delta 0) | 
|  | remote: Processing changes: new: 1, done | 
|  | remote: | 
|  | remote: New Changes: | 
|  | remote:   http://gerrithost/#/c/RecipeBook/+/702 Change to a proper, yeast based pizza dough. | 
|  | remote: | 
|  | To ssh://gerrithost:29418/RecipeBook | 
|  | * [new branch]      HEAD -> refs/for/master | 
|  | ---- | 
|  |  | 
|  | Notice the reference to a `refs/for/master` branch. Gerrit uses this branch to | 
|  | create reviews for the master branch. If Max opted to push to a different | 
|  | branch, he would have modified his command to | 
|  | `git push origin HEAD:refs/for/<branch_name>`. Gerrit accepts pushes to | 
|  | `refs/for/<branch_name>` for every branch that it tracks. | 
|  |  | 
|  | The output of this command also contains a link to a web page Max can use to | 
|  | review this commit. Clicking on that link takes him to a screen similar to | 
|  | the following. | 
|  |  | 
|  | .Gerrit Code Review Screen | 
|  | image::images/intro-quick-new-review.png[Gerrit Review Screen] | 
|  |  | 
|  | This is the Gerrit code review screen, where other contributors can review | 
|  | his change. Max can also perform tasks such as: | 
|  |  | 
|  | * Looking at the link:user-review-ui.html#diff-preferences[diff] of his change | 
|  | * Writing link:user-review-ui.html#inline-comments[inline] or | 
|  | link:user-review-ui.html#reply[summary] comments to ask reviewers for advice | 
|  | on particular aspects of the change | 
|  | * link:intro-user.html#adding-reviewers[Adding a list of people] that should | 
|  | review the change | 
|  |  | 
|  | In this case, Max opts to manually add the senior developer on his team, Hannah, | 
|  | to review his change. | 
|  |  | 
|  | == Reviewing the Change | 
|  |  | 
|  | Let's now switch to Hannah, the senior developer who will review Max's change. | 
|  |  | 
|  | As mentioned previously, Max chose to manually add Hannah as a reviewer. Gerrit | 
|  | offers other ways for reviewers to find changes, including: | 
|  |  | 
|  | * Using the link:user-search.html[search] feature that to find changes | 
|  | * Selecting *Open* from the *Changes* menu | 
|  | * Setting up link:user-notify.html[email notifications] to stay informed of | 
|  | changes even if you are not added as a reviewer | 
|  |  | 
|  | Because Max added Hannah as a reviewer, she receives an email telling her about | 
|  | his change. She opens up the Gerrit code review screen and selects Max's change. | 
|  |  | 
|  | Notice the *Label status* section above: | 
|  |  | 
|  | ---- | 
|  | Label Status Needs label: | 
|  | * Code-Review | 
|  | * Verified | 
|  | ---- | 
|  |  | 
|  | These two lines indicate what checks must be completed before the change is | 
|  | accepted. The default Gerrit workflow requires two checks: | 
|  |  | 
|  | * *Code-Review*. This check requires that someone look at the code and ensures | 
|  | that it meets project guidelines, styles, and other criteria. | 
|  | * *Verified*. This check means that the code actually compiles, passes any unit | 
|  | tests, and performs as expected. | 
|  |  | 
|  | In general, the *Code-Review* check requires an individual to look at the code, | 
|  | while the *Verified* check is done by an automated build server, through a | 
|  | mechanism such as the | 
|  | link:https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger[Gerrit Trigger | 
|  | Jenkins Plugin]. | 
|  |  | 
|  | IMPORTANT: The Code-Review and Verified checks require different permissions | 
|  | in Gerrit. This requirement allows teams to separate these tasks. For example, | 
|  | an automated process can have the rights to verify a change, but not perform a | 
|  | code review. | 
|  |  | 
|  | With the code review screen open, Hannah can begin to review Max's change. She | 
|  | can choose one of two ways to review the change: unified or side-by-side. | 
|  | Both views allow her to perform tasks such as add | 
|  | link:user-review-ui.html#inline-comments[inline] or | 
|  | link:user-review-ui.html#reply[summary] comments. | 
|  |  | 
|  | Hannah opts to view the change using Gerrit's side-by-side view: | 
|  |  | 
|  | .Side By Side Patch View | 
|  | image::images/intro-quick-review-line-comment.png[Adding a Comment] | 
|  |  | 
|  | Hannah reviews the change and is ready to provide her feedback. She clicks the | 
|  | *REPLY* button on the change screen. This allows her to vote on the change. | 
|  |  | 
|  | .Reviewing the Change | 
|  | image::images/intro-quick-reviewing-the-change.png[Reviewing the Change] | 
|  |  | 
|  | For Hannah and Max's team, a code review vote is a numerical score between -2 | 
|  | and 2. The possible options are: | 
|  |  | 
|  | * `+2 Looks good to me, approved` | 
|  | * `+1 Looks good to me, but someone else must approve` | 
|  | * `0 No score` | 
|  | * `-1 I would prefer that you didn't submit this` | 
|  | * `-2 Do not submit` | 
|  |  | 
|  | In addition, a change must have at least one `+2` vote and no `-2` votes before | 
|  | it can be submitted. These numerical values do not accumulate. Two | 
|  | `+1` votes do not equate to a `+2`. | 
|  |  | 
|  | NOTE: These settings are enabled by default. To learn about how to customize | 
|  | them for your own workflow, see the | 
|  | link:config-project-config.html[Project Configuration File Format] topic. | 
|  |  | 
|  | Hannah notices a possible issue with Max's change, so she selects a `-1` vote. | 
|  | She uses the *Cover Message* text box to provide Max with some additional | 
|  | feedback. When she is satisfied with her review, Hannah clicks the | 
|  | *SEND* button. At this point, her vote and cover message become | 
|  | visible to to all users. | 
|  |  | 
|  | == Reworking the Change | 
|  |  | 
|  | Later in the day, Max decides to check on his change and notices Hannah's | 
|  | feedback. He opens up the source file and incorporates her feedback. Because | 
|  | Max's change includes a change-id, all he has to do is follow the typical git | 
|  | workflow for updating a commit: | 
|  |  | 
|  | * Check out the commit | 
|  | * Amend the commit | 
|  | * Push the commit to Gerrit | 
|  |  | 
|  | ---- | 
|  | $ <checkout first commit> | 
|  | $ <rework> | 
|  | $ git commit --amend | 
|  | [master 30a6f44] Change to a proper, yeast based pizza dough. | 
|  | Date: Fri Jun 8 16:28:23 2018 +0200 | 
|  | 1 file changed, 10 insertions(+), 5 deletions(-) | 
|  | $ git push origin HEAD:refs/for/master | 
|  | Counting objects: 3, done. | 
|  | Delta compression using up to 8 threads. | 
|  | Compressing objects: 100% (2/2), done. | 
|  | Writing objects: 100% (3/3), 528 bytes | 0 bytes/s, done. | 
|  | Total 3 (delta 0), reused 0 (delta 0) | 
|  | remote: Processing changes: updated: 1, done | 
|  | remote: | 
|  | remote: Updated Changes: | 
|  | remote:   http://gerrithost/#/c/RecipeBook/+/702 Change to a proper, yeast based pizza dough. | 
|  | remote: | 
|  | To ssh://gerrithost:29418/RecipeBook | 
|  | * [new branch]      HEAD -> refs/for/master | 
|  | ---- | 
|  |  | 
|  | Notice that the output of this command is slightly different from Max's first | 
|  | commit. This time, the output verifies that the change was updated. | 
|  |  | 
|  | Having uploaded the reworked commit, Max can go back to the Gerrit web | 
|  | interface, look at his change and diff the first patch set with his rework in | 
|  | the second one. Once he has verified that the rework follows Hannahs | 
|  | recommendation he presses the *DONE* button to let Hannah know that she can | 
|  | review the changes. | 
|  |  | 
|  | When Hannah next looks at Max's change, she sees that he incorporated her | 
|  | feedback. The change looks good to her, so she changes her vote to a `+2`. | 
|  |  | 
|  | == Verifying the Change | 
|  |  | 
|  | Hannah's `+2` vote means that Max's change satisfies the *Needs Review* | 
|  | check. It has to pass one more check before it can be accepted: the *Needs | 
|  | Verified* check. | 
|  |  | 
|  | The Verified check means that the change was confirmed to work. This type of | 
|  | check typically involves tasks such as checking that the code compiles, unit | 
|  | tests pass, and other actions. You can configure a Verified check to consist | 
|  | of as many or as few tasks as needed. | 
|  |  | 
|  | NOTE: Remember that this walkthrough uses Gerrit's default workflow. Projects | 
|  | can add custom checks or even remove the Verified check entirely. | 
|  |  | 
|  | Verification is typically an automated process using the | 
|  | link:https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger[Gerrit Trigger Jenkins Plugin] | 
|  | or a similar mechanism. However, there are still times when a change requires | 
|  | manual verification, or a reviewer needs to check how or if a change works. | 
|  | To accommodate these and other similar circumstances, Gerrit exposes each change | 
|  | as a git branch. The Gerrit UI includes a | 
|  | link:user-review-us.html#download[*download*] link in the Gerrit Code Review | 
|  | Screen to make it easy for reviewers to fetch a branch for a specific change. | 
|  | To manually verify a change, a reviewer must have the | 
|  | link:config-labels.html#label_Verified[Verified] permission. Then, the reviewer | 
|  | can fetch and checkout that branch from Gerrit. Hannah has this permission, so | 
|  | she is authorized to manually verify Max's change. | 
|  |  | 
|  | NOTE: The Verifier can be the same person as the code reviewer or a | 
|  | different person entirely. | 
|  |  | 
|  | .Verifying the Change | 
|  | image::images/intro-quick-verifying.png[Verifying the Change] | 
|  |  | 
|  | Unlike the code review check, the verify check is pass/fail. Hannah can provide | 
|  | a score of either `+1` or `-1`. A change must have at least one `+1` and no | 
|  | `-1`. | 
|  |  | 
|  | Hannah selects a `+1` for her verified check. Max's change is now ready to be | 
|  | submitted. | 
|  |  | 
|  | == Submitting the Change | 
|  |  | 
|  | Max is now ready to submit his change. He opens up the change in the Code Review | 
|  | screen and clicks the *SUBMIT* button. | 
|  |  | 
|  | At this point, Max's change is merged into the repository's master branch and | 
|  | becomes an accepted part of the project. | 
|  |  | 
|  | == Next Steps | 
|  |  | 
|  | This walkthrough provided a quick overview of how a change moves | 
|  | through the default Gerrit workflow. At this point, you can: | 
|  |  | 
|  | * Read the link:intro-user.html[Users guide] to get a better sense of how to | 
|  | make changes using Gerrit | 
|  | * Review the link:intro-project-owner.html[Project Owners guide] to learn more | 
|  | about configuring projects in Gerrit, including setting user permissions and | 
|  | configuring verification checks | 
|  |  | 
|  | GERRIT | 
|  | ------ | 
|  | Part of link:index.html[Gerrit Code Review] | 
|  |  | 
|  | SEARCHBOX | 
|  | --------- |