docker&Jkenkis&maven工具

基于jenkins搭建一个持续集成服务器

2018-07-23  本文已影响532人  荒原_狼

持续集成概述

什么是持续集成

随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。

持续集成正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。

持续集成的核心价值在于:

持续集成的原则

业界普遍认同的持续集成的原则包括:
1)需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有 IBM Rational ClearCase、CVS、Subversion 等;

2)开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本地;

3)需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次;

4)必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建。

持续集成的组成

Jenkins简介

Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。

主要用于:

Jenkins拥有的特性包括:

部署一个CI系统的最低要求是,一个可获取源代码的仓库,一个包含构建脚本的项目。下图概括了CI系统的基本结构


Jenkins部署

Jenkins安装

Jenkins配置

配置一个JDK、Maven实例,请在每一节下面单击Add(新增) 按钮,这里将添加实例的名称和绝对地址。
JDK别名:命名标示,可随意取名。建议同安装根目录名保持一致
JAVA_HOME:本机JDK的安装路径(绝对路劲)
自动安装:不推荐这个选项,会出现需要oracle用户名,VPN等要求
后面Maven的配置是一样的,JDK去oracle官网下载, Maven去apache官网下载
Ps:每个文本框后面都有个问号,点击问号就会出现帮助信息
下图描述了以上两个部分。


l 可更新:清单中列示了Jenkins为某些插件搜索到了可用的更新。列出的每个插件可以被选择并应用更新。
l 可选插件:清单中列示了可用于安装(而不是目前已安装的)的所有插件。列出的每个插件都可以被选择并安装。
l 已安装:清单中列示了已经安装的插件。
l 高级:允许您通过设定HTTP代理的方式使Jenkins与在线插件库建立连接。此外,还提供了一个上传设备,可以安装您在Jenkins以外已下载的那些插件。
各种Jenkins插件根据之前所记述的类型进行分门别类。可勾选任意想安装的Jenkins插件,到页面最下面有两个按钮“Install without restart” “Download now and install after restart”,根据需要点选提交开始安装。

安装后,所有插件以hpi作为后缀名放置在plugins文件夹下。如果是高级用户还可以自行开发插件方便具体项目使用。
注意:安装完成后需要重启Jenkins部署的容器。这样才能使用新装的插件。
监控
当任务一旦运行,您将会看到这个任务正在队列中的仪表板和当前工作主页上运行。这两种显示如下。


一旦构建完成后,完成后的任务将会有三个地方进行显示。

您可以在Jenkins的控制面板上看到它,如下图。



在上面展示的截图中,您将注意到有两个图标描述当前作业的状态。S栏目代表着“最新构建状态”,W栏目代表着“构建稳定性”。Jenkins使用这两个概念来介绍一个作业的总体状况:
构建状态:下图中分级符号概述了一个Job新近一次构建会产生的四种可能的状态:
l Successful:完成构建,且被认为是稳定的。
l Unstable:完成构建,但被认为不稳定。
l Failed:构建失败。
l Disabled:构建已禁用。


构建状态界面
构建稳定性: 当一个Job中构建已完成并生成了一个未发布的目标构建,如果您准备评估此次构建的稳定性,Jenkins会基于一些后处理器任务为构建发 布一个稳健指数 (从0-100 ),这些任务一般以插件的方式实现。它们可能包括单元测试(JUnit)、覆盖率(Cobertura )和静态代码分 析(FindBugs)。分数越高,表明构建越稳定。下图中分级符号概述了稳定性的评分范围。任何构建作业的状态(总分100)低于80分就是不稳定的。

如果您想通过视图输出界面来监控当前任务的进展情况。您可以单击Console Output(控制台输出)。如果工作已完成,这将显示构建脚本产生的静态输出;如果作业仍然在运行中,Jenkins将不断刷新网页的内容,以便您可以看到它运行时的输出。如下图:


Jenkins其他配置

