1# 贡献流程<a name="ZH-CN_TOPIC_0000001052970939"></a> 2 3## 环境准备<a name="section124971410183614"></a> 4 5- 针对Git的安装、环境配置及使用方法,请参考码云帮助中心的Git知识大全:[https://gitee.com/help/categories/43](https://gitee.com/help/categories/43) 6- 注册SSH公钥,请参考码云帮助中心的公钥管理:[https://gitee.com/help/articles/4191](https://gitee.com/help/articles/4191) 7- 在开展Gitee的工作流之前,您需要先在OpenHarmony的代码托管平台上找到您感兴趣的Repository。 8 9## 代码下载<a name="section6125202333611"></a> 10 11### 从云上Fork代码分支<a name="section8365811818"></a> 12 131. 找到并打开对应Repository的首页。 142. 点击右上角的 Fork 按钮,按照指引,建立一个属于**个人**的云上Fork分支。 15 16### 把Fork仓下载到本地<a name="section49051646201819"></a> 17 18请按照以下的过程将Repository内的代码下载到您的在计算机上: 19 201. **创建本地工作目录**: 21 22 您需要创建本地工作目录,以便于本地代码的查找和管理 23 24 ``` 25 mkdir ${your_working_dir} 26 ``` 27 282. **复制远程仓库到本地** 29 1. **切换到本地路径**\* 30 31 ``` 32 mkdir -p ${your_working_dir} 33 cd ${your_working_dir} 34 ``` 35 36 2. **复制远程仓库到本地** 37 - 您可以在仓库页面内复制远程仓库的拷贝地址,得到$remote\_link: 38 39 **图 1** 复制远程仓库<a name="fig1772512534014"></a> 40 ![](figures/复制远程仓库.png "复制远程仓库") 41 42 - 在本地电脑执行拷贝命令: 43 44 ``` 45 git clone $remote_link 46 ``` 47 48 49 50 51### 使用repo工具批量下载代码仓<a name="section15763252468"></a> 52 531. 下载码云repo工具\(可以参考码云帮助中心:[https://gitee.com/help/articles/4316](https://gitee.com/help/articles/4316)\): 54 55 ``` 56 curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 > /usr/local/bin/repo 57 chmod a+x /usr/local/bin/repo 58 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests 59 ``` 60 612. 下载\(注意没有repo branch参数\): 62 63 ``` 64 repo init -u https://gitee.com/openharmony/manifest.git -b master 65 repo sync -c 66 ``` 67 68 69## 代码提交<a name="section338918220422"></a> 70 71### 单仓提交\(git clone场景\)<a name="section669715742719"></a> 72 731. **拉分支** 74 75 更新您的本地分支 76 77 ``` 78 git remote add origin $remote_link 79 git fetch origin 80 git checkout master 81 git pull --rebase 82 ``` 83 84 基于远端master分支拉取本地调试分支 85 86 ``` 87 git branch myfeature origin/master 88 git checkout myfeature 89 ``` 90 91 然后在myfeature分支上编辑和修改代码。 92 932. **在本地工作目录提交变更** 94 95 ``` 96 git add . 97 git commit -sm "xxxxxx" // 提交信息包含signoff邮箱 98 ``` 99 100 您可能会在前次提交的基础上,继续编辑构建并测试更多内容,可以使用commit --amend继续添加提交。 101 1023. **将变更推送到您的远端目录** 103 104 准备进行审查(或只是建立工作的异地备份)时,将分支推到您的fork仓库: 105 106 ``` 107 git push -f origin myfeature 108 ``` 109 110 111### 多仓提交\(repo init/sync场景\)<a name="section6560046192910"></a> 112 1131. 配置全局环境token码: 114 115``` 116repo config --global repo.token {TOKEN} 117``` 118 119token码在码云[个人设置→安全设置→私人令牌](https://gitee.com/profile/personal_access_tokens)中生成,例如 120 121``` 122repo config --global repo.token 211XXXXXXXXXXXXXXXXXXXXXXXX 123``` 124 1252. 在码云上任意一个此次要修改的仓下创建issue\(类似于gerrit的changeID功能,用来关联多个耦合仓修改\),并记录下issue编号\(如下图中的issue编号是\#I1TVV4\)\(如果不涉及多个仓耦合修改,则此步骤不需要\): 126 127![](figures/无标题1.png) 128 1293. 在本地代码工作区新建分支,修改代码,并提交: 130 131``` 132repo start branchname --all 133``` 134 135修改代码后在此次修改的多个仓里执行: 136 137``` 138git add . 139git commit -sm "xxxxxx" 140``` 141 142或者通过repo工具批量add/commit,在代码工程根目录下执行: 143 144``` 145repo forall -c 'git add .' 146repo forall -c 'git commit -sm "xxxxxx"' 147``` 148 1494. PUSH代码\(注意:不支持repo upload\): 150 151配置push代码时是否直接生成PR,选择False是不直接生成,需要手动去fork仓里生成PR,选择True是push到fork仓的同时生成PR: 152 153``` 154repo config repo.pullrequest {True/False} 155``` 156 157例如选择push代码的时候同时生成PR,则执行: 158 159``` 160repo config repo.pullrequest True 161``` 162 163push代码: 164 165``` 166repo push --br={BRANCH} --d={DEST_BRANCH} --content={PR_CONTENT} 167``` 168 169BRANCH为本地分支,DEST\_BRANCH为目的分支\(即主干分支\),一般是master,PR\_CONTENT为填写的PR描述,假设涉及多仓耦合提交,这里必须填写Issue编号,例如: 170 171``` 172repo push --br="20200903" --d="master" --content="#I1TVV4" 173``` 174 175在弹出的编辑页面将需要提交仓、分支、commit的注释符打开: 176 177![](figures/无标题2.png) 178 179保存退出,repo会自动将本地分支推送到远端fork仓\(如果没有fork仓,系统会自动创建fork仓\)里,并自动生成PR: 180 181![](figures/无标题3.png) 182 183同时自动将PR和Issue关联: 184 185![](figures/无标题4.png) 186 187## 创建Pull Request(如已通过repo工具自动创建PR,则此步忽略)<a name="section28261522124316"></a> 188 189访问您在码云上的fork仓页面,点击创建Pull Request按钮选择myfeature分支生成PR。 190 191详细操作请参考码云帮助中心的开发协作指导:[https://gitee.com/help/articles/4128](https://gitee.com/help/articles/4128) 192 193>![](public_sys-resources/icon-notice.gif) **须知:** 194>**多个代码仓存在编译依赖时如何同时发起构建:** 195>OS\(操作系统\)开发时,经常会遇到多个代码仓的修改具有编译依赖关系,需要同时构建、同时合入。为此码云平台将Issue作为具有编译依赖的多个代码仓提交PR的关联标识。具体操作如下: 196>1. 在此次提交的任意一个代码仓上创建Issue。 197>2. 将多个需要同时构建、同时合入的PR关联上述Issue,具体操作请参考码云帮助中心:[https://gitee.com/help/articles/4142](https://gitee.com/help/articles/4142)。 198>3. 触发构建\(详见触发构建的操作帮助\)后,构建中心会识别关联了同一Issue的PR,同时下载构建,并在代码审核通过后,同时进行合并入代码库。 199 200## 门禁构建<a name="section981124754415"></a> 201 202### 创建Issue<a name="section979820334458"></a> 203 2041. 找到并打开对应Repository的首页 2052. 选择左上角的Issues页签,点击右侧新建Issue按钮,按照指引建立一个专属的任务,用于相关联的代码(开发特性/修改bug)执行CI门禁。 206 207### 将Issue与PR关联<a name="section5470144853615"></a> 208 209创建PR或编辑已有的PR时,描述框输入\#+I+五位Issue ID,即可将Issue与PR关联。 210 211**约束:** 212 213- 一个PR只允许关联一个Issue,关联多个Issue时无法触发CI。 214- 相关特性开发或bug修复涉及多个代码仓联合修改时,多个PR可关联同一个Issue。 215- Issue关联的PR中,不允许存在已被合入或关闭的PR,否则无法触发CI。 216- 若Issue已被合入或关闭的PR关联,则该Issue无法被重复使用,需重新创建Issue并进行OPEN的PR关联。 217 218### 触发代码门禁<a name="section11163175420406"></a> 219 220在PR中评论“start build“即可触发CI门禁。 221 222多个PR关联同一个Issue时,在任一PR中评论“start build”均可触发该Issue的CI门禁。 223 224门禁执行完成,会在该Issue关联的所有PR中自动评论门禁执行结果。 225 226如果门禁通过,该Issue关联的所有PR均会自动标记“测试通过”。 227 228详细参考[代码门禁质量要求](https://gitee.com/openharmony/community/blob/master/sig/sig_qa/%E4%BB%A3%E7%A0%81%E9%97%A8%E7%A6%81%E8%A6%81%E6%B1%82.md)。 229 230## CI门户<a name="section8563257123985"></a> 231 232OpenHarmony通过持续集成(CI,Continuous Integration)及时发现代码问题,确保代码质量可靠和功能稳定,包括: 233 234- 代码门禁:开发者向OpenHarmony提交代码合入申请后,会触发门禁检查,例如静态检查、代码编译、功能测试等,门禁通过后才能合入代码。 235- 每日构建:OpenHarmony的持续集成流水线每日自动执行,以便提前发现代码静态检查、编译、功能等方面的问题,及时修复问题,确保代码质量。 236 237CI门户是为了便于开发者及时查看、分析每日构建和代码门禁的执行结果的一个可持续集成的门户。 238 239示例:[CI门户入口](http://ci.openharmony.cn/) 240 241![CI门户](figures/ci-portal.png) 242 243## 代码审查<a name="section17823849145014"></a> 244 245请参考码云帮助中心:[https://gitee.com/help/articles/4304](https://gitee.com/help/articles/4304) 246 247**相关主题:[FAQ](FAQ.md)** 248