【Windows】安装Jenkins及基本使用
Jenkins介绍
Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具。
可以简单将jenkins理解为一个代码部署工具。
在没有持续部署工具之前,开发部署代码到服务器上是需要一定的流程的,比如合并代码,然后相关人员将代码更新到服务器(旧代码覆盖),运行一些指令让新代码生效,然后观察运行情况。
流程听起来好像还挺简单的,但是谁能保证部署人员的每一步都没有差错呢?需要部署的服务多的话,也很费时间。
一般情况下,人工部署到服务器的步骤都是固定的,那是不是表示可以动一些“歪点子”(脚本程序),让脚本替代部署人员去做部署的工作呢?懒人表示肯定能行。
Jenkins就是按照人工部署的步骤,代替人工操作,将代码部署到指定服务器并运行的工具。
下载Jenkins
Jenkins由Java语言编写而成,安装包即是一个war包。因此,Jenkins的运行启动依赖于Java环境,同时,它是免安装的。
直接使用清华大学的Jenkins镜像源站下载最新版本:https://mirrors.tuna.tsinghua.edu.cn/jenkins
我们直接进入war-stable目录下载稳定版本(注:在 2.346.3 版本后都要求JDK 8以上了。因为我们常用的是JDK1.8,所以下载JDK8最后一个版本进行演示)
安装并启动
配置环境变量
在解析war包时会默认在c盘生成jenkins安装目录,可在环境变量中设置jenkins的安装目录:JENKINS_HOME。
启动Jenkins
命令行:切换到jenkins.war所在目录,执行java -jar "jenkins.war"命令
若要修改访问端口,执行如下命令:
java -jar "jenkins.war" --ajp13Port=-1 --httpPort=8088
执行之后,出现如下错误信息:
2023-08-09 09:39:29.644+0000 [id=44] WARNING hudson.model.UpdateCenter#updateDefaultSite: Upgrading Jenkins. Failed to update the default Update Site 'default'. Plugin upgrades may fail.
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
Caused: sun.security.validator.ValidatorException: PKIX path building failed
at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
Caused: javax.net.ssl.SSLHandshakeException
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
at hudson.model.DownloadService.loadJSON(DownloadService.java:122)
at hudson.model.UpdateSite.updateDirectlyNow(UpdateSite.java:219)
at hudson.model.UpdateSite.updateDirectlyNow(UpdateSite.java:214)
at hudson.model.UpdateCenter.updateDefaultSite(UpdateCenter.java:2667)
at jenkins.install.SetupWizard.init(SetupWizard.java:206)
at jenkins.install.InstallState$InitialSecuritySetup.initializeState(InstallState.java:182)
at jenkins.model.Jenkins.setInstallState(Jenkins.java:1131)
at jenkins.install.InstallUtil.proceedToNextStateFrom(InstallUtil.java:98)
at jenkins.install.InstallState$Unknown.initializeState(InstallState.java:88)
at jenkins.model.Jenkins$15.run(Jenkins.java:3497)
at org.jvnet.hudson.reactor.TaskGraphBuilder$TaskImpl.run(TaskGraphBuilder.java:175)
at org.jvnet.hudson.reactor.Reactor.runTask(Reactor.java:305)
at jenkins.model.Jenkins$5.runTask(Jenkins.java:1158)
at org.jvnet.hudson.reactor.Reactor$2.run(Reactor.java:222)
at org.jvnet.hudson.reactor.Reactor$Node.run(Reactor.java:121)
at jenkins.security.ImpersonatingExecutorService$1.run(ImpersonatingExecutorService.java:68)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
将jenkins安装路径下hudson.model.UpdateCenter.xml文件的https修改为http。
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://updates.jenkins.io/update-center.json</url>
</site>
</sites>
修改完后,重新执行启动命令
访问jenkins,访问地址:http://localhost:端口(我们上面指定了端口8088)
上述的启动方式唯一缺点是每次重启后需要手动启动Jenkins程序(每次启动并不会覆盖上一次操作的文件)。
我们可以换一个方式,部署Jenkins在Tomcat下,可以按照以下步骤实现:
① 把下载好的war包复制粘贴到tomcat的webapps目录下
② 启动tomcat
③ 在浏览器上输入:http://localhost:xxxx/jenkins/login(其中xxxx是tomcat配置的访问端口),首次打开会进入第5步设置密码和安装插件
首次访问需要输入admin管理员的默认初始密码,该密码可以按下图中红色字体显示的位置进行查找
下图就是我们根据红色字体显示的位置找到的初始密码:
弹出插件安装页面直接关了,后边再装插件。
使用该密码登录成功后即可进入Jenkins的管理首页,如下图所示:
Jenkins插件安装失败
有可能是下载源有问题。
已知有三个源:
- http://updates.jenkins.io/update-center.json(或https://updates.jenkins.io/update-center.json),默认的
- http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- http://mirror.esuni.jp/jenkins/updates/update-center.json
拉到最后,如下图换源
其实上面的源修改会同步更新到hudson.model.UpdateCenter.xml文件,但是这样还是不能够完全解决我们遇到的问题。
我们找到updates文件下的default.json,替换两个地方:
① 全量替换www.google.com替换成www.baidu.com
② https://updates.jenkins.io/download/plugins替换成http://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins
然后重启下服务。
当安装插件的时候,可能会报另外的错误:
2023-08-09 10:16:47.447+0000 [id=77] SEVERE h.model.UpdateCenter$DownloadJob#run: Failed to install trilead-api
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
at java.security.cert.CertPathBuilder.build(Unknown Source)
Caused: sun.security.validator.ValidatorException: PKIX path building failed
at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
at sun.security.validator.Validator.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
Caused: javax.net.ssl.SSLHandshakeException
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.Handshaker.fatalSE(Unknown Source)
at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)
at sun.security.ssl.ClientHandshaker.processMessage(Unknown Source)
at sun.security.ssl.Handshaker.processLoop(Unknown Source)
at sun.security.ssl.Handshaker.process_record(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
at hudson.model.UpdateCenter$UpdateCenterConfiguration.download(UpdateCenter.java:1291)
Caused: java.io.IOException: Failed to load https://updates.jenkins.io/download/plugins/trilead-api/1.67.vc3938a_35172f/trilead-api.hpi to D:\softinstall\jenkins\plugins\trilead-api.jpi.tmp
at hudson.model.UpdateCenter$UpdateCenterConfiguration.download(UpdateCenter.java:1302)
Caused: java.io.IOException: Failed to download from https://updates.jenkins.io/download/plugins/trilead-api/1.67.vc3938a_35172f/trilead-api.hpi
at hudson.model.UpdateCenter$UpdateCenterConfiguration.download(UpdateCenter.java:1336)
at hudson.model.UpdateCenter$DownloadJob._run(UpdateCenter.java:1893)
at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:2205)
at hudson.model.UpdateCenter$DownloadJob.run(UpdateCenter.java:1867)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:121)
at java.lang.Thread.run(Unknown Source)
此时,我们一定要下载 skip-certificate-check.hpi 文件(需要注意与jenkins的版本问题)。
插件下载地址:http://mirror.xmission.com/jenkins/plugins/
然后,点击Jenkins左侧控制面板中的“Manage Jenkins”--->“Manage Plugins”--->“Advanced”,拖到下面找到“Deploy Plugin”,上传.hpi类型的文件,点击Deploy安装插件。
【必须先安装 skip-certificate-check.hpi ,否则安装插件时会失败。】
Jenkins的汉化
1. 进入Manage Jenkins 中 Manage Plugins
2. 安装插件Locale、Localization: Chinese (Simplified)(通过Install without restart 直接安装)
3. 重启服务
4. 已经汉化了,但是汉化不完全
进入Manage Jenkins 中Configure System, 在Default Language中设定"zh_US"
修改完成后,重启服务。
Jenkins插件管理
进入Manage Jenkins(系统管理)中 Manage Plugins(插件管理)
安装Git插件
这里我们选择Git作为CI系统中的版本控制工具, 因此我们需要在Jenkins中安装Git插件, 该插件可以帮助Jenkins从Git代码仓库中获取项目代码。
安装服务器部署插件
如果选择Tomcat作为项目服务器,则需要在Jenkins中安装服务器部署插件,该插件可以帮助Jenkins把编译打包后的项目部署到Tomcat服务器中。
安装Maven插件
Jenkins基本配置
要想使用Jenkins实现持续集成, 必须先了解并进行一些基本配置
Configure System系统设置
进入Manage Jenkins 中Configure System(系统配置)
在系统设置页面中需要做以下配置, 如图所示:
Jenkins URL是你所在的团队中Jenkins系统的访问路径, 根据实际情况填写即可, 系统管理员邮件地址也是根据团队实际情况填写即可, Jenkins将来会通过该邮件地址向团队中的其他成员发一些通知邮件。
上图是配置SMTP的一些信息, 根据实际情况填写即可, 为了验证配置是否成功, 可以在最下方的文本框中输入自己的一个邮箱地址, 然后点击[Test configuration]按钮发送一份邮件测试一下。
注意事项:上述这些配置是必须的, 否则将来Jenkins在进行系统集成时会报错
Global Tool Configuration全局工具配置
进入Manage Jenkins 中Global Tool Configuration(全局工具配置)
主要用来配置JDK, Git和Maven的环境信息, 因为Jenkins需要通过这些环境配置来实现自动化的代码获取,自动化的编译和打包功能, 如下图所示:
JDK环境配置
不建议勾选[自动安装], 因为它会在线下载JDK并安装到本地, 建议提前在本地安装好JDK, 然后根据实际安装路径填写即可, 那个别名可以随意填写。
Git环境配置
不建议勾选[自动安装], 因为它会在线下载Git并安装到本地, 建议提前在本地安装好Git, 然后根据实际安装路径填写即可, 那个别名可以随意填写。
Maven环境配置
不建议勾选[自动安装], 因为它会在线下载Maven并安装到本地, 建议提前在本地安装好Maven, 然后根据实际安装路径填写即可, 那个别名可以随意填写。
管理用户
我们以管理员身份登录后, 可以对Jenkins系统中的用户进行管理, 例如: 获得用户信息, 新建用户, 修改登录密码等
获得用户信息
进入Manage Jenkins, 在右侧的页面中点击[管理用户]菜单即可得到当前Jenkins系统中的所有用户信息, 如下图所示:
修改登录密码
点击上图中某个用户后面的齿轮图标即可进入到用户编辑页面, 在该页面的底部可以修改登录密码, 如下图所示:
点击“保存”按钮后,找不到页面,但是密码是修改成功的了。
新建用户
点击上上图中左侧[新建用户]菜单, 即可进入到新建用户的页面, 如下图所示:
Jenkins任务操作
对于Jenkins来说,持续集成包含自动获取代码,自动编译和打包,自动部署运行三个最基本的过程, 整个过程就是一个任务,任务操作是Jenkins的重中之重, 通过任务才能最终实现自动化的持续集成。
创建任务
在Jenkins后台首页中直接就可以创建一个新任务, 如下图所示:
1. 设置任务名称并选择任务类型
如下图所示:
任务名称可以随意命名, 任务类型选择第一个Freestyle project(构建一个自由风格的软件项目), 这样就可以在接下来的操作中使用Git和Maven,点击确定按钮后就进入到了新建任务向导中,一共六个向导页面需要配置, 如下图所示:
2. 向导一:General配置
该向导中的配置项比较多, 只需要关注如下两个配置项即可。
Jenkins每次构建都会产生相关的很多信息,这些信息默认随着每次的构建都会保存下来, 时间长了会比较占用空间, 而且这些信息也没太大用处, 上图中[丢弃旧的构建]就是用来设置保存策略的, 可以通过天数或个数来进行控制
Jenkins在构建时需要从代码仓库中获取项目代码, 上图用来设置获取项目代码失败的重试次数。
3. 向导二:源码管理
由于Jenkins需要通过版本控制工具(例如:Git)来获取项目源码,因此需要配置代码仓库的位置和认证信息, 上图中的[Respositiory URL]就是你所在团队中代码仓库的位置, 请根据实际情况填写, 如果该代码仓库需要通过账号和密码进行认证, 请点击上图中的[添加]按钮添加这些信息即可。
4. 向导三:构建触发器
这里用来设置Jenkins何时从代码仓库中获取代码并开始构建, 可以使用脚本也可以设置时间, 建议勾选最后一项, 并在日程表中填入构建时间表达式, 该表达式的具体写法可以点击右侧的[问号]图标查看帮助文档, 如下图所示:
一个构建时间表达式包含五部分数据: MINUTE,HOUR,DOM,MONTH,DOW, 具体介绍如下:
每部分数据的取值可以是具体数字, 星号(*), 和Hash(H), 星号(*)表示任意取值, Hash(H)表示随机时间或取值范围, 例如:
H/10 * * * *表示从当前时间开始每隔10分钟构建一次
H(0-29)/10 * * * *表示每个小时的前一半时间中每隔10分钟构建一次
5. 向导四:构建
点击上图中的[增加构建步骤]按钮, 选择最后一个下拉菜单项, 表示构建时通过Maven进行自动编译和打包
Maven Version一项选择的是前面在进行Maven环境配置时的name, Goals一项填写的是构建时要执行的Maven命令。
6. 构建测试
经过上述向导的配置, 一个任务就创建成功了, 接下来就可以尝试构建一次。
点击上图中左侧的[立即构建]就开始对刚才的”HelloWorld”任务进行构建, 如下图所示:
在上图的左侧底部可以看到#2, 这表示是第2次进行任务构建, 在#2上面点击一下会进入到下图所示:
在这里可以观察到构建是否成功。
7. 管理任务
我们可以使用Jenkins创建很多个任务, 每个任务创建成功后可以进行很多次构建, 当然, 我们也可以对创建后的任务进行管理, 如下图所示:
点击任意一个任务的名字可以打开一个下拉菜单, 点击菜单中的[删除Project]就会把该任务删除, 点击[配置]菜单项就可以重新打开向导页面修改创建任务时的配置信息。
8. 任务构建后的操作
任务构建成功后, 对于C/S架构的软件接下来可以直接运行, 对于B/S架构的软件接下来需要先部署到Web服务器中才能运行。
部署配置
1. 这里我们创建了一个最简单的Maven工程, 名字叫hello-world, 该工程中包含一个index.html页面, 如下图所示:
2. 把该工程提交到Git代码仓库中
3. 给Tomcat服务器配置角色和管理员用户
打开tomcat-users.xml, 该文件用来配置Tomcat服务器的角色和管理员用户, 配置这些信息是Jenkins要求的, user标签中username和password属性的值可以自己设置, 其他部分照抄即可
4. 给刚才新建的任务增加一个构建后的操作, 完成部署配置
点击[增加构建后操作步骤]按钮, 在菜单中点击[Deploy war/ear to a container]菜单项根据实际情况配置一个Web服务器, 如下图所示:
这里我们选择Tomcat 8.x, 然后把你所在团队中使用的Tomcat服务器的相关信息配置一下, 如下图所示:
WAR/EAR files一项用来填写你构建的项目的名字(编译打包后的名字),一定要注意路径
Context path一项用来填写访问路径, 就是http://localhost:8080/xxx/index.html中xxx的信息
Credentials一项用来设置Tomcat服务器管理员账号和密码,可以点击[添加]按钮进行新增,账号和密码要跟前面tomcat-users.xml文件中的配置保持一致
Tomcat URL一项请根据实际情况填写即可
注意:如果是SpringBoot项目,可以打包成war包,但是需要有一些注意项:SpringBoot打包war部署到tomcat
构建应用之前必须保证tomcat是正常启动的
5. 整个部署配置全部结束, 接下来再次进行任务构建, 我们这次可以观察到如下日志输出信息:
邮件通知
为了便于团队管理和项目监控, Jenkins允许每次构建失败时发送邮件通知团队相关人员, 要想实现这个功能我们需要再次增加一个构建后的操作, 如下图所示:
点击上图中的[增加构建后操作步骤]按钮, 选择最后一项[E-mail Notification], 然后进行如下配置即可
Recipients一项用来填写团队成员收件人邮箱地址, 可以多个, 中间用逗号隔开即可.
接下来我修改任务配置信息, 构建失败后立即就收到了通知邮件。
参考: |