Project

General

Profile

Actions

HOWTO backport commits » History » Revision 17

« Previous | Revision 17/52 (diff) | Next »
Nathan Cutler, 05/10/2015 11:45 AM
add | tr -d '\\"' to title pipe chain


Backport issues

  • Pick one entry with the highest Severity field in the list of issues linked from the top level page (for instance firefly issues) and look for more information about it in the inventory page (for instance the firefly inventory page not only shows issues but also discovers pull requests, commits and backports to other stable branches). Note that Severity is different from Priority. Severity is not used while working on the bug, it's used to prioritize backports only. An issue marked with a high Priority may not need to be backported with the same priority.
  • git clone a fork of http://github.com/ceph/ceph
  • git 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 issue
  • git cherry-pick -x the commits from the pull request that was targeting master (not from the pull requests targeting stable branches)
  • 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
  • create a pull request from the wip-$issue-$release branch with the same title as the issue
    account=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
  • Add a link to the pull request in the issue formatted as follows :
    * $release backport http://github.com/ceph/ceph/pull/XXX*
    

    the following snippet does that:
    curl --verbose -X PUT --header 'Content-type: application/json' --data-binary '{"issue":{"notes":"* '$release' backport https://github.com/ceph/ceph/pull/'$number'"}}' '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)
  • assign the pull request to the lead after it passed integration and upgrade tests

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
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_repo':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
curl --verbose -X PUT --header 'Content-type: application/json' --data-binary '{"issue":{"notes":"* '$release' backport https://github.com/ceph/ceph/pull/'$number'"}}' 'http://tracker.ceph.com/issues/'$issue.json?key=$redmine_key
firefox http://tracker.ceph.com/issues/$issue

Updated by Nathan Cutler about 9 years ago · 17 revisions