上云无忧 > 文档中心 > 百度智能云代码托管 iCode 使用教程 - 评审协作
代码托管 iCode
百度智能云代码托管 iCode 使用教程 - 评审协作

文档简介:
当我们对代码质量有较高要求的情况下,再使用git push直接将代码推入远程仓库的方法就难以满足我们的需求了。为此iCode为大家提供了人工评审和预提交测试的功能,下面介绍下开启方法和效果。 【百度智能云】效率云
*此产品及展示信息均由百度智能云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠

当我们对代码质量有较高要求的情况下,再使用git push直接将代码推入远程仓库的方法就难以满足我们的需求了。为此iCode为大家提供了人工评审和预提交测试的功能,下面介绍下开启方法和效果。

开启方法

进入代码库“提交规则”设置页,勾选“提交准入检查”。push 代码的时候需要以 refs/for/分支 的形式使用准入检查功能(详细介绍见下文)

  • 机器检查>持续集成:ipipe的change流水线执行成功才能入库
  • 人工评分>代码评审:人工评审通过,拿到+2分后才能入库
  • 人工评分>禁止自评:人工评审通过,拿到+2分后才能入库,且代码的提交人不能评审自己的代码。

开启上述规则的情况下,再使用git push [目标仓库] [目标分支]就不好使了。那么我们怎么提交代码呢?下面就来介绍下原理和操作方法

原理

每一个本地commit被合入远端任意分支(例如:master)前都需要经过评审

本地commit先被推送到远端master的暂存区进行逐行评审

评审通过后自动合入远端master

评审驳回后发起人替换新版commit并丢弃旧版(git commit –amend),再次发起评审

操作步骤

过程解释

以开发master分支为例,假设我们要基于最新的master分支继续开发代码。首先进入本地的workspace,执行下述命令,

➜  icode git:(master) git checkout master
Already on 'master'
Your branch is up-to-date with 'origin/master'.
➜  icode git:(master) git fetch
➜  icode git:(master) git merge origin/master
Already up-to-date.

步骤 命令
① 远程仓库的master分支最新一次提交是C1,基于C1拉取本地分支featureX【可选】拉本地分支featureX是可选操作,当同时需要开发多个不同的功能时拉不同的本地分支更有意义。否则直接用本地的master分支即可
②在本地修改代码,提交到本地仓库C2 修改代码git add <文件名>git commit -m “some comments for C2”
③发起Change Request(push),实时触发编码规范检查和预提交流水线构建任务,可以在此时通知其他同事来评审代码 git push origin featureX:refs/for/master
④所有检查通过的情况下,点击”合入“按钮成功,代码真正提交到远程仓库的master分支
合入成功后,持续集成任务会被触发,可以在这个环节做更多的自动化验证和手工测试
当任意一项检查不通过需要修改代码的情况下(编译失败/人工平时不通过/合入冲突……),重新回到开发环境使用相同的提交步骤。修改代码>add>commit提交为C3>push到master 修改代码

git add <文件名>

git commit -m “some comments for C3”

git push origin featureX:refs/for/master

举例

本地开发和提交

我要向appdemo/icode的master分支提交代码,我在本地拉出feature-abc分支作为开发分支

➜ $ (master) git checkout -b feature-abc
Switched to a new branch 'feature-abc'
➜ $ (feature-abc) echo cat >pets
➜ $ (feature-abc) ✗ git add pets
➜ $ (feature-abc) ✗ git commit -m'get some pets'
[feature-abc c00fc83] get some pets
 1 file changed, 1 insertion(+)
 create mode 100644 pets
➜ $ (feature-abc) git push origin feature-abc:refs/for/master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 365 bytes | 365.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: 
remote: Processing changes: new: 1, refs: 1, done
remote: 
remote: New Changes:
remote:   http://xly.bce.baidu.com/review/changes/170 get some pets
remote: 
To https://xly.bce.baidu.com/git/xxxx/Baidu/demo
 * [new branch]      feature-abc -> refs/for/master

(警告) 上述以master分支为例,以此类推,向其他分支提交代码的方法是一样的,在git push origin HEAD:refs/for/<目标分支>时,目标分支不同,决定了代码最终会被合并到哪个远程分支上。

Owner评审:通过或驳回

代码评审入口

评审详情页

查看上传的commit详情、代码diff,代码逐行评审,添加评论

  • +2:通过,可以提交
  • +1:我觉得OK,还需要其他人+2
  • 0:无意见
  • -1:最好不要提交
  • -2:不能提交

合入master

点“评审详情页”右上角的“合入”按钮

【Optional】替换评审中的commit

注意:飘红的为关键命令

➜  $ (feature-abc) echo cat >>pets
➜  $ (feature-abc) ✗ git commit --amend 
    [feature-abc 2307014] get some pets
     Date: Thu Jan 17 18:47:13 2019 +0800
     2 files changed, 2 insertions(+), 1 deletion(-)
     create mode 100644 test1.txt
➜ $ (feature-abc) git push origin feature-abc:refs/for/master
    Enumerating objects: 6, done.
    Counting objects: 100% (6/6), done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (4/4), 412 bytes | 412.00 KiB/s, done.
    Total 4 (delta 0), reused 0 (delta 0)
    remote: 
    remote: Processing changes: updated: 1, refs: 1, done
    remote: 
    remote: Updated Changes:
    remote:   http://xly.bce.baidu.com/review/changes/170 get some pets
    remote: 
    To https://xly.bce.baidu.com/git/xxxx/Baidu/demo
 * [new branch]      feature-abc -> refs/for/master

