【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一项用来填写团队成员收件人邮箱地址, 可以多个, 中间用逗号隔开即可.

接下来我修改任务配置信息, 构建失败后立即就收到了通知邮件。

 

参考:

 

posted @ 2023-07-03 08:43  残城碎梦  阅读(2128)  评论(0编辑  收藏  举报