铺垫:
在原来公司,技术总监是一个非常有能力的人,可以说是搞技术的人的一个风向标、一个标杆。他在公司内部搭建了一套持续集成(Continuous integration,简称CI,原理的话,网上很多,不再累述)的架子,使用的jinkens+maven/ant,还在jinkens上集成了一些其他的插件,如sonar等。
技术总监对代码质量要求非常高,当然,这也是把一个产品做好的必要一步。
实际上,在他的这一套东西下,公司的项目一天天变好,代码质量越来越高,体系更健全,流程更清晰,开发人员的自觉性和编码能力都有所提高。
现在从原来公司出来了,仔细想想,还没有自己掌握这一套东西。好的东西,就应该被传承下去,所以最近开始自己学习CI一套的东西。
说明:
我自己学习东西的时候,自制力不强,所以一般没有很体系地去学习,文章可能也写得没什么条理(典型的理科生,想到什么说什么),所以在文章结构上希望大家体谅下。
废话不多了,开工:
首先搭建一个简单的CI基础:一个maven项目,自动部署到tomcat
我在做这个DEMO的时候,其实已经集成到了jinkens上,但是一直在自动部署的这一块出问题,后来我就单独用命令在验证了,所以和jinkens继承的内容放到后面(可能下一章)来讲。之所以单独一章来讲自动部署这一块,是由于我发现网上很多的文章都说得非常含糊(主要参考StackOverflow),好了,废话不多说了。
准备材料:
1、maven project(不详细讲解如何建立project,请参考我的其他博客)
2、tomcat(6或者7都可以,有一点小差别,后面讲到)
3、maven3.0.5
开发环境:jdk7+tomcat7+windows7 x64 +eclipse
第一步:配置tomcat
无论你是tomcat7或者tomcat6,修改%TOMCAT_HOME%/conf/tomcat-users.xml,在里面添加用户。
高能警告:下面的<role></role>标签,在tomcat的原来默认配置里面,只有<role rolename="tomcat" />和<role rolename="role1" />,如果只使用这两种配置的话,是无法再http://localhost:8080/manager下登录的,会出现403错误(由于没有manager-gui角色权限),如果没有配置<role rolename="manager-script" /><role rolename="manager-jmx" />,并且在roles里面添加进去,会在自动部署的时候,出现Cannot invoke Tomcat manager: Connection reset by peer错误(这个问题我搞了一天,在StackOverflow上很多类似的问题,但是都没提别提醒是这个地方出的问题)
<role rolename="tomcat" /> <role rolename="role1" /> <!-- tomcat的默认注释掉的代码里面没有下面四中角色,一定要加上,不然会出现很多错误 --> <role rolename="admin" /> <role rolename="manager-gui" /> <role rolename="manager-script" /> <role rolename="manager-jmx" /> <user username="admin" password="admin" roles="tomcat,manager-gui" /> <user username="both" password="tomcat" roles="tomcat,role1,manager-gui" /> <!-- 这个是我用到的用户,roles里面的角色名很重要 --> <user username="tomcat" password="tomcat" roles="role1,manager-gui,tomcat,admin,manager-script,manager-jmx" />
我的settings.xml在%MAVEN_HOME%/conf下,在<servers>节点内,添加如下代码
<server> <id>tomcatServer</id> <!-- server login name --> <username>tomcat</username> <!-- server login password --> <password>tomcat</password> </server>
第三步:配置pom.xml
在<plugins>节点内,添加如下代码,
高能警告:tomcat7-maven-plugin插件里的<url>里是http://localhost:8080/manager/text,不是http://localhost:8080/manager/html,
<build> <finalName>myweb</finalName> <defaultGoal>install</defaultGoal> <sourceDirectory>src/main/java</sourceDirectory> <resources> <resource> <directory>src/main/java</directory> <excludes> <exclude>**/*.java</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> </resource> </resources> <plugins> <!-- 打包插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.5.1</version> <configuration> <source>1.7</source> <target>1.7</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.2</version> <configuration> <warSourceDirectory>${basedir}/src/main/webapp</warSourceDirectory> <version>3.0</version> <failOnMissingWebXml>false</failOnMissingWebXml> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.12.4</version> <configuration> <skipTests>true</skipTests> <testFailureIgnore>true</testFailureIgnore> </configuration> </plugin> <!-- 自动部署到tomcat --> <plugin> <groupId>org.apache.tomcat.maven</groupId> <!-- tomcat7 --> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <!-- 如果是tomcat6,则使用tomcat-maven-plugin 1.1版本 <artifactId>tomcat-maven-plugin</artifactId> <version>1.1</version> --> <configuration> <url>http://localhost:8080/manager/text</url> <server>tomcatServer</server> <path>/myweb</path> </configuration> </plugin> </plugins> </build>
第四步:运行maven命令,自动编译-打包-部署
首先启动tomcat。
使用CMD命令,进入项目的根目录,然后运行命令:mvn -U clean package tomcat7:deploy(如果是tomcat的插件,那么使用mvn -U clean package tomcat:deploy命令),如果是重新部署,则把deploy改成redeploy。
最后看到BUILD SUCCESS则表示部署成功了
在%TOMCAT_HOME%/webapps下,能够看到我们部署的系统
补充:
这也是我刚才实验发现的,当使用CMD命令运行了maven命令自动部署后,惊奇地发现,没有重启tomcat,新部署的myweb项目也启动了,并且可以访问。下图是运行命令时,tomcat的日志