更新Patch Set

##【Optional】git-rebase远端master

当发生以下情况,你需要将远端的master的代码合并到本地分支,

  1. 远端master提交了一个commit,你的本地分支依赖这个commit的代码
  2. 远程master提交了一个commit,与你的本地分支合并冲突,你需要手动解决冲突 这两种场景都使用git-rebase来解决,

命令

➜  $ (feature-abc) git fetch origin master:master
From https://xly.bce.baidu.com/git/xxxx/Baidu/demo
   2897d6d..e047cf5  master     -> origin/master

➜  $ (feature-abc) git rebase origin/master
First, rewinding head to replay your work on top of it...
Applying: get some pets
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging pets
CONFLICT (add/add): Merge conflict in pets
error: Failed to merge in the changes.
Patch failed at 0001 get some pets
The copy of the patch that failed is found in: .git/rebase-apply/patch
When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
➜  $ (36d6b4c) ✗ git status
rebase in progress; onto 36d6b4c
You are currently rebasing branch 'feature-abc' on '36d6b4c'.
  (fix conflicts and then run "git rebase --continue")
  (use "git rebase --skip" to skip this patch)
  (use "git rebase --abort" to check out the original branch)
Unmerged paths:
  (use "git reset HEAD..." to unstage)
  (use "git add..." to mark resolution)
    both added:      pets
no changes added to commit (use "git add" and/or "git commit -a")
➜  $ (36d6b4c) ✗ vi pets
➜  $ (36d6b4c) ✗ git add pets
➜ $ (36d6b4c) ✗ git rebase --continue
Applying: get some pets
➜ $ (feature-abc) git push origin feature-abc:refs/for/master
    Enumerating objects: 6, done.
    Counting objects: 100% (6/6), done.
    Delta compression using up to 4 threads.
    Compressing objects: 100% (2/2), done.
    Writing objects: 100% (4/4), 412 bytes | 412.00 KiB/s, done.
    Total 4 (delta 0), reused 0 (delta 0)
    remote: 
    remote: Processing changes: updated: 1, refs: 1, done
    remote: 
    remote: Updated Changes:
    remote:   http://xly.bce.baidu.com/review/changes/170 get some pets
    remote: 
    To https://xly.bce.baidu.com/git/xxxx/Baidu/demo
 * [new branch]      feature-abc -> refs/for/master

提交规则设置

提交规则

配置提交规则直接影响代码的提交方式和提交要求。

  • 分支:配置项对哪个分支生效。为空表示目前尚不支持按照分支维度配置,只能按照代码库维度配置
  • 禁止删除:禁止删除已经入库的提交代码,禁止使用git push -f修改远程仓库的提交历史
  • 提交准入检查:不能直接使用git push命令更新远程分支,必须经过评审检查环节
  • 机器检查>持续集成:强制检查持续集成任务执行成功
  • 人工评分>代码评审:强制要求人工评审通过
  • 人工评分>同行评审:强制要求代码的提交人不能给自己评审通过,必须找其他同事评审通过
  • 提交方式>自动提交:当不勾选”人工评分“的情况下,检查通过会自动”合入“代码到远程仓库的目标分支
  • 提交方式>合入策略:当别人在我执行合入前已经更新了远程仓库对应分支的代码时,系统如何将我的代码合入远程仓库

默认评审人

认评审人是一个便捷用户操作的功能,当我执行类似git push origin xxx:refs/for/xxx的命令发起评审时,默认评审人会在iCode的我的评审页中看到我的评审单。

可以按照分支+文件/目录的维度来配置

相似文档
  • 实际的项目开发中,往往不可避免的需要在master之外的其他分支提交代码。拉分支的情况可能有以下几种,不论你是哪种场景,原理都是相通的。 【百度智能云】效率云
  • 小贴士:iCode除了做好本职的工作,从使用者的角度出发,增加了云端编译功能,同时还和iPipe打通可以做一些持续集成和交付相关的事情哟~小伙伴儿们按需使用哦~ iCode联合ipipe和编译工具一起,只要代码托管在iCode,再写个ci.yml的编译配置文件就可以实现持续集成和交付。 【百度智能云】效率云
  • 本地工作: 一个任务用一个分支,可以提交多次。 git checkout -b 1-add-a-py vi a.py git add a.py git commit -m'add a.py' vi a.py git add a.py git commit -m'print hello world' push到服务器: git push origin HEAD:refs/for/master //评审系统中生成一条评审记录,评审的代码就是当前工作中的分支(HEAD)。本地分支1-add-a-py => 远端评审系统 => 远端master。 【百度智能云】效率云
  • 1.下载代码库时的安装hook是干什么用的? 安装了此hook后,每次push会进行相应的检查,检查合格才能入库。 2.commit-msg是运行在客户端的一个git hook 它在每次git commit的时候自动往commit message末尾附加一行随机的change-id,如下图 【百度智能云】效率云
  • Q:git push HEAD:refs/for/master,长命令输入较麻烦,是否有更便捷办法? A:push时不能支持直接push到icode分支。必须执行下面命令发评审。 git push origin <当前分支>:refs/for/master 【百度智能云】效率云
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部