HOWTO backport commits » History » Revision 29
« Previous |
Revision 29/52
(diff)
| Next »
Loïc Dachary, 08/11/2015 08:27 AM
Backport commits¶
- Pick one entry with the highest Priority field in the list of backports linked from the top level page (for instance hammer backports)
git clone
a fork of http://github.com/ceph/cephgit checkout -b wip-$issue-$release origin/$release
to create a branch with a name that reflects the issue being fixed and the target release: this naming is convenient to select all branches containing backports for firefly or select all branches containing backports for a specific issuegit cherry-pick -x
the commits from the pull request that was targetingmaster
(not from the pull requests targeting stable branches -- with the exception ofnext
, which can be used because all commits tonext
are merged intomaster
on a regular basis)- the original issue is linked in the Related issues section of the issue, as a Copied from link
- the pull request or commit targeting master can be found by following the Copied from link and searching the original issue
git push origin wip-$issue-$release
to publish the branch on github and be able to create a pull request from it- generate a $github_token by following the GitHub instructions
- retrieve the $redmine_key: it is a token that will allow you to script issue updates
- login http://tracker.ceph.com/
- visit http://tracker.ceph.com/my/account
- look for API access key in the page (Control-f)
- click on the Show link just under API access key
- copy the hexadecimal number it shows
- redmine_key=b586ce6a7a936e71f351c93ac0b65a588d4333
- create a pull request from the
wip-$issue-$release
branch with the same title as the issueaccount=myaccount eval title=$(curl --silent 'http://tracker.ceph.com/issues/'$issue.json?key=$redmine_key | jq .issue.subject) ; echo $title number=$(curl --silent --data-binary '{"title":"'"$title"'","head":"'$account':wip-'$issue-$release'","base":"'$release'","body":"http://tracker.ceph.com/issues/'$issue'"}' 'https://api.github.com/repos/ceph/ceph/pulls?access_token='$github_token | jq .number)
- assigned the pull request to yourself (because it needs to got through integration tests before it can be approved by the original author), add the relevant labels (rgw, core, bug fix, feature...) and set the milestone to $release (requires write permission to the ceph repository)
component=core ; curl --silent --data-binary '{"milestone":"'$release_number'","assignee":"'$account'","labels":["bug fix","'$component'"]}' 'https://api.github.com/repos/ceph/ceph/issues/'$number'?access_token='$github_token
- wait for the make check bot to run the run-make-check.sh script on the branch that was pushed and verify it works
- Set the issue description to only contain the URL to the pull request and change the status to In Progress
redmine_status=2 # In Progress curl --verbose -X PUT --header 'Content-type: application/json' --data-binary '{"issue":{"description":"https://github.com/ceph/ceph/pull/'$number'","status_id":'$redmine_status'}}' 'http://tracker.ceph.com/issues/'$issue.json?key=$redmine_key
- if there is a conflict explain how it was resolved in the commit message, below the Conflicts line. For instance:
commit c60da2f3c34e7325c748d2d6e55140a0a30013fd Author: Samuel Just <sjust@redhat.com> Date: Thu Nov 20 15:15:08 2014 -0800 PGLog: include rollback_info_trimmed_to in (read|write)_log Fixes: #10157 Backport: firefly, giant Signed-off-by: Samuel Just <sjust@redhat.com> (cherry picked from commit 1fe8b846641486cc294fe7e1d2450132c38d2dba) Conflicts: src/osd/PGLog.cc in the context coll_t::META_COLL was replaced with META_COLL
- The difference between the original commit and the one including a conflict resolution can be displayed with
commit=c7d0d51cb574594de6f09457c960347b11fc2474 ; picked_from=$(git show --no-patch --pretty=%b $commit | perl -ne 'print if(s/.*cherry picked from commit (\w+).*/$1/)') ; diff -u --ignore-matching-lines '^[^+-]' <(git show $picked_from) <(git show $commit)
- if the conflict is difficult to resolve, seek help from the author of the original commit (see librbd: deadlock in image refresh for instance) and assign the issue to her/him, or to a lead
Do not merge the pull request yet. Merging only takes place after the backports pass integration and upgrade tests and with proper approval as described in HOWTO merge commits from the integration branch.
When the backport PR is opened, you can update the backport tracker issue: set Status to "In Progress" and Target version to the version you are working on.
All commits being backported must be cherry-picked from master. There are exceptions to this rule (see https://github.com/ceph/ceph/pull/4175 for instance: it fixes a regression introduced by an incorrect resolution of a backport) but they are rare. When a backport is done to fix a bug that shows in the integration tests or upgrade tests run by cron, testing the backport in an integration branch is redundant because the existing tests will keep failing.
Here are the snippets above grouped together for easier copy/paste:
redmine_key=b586c588d4333 github_token=bc275830c635 github_user=dachary issue=$1 # can't seem to extract the release number with the api release=giant ; release_number=2 release=firefly ; release_number=3 release=hammer ; release_number=5 [ $(curl --silent http://tracker.ceph.com/issues/$issue.json | jq -r .issue.tracker.name) == "Backport" ] || echo "not a backport issue" && exit 1 git checkout -f -b wip-$issue-$release ceph/$release git cherry-pick -x ..... git push loic wip-$issue-$release ; sleep 2 # let github catch up title=$(curl --silent 'http://tracker.ceph.com/issues/'$issue.json?key=$redmine_key | jq .issue.subject | tr -d '\\"') echo "Issue title: $title" number=$(curl --silent --data-binary '{"title":"'"$title"'","head":"'$github_user':wip-'$issue-$release'","base":"'$release'","body":"http://tracker.ceph.com/issues/'$issue'"}' 'https://api.github.com/repos/ceph/ceph/pulls?access_token='$github_token | jq .number) echo "Opened pull request $number" component=core ; curl --silent --data-binary '{"milestone":"'$release_number'","assignee":"'$github_user'","labels":["bug fix","'$component'"]}' 'https://api.github.com/repos/ceph/ceph/issues/'$number'?access_token='$github_token firefox https://github.com/ceph/ceph/pull/$number redmine_status=2 # In Progress curl --verbose -X PUT --header 'Content-type: application/json' --data-binary '{"issue":{"description":"https://github.com/ceph/ceph/pull/'$number'","status_id":'$redmine_status'}}' 'http://tracker.ceph.com/issues/'$issue.json?key=$redmine_key firefox http://tracker.ceph.com/issues/$issue
If you would like to automate update of the tracker target version, try something like this instead of the last curl
command:
curl --verbose -X PUT --header 'Content-type: application/json' --data-binary '{"issue":{"description":"https://github.com/ceph/ceph/pull/'$number'","status_id":'$redmine_status',"fixed_version_id":'$redmine_fixed_version'}}' 'http://tracker.ceph.com/issues/'$issue.json?key=$redmine_key
The values of
$redmine_status
and $redmine_fixed_version
can be determined by setting the desired values in an issue and then peeking at the JSON using a command like this:curl --silent 'http://tracker.ceph.com/issues/12395.json'
Updated by Loïc Dachary over 8 years ago · 29 revisions