Slave配置
Jenkins有个很强大的功能:分布式构建,分布式构建能够让同一套代码在不同的环境(如:Windows和Linux系统)中编译、测试等。而且Jenkins构建的代码和产物最后自动拷贝到主节点。
注意:如果节点主机上不存在JDK,Jenkins会去自动下载,但Oracle对程序自动下载做了限制,会导致下载失败,然后一直循环这个问题。
建议:所有Unix/Mac/Linux或者Windows机器的环境路径统一(如:JDK、Maven),便于管理、不易出现奇葩问题。
l 进入节点配置界面:系统管理→管理节点→新建节点(左上角)


l 节点名称:建议使用字母、数字或字母和数字的组合。最好见名知意。不建议使用标点符号和中文(中文命名没有问题,但Job中无法引用)
l Dumb Slave:新建一个节点
l 复制现有节点:从已存在的节点中复制一份配置(存在节点才会显示)
l 点击ok进入下一步配置

l Name:节点名称

l Description:节点描述,支持中文

l # of executors:最大同时构建数量(根据机器的性能定,单颗四核cpu建议不要超过5)【必须为数字】

l Remote FS root:节点的根目录(注意:如果目录不存在,会自动创建目录。你必须对该目录有读写权限,不然会报错:hudson.util.IOException2: Failed to copy xxxx)

l Labels:标记(又叫做标签)用来对多节点分组,标记之间用空格分隔.例如'refression java6'将会把一个节点标记上 和'java6'.
举例来说,如果你有多个Windows系统的构建节点并且你的Job也需要在Windows系统上运行,那么你可以配置所有的Windows系统节点都标 记为'windows', 然后把Job也标记为'windows'.这样的话你的Job就不会运行在除了Windows节点以外的其它节点之上了.

l 用法:尽可能的使用这个节点/只允许运行绑定到这台机器的Job(根据你的需求,二选一)

l Launch method:运行方式有四个选项。建议选择第1、2种方式配置。详细如下:

n 【推荐】Launch slave agents on Unix machines via SSH 在Unix(包括Linux)机器上通过SSH通道连接节点 (适用于Unix和Linux)

u Host:节点主机的ip地址

u Credentials:凭据(如果为空或者不可选择,请在系统管理→Manage Credentials中配置。Manage Credentials的配置非常简单,这里就不在描述了。Manage Credentials配置完成后,需刷新节点配置页面才会显示。)

u Port:端口默认22

u JavaPath:[可选]JDK路径,默认和master节点相同。路径必须指定到Java程序,如:/path/bin/java

u JVM Options:[可选]JVM可选参数

u Prefix Start Slave Command:[可选]不知道干什么用的参数

u Suffix Start Slave Command:[可选]不知道干什么用的参数

u Connection Timeout in Seconds:[可选]链接超时设置

u Maximum Number of Retries:[可选]失败重连数

u Seconds To Wait Between Retries:[可选]重连间隔时间

u 测试可以使用Unix命令,会自动拼接在[SSH] Starting slave process:[Prefix Start Slave Command] cd '/path' && /path/bin/java -jar slave.jar [Suffix Start Slave Command]

n 【推荐】Launch slave agents via Java Web Start 通过Java Web Start连接节点 (适用于所有支持Java程序的系统)

u Tunnel connection through:[可选]在端口转发这种情况下使用

u JVM options:[可选]JVM可选参数

u 这种方法的缺点:如果该节点宕机了,主节点无法自动重启它。

n Launch slave via execution of command on the Master 通过主节点的控制台连接节点

u Jenkins的开发者考虑到某些企业可能有N++ 个节点(N>=你猜!)。如果在界面配置,那么升级版本之类的操作会很麻烦。所以允许你使用shell脚本去配置管理节点(貌似很方便的样子)。具体的脚本需要你自己写。

u Launch command:Unix运行脚本的命令,如:sh aaa.sh

n 【不建议使用】Let Jenkins control this Windows slave as a Windows service 让Jenkins节点添加到Windows服务中

