最近在做一个电影售票系统的大作业,这是一个web app,需要前后端分离开发。而且有多人进行协同开发,这就需要使用git这种类型的工具,来帮助我们合并、管理代码。我们选择使用GitHub这个免费的远程代码托管服务网站来进行托管代码。并且使用Travis CI来进行持续集成开发测试。
Git
在之前,也有一直使用GitHub,但主要无非用来管理自己平时个人写的代码,比较少涉及到多人协同开发以及解决一些冲突的问题。所以有必要再补一下这方面相关的知识。Git是Linux之父Linus当年在开发linux的过程中,不满于SVN的使用,而自己写出来的一个工具(不愧是大神,实在佩服)。
这里可以参考廖雪峰Git教程,比较简明详细、清晰明了。主要介绍了如何具体实际来操作Git,适合快速上手。在后续的开发过程中,我也会将此类相关注意点和问题再整理成博客的。
也可以参考Pro Git这本书,里面比较详细地介绍了各种功能使用,以及原理。
branch 分支
分支是团队开发中,一个重要的工具,使得开发更加安全和稳定。
在具体开发过程中使用master
分支来保管稳定版本的代码,使用dev
分支来管理开发过程中的代码,也可以再新建分支来开发新的特性。等开发完成之后,再将稳定的代码合并到master
分支。
通过git checkout dev
可以切换到dev
分支。
1 | git checkout dev |
2 | Switched to branch 'dev' |
通过git branch
命令来查看所有分支,当前分支带*
号。
1 | git branch |
2 | * dev |
3 | master |
通过git merge
命令来合并指定分支到当前分支。
1 | git merge dev |
合并完dev分支之后就可以删除了
1 | git branch -d dev |
参考: 廖雪峰:创建于合并分支
GitHub
了解了Git的使用之后,使用GitHub基本没有什么太大的困难了。开发小组的成员在后续会建立一个GitHub仓库来进行开发。这里推荐使用SSH key来连接到GitHub上,之后就可以直接使用这个本地的private key来push代码到GitHub的远程仓库上了,不用再每次push都要输入密码了,更加安全也方便。官方步骤指南Connecting to GitHub with SSH
使用Issues进行Bug管理
GitHub提供了一个很好的功能Issues功能,通过Issues别人可以向项目的开发者提出Bug报告、需求等。我们可以通过使用Issues来记录Bug的发现以及解决。当发现了一个新的Bug之后可以创建一个Issue,当解决了之后再关闭掉这个Issue。开发者也可以自己向自己的项目提出Issues。下面就先拿我之前的一个仓库使用Issues来进行Bug管理来举例。
点进具体的某个issue可以发现它是评论列表风格的,可以在里面描述bug的问题,解决之后也可以评论是如何解决这个bug的,可以很方便地记录开发的过程。
Labels 标签功能
并且有一个Lables标签功能,来标记这个Issue是一个Bug还是需求等等。
fork
由于我负责了持续测试这一块,而项目的仓库不是我建立了,在一般的团队协作下,也都是成员fork项目的仓库到自己的帐号下,修改之后再提交pull request。再让自己的项目仓库与上游的项目仓库保持同步,就可以实现我的GitHub帐号来管理Travis了。
先将自己fork的仓库git clone "repo_address"
到本地。
然后通过git remote add upstream "upstream_address"
再通过git remote -v
可以看到多了我们所需要同步的上游地址。
1 | git remote -v |
2 | origin Paul_work:Kinpzz/movie-booking.git (fetch) |
3 | origin Paul_work:Kinpzz/movie-booking.git (push) |
4 | upstream Paul_work:zhzdeng/movie-booking (fetch) |
5 | upstream Paul_work:zhzdeng/movie-booking (push) |
然后我们只需要保持着master
分支与上游项目仓库保持一致即可,在我们要合并dev
分支到master
分支的时候,先git checkout master
切换到master
分支,再将master
分支和上游master
分支同步。直接git fetch upstream
即可。
1 | git checkout master |
2 | git fetch upstream |
3 | git merge upstream/master |
这里要注意
- 在每次push到仓库上的时候应该先与上游仓库进行同步
- 尽量避免使用
git pull
其功能等同于fetch+merge,但是隐藏一些细节,存在一些安全问题,本地的有的代码容易被远程仓库直接覆盖。参考:Git 少用 Pull 多用 Fetch 和 Merge
要与远程仓库同步的时候,可以通过git push branch_name
来选择要push到哪个远程仓库上。
pull request 进行代码review
当我的远程仓库开发完了一个稳定的特性之后,就可以向主的项目仓库提出一个pull request
的请求了,在里面我们可以清楚地看到代码的改动地方,可以通过这个功能来进行代码review。主仓库的所有者,在review之后,就可以决定要不要合并这个代码,还是继续让提交者进行修改。通过点击Reviewer
可以邀请项目作业来进行review。
Travis CI
CI 全称 Continuous Integration(持续集成),在一个项目中,任何人对代码库的任何改动都会触发CI服务器自动对项目进行构建、测试、甚至部署。可以及时发现问题,随时修复。
而Travis CI是一个在线托管CI的服务,不需要自己搭建CI服务器,可以通过Travis提供的网页服务来配置我们的CI。并且可以直接与GitHub的仓库进行关联,对开源项目免费。
进入Travis CI 官网https://travis-ci.org,可以直接使用GitHub账号进行登录。
为一个项目配置好Travis CI的步骤也比较简单,主要就有三步:
- 激活所需GitHub仓库
- 将
.travis.yml
配置文件加入仓库 - 使用
git push
进行触发
步骤
激活Github仓库
交互界面设计的不错,直接点用按钮就完成激活了。
配置.travis.yml文件
.travis.yml
文件用来告诉Travis一些项目信息,使用的语言,环境等要求。
1 | language: java |
2 | |
3 | jdk: |
4 | - oraclejdk8 |
当我们push到GitHub仓库上Travis一看到Java项目,就默认用Maven 3来进行构建,然后执行两个脚本命令
1 | mvn install -DskipTests=true -Dmaven.javadoc.skip=true |
2 | mvn test -B |
如果我们不使用默认的install和test脚本,可以自己再进行自定义。在.travis.yml
里面进行配置install和test标签。
如在.travis.yml
内添加:
1 | install: ./install-dependencies.sh |
具体可以参考Travis: Customizing the Build
之后会通过邮件通知我们构建结果,构建成功在下面可以看见build passing的标志。
还可以通过点击那个标志获取连接,在项目的README.md
文档上显示出一个构建通过的小标志
在发起pull request之后,Travis CI也会对项目进行自动检测,并且可以在发起pull request者的tavis和GitHub中看到构建结果
使用checkstytle进行风格检测
通过简单地配置.travis.yml
文件,也可以达到在CI服务器上对代码风格进行检测,这里代码风格使用google style,配合checkstyle这个代码检测工具,添加maven命令也可以完成。
方法一:
在.travis.yml
配置文件中添加如下代码:
1 | after_script: |
2 | - mvn checkstyle:check --batch-mode --fail-never |
注意这种方法默认的是使用sun_checks.xml - Sun Microsystems Definition (default)
. 我们这里要使用的的google style所以这种方法,所以需要再另外进行配置。
方法二:
由于我们要使用google style(google_checks.xml - Google Definition.
)所以就需要在构建阶段pom.xml
文件中另外进行配置,使用checkstyle这个插件。在<configLocation>google_checks.xml</configLocation>
使用google_checks.xml
这个配置。
1 | <plugin> |
2 | <groupId>org.apache.maven.plugins</groupId> |
3 | <artifactId>maven-checkstyle-plugin</artifactId> |
4 | <version>2.17</version> |
5 | <executions> |
6 | <execution> |
7 | <id>validate</id> |
8 | <phase>validate</phase> |
9 | <configuration> |
10 | <configLocation>google_checks.xml</configLocation> |
11 | <encoding>UTF-8</encoding> |
12 | <consoleOutput>true</consoleOutput> |
13 | <failsOnError>true</failsOnError> |
14 | <linkXRef>false</linkXRef> |
15 | </configuration> |
16 | <goals> |
17 | <goal>check</goal> |
18 | </goals> |
19 | </execution> |
20 | </executions> |
21 | </plugin> |
在构建之后没有如果代码风格问题会看到,如果有问题会进行提示。
1 | [INFO] --- maven-checkstyle-plugin:2.17:check (validate) @ movie-booking --- |
2 | [INFO] Starting audit... |
3 | Audit done. |
参考:checkstyle plugin usage
建议在项目的仓库上也关联Travis CI这样子就能每次提交新改动到项目上的时候同时进行自动化的在线构建和检测了。
使用pmd进行源码检测
PMD 是源码检测工具。它能发现常见编程缺陷,如未使用的变量,空catch块,不必要的对象创建等等。
maven的网站上有给出如何配置pmd,但是在build的时候配置一直不成功于是我决定使用命令来进行检测
1 | mvn pmd:check |
2 | mvn pmd:cpd-check |
检测的结果会输出在target/pmd.xml中,如果有问题会以xml的方式进行记录。然后使用cat
来显示这个文件
1 | $ cat target/pmd.xml |
命令可以配置在.tarvis.yml
中
1 | before_script: |
2 | - mvn pmd:check |
3 | - mvn pmd:cpd-check |
4 | - cat target/pmd.xml |
下面测试,代码没有pmd检测出来的问题,所以pmd.xml
文件中没有显示错误信息