Project

General

Profile

HOWTO populate the integration branch » History » Revision 13

Revision 12 (Loïc Dachary, 04/17/2015 09:41 AM) → Revision 13/31 (Loïc Dachary, 04/17/2015 09:47 AM)

Before a backported commit can be merged into the release branch, it must be tested in an integration branch. It serves two purposes: 

 * Detect trivial problems that would break the upgrade tests run on the release branch (they are run at the tip of the branch, not at the latest point release) 
 * Do not pollute the release branch with reverted commits (commits would have to be reverted because the stable branch must never (because it cannot be rebased) 

 Let say the release to be tested is *$release* (i.e. giant for instance) and your local clone has two remotes: *origin* which is your read/write fork of the official ceph repository and *ceph* which is the read only official ceph repository. 
 <pre> 
 ceph 	 https://github.com/ceph/ceph.git (fetch) 
 ceph 	 https://github.com/ceph/ceph.git (push) 
 origin 	 git@github.com:dachary/ceph.git (fetch) 
 origin 	 git@github.com:dachary/ceph.git (push) 
 </pre> 

 * Create a $release-backport branch locally if it does not already exists: *git checkout -b $release-backports ceph/$release* 
 * Reset it to ceph/$release: *git reset --hard ceph/$release* 
 * Fetch all pull requests from github. Each pull request XXX has its own branch in the official ceph repository, named *pull/XXX* 
 ** Retrieve the commits of the pull request XXX: *git fetch --force ceph +refs/pull/XXX/head:refs/remotes/ceph/pull/XXX/head* 
 ** Get the title of the pull request: *eval title=$(curl --silent https://api.github.com/repos/ceph/ceph/pulls/XXX | jq .title)* 
 ** Merge the pull request in the local integration branch. The *--no-ff* ensures that even if the merge commit could be skipped, it will not be. *git merge --no-ff -m "$(echo -e "Merge XXX: $title\n\nReviewed-by: Myself <me@me.com>")" ceph/pull/XXX/head* 
 * Modify the pull requests individually to fix merge conflicts (i.e. they must merge cleanly, which may involving aggregating two pull requests into a single one designed to properly resolve the conflict).  
 * Push the integration branch to github: *git push --force origin $release-backports* 
 * Verify the integration branch compiles and passes make check 
 ** On the local machine: *./run-make-check.sh* 
 ** Via the make check bot by creating a pull request with the $release-backports* integration branch 
 * Push the integration branch to the official repository: *git push --force ceph $release-backports* (requires write permission to the ceph repository) 

 The following snippet summarizes all the actions above: 
 <pre> 
 release=hammer 
 PRS="3963 4185" 
 reviewer='Loic Dachary <ldachary@redhat.com>' 
 git checkout -b $release-backport ceph/$release 
 git reset --hard ceph/$release 
 git fetch --force ceph $(for ref in $PRS ; do echo +refs/pull/$ref/head:refs/remotes/ceph/pull/$ref/head ; echo +refs/pull/$ref/merge:refs/remotes/ceph/pull/$ref/merge ; done) 
 for pr in $PRS ; do eval title=$(curl --silent https://api.github.com/repos/ceph/ceph/pulls/$pr | jq .title) ; echo $title ; git log --oneline ceph/pull/$pr/merge^1..ceph/pull/$pr/merge^2 ; git merge --no-ff -m "$(echo -e "Merge $pr: $title\n\nReviewed-by: $reviewer")" ceph/pull/$pr/head ; done 
 git push --force origin $release-backports 
 </pre>