文档章节

【Kubernetes社区之路】如何优雅的cherry-pick

恋恋美食
 恋恋美食
发布于 2019/11/22 12:12
字数 1295
阅读 51
收藏 0

尽管Kubernetes拥有众多分支,但社区主要围绕在master分支进行开发。即便其他分支存在bug,通常也是先在master分支进行修复,然后再cherry-pick到其他分支。

软件开发不可避免的会出现bug,所以经常需要从master同步一些补丁到其他仍在维护的分支。而同步的手段可以有多种:

  • 手动提交PR到其他分支;
  • 自动提交PR到其他分支;

一般来说,自动提交的方式更普遍,它能把某个master已合入的PR自动cherry-pick到你指定的分支上,而手动提交只有在极少数情况下才会使用。通过本节的内容,希望能回答以下几个问题:

  • 如何自动同步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安装它。

如何自动cherry-pick

比如,需要将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都可以胜任。只有在冲突比较大时,需要手工处理冲突时才会手动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。

© 著作权归作者所有

恋恋美食

恋恋美食

粉丝 119
博文 178
码字总数 168099
作品 0
杭州
高级程序员
私信 提问
加载中

评论(0)

Kubernetes 1.7.6 版本发布,容器集群管理系统

近期 Kubernetes 版本发布较频繁啊,距离 Kubernetes 1.8.0-beta.1 版本发布1周时间,1.7 release 版跟着发布了 1.7.6 版本,感谢社区如此勤劳的更新 :) 此次版本相比1.7.5大概更新了13处,...

两味真火
2017/09/23
626
2
git在错误的分支上提交了代码如何优雅的迁移到正确的分支

假设: 错误的分支名为bugfix 正确的分支名为bugfixOnRelease git: 先切换到bugfix分支 git checkout bugfix 打开错误分支上提交代码的log,复制第一条log的那个标识,比如d4961b51 git lo...

学霸猫
2019/01/25
52
0
git cherry-pick. 如何把已经提交的commit, 从一个分支放到另一个分支

实际问题: 在本地 master 分支上做了一个commit ( 38361a68138140827b31b72f8bbfd88b3705d77a ) , 如何把它放到 本地 old_cc 分支上? 办法之一: 使用 cherry-pick. 根据git 文档: Appl...

carlos
2014/11/25
158
0
git 不可不学

Git是协作开发中必不可少的,简单的一个人一个分支没有太多需要掌握的,但如果是大型团队,几十个功能同时开发,如何协同良好的使用Git成为了项目顺利进展的基石。如果你即将或刚进入这种大型...

蔡少东
2016/07/10
124
0
Git整理(五) git cherry-pick的使用

概述 git cherry-pick可以理解为”挑拣”提交,它会获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。 当我们需要在本地合入其他分支的提交时,如果我们不想对整个分支进行...

嘿嘿嘿IT
2019/07/16
89
0

没有更多内容

加载失败,请刷新页面

加载更多

利用docker来部署go应用程序

利用docker实现go程序的快速部署 最近很长一段时间一直通过各种渠道去了解国内外有关devops方面的实践,感受很多的知识点都特别的分散,所以想通过系统的整理来巩固相应的知识体系。接下来会...

罗布V
34分钟前
43
0
【剑指Offer】二叉树——二叉查找树

package cn.dzp.flyroc.offer;import java.util.Arrays;public class VerifySquenceOfBSTDemo { /*题目描述:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结...

大数据健身侠
41分钟前
67
0
Linux就该这么学 -- 用户与组

==

jionzhao
昨天
78
0
vscode安装vetur插件写.vue文件html代码无法格式化解决方法

文件-首选项-设置-找到vetur插件-点击“在settings.json中编辑” 加入以下代码即可解决问题 "vetur.format.defaultFormatter.html": "js-beautify-html", "vetur.format.defaultFo......

kyle小哥
昨天
52
0
学习02-css盒子模型

边框border: 属性 用途 注意 border-color 边框颜色 颜色用十六进制#fff border-width 边框宽度 单位px border-style 边框样式 solid实线,dashed虚线,dotted点线 综合写法 边框 样式 颜色...

宋_
昨天
63
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部