为JBoss AS7贡献代码

(阅读本文需要git的基本知识,如果你对git不熟,请先学习git后再看本文)

参与开源项目最直接的方式可能就是提交源代码了。随着Git的普及和Github的流行,为开源项目贡献代码变得更加简单。JBoss AS7的源代码已经托管给github了,不管是社区,还是Red Hat员工,目前都基于github进行AS7的开发工作。本文讲解如何为AS7在github上面贡献代码。

首先,JBoss AS7的代码位于:

https://github.com/jbossas/jboss-as


我们如果想将自己撰写或是修改的代码提交进jboss-as,首先必须了解github所支持的开发流程为Pull request模式。

Pull request模式是github所支持的开发流程,它有点类似Linux内核的提交Patch的开发方式,但是比提交Patch更为简便,由于github支持可视化的操作界面,所以整个过程更直观。讲太多抽象的概念容易晕,下面我们通过一步一步的具体过程来讲解Pull-Request的代码提交流程。

第一步是要有一个github的账号。注册账号的过程就不多说了。

有了github账号以后,我们不能直接修改jboss-as的代码并进行提交,所有的开发工作必须在本地完成,并提交给jboss-as的核心开发小组进行审核后方可入库,因此下一步是将jboss-as的代码库fork到自己的空间里。打开jboss-as的页面:

https://github.com/jbossas/jboss-as


注意右上角有一个"Fork"的链接,点它,将代码复制到自己的空间里。如果你想深入了解Fork的含义,可以参考这篇文档:

http://help.github.com/fork-a-repo/


Fork成功后,jboss-as就被复制到自己的空间里,比如我fork的jboss-as位于:

https://github.com/liweinan/jboss-as


我们对自己fork的这个jboss-as是拥有读写权限的。接下来要做的是把给clone到本地,在本地执行git命令:

git clone [email protected]:liweinan/jboss-as.git


注意这个clone命令用的地址是带Read-Write权限的clone。接下来是修改代码,我们可以去issues.jboss.org上面看看目前AS7有什么BUG是可以自己胜任修复工作的。我在这篇文章中以这个BUG为例:

https://issues.jboss.org/browse/AS7-2983


这是一个和RESTEasy相关的问题报告,具体的内容无需了解,总之假设我们现在知道该如何在AS7中修改代码,修复这个问题,因此动手改了clone下来的as7的代码。以下是我在代码中做的改动:

% git diff
diff --git a/... b/...
index 35305da..c6409e3 100644
--- a/...
+++ b/...
@@ -39,6 +39,7 @@ public class JaxrsIntegrationProcessor implements DeploymentUnitProcessor {
...
+                } else if (param.getParamName().equals(RESTEASY_SCAN_PROVIDERS)) {
+                    it.remove();
+                    JAXRS_LOGGER.resteasyScanWarning(RESTEASY_SCAN_PROVIDERS);
...


对上面的代码的改动意义在本文中也无需了解,只需明白我们对代码确实做出了一些改动和开发工作。接下来要做的是提交这些改动。使用git commit可进行代码提交,但首先我们要创建一个新的分支,并起一个和改动相关,日后帮助理解与回忆的分支名:

% git checkout -b auto_scanner
M	jaxrs/src/main/java/org/jboss/as/jaxrs/deployment/JaxrsIntegrationProcessor.java
Switched to a new branch 'auto_scanner'


接下来是将改动的代码提交进分支:

git commit -a -m 'https://issues.jboss.org/browse/AS7-2983'


注意上面我将这次改动对应的bug号写进了提交日志中,这不光是为了记忆,实际上JBoss的BUG跟踪系统使用的是JIRA,它和github之间有一些绑定,并通过这个bug进行自动化的连接。在这里不展开这个话题,继续往后看,我们会慢慢理解工作方式。

代码提交后,将代码push进github:

% git push origin auto_scanner 
Counting objects: 23, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (12/12), 883 bytes, done.
Total 12 (delta 4), reused 0 (delta 0)
To [email protected]:liweinan/jboss-as.git
 * [new branch]      auto_scanner -> auto_scanner


注意push的是我们刚刚提交的分支。至此,本地的开发工作完成了,接下来是github上面的工作。此时,回到github主页,确认刚刚的push进行进入github了:

https://github.com/liweinan/jboss-as


在自己的这个fork项目里,在页面中间偏上的位置有个"Branch",点击进入查看刚刚提交的'auto_scanner'分支是否存在了:

https://github.com/liweinan/jboss-as/branches


如果没什么问题,在这个页面的右上角,点击''Pull Request",进入提交代码合并请求的页面:

https://github.com/liweinan/jboss-as/pull/new/master


在这个页面中,我们要将刚刚分支中的代码请求合并进jboss-as的主干代码,在页面右边的输入栏写入分支名称'auto_scanner':

为JBoss AS7贡献代码_第1张图片

填写完成后点击"Update Commit Range",此时进入下一个页面,填写此次请求的目的及说明:

为JBoss AS7贡献代码_第2张图片

完成后提交。至此,整个代码提交工作就完成了:

为JBoss AS7贡献代码_第3张图片

剩下的是等待as7的核心开发人员进行代码审核。注意你提交的代码会触发AS7的自动化测试流程启动,如果你的代码提交请求导致系统测试不通过,基本上就直接拒了。

如果没什么问题,代码审核通过,那么你提交的修改就会被合并至as7的代码库并收到通知:

为JBoss AS7贡献代码_第4张图片

以上就是整个github里面的Pull-Request开发全流程,如果你想更深入的学习理解这种开发流程,请参考这篇文档:

http://help.github.com/send-pull-requests/


最后再多说几句有关jira中的bug,此时查看此次提交对应的bug:

https://issues.jboss.org/browse/AS7-2983?page=com.atlassian.jirafisheyeplugin:fisheye-issuepanel


发现这个bug被自动更改为"Resolved"的状态了。这样就形成了开发,测试,BUG根踪一体化的自动流程管理,大大节省了人工。其实没什么神奇的,jira和github之间的连接是通过Crucible这个产品完成的:

http://www.atlassian.com/software/crucible/overview


由于我们在github提交时使用了jira中的bug号,当crucible扫到提交中的bug号时,就会自动向jira里面记录代码日志,并根据github中的代码审核通过及测试情况将jira中的bug自动标记为已解决状态。

小结

在本文中,我们学习了如何在github中为JBoss AS7贡献代码。实际上基于git的开发流程已经在Linux内核的开发过程中发展的很成熟了。相比Subversion那种集中式管理方式,这种开发模型无疑更轻更高效,可在不断的协作过程中有更为深入的体会。


你可能感兴趣的:(github,jboss,git,AS,as7)