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密钥对,
若存在以下文件,则表明已经生成过:

AlgorithmPublic keyPrivate 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 插件进行安装

image.png

 

在全局工具中配置 allure 相关

image.png

 

然后继续改造 Job,在构建后的操作中添加 allure 报告的信息。

image.png

 

这样之后,我们就可以在构建后,在 Jenkins 上直接查看执行后的报告了。

这样使用之后,感觉还是差点东西,差什么呢,因为用例很多,每次构建的时间都很长,这就导致我无法知道什么时候结束,来第一时间查看结果并反馈执行情况。所以我们还需要继续改造,加入通知的能力。

 

2)改造三:增加通知的能力

在和项目组沟通后,确定了两种方式的通知,企业微信通知邮件通知。 研究一番之后,发现,Jenkins 使用插件来实现企业微信通知,只能显示少量的信息(如:开始时间),并不能达到我们想的显示大致的执行结果的能力,所以这部分,我就直接使用 Python 脚本来实现了,不使用 Jenkins。 这里就不做详细说明了,大致的思路是:解析执行生成的 xml 文件来获取执行结果信息,然后按照企业微信机器人的方式来通知。附上一张我调试的效果图:

image.png

虽然企业微信通知没有使用 Jenkins,但是邮件的通知,Jenkins 还是很好用的,我们用 Jenkins 来进行邮件的通知发送,接着改造 job。

在构建后的操作中添加 Editable Email Notfication,填写发送邮件的信息。

image.png

这样改造之后,我们也拥有了通知的能力。

这时候领导又提要求了,现在想晚上使用脚本来巡检,早上查看结果。这样不可能每天晚上登录 Jenkins 来构建,所以我们需要继续改造,加入定时构建的能力。

 

3) 改造四:增加定时构建

在 job 的构建触发器中选择 Build periodically H 2 1,2,3,4,5 表示周一到周五每天凌晨 2 点左右开始构建,填写后,可以查看到下面显示的下次构建的时间 这样改造之后,每天晚上就自动构建了。

image.png

到这里我们就拥有了 Git,查看报告,邮件通知,定时构建的能力。

这个时候运维的小伙伴又提要求了,给我们自动化测试分配了一台服务器,让我们在那台设备上测试,不想和开发发布的混在一起。

 

4)改造五:指定节点运行

我们需要在指定节点构建,通过 Jenkins 来调度。这样我还需要接着改造了。

1. 添加节点

进入系统管理(configuer system)》管理节点(manage nodes and clouds),点击新增节点。

image.png

 

注意:节点的标签不要用中文 再配置节点属性和工具

image.png

 

如果启动方式没有上方选择的选项,需要到全局安全配置中勾选如图的地方:

image.png

 

2. 连接节点

新增的节点是没有连接 Jenkins 服务的,需要启动一个 agent 来主动连接到服务。

image.png

按照如下步骤来操作: 到从节点(执行机)上登录 Jenkins,点击刚刚添加的节点中,会如下图显示

image.png

点击红框标记的图标,会下载下来一个文件

image.png

 

双击打开下载的文件,会显示一个小窗口,自动连接(需要 jdk 环境)

image.png

 

连接后会添加到执行机的服务中运行,之后不用再操作。

注意:如果连接提示失败,可能是端口没有开放,配置时选择的随机生成端口,如果连接提示端口没有打开,将 Jenkins 所在的服务器上刚使用的端口打开即可。

image.png

改造 Job,配置使用执行的节点

在一般信息中勾选限制项目的运行节点,填写我们添加的节点的标签。

image.png



posted @ 2016-11-01 03:14  liangww  阅读(5454)  评论(0编辑  收藏  举报