Project

General

Profile

HOWTO backport commits » History » Version 33

Nathan Cutler, 12/01/2015 04:31 PM
fix up script: add set -x and change conditional from == to !=

1 24 Loïc Dachary
h3. Backport commits
2 1 Loïc Dachary
3 18 Loïc Dachary
* Pick one entry with the highest *Priority* field in the list of backports linked from [[HOWTO|the top level page]] (for instance "hammer backports":http://tracker.ceph.com/projects/ceph/issues?query_id=78) 
4 23 Nathan Cutler
* <code>git clone</code> a fork of http://github.com/ceph/ceph
5
* <code>git checkout -b wip-$issue-$release origin/$release</code> 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
6 32 Loïc Dachary
* <code>git cherry-pick -x</code> the commits from the pull request that was targeting <code>master</code> (not from the pull requests targeting stable branches -- with the exception of the upcoming stable branch, which can be used because all commits to the upcoming stable branch are merged into <code>master</code> on a regular basis)
7 19 Loïc Dachary
** the original issue is linked in the *Related issues* section of the issue, as a *Copied from* link
8
** the pull request or commit targeting master can be found by following the *Copied from* link and searching the original issue
9 23 Nathan Cutler
* <code>git push origin wip-$issue-$release</code> to publish the branch on github and be able to create a pull request from it
10 16 Loïc Dachary
* generate a *$github_token* by "following the GitHub instructions":https://help.github.com/articles/creating-an-access-token-for-command-line-use/
11 14 Loïc Dachary
* retrieve the *$redmine_key*: it is a token that will allow you to script issue updates
12
** login http://tracker.ceph.com/
13
** visit http://tracker.ceph.com/my/account
14
** look for *API access key* in the page (Control-f)
15
** click on the *Show* link just under *API access key*
16
** copy the hexadecimal number it shows
17
** redmine_key=b586ce6a7a936e71f351c93ac0b65a588d4333
18 23 Nathan Cutler
* create a pull request from the <code>wip-$issue-$release</code> branch with the same title as the issue
19 7 Loïc Dachary
<pre>
20 10 Loïc Dachary
account=myaccount
21 7 Loïc Dachary
eval title=$(curl --silent 'http://tracker.ceph.com/issues/'$issue.json?key=$redmine_key | jq .issue.subject) ; echo $title
22 10 Loïc Dachary
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)
23
</pre>
24 13 Loïc Dachary
* 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)
25 10 Loïc Dachary
<pre>
26
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
27
</pre>
28
* wait for the make check bot to run the *run-make-check.sh* script on the branch that was pushed and verify it works
29 29 Loïc Dachary
* Set the issue description to only contain the URL to the pull request and change the status to *In Progress*
30 1 Loïc Dachary
<pre>
31 29 Loïc Dachary
redmine_status=2 # In Progress
32
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
33 2 Loïc Dachary
</pre>
34
* if there is a conflict explain how it was resolved in the commit message, below the Conflicts line. For instance:
35
<pre>
36
commit c60da2f3c34e7325c748d2d6e55140a0a30013fd
37
Author: Samuel Just <sjust@redhat.com>
38
Date:   Thu Nov 20 15:15:08 2014 -0800
39 1 Loïc Dachary
40
    PGLog: include rollback_info_trimmed_to in (read|write)_log
41
    
42
    Fixes: #10157
43
    Backport: firefly, giant
44
    Signed-off-by: Samuel Just <sjust@redhat.com>
45
    (cherry picked from commit 1fe8b846641486cc294fe7e1d2450132c38d2dba)
46
    
47
    Conflicts:
48
    	src/osd/PGLog.cc
49
            in the context coll_t::META_COLL was replaced with META_COLL
50
</pre>
51
* The difference between the original commit and the one including a conflict resolution can be displayed with
52 11 Loïc Dachary
<pre>
53
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)
54
</pre>
55 18 Loïc Dachary
* if the conflict is difficult to resolve, seek help from the author of the original commit (see "librbd: deadlock in image refresh":https://github.com/ceph/ceph/pull/4176 for instance) and assign the issue to her/him, or to a [[HOWTO#Leads|lead]]
56 25 Nathan Cutler
57
Do not merge the pull request yet. Merging only takes place after the backports pass [[HOWTO run integration and upgrade tests|integration and upgrade tests]] and with proper approval as described in [[HOWTO merge commits from the integration branch]].
58 1 Loïc Dachary
59 28 Nathan Cutler
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.
60
61 10 Loïc Dachary
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.
62
63 17 Nathan Cutler
Here are the snippets above grouped together for easier copy/paste:
64 10 Loïc Dachary
<pre>
65 33 Nathan Cutler
set -x
66 10 Loïc Dachary
redmine_key=b586c588d4333
67 30 Loïc Dachary
redmine_user_id=789 # as found in the URL near "Logged in as " top right of each page
68 10 Loïc Dachary
github_token=bc275830c635
69 12 Loïc Dachary
github_user=dachary
70 10 Loïc Dachary
issue=$1
71
# can't seem to extract the release number with the api
72
release=giant ; release_number=2
73 1 Loïc Dachary
release=firefly ; release_number=3
74
release=hammer ; release_number=5
75
release=infernalis ; release_number=7
76 33 Nathan Cutler
if [ $(curl --silent http://tracker.ceph.com/issues/$issue.json | jq -r .issue.tracker.name) != "Backport" ]
77
then
78
    echo "not a backport issue"
79
    exit 1
80
fi
81 12 Loïc Dachary
git checkout -f -b wip-$issue-$release ceph/$release
82
git cherry-pick -x .....
83 10 Loïc Dachary
git push loic wip-$issue-$release ; sleep 2 # let github catch up
84 1 Loïc Dachary
title=$(curl --silent 'http://tracker.ceph.com/issues/'$issue.json?key=$redmine_key | jq .issue.subject | tr -d '\\"')
85 17 Nathan Cutler
echo "Issue title: $title"
86 22 Loïc Dachary
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)
87 1 Loïc Dachary
echo "Opened pull request $number"
88
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
89 12 Loïc Dachary
firefox https://github.com/ceph/ceph/pull/$number
90 1 Loïc Dachary
redmine_status=2 # In Progress
91 30 Loïc Dachary
curl --verbose -X PUT --header 'Content-type: application/json' --data-binary '{"issue":{"description":"https://github.com/ceph/ceph/pull/'$number'","status_id":'$redmine_status',"assigned_to_id":'$redmine_user_id'}}' 'http://tracker.ceph.com/issues/'$issue.json?key=$redmine_key
92 10 Loïc Dachary
firefox http://tracker.ceph.com/issues/$issue
93
</pre>
94 26 Nathan Cutler
95 29 Loïc Dachary
If you would like to automate update of the tracker target version, try something like this instead of the last <code>curl</code> command:
96 26 Nathan Cutler
<pre>
97
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
98
</pre>
99 27 Nathan Cutler
The values of <code>$redmine_status</code> and <code>$redmine_fixed_version</code> can be determined by setting the desired values in an issue and then peeking at the JSON using a command like this:
100
<pre>
101
curl --silent 'http://tracker.ceph.com/issues/12395.json'
102
</pre>