diff options
Diffstat (limited to 'doc/developer-guide/Development-Workflow.md')
-rw-r--r-- | doc/developer-guide/Development-Workflow.md | 457 |
1 files changed, 0 insertions, 457 deletions
diff --git a/doc/developer-guide/Development-Workflow.md b/doc/developer-guide/Development-Workflow.md deleted file mode 100644 index 4c80327bff0..00000000000 --- a/doc/developer-guide/Development-Workflow.md +++ /dev/null @@ -1,457 +0,0 @@ -Development work flow of Gluster -================================ - -This document provides a detailed overview of the development model -followed by the GlusterFS project. - -For a simpler overview visit -[Simplified develoment workflow](./Simplified Development Workflow.md). - -Basics ------- - -The GlusterFS development model largely revolves around the features and -functionality provided by Git version control system, Gerrit code review -system and Jenkins continuous integration system. It is a primer for a -contributor to the project. - -### Git - -Git is a extremely flexible, distributed version control system. -GlusterFS' main git repository is at <http://git.gluster.org> and public -mirrors are at GlusterForge -(https://forge.gluster.org/glusterfs-core/glusterfs) and at GitHub -(https://github.com/gluster/glusterfs). The development repo is hosted -inside Gerrit and every code merge is instantly replicated to the public -mirrors. - -A good introduction to Git can be found at -<http://www-cs-students.stanford.edu/~blynn/gitmagic/>. - -### Gerrit - -Gerrit is an excellent code review system which is developed with a git -based workflow in mind. The GlusterFS project code review system is -hosted at [review.gluster.org](http://review.gluster.org). Gerrit works -on "Change"s. A change is a set of modifications to various files in -your repository to accomplish a task. It is essentially one large git -commit with all the necessary changes which can be both built and -tested. - -Gerrit usage is described later in 'Review Process' section. - -### Jenkins - -Jenkins is a Continuous Integration build system. Jenkins is hosted at -<http://build.gluster.org>. Jenkins is configured to work with Gerrit by -setting up hooks. Every "Change" which is pushed to Gerrit is -automatically picked up by Jenkins, built and smoke tested. Output of -all builds and tests can be viewed at -<http://build.gluster.org/job/smoke/>. Jenkins is also setup with a -'regression' job which is designed to execute test scripts provided as -part of the code change. - -Preparatory Setup ------------------ - -Here is a list of initial one-time steps before you can start hacking on -code. - -### Register - -Sign up for an account at <http://review.gluster.org> by clicking -'Register' on the right-hand top. You can use your gmail login as the -openID identity. - -### Preferred email - -On first login, add your git/work email to your identity. You will have -to click on the URL which is sent to your email and set up a proper Full -Name. Make sure you set your git/work email as your preferred email. -This should be the email address from which all your code commits are -associated. - -### Set Username - -Select yourself a username. - -### Watch glusterfs - -In Gerrit settings, watch the 'glusterfs' project. Tick on all the three -(New Changes, All Comments, Submitted Changes) types of notifications. - -### Email filters - -Set up a filter rule in your mail client to tag or classify mails with -the header - - List-Id: <gerrit-glusterfs.review.gluster.org> - -as mails originating from the review system. - -### SSH keys - -Provide your SSH public key into Gerrit so that you can successfully -access the development git repo as well as push changes for -review/merge. - -### Clone a working tree - -Get yourself a working tree by cloning the development repository from -Gerrit - - sh$ git clone ssh://[username)@]git.gluster.org/glusterfs.git glusterfs - -Branching policy ----------------- - -This section describes both, the branching policies on the public repo -as well as the suggested best-practice for local branching - -### Master/release branches - -In glusterfs.git, the master branch is the forward development branch. -This is where new features come in first. In fact this is where almost -every change (commit) comes in first. The master branch is always kept -in a buildable state and smoke tests pass. - -Release trains (3.1.z, 3.2.z, 3.2.z) each have a branch originating from -master. Code freeze of each new release train is marked by the creation -of the release-3.y branch. At this point no new features are added to -the release-3.y branch. All fixes and commits first get into master. -From there, only bug fixes get backported to the relevant release -branches. From the release-3.y branch, actual release code snapshots -(e.g. glusterfs-3.2.2 etc.) are tagged (git annotated tag with 'git tag --a') shipped as a tarball. - -### Personal per-task branches - -As a best practice, it is recommended you perform all code changes for a -task in a local branch in your working tree. The local branch should be -created from the upstream branch to which you intend to submit the -change. If you are submitting changes to master branch, first create a -local task branch like this - - - sh$ git checkout master - sh$ git branch bug-XYZ && git checkout bug-XYZ - ... <hack, commit> - -If you are backporting a fix to a release branch, or making a new change -to a release branch, your commands would be slightly different. If you -are checking out a release branch in your local working tree for the -first time, make sure to set it up as a remote tracking branch like this -- - - sh$ git checkout -b release-3.2 origin/release-3.2 - -The above step is not necessary to be repeated. In the future if you -want to work to the release branch - - - sh$ git checkout release-3.2 - sh$ git branch bug-XYZ-release-3.2 && git checkout bug-XYZ-release-3.2 - ... <cherry-pick, hack, commit> - -Building --------- - -### Environment Setup - -**For details about the required packages for the build environment -refer : [Building GlusterFS](./Building GlusterFS.md)** - -Ubuntu: - -To setup the build environment on an Ubuntu system, type the following -command to install the required packages: - - sudo apt-get -y install python-pyxattr libreadline-dev tar - python-pastedeploy python-simplejson python-sphinx python-webob libssl-dev - pkg-config python-dev python-eventlet python-netifaces libaio-dev libibverbs-dev - libtool libxml2-dev liblvm2-dev make autoconf automake bison dos2unix flex libfuse-dev - -CentOS/RHEL/Fedora: - -On Fedora systems, install the required packages by following the -instructions in [CompilingRPMS](./Compiling RPMS.md). - -### Creating build environment - -Once the required packages are installed for your appropiate system, -generate the build configuration: - - sh$ ./autogen.sh - sh$ ./configure --enable-fusermount - -### Build and install - -#### GlusterFS - -Ubuntu: - -Type the following to build and install GlusterFS on the system: - - sh$ make - sh$ make install - -CentOS/RHEL/Fedora: - -In an rpm based system, there are two methods to build GlusterFS. One is -to use the method describe above for *Ubuntu*. The other is to build and -install RPMS as described in [CompilingRPMS](./Compiling RPMS.md). - -#### GlusterFS UFO/SWIFT - -To build and run Gluster UFO you can do the following: - -1. Build, create, and install the RPMS as described in - [CompilingRPMS](./Compiling RPMS.md). -2. Configure UFO/SWIFT as described in [Howto Using UFO SWIFT - A quick - and dirty setup - guide](http://www.gluster.org/2012/09/howto-using-ufo-swift-a-quick-and-dirty-setup-guide) - -Commit policy -------------- - -For a Gerrit based work flow, each commit should be an independent, -buildable and testable change. Typically you would have a local branch -per task, and most of the times that branch will have one commit. - -If you have a second task at hand which depends on the changes of the -first one, then technically you can have it as a separate commit on top -of the first commit. But it is important that the first commit should be -a testable change by itself (if not, it is an indication that the two -commits are essentially part of a single change). Gerrit accommodates -these situations by marking Change 1 as a "dependency" of Change 2 -(there is a 'Dependencies' tab in the Change page in Gerrit) -automatically when you push the changes for review from the same local -branch. - -You will need to sign-off your commit (git commit -s) before sending the -patch for review. By signing off your patch, you agree to the terms -listed under "Developer's Certificate of Origin" section in the -CONTRIBUTING file available in the repository root. - -Provide a meaningful commit message. Your commit message should be in -the following format - -- A short one line subject describing what the patch accomplishes -- An empty line following the subject -- Situation necessitating the patch -- Description of the code changes -- Reason for doing it this way (compared to others) -- Description of test cases - -### Test cases - -Part of the workflow is to aggregate and execute pre-commit test cases -which accompany patches, cumulatively for every new patch. This -guarantees that tests which are working till the present are not broken -with the new patch. Every change submitted to Gerrit much include test -cases in - - tests/group/script.t - -as part of the patch. This is so that code changes and accompanying test -cases are reviewed together. All new commits now come under the -following categories w.r.t test cases: - -#### New 'group' directory and/or 'script.t' - -This is typically when code is adding a new module and/or feature - -#### Extend/Modify old test cases in existing scripts - -This is typically when present behavior (default values etc.) of code is -changed - -#### No test cases - -This is typically when code change is trivial (e.g. fixing typos in -output strings, code comments) - -#### Only test case and no code change - -This is typically when we are adding test cases to old code (already -existing before this regression test policy was enforced) - -More details on how to work with test case scripts can be found in - -tests/README - -Review process --------------- - -### rfc.sh - -After doing the local commit, it is time to submit the code for review. -There is a script available inside glusterfs.git called rfc.sh. You can -submit your changes for review by simply executing - - sh$ ./rfc.sh - -This script does the following: - -- The first time it is executed, it downloads a git hook from - <http://review.gluster.org/tools/hooks/commit-msg> and sets it up - locally to generate a Change-Id: tag in your commit message (if it - was not already generated.) -- Rebase your commit against the latest upstream HEAD. This rebase - also causes your commits to undergo massaging from the just - downloaded commit-msg hook. -- Prompt for a Bug Id for each commit (if it was not already provded) - and include it as a "BUG:" tag in the commit log. You can just hit - <enter> at this prompt if your submission is purely for review - purposes. -- Push the changes to review.gluster.org for review. If you had - provided a bug id, it assigns the topic of the change as "bug-XYZ". - If not it sets the topic as "rfc". - -On a successful push, you will see a URL pointing to the change in -review.gluster.org - -Auto verification ------------------ - -The integration between Jenkins and Gerrit triggers an event in Jenkins -on every push of changes, to pick up the change and run build and smoke -test on it. - -If the build and smoke tests execute successfuly, Jenkins marks the -change as '+0 Verified'. If they fail, '-1 Verified' is marked on the -change. This means passing the automated smoke test is a necessary -condition but not sufficient. - -It is important to note that Jenkins verification is only a generic -verification of high level tests. More concentrated testing effort for -the patch is necessary with manual verification. - -If auto verification fails, it is a good reason to skip code review till -a fixed change is pushed later. You can click on the build URL -automatically put as a comment to inspect the reason for auto -verification failure. In the Jenkins job page, you can click on the -'Console Output' link to see the exact point of failure. - -Reviewing / Commenting ----------------------- - -Code review with Gerrit is relatively easy compared to other available -tools. Each change is presented as multiple files and each file can be -reviewed in Side-by-Side mode. While reviewing it is possible to comment -on each line by double-clicking on it and writing in your comments in -the text box. Such in-line comments are saved as drafts, till you -finally publish them as a Review from the 'Change page'. - -There are many small and handy features in Gerrit, like 'starring' -changes you are interested to follow, setting the amount of context to -view in the side-by-side view page etc. - -Incorporate, Amend, rfc.sh, Reverify ------------------------------------- - -Code review comments are notified via email. After incorporating the -changes in code, you can mark each of the inline comment as 'done' -(optional). After all the changes to your local files, amend the -previous commit with these changes with - - - sh$ git commit -a --amend - -Push the amended commit by executing rfc.sh. If your previous push was -an "rfc" push (i.e, without a Bug Id) you will be prompted for a Bug Id -again. You can re-push an rfc change without any other code change too -by giving a Bug Id. - -On the new push, Jenkins will re-verify the new change (independent of -what the verification result was for the previous push). - -It is the Change-Id line in the commit log (which does not change) that -associates the new push as an update for the old push (even though they -had different commit ids) under the same Change. In the side-by-side -view page, it is possible to set knobs in the 'Patch History' tab to -view changes between patches as well. This is handy to inspect how -review comments were incorporated. - -If further changes are found necessary, comments can be made on the new -patch as well, and the same cycle repeats. - -If no further changes are necessary, the reviewer can mark the patch as -reviewed with a certain score depending on the depth of review and -confidence (+1 or +2). A -1 review indicates non-agreement for the -change to get merged upstream. - -Regression tests and test cases -------------------------------- - -All code changes which are not trivial (typo fixes, code comment -changes) must be accompanied with either a new test case script or -extend/modify an existing test case script. It is important to review -the test case in conjunction with the code change to analyse whether the -code change is actually verified by the test case. - -Regression tests (i.e, execution of all test cases accumulated with -every commit) is not automatically triggered as the test cases can be -extensive and is quite expensive to execute for every change submission -in the review/resubmit cycle. Instead it is triggered by the -maintainers, after code review. Passing the regression test is a -necessary condition for merge along with code review points. - -Submission Qualifiers ---------------------- - -For a change to get merged, there are two qualifiers which are enforced -by the Gerrit system. They are - A change should have at least one '+2 -Reviewed', and a change should have at least one '+1 Verified' -(regression test). The project maintainer will merge the changes once a -patch meets these qualifiers. - -Submission Disqualifiers ------------------------- - -There are three types of "negative votes". - --1 Verified - --1 Code-Review ("I would prefer that you didn't submit this") - --2 Code-Review ("Do not submit") - -The implication and scope of each of the three are different. They -behave differently as changes are resubmitted as new patchsets. - -### -1 Verified - -Anybody voting -1 Verified will prevent \*that patchset only\* from -getting merged. The flag is automatically cleared on the next patchset -post. The intention is that this vote is based on the result of some -kind of testing. A voter is expected to explain the test case which -failed. Jenkins jobs (smoke, regression, ufounit) use this field for -voting -1/0/+1. When voting -1, Jenkins posts the link to the URL which -has the console output of the failed job. - -### -1 Code-Review ("I would prefer that you didn't submit this") - -This is an advisory vote based on the content of the patch. Typically -issues in source code (both design and implementation), source code -comments, log messages, license headers etc. found by human inspection. -The reviewer explains the specific issues by commenting against the most -relevant lines of source code in the patch. On a resubmission, -1 votes -are cleared automatically. It is the responsibility of the maintainers -to honor -1 Code-Review votes from reviewers (by not merging the -patches), and inspecting that -1 comments on previous submissions are -addressed in the new patchset. Generally this is the recommended -"negative" vote. - -### -2 Code-Review ("Do not submit") - -This is a stronger vote which actually prevents Gerrit from merging the -patch. The -2 vote persists even after resubmission and continues to -prevent the patch from getting merged, until the voter revokes the -2 -vote (and then is further subjected to Submission Qualifiers). Typically -one would vote -2 if they are \*against the goal\* of what the patch is -trying to achieve (and not an issue with the patch, which can change on -resubmission). A reviewer would also vote -2 on a patch even if there is -agreement with the goal, but the issue in the code is of such a critical -nature that the reviewer personally wants to inspect the next patchset -and only then revoke the vote after finding the new patch satisfactory. -This prevents the merge of the patch in the mean time. Every registered -user has the right to exercise the -2 Code review vote, and cannot be -overridden by the maintainers. |