u 这个选项比Launch slave agents via Java Web Start添加为服务更加稳定(帮助文档描述)。采用这种运行方式,那么这个系统不能登录任何用户。这种配置方式是非常的麻烦和折腾。

u Administrator user name:域\管理员账号

u Password:密码

u Host:节点主机IP或者域名

u Run service as:

u Use Local System User:使用本地系统用户

u Log on using a different account:使用不同的用户登录

u User name:账号

u Password:密码

u Use Administrator account given above:使用上面的用户登录

u Path to java executable:[可选]JDK路径。必须指定到Java程序,如:C:\Windows\system32\java.exe

u JVM options:[可选]JVM可选参数

l Availability:

u Keep this slave on-line as much as possible:尽可能保持节点在线【推荐】

u Take this slave on-line according to a schedule:根据时间表在线(类似于Linux的定时任务)

l Startup Schedule:类似于Linux定时任务的时间,如下:

l # every fifteen minutes (perhaps at :07, :22, :37, :52)

l H/15 * * * *

l # every ten minutes in the first half of every hour (three times, perhaps at :04, :14, :24)

l H(0-29)/10 * * * *

l # once every two hours every weekday (perhaps at 10:38 AM, 12:38 PM, 2:38 PM, 4:38 PM)

l H 9-16/2 * * 1-5

l # once a day on the 1st and 15th of every month except December

l H H 1,15 1-11 *

l 如果使用 H Jenkins会自动提前一段时间连接节点,避免出现同一时间高并发的问题

l Scheduled Uptime:超过任务时间后延迟多少分钟离线。如果此数值大于在线总时间(单位:分),就会一直保持在线【必须为数字】

l Keep on-line while jobs are running:当有Job在构建时(到达离线时间了)继续保持在线

u Take this slave on-line when in demand and off-line when idle:让Jenkins根据需求自动连接或者离线

l In demand delay:告诉Jenkins如果有Job需要在此节点构建,需要在任务队列等待多长时间才会进入任务状态进行构建【必须为数字】

l Idle delay:告诉Jenkins多少分钟内如果没有Job需要构建就离线【必须为数字】

l Node Properties:

u Environment variables:配置环境变量(可以在脚本中引用)

u Tool Locations:工具的目录【推荐】。说明:可以替换系统设置的各种工具目录。如:JDK目录、Ant目录、Maven目录等。好处就是在不更改Job配置的情况下,不同环境(如:Windows和Linux) Job配置通用。

Windows Slave

相应配置选择完成后,进入需要控制的远程机器上,一定要进入远程的slave机器,而不是你的master机器。输入对应的你的jenkins的地址,例如这里:

http://192.168.11.237:8080/computer/

点击进入对应的该slave机器的图标进入:


如上图所示,有两种方式可以启动节点(都是JNLP方式。JNLP连接需要端口,默认连接端口是随机的,端口更改 系统设置→Configure Global Security→JNLP节点代理的TCP端口)

你以下几种方式启动:

l Launch agent from browser on slave 下载文件slave-agent.jnlp文件,双击打开。

n 一般用在Windows系统上,需要javaws.exe(在Java的bin目录中可以找到)程序才能打开。如果提示错误,请卸载JDK后重新安装。

u 注意事项:

u 确认slave-agent.jnlp 是用javaws来运行的,而不是java.exe 或者是javaw.exe来运行,因为一般的机器默认是采用java.exe启动的。

u 将slave-agent.jnlp用notepad打开后,确认其中的URL是可用的Jenkins地址。其中的配置可能是这样的:

确认其中的url地址是正确的地址,而不是localhost****或者127.0.0.1。

以上的配置完成后,如果点击lanch按钮,可能会报一下的错误:

Slave irshost12.tc.tb.com

Connection was broken

java.net.SocketException: Connection reset

at java.net.SocketInputStream.read(SocketInputStream.java:168)

