百度百科里给Jenkins的定义是,“持续集成软件平台+工具“,没用Jenkins之前看不懂,用了之后还是看不到看不懂这个说法。
找到了Jenkins官网的解释“The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.“——提供上百款插件实现服务器的自动化工作(这里的自动化指运维),包括构造应用(项目、服务、软件工程),部署应用,和任何服务器相关功能实现的自动化,Jenkins是开源软件,而且在这方面是走在领先地位的哦。
目前我用到Jenkins的功能是,集成maven、git,经过一些github、tomcat的配置,一键操作一键完成项目从github发布到阿里云服务器。Jenkins调用git的命令,拉github的项目,项目经过maven打包war文件,用tomcat的manager发布到服务器。
Jenkins的优点
1. 省时间,每次发布系统基本都是差不多的操作,对于急着看上线效果的你来说,简直就是心急吃热豆腐;
2. 发布系统是个细致活,容易出问题,就算你牛逼你仔细可以不出问题,这些精力用在别的地方岂不是更好;
3. Jenkins把构造、部署系统的流程抽象化,做每件事只需要关注当前的工作不必考虑上下游的东西,比如你的项目是从github拉下来的,只要考虑配置github的东西,不用考虑项目构建发布;
4. Jenkins提供的插件有为我们做了很多事,比如对接github,使用svn的命令完成项目拉取。我们没办法精通所有的构造、部署方法,更没办法知道所有冷知识,只需要我们提供一些参数,Jenkins就能为我们做好应对那些应用(git、maven…)的工作,Jenkins简直就是服务器界的瑞士军刀啊。
安装Jenkins
从Jenkins官网下载Jenkins的war包。
https://jenkins.io/download/
用终端登录,可以用wget http://mirrors.jenkins.io/war/latest/jenkins.war
下载war包。
把jenkins.war放到tomcat根目录下的/webapps。启动tomcat,jenkins项目就算部署成功了,浏览器访问 http://{ip}:{port}/jenkins 就能进入jenkins的初始化界面(初始的时候有个密码,密码写在日志,很容易找到的),初始化界面可以创建第一个用户,安装插件,。
文章的重点不是jenkins的部署,而且这个也挺简单,就不贴图了。
Github+Maven+Tomcat的发布流程配置
Jenkins可以做很多事,下面说的是配置从Github拉去代码,发布到服务器的自动化过程。
首先,我们要把“硬件”层面的东西配好,Git、Maven和Tomcat的Manger,然后要准备好Github和Manger的账户信息,最后就可以配置整个流程了。
Git & Maven
安装Jenkins的电脑或服务器上面要装上Git和Maven,借助他们可以用来拉Github、Gitlab的代码,和构建war项目(不仅限于war)。如果是在Centos服务器上,安装这两个的工作就很简单了
yum install git
yum install maven
yum是用来下载rpm文件的,rpm才是真正Centos的安装工具,rpm安装的默认路径如下
/etc 一些设置文件放置的目录如/etc/crontab
/usr/bin 一些可执行文件
/usr/lib /usr/lib64 一些程序使用的动态函数库
/usr/share/doc 一些基本的软件使用手册与帮助文档
/usr/share/man 一些man page文件
查看所有安装的软件
[root@iZbp1aiejzadfq9do06acaZ bin]# rpm -qa
iwl6050-firmware-41.28.5.1-49.el7.noarch
iwl2030-firmware-18.168.6.1-49.el7.noarch
iwl105-firmware-18.168.6.1-49.el7.noarch
.......
查看软件信息
[root@iZbp1aiejzadfq9do06acaZ bin]# rpm -qi yum-metadata-parser-1.1.4-10.el7.x86_64
Name : yum-metadata-parser
Version : 1.1.4
Release : 10.el7
.......
查看软件安装路径
[root@iZbp1aiejzadfq9do06acaZ bin]# rpm -ql yum-metadata-parser-1.1.4-10.el7.x86_64
/usr/lib64/python2.7/site-packages/_sqlitecache.so
/usr/lib64/python2.7/site-packages/sqlitecachec.py
/usr/lib64/python2.7/site-packages/sqlitecachec.pyc
/usr/lib64/python2.7/site-packages/sqlitecachec.pyo
Tomcat Manager
tomcat也是有管理界面和接口的哟!!
通过管理界面和API,可以查看系统状态信息和项目部署情况,还能发布项目、删除项目。
开启这项功能很简单,做两个事就行。首先,开放manager的外网访问权限,然后解锁具有这些权限的role和user。
manager默认是开启的,也有基本的账号能登录进去,但是部署在服务器上的tomcat就不能访问了,在tomcat根目录conf/Catalina/localhost
文件下创建文件manager.xml
,allow是允许访问的IP。
<?xml version="1.0" encoding="UTF-8"?>
<Context privileged="true" antiResourceLocking="false" docBase="${catalina.home}/webapps/manager">
<Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="^.*$" />
</Context>
manager默认的roler和user都被关闭了,修改tomcat根目录下conf/tomcat-user.xml
文件,如下:
<role rolename="tomcat"/>
<role rolename="role1"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-status"/>
<user username="tomcat" password="111" roles="tomcat"/>
<user username="both" password="111" roles="tomcat,role1"/>
<user username="role1" password="111" roles="role1"/>
<user username="deploy" password="111" roles="manager-status,manager-gui,manager-script"/>
deploy用户拥有管理部署项目的界面操作、api操作权限。
Github的Personal Access Token
通过Personal Access Token授权就可以访问Github的接口。创建一个拥有repo和admin:repo_hook权限的token,Jenkins通过该token,调用Github的接口创建Webhooks。
上面的Token是属于账户级的东西,Webhooks是项目级别的,当项目发生了某个事件,Github会给一个指定的url发Post请求。有了Webhoks,就不需要定时去拉Github的代码,而让Github主动通知。GitLab也有类似的机制。
万事俱备,开始要配置Jenkins了!!!
Git和Maven,要在Global Tool Configuration全局工具配置好。
这里贴出Git,Maven,JDK的配置,涉及到的name都只是名称可以随便填。
一般Home是安装路径的根目录,而执行文件路径只要该路径下能访问执行文件就行
系统管理->系统设置,可以配置一些Jenkins的基础设置
下面的这个配置就是设置Github接口调用地址和认证方式的地方,
Credentials用secret test,虽然也可以用账号密码验证,secrest test可以只授权部分功能开发,而且更不容易被盗取。secrest test创建如下,只需要把Github的Personal Access Token填入Secret就可以了。
Override Hook URL
是Github回调Jenkins的接口配置。
Shared secret
上面的Credentials是Github给Jenkins的验证Token,shared secret是Jenkins给Github提供的验证Token,在Github的Personal Access Token创建那的secret就是填这个。原理差不多,整一个长一点的字符串就行。
上面做的是全局配置,接下来可以开始创建Jenkins工程了!!!
这里我们创建的是Maven项目,关于其他项目还没探索过,后续可能会有文章哟。
如果你没看到下面的界面,那应该是搞错项目类型了。
maven项目的配置如下:
1. 设置git从哪拉代码,和拉去的分支(工作区可以查看代码)
2. “GitHub hook trigger for GITScm polling”以前叫做“Build when a change is pushed to GitHub”,Github Plugin插件改了这个设置的名称。这Webhooks的设置虽然是在这开启,但是账号却是全局维护的,虽然有点摸不着头脑,大概设计者考虑到不同项目用的是同一个Github账号,这样可以避免Webhooks重复设置。
3. Maven的构建语句
这里需要额外提下pom.xml文件,即使Maven可以正常跑起来,pom.xml没配好,还是会出问题的。下面是笔者可以正常发布的pom.xml。
<project>
<properties>
<tomcat.version>8.5.9</tomcat.version>
<java.version>1.8</java.version>
.....
</properties>
<dependencies>
.....
</dependencies>
<build>
<!-- 生成war文件的文件名 -->
<finalName>unitools</finalName>
<plugins>
<!-- 生成war文件的插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.6</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
<!-- 忽视单元测试错误异常 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version>
<configuration>
<testFailureIgnore>true</testFailureIgnore>
</configuration>
</plugin>
<!-- 生成war过程需要整合项目依赖的包 -->
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- 打war包是个java文件编译的过程,当然是要指定jdk信息的-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<encoding>${project.build.sourceEncoding}</encoding>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
<!-- 有些项目用eclipse生成war可以运行,用maven确不可以。eclipse记录了所有文件的发布路径,maven单独用的时候,需要配置好资源文件的发布路径哟 -->
<resources>
<resource>
<directory>src/main/resourse</directory>
<includes>
<include>**/**</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
- 配置tomcat发布信息
这里的账号信息来自Tomcat manager。这里说两个要注意的点:WAR/EAR files的路径是相对路径,相对的是Jenkins的工作区,maven默认会打在target文件下,如果pom.xml没配<finalName></finalName>
,要小心哦!;Context path是项目发布的名称,也就是url访问的名称。