maven与Jenkins 使用
一、简介
1. Make工具
这个工具是最最原始的工具了,在linux下编过程序,看过比较大的c/c++代码的人应该都听说过这个工具(Windows下对应的工具为nmake)。它负责组织构建的过程,也就是负责指挥编译器如何编译,连接器如何连接,最后生成一个可用的文件。
2. Ant工具
但是有人觉得make工具的很难使用,他的语法很难理解,就发明了ant
3. Maven工具
Maven像make一样是个构建(build)工具,Maven工具是对ant工具的进一步改进(这么说不太准确,但是可以这么理解)。在make工具中,如果我们要编译某些源文件,我们肯定首先要安装编译器等工具,但是有时候需要不同版本的编译器,如果把每个包都下载下来,在makefile中进行配置制定,需要的包非常多,很难管理,于是人们发明了Maven工具。Maven使用配置文件pom.xml对环境进行配置,例如设定编译器的版本,设定所需支持包的URL,这样maven就可以自动去下载所需的包。这样如果需要对构建环境进行改变时,直接改变pom文件就可以了,maven会自动网络上下载配置的包。Maven可以利用一些别的工具,实现对编译结果的统计,对源代码的检查,对于代码的测试等。
4. Jenkins工具
其实Maven还是不够强大。Maven可以控制编译,控制连接,可以生成各种报告,可以进行代码测试。可是如何控制这个流程呢?先编译还是先连接?先进行代码测试,还是先生成报告?这个工具就是Jenkins。Jenkins能够对流程进行控制,对能够对各个阶段生成的各种结果进行综合,以图表的形式呈现出来。但是不同的工具生成不同格式的结果,Jenkins如何让这些结果呈现出来?这就是jenkins插件,Jenkins插件使maven中用到的各种工具生成的结果能够在Jenkins中呈现出来。
二、Maven
Maven是一个项目管理工具,它包含了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统。Maven可以管理项目的整个生命周期,包括编译,构建,测试,发布,报告等等。目前Apache下绝大多数项目都已经采用Maven进行管理。
1、Maven的基本功能
·构建:比如生成class、jar、war或者ear文件
·生成文档:比如生成javadoc、网站文档
·生成报告:比如junit测试报告
·生成依赖类库:生成文档,说明项目多其他软件的依赖
·有关SCM:SCM(Software Configuration Management),软件配置管理,比如版本控制,比如bug管理等等
·发布:生成供发布的分发包,比如生成Struts2的分发包,供提交给用户使用
·部署:比如,web应用程序,自动部署到指定的服务器上
2、maven环境搭建
Jdk 1.5以上java开发环境。
Eclipse IDE 一个。
Maven 3.0.3下载地址: http://maven.apache.org/docs/3.0.3/release-notes.html
第一步:配置maven环境
将下载文件解压,然后设置maven环境
如果你配置过jdk的话,这里对你应该不难。如我的maven环境为:F:\maven\apache-maven-3.0.3
我的电脑-----属性----高级-----环境变量-----环境变量-----新建
变量名:M2_HOME
变量值:F:\maven\apache-maven-3.0.3
找到path
在环境变量值尾部加入:;%M2_HOME%\bin;---前面注意分号
当然,你也可以直接在path 路径下加入:;F:\maven\apache-maven-3.0.3\bin 只是上面的方式更优雅一点。
打开命令提示符(开始---运行---cmd),检查我们的java环境和maven环境是否有误。mvn -v
第二步:修改仓库位置
修改我们仓库地址,仓库用于存放我们项目所依赖的所有jar包。我的仓库路径:F:\maven\repo----这个路径是我自己创建,你可以将路径创建在任何位置。我们打开…\apache-maven-3.0.3\conf\目录下的setting.xml文件,设置成我们创建的仓库路径
下面我们用一个命令验证一下。打开命令提示符,输入:mvn help:system 该命令会打印出所有的java系统属性和环境变量。这些信息对我们日常的编程工作很有帮且。如果运行的过程中没有错误,打开我们仓库(F:\maven\repo)会发现里面多了一些文件。这些文件就是我们从maven的中央仓库下载到本地仓库的。
第三步:创建maven项目
创建一个我们自己的项目。
我们通过maven命令行方式创建一个项目
cd maven
mvn archetype:create -DgroupId=com.chongshi.test -DartifactId=hello -DpackageName=com.chongshi.test -Dversion=1.0
因为是第一次构建项目,所有依赖的jar包都要从maven的中央仓库下载,所以需要时间等待。等以后我们的本地仓库中积累了我们常用的jar包后,我们的开发将变得非常规范和方便。借助下载jar包的时间,我们来了解一下pom.xml文件。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.chongshi.test</groupId> <artifactId>hello</artifactId> <version>1.0</version> <packaging>jar</packaging> <name>hello</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
Ø project:pom.xml文件中的顶层元素;
Ø modelVersion:指明POM使用的对象模型的版本。这个值很少改动。
Ø groupId:指明创建项目的组织或者小组的唯一标识。GroupId是项目的关键标识,典型的,此标识以组织的完全限定名来定义。比如,org.apache.maven.plugins是所有Maven插件项目指定的groupId。
Ø artifactId:指明此项目产生的主要产品的基本名称。项目的主要产品通常为一个JAR文件。第二,象源代码包通常使用artifactId作为最后名称的一部分。典型的产品名称使用这个格式: <artifactId>- <version>. <extension>(比如:myapp-1.0.jar)。
Ø version:项目产品的版本号。Maven帮助你管理版本,可以经常看到SNAPSHOT这个版本,表明项目处于开发阶段。
Ø name:项目的显示名称,通常用于maven产生的文档中。
Ø url:指定项目站点,通常用于maven产生的文档中。
Ø description:描述此项目,通常用于maven产生的文档中。
对于一个项目中只有下面的一部分是是我们需要关注的:
<groupId>com.chongshi.test</groupId>
<artifactId>hello</artifactId>
<version>1.0</version>
第四步:编译项目代码
我们的项目已经创建完成。但我们点开目录发现,它并不是我们eclipse所需要的项目目录格式。我们需要把它构建成我们eclipse可以导入的项目。
在命令提示符下进入到我们的创建的项目目录(F:\maven\hello)下,执行:mvn clean compile
Clean 告诉maven清理输入出目录target/,compile告诉maven编译项目主代码。
项目是编译完了,但项目的目录结构还不是我们想要的eclipse的项目结构,是不能导入到eclipse中的。所以,还需要执行一个命令:mvn eclipse:eclipse
命令执行完成后就得我们需要的项目目录了。
第五步:导入eclipse工具
打开的我们的eclipse工具。
先配置maven仓库路径
Window----Perferences-----java-----Build Path-----Classpath Variables
New一个变量的类路径。
Name :M2_REPO 注意这个名字必须要大写。
Path :F:/maven/repo 点击“Folder…”找到有本地仓库的位置。
下面,可以导入我的hello项目了。Eclipse如何导入项目,我这里就不说了,如果你是个java开发人员的话。
第六步:包的更新与下载
打开项目发现我们junit 是3.8.1的,有点老了。那我想换成4.7的,如何通过maven的方式更换呢。其实,很简单,打开我们项目下的的pom.xml文件。
……
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
……
更改变,junit的版本号,然后重新执行:mvn eclipse:eclipse
Maven 中央仓库地址:http://search.maven.org/
假如,我们想下载一个struts 的jar包。在搜索框内搜索strruts ,会要列出中央仓库中的所有struts版本。
列表的格式与我们pom.xml配置文件的格式是对应的。
我们在pom.xml中加入:
<groupId>stuts</groupId>
<artifactId>struts-scripting</artifactId>
<version>1.0.1</version>
然后更新项目就可从中央仓库下载我们想要的任意jar包(必须是开源的包)
3、常用命令
mvn archetype:create 创建Maven项目
mvn compile 编译源代码
mvn deploy 发布项目
mvn test-compile 编译测试源代码
mvn test 运行应用程序中的单元测试
mvn site 生成项目相关信息的网站
mvn clean 清除项目目录中的生成结果
mvn package 根据项目生成的jar
mvn install 在本地Repository中安装jar
mvn eclipse:eclipse 生成eclipse项目文件
mvnjetty:run 启动jetty服务
mvntomcat:run 启动tomcat服务
mvn clean package -Dmaven.test.skip=true:清除以前的包后重新打包,跳过测试类
三、Jenkins
jenkins是一个广泛用于各种项目的"自动化"编译、打包、分发部署。jenkins本身是用java语言开发的,所以安装jenkins的机器至少要有jdk。jenkins可以很好的支持各种语言(java, c#, php等)的项目构建,也完全兼容ant、maven、gradle等多种第三方构建工具,同时跟svn、git能无缝集成,也支持直接与知名源代码托管网站github、bitbucket直接集成。Jenkins默认情况下可以实现项目更新(通过SVN)和项目发布(通过MAVEN)1、Jenkins 安装(windows)
1)windows安装包
1.以管理员身份运行cmd.exe,进入到jenkins安装目录
2.停止服务:jenkins.exe stop
2019-05-05 22:31:21,203 INFO - Stopping the service with id ‘Jenkins’
3.启动服务:jenkins.exe start
2019-05-05 22:32:09,753 INFO - Starting the service with id ‘Jenkins’
2)war安装包
下载jenkins.war, 下载成功后,将war包文件放入对应的目录(如C:\Users\Jenkins\),在命令行切换目录到Jenkins,然后执行java -jar jenkins.war
访问http://localhost:8080 。
Jenkins集群配置
集群配置也十分简单,就是添加slave节点的过程。点击系统管理->管理节点->新建节点,各个配置后面都有详细的帮助说明的。
在启动方法这里推荐使用 Launch slave agents>构建Job
其实到这一步,就是jenkins的常规流程了,你可以参照创建Job选项的界面的各个配置,制定你构建计划,或者我们直接使用脚本来完成我们的构建操作(建议)选择构建Execute shell,文章末尾会附上一个完整项目的shell构建流程。
Pipeline
Pipeline字面意思就是流水线,很好用的Jenkins的一个插件,将很多步骤按顺序排列好,做完一个执行下一个。真实的工作环境有很多job,比如先编译,然后执行静态代码检查、单元测试、然后部署服务器、服务器重启、进行ui测试等。我们需要对这些job进行一些设置将它们的上下游关系配置好。
这时候Pipeline就派上用场了。在Jenkins主页点击新建视图,然后选择Build Pipeline View,然后填写Select Initial Job,构建后的操作可以选择其他的Job,以此类推,这样一个流水线就完成了。Pipeline提供视图界面,你可以在视图上形象地看到整个构建计划的执行流程和完成度。
2、Jenkins常用命令
(1)关闭Jenkins
http://localhost:8080/exit
(2)重启Jenkies
http://localhost:8080/restart
(3)重新加载配置信息
http://localhost:8080/reload
(4)Jenkins时区设置为北京时间
打开 【系统管理】->【脚本命令行】运行下面的命令
System.setProperty('org.apache.commons.jelly.tags.fmt.timeZone', 'Asia/Shanghai')
3、插件安装
(1)如果在安装jenkins的时候没有安装相关插件,可以按照如下方式安装(已经安装,则不需要)
(2)选择可选插件菜单,搜索自己想要的插件,然后安装,如果有插件一直安装失败的情况,可以从jenkins官网下载插件,然后导入到jenkins。在jenkins插件管理->高级,选择上传插件进行安装。
4、定时构建语法
* * * * * (五颗星,中间用空格隔开)
第一颗*表示分钟,取值0~59
第二颗*表示小时,取值0~23
第三颗*表示天,取值1~31
第四颗*表示第几月,取值1~12
第五颗*表示星期,取值0~7,其中0和7代表的都是周日
H表示随机,没有用到 H 随机的话,不要加括号
1.
H/30 * * * * 每30分钟构建一次:
2.
H H/2 * * * 每隔2个小时构建一次
H 4-19/3 * * * 凌晨点到下午7点,每隔3个小时构建一次
0 8 * * * 每天早上8点构建一次
H 8-18/3 * * * 每天早上8点到晚上6点每三小时检查一次
3.
* * 3-5 * * 每个月的3号,4号,5号 都会被构建,具体时间未知
20 16 15 * * 每个月的15号下午16点20分构建一次
4.
0 8,12,22 * * * 每天的8点,12点,22点,一天构建3次(多个时间点,中间用逗号隔开)
5.
每个月的1-7号一天构建一次
H/30 8-19/3 1-28 1-11 1-5 在1-11月中的1号-28号,每个工作日,早晨的8点到下午7点每隔3.5个小时会触发构建
5、用户和权限
jenkins 配置用户角色权限需要安装插件 Role Strategy Plugin
1.安装 Role Strategy Plugin 插件,下载地址:https://updates.jenkins-ci.org/download/plugins/role-strategy/
打开jenkins 系统管理-->管理插件-->高级,点击上传,选择下载的插件安装
2、安装完后,重启jenkins,进入系统设管理-->Configure Global Security ,配置如下,保存
3.配置User/Group权限
打开 系统管理-->Manage and Assign Roles
3-1. 管理角色(Manage Roles)
选择该项可以创建全局角色、项目角色,并可以为角色分配权限
添加test组,并给Over all 的Read 权限、Job Build 权限、View的Read权限。
Project roles 配置Pattern,例如匹配以 auto开头的,需要写成 auto.*切记!配置完后保存
3-2.添加用户权限(Assign Role)
系统需要有用户(若没有可添加:系统管理 --> 用户管理 -->添加用户),然后:
4,创建 autotest 任务, 用户test(只有构建权限)用户登录进去,发现只能看到autotest任务,实现不同用户不同视图及不同权限
四、ssh密钥
1、检查是否已存在SSH密钥对
服务器可以通过ssh来通信和连接,linux一般默认已安装了ssh服务,windows一般未安装,建议安装OpenSSH
1)、在Windows, Linux, macOS系统下,进入用户home目录(windows为C:\Users\当前用户名)
2)、进入.ssh/子目录(windows为C:\Users\当前用户名\.ssh),
3)、若不存在则需按照下文步骤生成SSH密钥对,
若存在以下文件,则表明已经生成过:
Algorithm | Public key | Private key |
---|---|---|
ED25519 (preferred) | id_ed25519.pub | id_ed25519 |
RSA (at least 2048-bit key size) | id_rsa.pub | id_rsa |
DSA (deprecated) | id_dsa.pub | id_dsa |
ECDSA | id_ecdsa.pub | id_ecdsa |
2、生成SSH密钥对
1)、打开windows CMD
2)、执行ssh-keygen命令,comment可以是邮箱账号会出现在.pub文件中
ssh-keygen -t rsa -b 2048 -C "<comment>"
可按提示输入密码(亦可直接回车跳过)生成完成后,既可在如下图提示的目录下查看到密钥对文件
3、通过SSH密钥对实现免密登录Linux服务器
将公钥拷贝到目标主机的用户home/.ssh
目录下的authorized_keys文件中。又或者通过如下命令进行公钥拷贝:
# 其中可通过-p指定ssh端口(默认22)
ssh-copy-id 用户名@目标主机IP -p 22
拷贝完成后即可在私钥所在的机器上
直接免密登录绑定公钥的机器
ssh 用户名@目标主机IP
五、Jenkins部署项目
当我们每次把代码提交到仓库的时候,都希望Jenkins会自动部署运行,我们应该给它一个凭证以便访问文件,即免密访问,如果想要访问对方主机,需要把本机机的公钥交给它即可。
在jenkins所在主机生成ssh密钥,我们把公钥给仓库平台gitlab、把私钥给Jenkins。
1、添加公钥到gitlab用户,用来clone代码
我们在Jenkins所在的主机生成秘钥,然后查看id_rsa.pub ,把公钥复制到仓库就行
1)、登录gitlab,点击右上角头像 -> 下拉菜单Settings -> 左侧菜单SSH Keys
2)、将之前生成的公钥id_rsa.pub内容粘贴到Key文本框,同时自定义title。添加完成后,即可在私钥所在的机器上拥有该ssh公钥绑定账户的操作权限(注意对应ssh gitlab库链接)
2、接下来我们要把私钥交给Jenkins。依次点击 凭据–系统–全局凭据–添加凭据
我们先修改类型为SSH Username with private key,然后点击下面的 Enter directly,把Jenkins所在主机的私钥复制粘贴到此即可
点击ok之后返回查看是否添加成功
六、jenkins操作
1、jenkins普通任务
1 )新建任务
我们点击 New Item创建一个新任务,输入任务名。类型选择Freestyle project,然后点击OK
我们直接选择Source Code Management,选择git,填写仓库的SSH链接和选择凭证用户,最后点save即可
2)构建任务
新建任务之后,点击左边的Build Now即可开始执行任务。我们可以在左下角看到构建历史,还可以点击倒三角形选择Console Output看到具体的构建步骤
2、jenkins触发式任务
1)准备一个测试脚本,开发如果提交了代码就执行这个测试脚本。
2)我们点击New Item创建一个新任务,输入任务名。类型选择Freestyle project,然后点击OK
3)源码管理选择git,然后只需要在repository url中输入git仓库地址即可。
4)构建触发器:即gitlab有提交操作则自动部署,这里只需设置一个认证的token即可,
gitlab调用触发器,使用 JENKINS_URL/job/new_cms/build?token=TOKEN_NAME即可
在系统管理–>用户管理–>查看用户id和token,需要把用户id和API Token加入触发器中,做用户验证
根据触发器验证令牌和用户id+token会生成一个下面的url,只需要访问这个URL地址jenkins就会自动部署对应项目的代码。
http:
//admin
:984c9edf027e750f0587808fab0c3f9b@192.168.100.10:8080
/job/jenkins_trigger/build
?token=hehe
在jenkins全局安全设置中取消勾选“防止跨站点请求伪造,不然jenkins会认为gitlab的请求不合法。
(5)普通构建,选择execute shell,执行部署脚本即可
(6)jenkins定时构建,定时构建一般用在安卓,ios打包,每天凌晨会拉取安卓,ios进行编译打包,并自动推送到共享。本示例演示定时执行一个命令
选择Execute Windows batch command
(6)在gitlab中配置webhooks,配置URL,每次提交代码就访问这个url,执行构建
URL这里输入上面上面用户ID+API token+job token生成的URL地址即可。触发工作选择,push event,merge request event即可。
(7)添加完成测试:点击test模拟提交操作,看看是否会执行自动构建
Jenkins查看,可以看到构建也是成功的。
七、高级改造
1) 改造二:加入直接查看报告的能力
在本地执行时,我们是 allure 可执行文件来生成报告,那集成到 Jenkins,我们需要先安装 allure 的插件
在插件管理中搜索 alluer 插件进行安装
在全局工具中配置 allure 相关
然后继续改造 Job,在构建后的操作中添加 allure 报告的信息。
这样之后,我们就可以在构建后,在 Jenkins 上直接查看执行后的报告了。
这样使用之后,感觉还是差点东西,差什么呢,因为用例很多,每次构建的时间都很长,这就导致我无法知道什么时候结束,来第一时间查看结果并反馈执行情况。所以我们还需要继续改造,加入通知的能力。
2)改造三:增加通知的能力
在和项目组沟通后,确定了两种方式的通知,企业微信通知邮件通知。 研究一番之后,发现,Jenkins 使用插件来实现企业微信通知,只能显示少量的信息(如:开始时间),并不能达到我们想的显示大致的执行结果的能力,所以这部分,我就直接使用 Python 脚本来实现了,不使用 Jenkins。 这里就不做详细说明了,大致的思路是:解析执行生成的 xml 文件来获取执行结果信息,然后按照企业微信机器人的方式来通知。附上一张我调试的效果图:
虽然企业微信通知没有使用 Jenkins,但是邮件的通知,Jenkins 还是很好用的,我们用 Jenkins 来进行邮件的通知发送,接着改造 job。
在构建后的操作中添加 Editable Email Notfication,填写发送邮件的信息。
这样改造之后,我们也拥有了通知的能力。
这时候领导又提要求了,现在想晚上使用脚本来巡检,早上查看结果。这样不可能每天晚上登录 Jenkins 来构建,所以我们需要继续改造,加入定时构建的能力。
3) 改造四:增加定时构建
在 job 的构建触发器中选择 Build periodically H 2 1,2,3,4,5 表示周一到周五每天凌晨 2 点左右开始构建,填写后,可以查看到下面显示的下次构建的时间 这样改造之后,每天晚上就自动构建了。
到这里我们就拥有了 Git,查看报告,邮件通知,定时构建的能力。
这个时候运维的小伙伴又提要求了,给我们自动化测试分配了一台服务器,让我们在那台设备上测试,不想和开发发布的混在一起。
4)改造五:指定节点运行
我们需要在指定节点构建,通过 Jenkins 来调度。这样我还需要接着改造了。
1. 添加节点
进入系统管理(configuer system)》管理节点(manage nodes and clouds),点击新增节点。
注意:节点的标签不要用中文 再配置节点属性和工具
如果启动方式没有上方选择的选项,需要到全局安全配置中勾选如图的地方:
2. 连接节点
新增的节点是没有连接 Jenkins 服务的,需要启动一个 agent 来主动连接到服务。
按照如下步骤来操作: 到从节点(执行机)上登录 Jenkins,点击刚刚添加的节点中,会如下图显示
点击红框标记的图标,会下载下来一个文件
双击打开下载的文件,会显示一个小窗口,自动连接(需要 jdk 环境)
连接后会添加到执行机的服务中运行,之后不用再操作。
注意:如果连接提示失败,可能是端口没有开放,配置时选择的随机生成端口,如果连接提示端口没有打开,将 Jenkins 所在的服务器上刚使用的端口打开即可。
改造 Job,配置使用执行的节点
在一般信息中勾选限制项目的运行节点,填写我们添加的节点的标签。