jenkins作为持续集成的利器,在很多公司都会使用,他可以很方便集成其他的工具,提供对项目代码管理,代码review,打包,发布一站式服务。jenkins使用java语言写的,安装的前提是需要安装jdk,既可以在直接通过java -jar jenkins.war运行,也可以将它放到tomcat的webapps目录下,随着tomcat启动而启动。
这里要进行的试验是利用jenkins持续集成将git远程代码拉取到jenkins目录下,然后利用maven对项目进行构建,然后将构建的jar包,发布到远程服务器上,并运行起来。
这里对试验资源的规划:两台虚拟机,一台作为jenkins持续集成的机器server,另一台作为远程发布java项目的机器node01。他们都需要安装jdk.
一、开始安装
server上需要安装的相关程序:
1、jdk安装,略过。
2、jenkins的安装,这里我依赖于一个tomcat8,将下载的jenkins.war包放入tomcat/webapps目录下,启动tomcat来启动jenkins。
a)tomcat启动之后,会启动jenkins,jenkins项目启动之后,会在/root目录下生成.jenkins目录,这里存放jenkins插件,配置,登录密码,项目空间等,如下图所示:
密码在secrets/initialAdminPassword中。
b)jenkins启动之后,访问地址为http://192.168.42.128:8080/jenkins,登录用户名和密码:admin/d2a9c843d2114f109d0572ce9ebf27fa
c)jenkins只是一个管理工具,他需要集成其他工具才能进行后续代码打包发布。
3、git安装,centos下,可以直接用yum来安装,装完即可使用git命令,这里我们只需要git作为客户端命令来使用。
yum install git
查看git版本
4、maven安装,上apache官网,找到maven,下载解压缩,设置环境变量即可使用。
node01机器:
jdk安装,略过。
二、配置
git,maven安装完成,就可以开始着手构建项目了,这里需要将系统的git,maven集成到jenkins,所以,需要安装对应的插件。
插件安装和配置,左侧菜单中依次选择系统管理->插件管理,选择可选插件tab页,可以搜索以下插件:
1)maven integration plugin //该插件安装了,才能创建maven项目。
2)git plugin //从远程拉取代码
3)deploy to container plugin //发布
4)publish over ssh //ssh远程登录
选择了插件,可以直接安装,该过程会等待,不是立即就可以完成的,视网络情况而定。
下面就开始进行配置。
1、系统设置,这里需要设置远程机器node01的key,name,hostname,username。
先在远程机器node01上通过ssh-keygen命令生成无密码登录的秘钥。然后将id_rsa的内容粘贴到publish over ssh部分的key文本框中。
然后填写node01机器名称,ip,登录名,默认root.
2、系统工具配置,依次选择系统管理->Global Tool Configuration
配置jdk安装路径,git可执行路径(默认不用配置git),maven安装路径,并且都将自动安装选项取消。
下面真正的从创建项目到构建发布,还需要一些配置。
三、构建项目并发布
1、新建任务,maven项目webapp;
接着配置源码管理,这里需要配置一个远程gitserver上的项目仓库地址,可以使github,也可以是公司内部的git服务器上的项目仓库地址。
2、配置构建策略;
这里就是构建成功之后要做的事情,比如是要将打包之后的jar通过ssh登录远程机器的方式部署到远程服务器,并执行服务器上的脚本deploy.sh来启动服务。
3、开始构建。
点击立即构建之后,可以在左侧Build History看到一个正在构建的记录,还有进度条,这里可以通过查看console output,看构建输出日志。
构建日志:
构建成功:
远程发布并启动程序成功。
SSH: Connecting from host [server]
SSH: Connecting with configuration [node01] ...
channel stopped
SSH: EXEC: STDOUT/STDERR from command [/root/deploy.sh] ...
Archive: /root/webapp-0.0.1-SNAPSHOT-bin.zip
creating: webapp-0.0.1-SNAPSHOT/
creating: webapp-0.0.1-SNAPSHOT/lib/
extracting: webapp-0.0.1-SNAPSHOT/lib/test-jetty-servlet-8.1.0.RC5.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/jetty-webapp-8.1.0.RC5.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/jetty-xml-8.1.0.RC5.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/jetty-util-8.1.0.RC5.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/jetty-servlet-8.1.0.RC5.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/jetty-security-8.1.0.RC5.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/jetty-server-8.1.0.RC5.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/servlet-api-3.0.20100224.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/jetty-continuation-8.1.0.RC5.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/jetty-http-8.1.0.RC5.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/jetty-io-8.1.0.RC5.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/log4j-1.2.17.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/slf4j-log4j12-1.7.12.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/slf4j-api-1.7.12.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/spring-beans-4.2.0.RELEASE.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/spring-core-4.2.0.RELEASE.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/commons-logging-1.2.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/spring-context-4.2.0.RELEASE.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/spring-aop-4.2.0.RELEASE.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/aopalliance-1.0.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/spring-expression-4.2.0.RELEASE.jar
extracting: webapp-0.0.1-SNAPSHOT/lib/webapp-0.0.1-SNAPSHOT.jar
creating: webapp-0.0.1-SNAPSHOT/bin/
inflating: webapp-0.0.1-SNAPSHOT/bin/app.sh
creating: webapp-0.0.1-SNAPSHOT/conf/
inflating: webapp-0.0.1-SNAPSHOT/conf/applicationContext.xml
inflating: webapp-0.0.1-SNAPSHOT/conf/log4j.xml
PID:
/root/webapp-0.0.1-SNAPSHOT/conf:/root/webapp-0.0.1-SNAPSHOT/lib/aopalliance-1.0.jar:/root/webapp-0.0.1-SNAPSHOT/lib/commons-logging-1.2.jar:/root/webapp-0.0.1-SNAPSHOT/lib/jetty-continuation-8.1.0.RC5.jar:/root/webapp-0.0.1-SNAPSHOT/lib/jetty-http-8.1.0.RC5.jar:/root/webapp-0.0.1-SNAPSHOT/lib/jetty-io-8.1.0.RC5.jar:/root/webapp-0.0.1-SNAPSHOT/lib/jetty-security-8.1.0.RC5.jar:/root/webapp-0.0.1-SNAPSHOT/lib/jetty-server-8.1.0.RC5.jar:/root/webapp-0.0.1-SNAPSHOT/lib/jetty-servlet-8.1.0.RC5.jar:/root/webapp-0.0.1-SNAPSHOT/lib/jetty-util-8.1.0.RC5.jar:/root/webapp-0.0.1-SNAPSHOT/lib/jetty-webapp-8.1.0.RC5.jar:/root/webapp-0.0.1-SNAPSHOT/lib/jetty-xml-8.1.0.RC5.jar:/root/webapp-0.0.1-SNAPSHOT/lib/log4j-1.2.17.jar:/root/webapp-0.0.1-SNAPSHOT/lib/servlet-api-3.0.20100224.jar:/root/webapp-0.0.1-SNAPSHOT/lib/slf4j-api-1.7.12.jar:/root/webapp-0.0.1-SNAPSHOT/lib/slf4j-log4j12-1.7.12.jar:/root/webapp-0.0.1-SNAPSHOT/lib/spring-aop-4.2.0.RELEASE.jar:/root/webapp-0.0.1-SNAPSHOT/lib/spring-beans-4.2.0.RELEASE.jar:/root/webapp-0.0.1-SNAPSHOT/lib/spring-context-4.2.0.RELEASE.jar:/root/webapp-0.0.1-SNAPSHOT/lib/spring-core-4.2.0.RELEASE.jar:/root/webapp-0.0.1-SNAPSHOT/lib/spring-expression-4.2.0.RELEASE.jar:/root/webapp-0.0.1-SNAPSHOT/lib/test-jetty-servlet-8.1.0.RC5.jar:/root/webapp-0.0.1-SNAPSHOT/lib/webapp-0.0.1-SNAPSHOT.jar
starting...\c
2896
ok
SSH: EXEC: completed after 1,204 ms
SSH: Disconnecting configuration [node01] ...
SSH: Transferred 1 file(s)
Finished: SUCCESS
总结:
整个过程,前面的安装和配置占了大部分时间,这是从无到有的一个过程,所以很繁琐,但是后续的构建项目,是很快的,这就是持续集成的好处,将人的工作由工具来完成,可以减少出错的概率,提高效率。
另外,这还是没有集成代码review的部分。