如何进行cherry-pick的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
尽管Kubernetes拥有众多分支,但社区主要围绕在master分支进行开发。即便其他分支存在bug,通常也是先在master分支进行修复,然后再cherry-pick到其他分支。
软件开发不可避免的会出现bug,所以经常需要从master同步一些补丁到其他仍在维护的分支。而同步的手段可以有多种:
手动提交PR到其他分支;
自动提交PR到其他分支;
一般来说,自动提交的方式更普遍,它能把某个master已合入的PR自动cherry-pick到你指定的分支上,而手动提交只有在极少数情况下才会使用。
使用Kubernetes仓库中hack/cherry_pick_pull.sh
脚本可以把一个合入到master分支的PR同步到其他分支。它可以帮你自动完成提交PR的所有过程。
使用hack/cherry_pick_pull.sh
自动同步需要满足一定的前提条件:
你必须已经签署了CLA声明,这也是每个贡献者必须要签署的内容;
针对master的PR已经被合入;
你的Github帐号中已经fork了Kubernetes仓库,并且你本地的shell中已经clone了此fork仓库;
你本的仓库中必须添加的远端仓库名为upstream
(通过命令 git remote add upstream https://github.com/kubernetes/kubernetes.git
);
在你环境变量中添加了export GITHUB_USER=<GitHub ID>
;
已安装了hub命令行工具;
如果你已经参与过代码贡献,那么这些要求一般都会自动满足,除了最后两个。
hub
命令行工具为GitHub官方提供的工具,用于从命令行操作GitHub。而环境变量中需要添加GITHUB_USER
正是因为hub命令行工具会使用。如果你还没有安装,可以使用命令go get github.com/github/hub
安装它。
比如,需要将master上的PR #85444 同步到分支 release-1.17,在前面条件都具备的情况下,只需要使用如下命令:
hack/cherry_pick_pull.sh upstream/release-1.17 85444
注意:此脚本会自动创建PR,不要轻易尝试,除非你真的需要这么做。
脚本执行过程中会有大量信息输出,可以了解到具体执行过程:
[root@ecs-d8b6 kubernetes]# hack/cherry_pick_pull.sh upstream/release-1.17 85444 +++ Updating remotes... Fetching upstream remote: Enumerating objects: 34, done. remote: Counting objects: 100% (34/34), done. remote: Total 48 (delta 34), reused 34 (delta 34), pack-reused 14 Unpacking objects: 100% (48/48), done. From https://github.com/kubernetes/kubernetes d87c921a516..1f913b45820 master -> upstream/master c0f31a4ef63..5c651b7bd5f release-1.16 -> upstream/release-1.16 486425533b6..27babd49b95 release-1.17 -> upstream/release-1.17 * [new tag] v1.17.0-rc.1 -> v1.17.0-rc.1 Fetching origin +++ Creating local branch automated-cherry-pick-of-#85444-upstream-release-1.17-1574748271 Branch 'automated-cherry-pick-of-#85444-upstream-release-1.17-1574748271' set up to track remote branch 'release-1.17' from 'upstream'. Switched to a new branch 'automated-cherry-pick-of-#85444-upstream-release-1.17-1574748271' +++ Downloading patch to /tmp/85444.patch (in case you need to do this again) +++ About to attempt cherry pick of PR. To reattempt: $ git am -3 /tmp/85444.patch Applying: Provided a mechanism to re-register hidden metrics. +++ I'm about to do the following to push to GitHub (and I'm assuming origin is your personal fork): git push origin automated-cherry-pick-of-#85444-upstream-release-1.17-1574748271:automated-cherry-pick-of-#85444-upstream-release-1.17 +++ Proceed (anything but 'y' aborts the cherry-pick)? [y/n] y Enumerating objects: 19, done. Counting objects: 100% (19/19), done. Delta compression using up to 4 threads Compressing objects: 100% (10/10), done. Writing objects: 100% (10/10), 2.19 KiB | 1.09 MiB/s, done. Total 10 (delta 8), reused 0 (delta 0) remote: Resolving deltas: 100% (8/8), completed with 8 local objects. remote: remote: Create a pull request for 'automated-cherry-pick-of-#85444-upstream-release-1.17' on GitHub by visiting: remote: https://github.com/RainbowMango/kubernetes/pull/new/automated-cherry-pick-of-%2385444-upstream-release-1.17 remote: To https://github.com/RainbowMango/kubernetes.git * [new branch] automated-cherry-pick-of-#85444-upstream-release-1.17-1574748271 -> automated-cherry-pick-of-#85444-upstream-release-1.17 +++ Creating a pull request on GitHub at RainbowMango:automated-cherry-pick-of-#85444-upstream-release-1.17 https://github.com/kubernetes/kubernetes/pull/85627 +++ Returning you to the master branch and cleaning up.
实际上该脚本实际上模拟了手工操作:
创建一个本地分支,比如automated-cherry-pick-of-#85444-upstream-release-1.17
;
通过hub工具获取PR的commit信息(可能有多个commit);
将upstream/master中相关的commit cherry-pick 到本地分支中;
将本地分支推送到远端(origin);
使用GitHub的接口提交PR;
手动cherry-pick一般不常发生,因为大多数情况下自动cherry-pick都可以胜任。只有在冲突比较大时,需要手工处理冲突时才会手动cherry-pick。
手动chery-pick,需要处理冲突,处理完成后提交PR的过程与向master提交完全一致,这里不再赘述。
提交到release分支的PR审核过程与提交到master分支的略有不同,提交到release分支的PR除了需要相关领域的approver批准以外,还需要release manager批准才可以合入。
提交到release分支的PR,自动会被添加上do-not-merge/cherry-pick-not-approved
标签,只有release manager批准后才会去除该标签,然后CI才会合入该PR。
看完上述内容,你们掌握如何进行cherry-pick的分析的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。