at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)

at java.io.BufferedInputStream.read(BufferedInputStream.java:237)

at java.io.ObjectInputStream$PeekInputStream.peek(ObjectInputStream.java:2252)

at java.io.ObjectInputStream$BlockDataInputStream.peek(ObjectInputStream.java:2545)

at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2555)

at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1294)

at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)

at hudson.remoting.Command.readFrom(Command.java:92)

at hudson.remoting.ClassicCommandTransport.read(ClassicCommandTransport.java:72)

at hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:48)

Connect slave to Jenkins one of these ways:

 Launch agent from browser on slave

Run from slave command line:

javaws http://16.158.69.53:9999/jenkins/computer/irshost12.tc.com.com/slave-agent.jnlp

Or if the slave is headless:

java -jar slave.jar -jnlpUrl [http://16.158.69.53:9999/jenkins/computer/irshost12.tc.com/slave-agent.jnlp](http://16.158.69.53:9999/jenkins/computer/irshost12.tc.com/slave-agent.jnlp)

如果出现上面的问题,我们就不要在点击launch按钮起启动了,采用命令行去启动也是一样的,这个时候选择下面的启动方式

l Run from slave command line
1.javaws http://xxxx/slave-agent.jnlp
如果你配置了权限那么后面还有一串看不懂的随机Key

n 下载slave.jar到本地,然后进入存放slave.jar的目录,复制粘贴并运行 java -jar slave.jar -jnlpUrl http://xxxxx 即可启动。

l Or if the slave is headless:
java -jar slave.jar -jnlpUrl http://192.168.11.237:8080//computer/192.168.11.155_WIN7_ICE/slave-agent.jnlp

如果启动成功,成功启动如下图所示:


点击左上角的File选择Install as a service就可以添加为Windows的服务了(默认开机自动启动)。将当前的slave设置成一个服务,每次机器重启的时候都自动启动slave服务,这样就不用每次都去启动这个slave agent了。

注意:

如果上面的窗口中显示Connected,可是一会有出现了Terminated的状态,那么很可能是因为你的jenkins配置权限的时候没有给匿名用户启动slave的权限。

具体操作是进入jenkins主界面,然后进入Manage Jenkins -> Configure Global Security ,勾选其中的anonymous用户的slave部分的权限。


Let Jenkins control this Windows slave as a Windows service

这种启动方式比较繁琐,此处不做赘述,可参考:http://blog.sina.com.cn/s/blog_87f0f17e0101iq8a.html
MAC/Linux Slave

l 在jenkins上增加节点

l 在Mac系统中将ssh的服务打开,在偏好设置-互联网与无线 -共享中



l 使用mac root用户修改sshd-config的鉴权方式
首先获取到root用户登录,然后vi /etc/ssd_config,修改PasswordAuthentication no 为PasswordAuthentication yes

l 此时在jenkins节点中点击salve节点,Lauch。

注意:

1.Slave节点机器上必须配置好java环境,建议手工在Environment variables指定JAVA_HOME路径信息

2.命令行调用code sign时报错:User interaction is not allowed
n 网上找了一些命令来用:

$security list-keychains
$unlock-keychain "-p" "keychainpassword"  "/Users/bixiaopeng/Library/Keychains/login.keychain”

但无法解决
于是乎用下面的方法解决了:
1.在应用程序里搜索Keychain Access,中文叫钥匙串访问权限
2.找到你的证书,右击 — 显示简介 — 访问控制 — 选中【允许所有应用程序访问此项目】 — 存储更攺 — 输入密码后保存更攺,解决问题。
n 如果上面的都无法解决,那就使用jenkins的Xcode插件吧


除了以上的连接方式,也可以采用私钥的形式进行链接:SSH Username with private key

这种启动方式比较繁琐,此处不做赘述,可参考:http://blog.sina.com.cn/s/blog_87f0f17e0101iq8a.html

上一篇下一篇

猜你喜欢

热点阅读