
持续集成平台-Jenkins
持续集成平台之jenkins
一、代码上线
代码上线是指在开发者在开发完具体的功能后,经过专门的测试工程师测试没有问题后,交友运维工程师进行代码的部署,并调整和优化,使之可以达到我们预期的功能。
1.1 早期代码部署的形式
-
纯手动Scp、Rsync上传代码。
-
纯手动登陆,Git pull 或者 Svn update。
-
纯手动xftp、ftp、filezilla上传代码。
-
开发发送压缩包,rz上传,解压部署代码。
缺点:
-
全程运维参与,占用大量时间。
-
如果节点多,上线速度慢。
-
人为失误多,目录管理混乱。
-
回滚不及时,或者难以回退。
(手动上线代码)
1.2 合理化上线方案
- 开发人员(rd)需在个人电脑搭建LAMP环境测试开发好的网站代码,并且在办公室或 IDC机房的测试环境测试通过,最好有专职测试人员(ts)。
- 程序代码上线要规定时间,例如:三天上线一次,如网站需经常更新可每天凌晨 2 点上线,这个看网站业务性质而定,原则就是影响用户体验最小。
- 代码上线之前需备份,网站程序出了问题方便回退,另外,从上线技巧上讲,上传代码时尽可能先传到服务器网站临时目录,传完整后一步mv过去,或者通过In做软链接— 线上更新代码的思路。如果严格更新,把应用服务器从集群节点平滑下线,然后更新。
- 尽量由运维人员管理上线,对于代码的功能性,开发人员更在意,而对于代码的性能优化和上线后服务器的稳定,运维更在意服务器的稳定,因此,如果网站宕机问题归运维管,就要让运维上线,这样更规范科学。否则,开发随意更新,出了问题运维负责,这样就错了,运维永远无法抬头。
(web代码规范化上线流程图)
1.3 企业上线制度和流程
JAVA代码环境上线时,有数台机器同时需要更新或者分批更新
-
本地开发人员取svn代码。当天上线提交到trunk,否则,长期项目单开分支开发,然后在合并主线(trunk)
-
办公内网开发测试时,由开发人员或配置管理员通过部署平台jenkins实现统一部署,(即在部署平台上控制开发机器从svn取代码,编译,打包,发布到开发机,包名如idc_dep.war).
-
开发人员通知或和测试人员一起测试程序,没有问题后,由配置管理员打上新的tag标记。这里要注意,不同环境的配置文件是随代码同时发布的。
-
配置管理员,根据上一步的tag标记,checkout出上线代码,并配置好IDC测试环境的所有配置,执行编译,打包(mvn,ant)(php不需要打包),然后发布到IDC内的统一分发服务器。
-
配置管理员或SA上线人员,把分发的程序代码内容推送到相关测试服务器(包名如idc_test.war),然后通知开发及测试人员进行测试。如果有问题向上回退,继续修改。
-
如果IDC测试没有问题,继续打好tag标记,此时,配置管理员,根据上步的tag标记,checkout出测试好的代码,并配置好IDC正式环境的所有配置,执行编译,打包(mvn,ant)(php不需要打包),然后发布到IDC内的统一分发服务器主机,准备批量发布。
-
配置管理员或SA上线人员,把分发的内容推送到相关正式服务器(包名如idc_product.war),然后通知开发及测试人员进行测试。如果有问题直接发布回滚指令。
IDC正式上线的过程对于JAVA程序,可以是AB组分组上线的思路,即平滑下线一半的服务器,然后发布更新代码,重启测试,无问题后,挂上更新后的服务器,同时再平滑下线另一半的服务器,然后发布更新代码测试(或者直接发布后,重启,挂上线)
1.4 php程序代码上线的具体方案
对于PHP上线方法:发布代码时(也需要测试流程)可以直接发布到正式线临时目录 ,然后mv或更改link的方式发布到正式上线目录 ,不需要重启http服务。这是新朗,赶集的上线方案。
1.5 Java程序代码上线的具体方案
对于java上线方法:较大公司需要分组平滑上线(如从负载均衡器上摘掉一半的服务器),发布代码后,重启服务器测试,没问题后,挂上上好线的一半,再下另外一半。如果前端有DNS智能解析,上线还可以分地区上线若干服务器,逐渐普及到全国的服务器,这个被称为“灰度发布”。
1.6 代码上线解决方案注意事项
上线的流程里,办公室测试环境-->IDC测试环境-->正式生产环境,所有环境中的所有软件均应版本统一,其次尽量单一,否则将后患无穷,开发测试成功,IDC测试就可能有问题(如:操作系统,web服务器,jdk,php,tomcat,resin等版本)
- 开发团队小组办公内部测试环境测试(该测试环境属于开发小组维护,或定时自动更新代码),代码有问题返回给某开发人员重新开发。
- 有专门的测试工程师,程序有问题直接返回给开发人员(此时返回的一般为程序的BUG,称为BUG库),无问题进行IDC测试
- IDC测试由测试人员和运维人员参与,叫IDCtest,进行程序的压力测试,有问题直接返回给开发人员,无问题进行线上环境上线。
- 数台服务器代码分发上线方案举例(JAVA程序) A:假设同业务服务器有6台,将服务器分为A,B两组,A组三台,B组三台,先对A组进行从负载均衡器上平滑下线,B组正常提供服务,避免服务器因上线影响业务。 B:下线过程是通过脚本将A组服务器从RS池(LVS,NGINX,HAPROXY,F5等均有平滑方案)中踢出,避免负载均衡器将请求发送给A组服务器(此时的时间应该为网站流量少时,一般为晚上) C:将代码分发到A组服务器的站点目录下,对A组服务器上线并重启服务,并由专业的测试人员进行访问测试,测试成功后,挂上A组的服务器,同时下线B组服务器,B组代码上线操作测试等和A组相同,期间也要观察上线提供服务的服务器状况,有问题及时回滚。
- 如果是PHP程序,则上线可以简单化,直接将上线代码(最好全量)发布到所有上线服务器的特定目录后,分发完成后,一次性mv或ln到站点目录,当然测试也是少不了的。测试除了人员测试外,还有各种测试脚本测试各个相关业务接口。
二、Maven
2.1 Maven说明
maven 官网:
https://maven.apache.org/
maven 官方仓库:
https://repo.maven.apache.org/maven2/

Maven是一个采用纯Java编写的并源项目管理工具
采用一种被称之为Project Object Model(POM)概念来管理项目,所有的项目配置信息都被定义在一个叫做POM.xml的文件中通过该文件Maven可以管理项目的整个生命周期,包括清除编译,测试,报告、打包、部署等等。
目前Apache下绝大多数项目都已经采用Maven进行管理而Maven本身还支持多种插件可以方便更灵活的控制项目,开发人员的主要任务应该是关注商业逻辑并去实现它,而不是把时间浪费在学习如何在不同的环境中去依赖iar包项目部署等。
Maven和ant都是软件构建工具 (软件管理工具)Maven比Ant更加强大,已经取代了ant,jar包的声明式依赖描述。Maven有jar包的仓库。
私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件。有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库,否则,私服请求外部的远程仓库,将构件下载到私服,再提供给本地仓库下载。
2.2 maven安装
2.2.1 maven 下载
#官方
https://maven.apache.org/download.cgi
#清华镜像源
http://mirrors.tuna.tsinghua.edu.cn/apache/maven
#官方各版本下载地址,推荐使用次新版本
https://archive.apache.org/dist/maven/maven-3
安装maven前必须安装java 环境:
Maven 3.3 要求 JDK 1.7 或以上
Maven 3.2 要求 JDK 1.6 或以上
Maven 3.0/3.1 要求 JDK 1.5 或以上
2.2.2 安装方式1: 包安装
==========================ubuntu方式=============================
[root@maven ~]#apt list maven -a
Listing... Done
maven/focal 3.6.3-1 all
[root@maven ~]#apt -y install maven
[root@maven ~]#mvn -v
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 1.8.0_352, vendor: Private Build, runtime: /usr/lib/jvm/java-8-openjdk-amd64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.4.0-132-generic", arch: "amd64", family: "unix"
==========================centos7方式=============================
[root@maven ~]# yum list maven
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.ustc.edu.cn
* extras: mirrors.ustc.edu.cn
* updates: mirrors.ustc.edu.cn
Installed Packages
maven.noarch 3.0.5-17.el7
root@maven ~]# yum -y install maven
[root@maven ~]# mvn -v
Apache Maven 3.0.5 (Red Hat 3.0.5-17)
Maven home: /usr/share/maven
Java version: 1.8.0_372, vendor: Red Hat, Inc.
Java home: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
=======================centos8方式================================
[root@rocky8 ~]#yum -y install maven
[root@rocky8 ~]#mvn -v
Apache Maven 3.5.4 (Red Hat 3.5.4-5)
Maven home: /usr/share/maven
Java version: 1.8.0_292, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java1.8.0-openjdk-1.8.0.292.b10-1.el8_4.x86_64/jre
Default locale: en_US, platform encoding: UTF-8 OS name:
#镜像加速
[root@maven ~]#vim /etc/maven/settings.xml
#在<mirrors></mirrors> 标签对⾥添加如下内容即可:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
2.2.3 安装方式2: 二进制安装
官方说明:
http://maven.apache.org/install.html
范例: 二进制安装
[root@maven ~]# yum -y install java-11-openjdk
[root@maven ~]#java -version
openjdk version "11.0.19" 2023-04-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.19.0.7-1.el7_9) (build 11.0.19+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.19.0.7-1.el7_9) (build 11.0.19+7-LTS, mixed mode, sharing)
[root@maven ~]#wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
[root@maven ~]#tar xf apache-maven-3.6.3-bin.tar.gz -C /usr/local/
[root@maven ~]#ln -s /usr/local/apache-maven-3.6.3/ /usr/local/maven
[root@maven ~]#echo 'PATH=/usr/local/maven/bin:$PATH' > /etc/profile.d/maven.sh
[root@maven ~]#echo 'export MAVEN_HOME=/usr/local/maven' >> /etc/profile.d/maven.sh
[root@maven ~]#. /etc/profile.d/maven.sh
[root@maven ~]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 1.8.0_372, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.372.b07-1.el7_9.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
#镜像加速
[root@maven ~]#vim /usr/local/maven/conf/settings.xml
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2.2.4 Maven 的打包命令说明
Maven工程构建的各个环节
- clean: 以前编译得到的旧文件class字节码文件删除
- compile:将java源程序编译成class字节码文件
- test:自动测试,例如,自动调用junit程序
- report:报告测试程序执行的结果
- package:应用打包,动态Web工程打成war包,java工程打成jar包
- install: 是指将打包得到的文件复制到仓库中指定的位置
- deploy:将动态Web工程生成的war包复制到Servlet容器下,使其可以运行
范例:
-
进入到包含有“pom.xml”的路径,执行:
mvn clean install package
-
有的时候受到测试的干扰,导致无法正在进行编译,这时候可以选择跳过测试:
mvn clean install package -Dmaven.test.skip=true 选项"-Dmaven.test.skip=true":跳过测试,并且不编译测试下的源代码 选项"-DskipTests":不执行测试,但是会进行测试代码的编译
-
如果需要编译的代码很庞大,需要考虑对编译环境做一些处理,提成编译效率:
启动多线程编译:mvn -T 4 clean install package -Dmaven.test.skip=true 分配编译的CPU个数:mvn -T 2C clean install package -Dmaven.test.skip=true 启用多线程编译:mvn clean install package -Dmaven.test.skip=true - Dmaven.compile.fork=true
-
所有的 Maven 都是建立在 JVM 上的,所以进行编译的时候还需要考虑JVM 参数优化:
如果是windows 找到“maven/bin/mvn.cmd”,如果 linux 找到“maven/bin/mvn”,配置参数 是:“MAVEN_OPTS” 打开属性配置文件:vim /etc/profile 指定内存配置:export MAVEN_OPTS="-Xmx6g -Xms6g" 注意不要超过物理内存一半 使配置立即生效:source /etc/profile
2.2.5 执行 java 代码编译实战案例
2.2.5.1 编译安装 spring-boot 项目
[root@maven ~]# mvn -v
Apache Maven 3.6.3 (cecedd343002696d0abb50b32b541b8a6ba2883f)
Maven home: /usr/local/maven
Java version: 11.0.19, vendor: Red Hat, Inc., runtime: /usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-1160.el7.x86_64", arch: "amd64", family: "unix"
#镜像加速
[root@maven ~]#vim /usr/local/maven/conf/settings.xml
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
[root@maven ~]#ls
spring-boot-helloWorld-main.zip
[root@maven ~]#unzip spring-boot-helloWorld-main.zip
[root@maven ~]#cd spring-boot-helloWorld-main/
[root@maven spring-boot-helloWorld-main]#ls
deploy Dockerfile Jenkinsfile LICENSE pom.xml README.md src
[root@maven spring-boot-helloWorld-main]#mvn clean package
[root@maven spring-boot-helloWorld-main]#ls target/
classes spring-boot-helloworld-0.9.0-SNAPSHOT.jar
generated-sources spring-boot-helloworld-0.9.0-SNAPSHOT.jar.original
generated-test-sources surefire-reports
maven-archiver test-classes
maven-status
#默认为8080端口
[root@maven spring-boot-helloWorld-main]#java -jar target/spring-boot-helloworld-0.9.0-SNAPSHOT.jar --server.port=8888
[root@maven ~]#curl 127.0.0.1:8888
Hello Spring Boot 2.0!
[root@maven ~]#curl 127.0.0.1:8888/hello
Hello World
三、jenkins
前面的章节我们介绍到一些代码发布的流程和规范,但是这里还是存在一个问题,代码的发布和部署是跨部门的,在一个大型的互联网公司中,开发部门和运维部门可能不在一起,甚至在不同的地域,遇到上线的高峰期可能存在上线“排期”,同时也存在沟通问题,因此开发人员上线代码是比较费时的事情,有时候开发人员在开发完代码后,交由测试人员测试结束中间可能存在好几天的空档期,在这个时间中开发需要积极配合测试人员及时修正bug,反馈的周期比较长,也会导致代码上线的周期比较长,为了解决这类问题,有专门的开发人员就开发出来一款专门用于改善代码发布上线的平台--jenkins。
3.1 jenkins的历史
官网:https://www.jenkins.io/
http://www.jenkins.org.cn/


Jenkins的前身是 Hudson,采用JAVA编写的持续集成开源工具。
Hudson由Sun公司在2004年启动,第一个版本于2005年在 Java. net发布。
2007年开始 Hudson逐渐取代 Cruise Control和其他的开源构建工具的江湖地位。在2008年的 avaNt大会上在开发者解决方案中获得杜克选择大奖( Duke's Choice Award)。
在2010年11月期间,因为 Oracle对Sun的收购带来了 Hudson的所有权问题。主要的项目贡献者和 Oracle之间,尽管达成了很多协议,但有个关键问题就是商标名称" Hudson"。甲骨文在2010年12月声明拥有该名称并申请商标的权利。因此,2011年1月11日,有人要求投票将项目名称从“ Hudson“改为 jenkins"。2011年1月29日,该建议得到社区投票的批准,创建了 Jenkins项目
2011年2月1日,甲骨文表示他们打算继续开发Hudson,并认为 jenkins只是一个分支,而不是重命名。因此, Jenkins和 Hudson继续作为两个独立的项目,每个都认为对方是自己的分支。到2013年12月,GitHub上的 jenkins拥有567个项目成员和约1,100个公共仓库,与此相对的Hudson有32个项目成员和17个公共仓库。到现在两者的差异更多,应该说 Jenkins已经全面超越了 Hudson。此外,大家可能是出于讨厌 Oracle的情绪,作为java开发者天然地应该支持和使用Jenkins.
后面 Hudson被Oracle捐给了Eclipse基金会,所以右边这老头有个 Eclipse的光环加持。
为什么jenkins更受欢迎?
首先,曾经是Hudson开发人员中的99%都转向了Jenkins的开发,其中包括最初的创建者川口清子(Kohsuke Kawaguchi)。他独自写了大部分代码,并且他的经验是Hudson各种高级特性的关键来源。Jenkins的开发社区更活跃。所以对很多人而言,从血统上看Hudson是后娘养的,Jenkins才是亲生的!
治理和社区
Jenkins开发社区的管理是很开放的。 有一个独立的董事会,其中包括来自Yahoo!, CloudBees,Cloudera和Apture等多家公司的长期以来的Hudson开发人员。每次会议后,他们定期举行治理会议并发表意见,征询公众意见。他们还将所有代码都捐赠给公共利益软件组织(SPI),以确保社区持续开放。
稳定性
分手后,针对Jenkins的贡献不断持续增加,Jenkins制定了新的长期支持发布线。社区定大约每三个月发布一次稳定版本的补丁。
插件的平台
Jenkins支持超过1000个插件。凭借多样而强大的插件Jenkins成了整个开发生命周期中的一个中心点。
到了2017年,两者的发展差异更大了。Jenkins应该说是CI工具中公认的老大,而Hudson不仅不能与Jenkins比,跟其他CI工具比也没什么优势,完全沉沦了
分手后,针对jenkins的责献不断持续增加,jenkins制定了新的长期支持发布线。社区定大约每三个月发布一次稳定版本的补丁。
3.2 Hudson和jenkins的对比
1、基本面问题
工具 | Jenkins | Hudson |
---|---|---|
最好的CI工具 | 1 | 22 |
最好的JAVA CI工具 | 1 | 7 |
最好的自托管CI工具 | 3 | 4 |
2、其他支持
工具 | Jenkins | Hudson |
---|---|---|
对Window支持最好 | 1 | 无排名 |
最好的开源CI工具 | 1 | 无排名 |
对BitBucket的支持 | 2 | 无排名 |
对移动开发者支持最好的CI | 4 | 无排名 |
3.3 jenkins功能
1)持续、自动地构建/测试软件项目。
2)监控软件开放流程,快速问题定位及处理,提提高开发效率。
3.4 jenkins特性
1)开源的java语言发持续集成工具,支持CI,CD。
2)易于安装部署配置:可通过yum安装或下载war包以及通过 docker容器等快速实现安装部署,可方便web界面配置管理。
3)消息通知及测试报告:集成RSS/Email通过RSs发布构建结果或当构建完成时通过 e-mail通知,生成TestNG测试报告。
4)分布式构建:支持jenkins能够让多台计算机一起构建/测试。
5)文件识别:jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等。
6)丰富的插件支持支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,Maven, docker等。
3.5 产品发布流程
产品设计成型→>开发人员开发代码→>测试人员测试功能->运维人员发布上线
3.6 jenkins CI/CD部署流程

说明:这张图稍微更形象一点,上线之前先把代码g到版本仓库,然后通过 jenkins将ava项目通过 maven去构建,这是在非容器之前,典型的自动化的一个版本上线流程。那它有哪些问题呢?
如:它的测试环境,预生产环境,测试环境。会存在一定的兼容性问题(环境之间会有一定的差异)

说明:这里和非容器化的环境不同的是,非容器化的环境,是jenkins在拉取到代码后,直接通过maven打包部署到应用服务器上,而容器化的环境则是jenkins拉取到了代码后会将代码打包成一个整体镜像,放到harbor(私有镜像仓库)中,在通过docker去仓库中拉取镜像进行部署,好处是环境一致,不会出现兼容性问题。
3.7 Jenkins的版本
Jenkins 项目产生两个发行线, 长期支持版本 (LTS) 和定期发布版本。
-
稳定版 LTS(每4周)
LTS (长期支持) 版本每12周从常规版本流中选择,作为该时间段的稳定大版本。每隔 4 周会更新迭代稳定的小版本,其中包括错误和安全修复反向移植。
下载链接
https://get.jenkins.io/
https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/
-
常规版本 (每周)
每周都会发布一个新版本,为用户和插件开发人员提供错误修复和功能。
四、部署jenkins
4.1 jenkins 的安装
Jenkins 支持多种部署和运行方式,可通过系统包、Docker 或者通过一个独立的 Java 程序
Jenkins支持多种安装方法
- docker
- 通用java包 war文件
- 二进制包
https://www.jenkins.io/zh/doc/book/installing/
4.1.1 安装前环境准备
4.1.1.1.1 系统准备
#关闭防火墙和SELinux
[root@jenkins ~]#systemctl stop firewalld && setenforce 0
#设置语言环境,防止后期Jenkins汉化出问题
[root@jenkins ~]# localectl set-locale LANG=en_US.UTF-8
4.1.1.2 JAVA 环境
Jenkins基于JAVA实现,安装 Jenkins前需要先安装 JDK
#方法一: 安装openjdk
[root@ubuntu2004 ~]#apt update
[root@ubuntu2004 ~]#apt -y install openjdk-8-jdk
[root@ubuntu2004 ~]#java -version
openjdk version "1.8.0_362"
OpenJDK Runtime Environment (build 1.8.0_362-8u372-ga~us1-0ubuntu1~20.04-b09)
OpenJDK 64-Bit Server VM (build 25.362-b09, mixed mode)
#方法二: 安装oracle的jdk
[root@ubuntu2004 ~]#ls
jdk-8u191-linux-x64.tar.gz snap
[root@ubuntu2004 ~]#tar xf jdk-8u191-linux-x64.tar.gz -C /usr/local/
[root@ubuntu2004 ~]#ln -sv /usr/local/jdk1.8.0_191/ /usr/local/jdk
'/usr/local/jdk' -> '/usr/local/jdk1.8.0_191/'
#java 命令软连接
[root@ubuntu2004 ~]#ln -sv /usr/local/jdk/bin/java /usr/bin/
'/usr/bin/java' -> '/usr/local/jdk/bin/java'
[root@ubuntu2004 ~]#vim /etc/profile
#添加文件的最后
export JAVA_HOME=/usr/local/jdk
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
[root@ubuntu2004 ~]#java -version
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)
#方法三: 安装JDK-11版
#ubuntu系统
[root@ubuntu2004 ~]#apt -y install openjdk-11-jdk
#rocky8系统
[root@rocky8 ~]#yum -y install java-11-openjdk
4.1.2 二进制包安装 Jenkins
4.1.2.1 Ubuntu 二进制包安装 jenkins
Ubuntu 安装jenkins 官方说明
https://pkg.jenkins.io/debian-stable/
安装过程
curl -fsSL https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key | sudo tee \
/usr/share/keyrings/jenkins-keyring.asc > /dev/null
echo deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] \
https://pkg.jenkins.io/debian-stable binary/ | sudo tee \
/etc/apt/sources.list.d/jenkins.list > /dev/null
sudo apt-get update
sudo apt-get install fontconfig openjdk-11-jre
sudo apt-get install jenkins
deb 包下载地址国内镜像站点
https://mirrors.aliyun.com/jenkins/debian-stable/
https://mirror.tuna.tsinghua.edu.cn/jenkins/debian-stable/
范例: Ubuntu二进制包安装jenkins
[root@ubuntu2004 ~]#apt update
[root@ubuntu2004 ~]#apt -y install openjdk-8-jdk daemon
[root@ubuntu2004 ~]#wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian-stable/jenkins_2.332.4_all.deb
[root@ubuntu2004 ~]#dpkg -i jenkins_2.332.4_all.deb
[root@ubuntu2004 ~]#systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded (/lib/systemd/system/jenkins.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2023-06-16 07:25:38 UTC; 31s ago
Main PID: 7925 (java)
Tasks: 43 (limit: 4575)
Memory: 979.2M
CGroup: /system.slice/jenkins.service
└─7925 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080
Jun 16 07:25:22 ubuntu2004 jenkins[7925]: This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword
Jun 16 07:25:22 ubuntu2004 jenkins[7925]: *************************************************************
Jun 16 07:25:22 ubuntu2004 jenkins[7925]: *************************************************************
Jun 16 07:25:22 ubuntu2004 jenkins[7925]: *************************************************************
Jun 16 07:25:38 ubuntu2004 jenkins[7925]: 2023-06-16 07:25:38.842+0000 [id=27] INFO jenkins.InitReactorRunner$1#onAttained: Comple>
Jun 16 07:25:38 ubuntu2004 jenkins[7925]: 2023-06-16 07:25:38.866+0000 [id=20] INFO hudson.lifecycle.Lifecycle#onReady: Jenkins is>
Jun 16 07:25:38 ubuntu2004 systemd[1]: Started Jenkins Continuous Integration Server.
Jun 16 07:25:40 ubuntu2004 jenkins[7925]: 2023-06-16 07:25:40.916+0000 [id=43] INFO h.m.DownloadService$Downloadable#load: Obtaine>
Jun 16 07:25:40 ubuntu2004 jenkins[7925]: 2023-06-16 07:25:40.922+0000 [id=43] INFO hudson.util.Retrier#start: Performed the actio>
Jun 16 07:25:40 ubuntu2004 jenkins[7925]: 2023-06-16 07:25:40.924+0000 [id=43] INFO hudson.model.AsyncPeriodicWork#lambda$doRun$1:
#获取登录密码
[root@ubuntu2004 ~]#cat /var/lib/jenkins/secrets/initialAdminPassword
befd8810c5b1459ca1887d81baf3ce32
范例:Ubuntu二进制安装jenkins旧版本
# 软件包下载地址:https://get.jenkins.io/debian-stable/jenkins_2.204.6_all.deb
[root@ubuntu2004 ~]#wget https://get.jenkins.io/debian-stable/jenkins_2.204.6_all.deb
[root@ubuntu2004 ~]#apt install daemon
[root@ubuntu2004 ~]#dpkg -i jenkins_2.204.6_all.deb
[root@ubuntu2004 ~]#systemctl status jenkins
[root@ubuntu2004 ~]#ps aux|grep jenkins
jenkins 8249 6.7 12.1 4578504 990932 ? Ssl 07:27 0:43 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080
root 9189 0.0 0.0 6432 656 pts/1 S+ 07:37 0:00 grep --color=auto jenkins
[root@ubuntu2004 ~]#ss -ntlp |grep java
[root@ubuntu2004 ~]#ss -ntlp |grep java
LISTEN 0 50 *:8080 *:* users:(("java",pid=8249,fd=134))
#存放日志
[root@ubuntu2004 ~]#ll /var/log/jenkins/jenkins.log
4.1.2.2 CentOS 二进制包安装 jenkins
CentOS 安装jenkins官方说明
https://pkg.jenkins.io/redhat-stable/
安装过程
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
yum install fontconfig java-11-openjdk
yum install jenkins -y
rpm包国内镜像下载链接
https://mirrors.aliyun.com/jenkins/redhat-stable/
https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/
范例:CentOS二进制包安装jenkins
[root@centos7 ~]#yum install java wget -y
[root@centos7 ~]#wget https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.332.4-1.1.noarch.rpm
[root@centos7 ~]#yum -y install jenkins-2.332.4-1.1.noarch.rpm
[root@centos7 ~]#rpm -ql jenkins
/etc/init.d/jenkins
/etc/logrotate.d/jenkins
/etc/sysconfig/jenkins
/usr/bin/jenkins
/usr/lib/systemd/system/jenkins.service
/usr/sbin/rcjenkins
/usr/share/java/jenkins.war
/usr/share/jenkins
/usr/share/jenkins/migrate
/var/cache/jenkins
/var/lib/jenkins
/var/log/jenkins
[root@centos7 ~]#systemctl start jenkins.service
[root@centos7 ~]#systemctl status jenkins
● jenkins.service - Jenkins Continuous Integration Server
Loaded: loaded (/usr/lib/systemd/system/jenkins.service; disabled; vendor preset: disabled)
Active: active (running) since 五 2023-06-16 15:53:15 CST; 25s ago
Main PID: 5106 (java)
CGroup: /system.slice/jenkins.service
└─5106 /usr/bin/java -Djava.awt.headless=true -jar /usr/share/java/jenkins.war --webroot=%C/jenkins/war ...
6月 16 15:53:03 centos7 jenkins[5106]: This may also be found at: /var/lib/jenkins/secrets/initialAdminPassword
6月 16 15:53:03 centos7 jenkins[5106]: *************************************************************
6月 16 15:53:03 centos7 jenkins[5106]: *************************************************************
6月 16 15:53:03 centos7 jenkins[5106]: *************************************************************
6月 16 15:53:15 centos7 jenkins[5106]: 2023-06-16 07:53:15.572+0000 [id=30] INFO jenkins.InitRe...ation
6月 16 15:53:15 centos7 jenkins[5106]: 2023-06-16 07:53:15.587+0000 [id=21] INFO hudson.lifecyc...nning
6月 16 15:53:15 centos7 systemd[1]: Started Jenkins Continuous Integration Server.
6月 16 15:53:16 centos7 jenkins[5106]: 2023-06-16 07:53:16.952+0000 [id=48] INFO h.m.DownloadSe...aller
6月 16 15:53:16 centos7 jenkins[5106]: 2023-06-16 07:53:16.953+0000 [id=48] INFO hudson.util.Re...pt #1
6月 16 15:53:16 centos7 jenkins[5106]: 2023-06-16 07:53:16.955+0000 [id=48] INFO hudson.model.A...16 ms
Hint: Some lines were ellipsized, use -l to show in full.
#查看第一次登录的密码
[root@centos7 ~]#cat /var/lib/jenkins/secrets/initialAdminPassword
5e9457269c7c42dcbfa407de2c780a3a
#默认配置
[root@centos7 ~]#grep -v "#" /etc/sysconfig/jenkins | grep -v "^$"
JENKINS_HOME="/var/lib/jenkins"
JENKINS_JAVA_CMD=""
JENKINS_USER="jenkins"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true"
JENKINS_PORT="8080"
JENKINS_LISTEN_ADDRESS=""
JENKINS_HTTPS_PORT=""
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_HTTP2_PORT=""
JENKINS_HTTP2_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"
JENKINS_HANDLER_IDLE="20"
JENKINS_EXTRA_LIB_FOLDER=""
JENKINS_ARGS=""
#修改配置
[root@centos7 ~]#grep -v "#" /etc/sysconfig/jenkins | grep -v "^$"
JENKINS_HOME="/var/lib/jenkins"
JENKINS_JAVA_CMD=""
JENKINS_USER="jenkins"
JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true \
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=12345 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Djava.rmi.server.hostname="10.0.0.40" \"
JENKINS_PORT="8080"
JENKINS_LISTEN_ADDRESS=""
JENKINS_HTTPS_PORT=""
JENKINS_HTTPS_KEYSTORE=""
JENKINS_HTTPS_KEYSTORE_PASSWORD=""
JENKINS_HTTPS_LISTEN_ADDRESS=""
JENKINS_HTTP2_PORT=""
JENKINS_HTTP2_LISTEN_ADDRESS=""
JENKINS_DEBUG_LEVEL="5"
JENKINS_ENABLE_ACCESS_LOG="no"
JENKINS_HANDLER_MAX="100"
JENKINS_HANDLER_IDLE="20"
JENKINS_EXTRA_LIB_FOLDER=""
JENKINS_ARGS=""
#可选启动参数:
JENKINS_JAVA_OPTIONS="-server -Xms1g -Xmx1g -Xss512k -Xmn1g
-XX:CMSInitiatingOccupancyFraction=65
-XX:+UseFastAccessorMethods
-XX:+AggressiveOpts -XX:+UseBiasedLocking
-XX:+DisableExplicitGC -XX:MaxTenuringThreshold=10
-XX:NewSize=2048M -XX:MaxNewSize=2048M -XX:NewRatio=2
-XX:PermSize=128m -XX:MaxPermSize=512m -XX:CMSFullGCsBeforeCompaction=5
-XX:+ExplicitGCInvokesConcurrent -XX:+UseConcMarkSweepGC -XX:+UseParNewGC
-XX:+CMSParallelRemarkEnabled -Djava.awt.headless=true
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname="10.0.0.40""
[root@centos7 ~]#systemctl restart jenkins
4.1.2.3 修改 jenkins 服务的用户
默认jenkins服务使用jenkins 帐号启动,将文件复制到生产服务器可能会遇到权限问题,因此修改为root用户
[root@ubuntu2004 ~]#vim /etc/default/jenkins
JENKINS_USER=root
JENKINS_GROUP=root
[root@ubuntu2004 ~]#systemctl restart jenkins
[root@ubuntu2004 ~]#ps aux | grep jenkins
root 10341 0.0 0.0 5936 168 ? S 08:26 0:00 /usr/bin/daemon --name=jenkins --inherit --env=JENKINS_HOME=/var/lib/jenkins --output=/var/log/jenkins/jenkins.log --pidfile=/var/run/jenkins/jenkins.pid -- /bin/java -Djava.awt.headless=true -jar /usr/share/jenkins/jenkin.war --webroot=/var/cache/jenkins/war --httpPort=8080
root 10342 89.6 4.2 4529564 344060 ? Sl 08:26 0:08 /bin/java -Djava.awt.headless=true -jar /usr/share/jenkins/jenkins.war --webroot=/var/cache/jenkins/war --httpPort=8080
root 10398 0.0 0.0 6432 724 pts/0 S+ 08:26 0:00 grep --color=auto jenkins
4.1.2.4一键安装 Jenkins 脚本
[root@ubuntu2004 ~]#cat install_jenkins.sh
#!/bin/bash
#
#********************************************************************
#QQ: 452495750
#Date: 2023-11-01
#FileName: install_jenkins.sh
#URL: http://14.116.227.197
#Description: 本脚本只支持Jenkins-2.319.3前版本
#********************************************************************
JENKINS_VERSION=2.319.3
#JENKINS_VERSION=2.346.2
URL="https://get.jenkins.io/debian-stable/jenkins_${JENKINS_VERSION}_all.deb"
#URL="https://mirrors.aliyun.com/jenkins/debian-stable/jenkins_${JENKINS_VERSION}_all.deb"
#URL="https://mirrors.aliyun.com/jenkins/debian-stable/jenkins_2.303.2_all.deb"
#URL="https://mirrors.tuna.tsinghua.edu.cn/jenkins/debian-stable/jenkins_2.289.3_all.deb"
#URL="https://mirrors.aliyun.com/jenkins/debian-stable/jenkins_2.289.3_all.deb"
#URL="https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat-stable/jenkins-2.289.3-1.1.noarch.rpm"
GREEN="echo -e \E[32;1m"
END="\E[0m"
HOST=`hostname -I|awk '{print $1}'`
. /etc/os-release
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}
install_java(){
if [ $ID = "centos" -o $ID = "rocky" ];then
#yum -y install java-1.8.0-openjdk
yum -y install java-11-openjdk
else
apt update
#apt -y install openjdk-8-jdk
apt -y install openjdk-11-jdk
fi
if [ $? -eq 0 ];then
color "安装java完成!" 0
else
color "安装java失败!" 1
exit
fi
}
install_jenkins() {
wget -P /usr/local/src/ $URL || { color "下载失败!" 1 ;exit ; }
if [ $ID = "centos" -o $ID = "rocky" ];then
yum -y install /usr/local/src/${URL##*/}
ystemctl enable jenkins
systemctl start jenkins
else
apt -y install daemon net-tools || { color "安装依赖包失败!" 1 ;exit ; }
dpkg -i /usr/local/src/${URL##*/}
fi
if [ $? -eq 0 ];then
color "安装Jenkins完成!" 0
else
color "安装Jenkins失败!" 1
exit
fi
}
start_jenkins() {
systemctl is-active jenkins
if [ $? -eq 0 ];then
echo
color "Jenkins安装完成!" 0
echo "-------------------------------------------------------------------"
echo -e "访问链接: \c"
${GREEN}"http://$HOST:8080/"${END}
else
color "Jenkins安装失败!" 1
exit
fi
while :;do
[ -f /var/lib/jenkins/secrets/initialAdminPassword ] && \
{ key=`cat /var/lib/jenkins/secrets/initialAdminPassword` ; break; }
sleep 1
done
echo -e "登录秘钥: \c"
${GREEN}$key${END}
}
install_java
install_jenkins
start_jenkins
#执行安装
[root@ubuntu2004 ~]#bash install_jenkins.sh
4.2 基于war包安装jenkins
4.2.1 安装jdk
注意:jdk版本必须是1.11以上的版本。
[root@jenkins ~]# yum -y install java-11-openjdk
[root@jenkins ~]# java -version
openjdk version "11.0.19" 2023-04-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.19.0.7-1.el7_9) (build 11.0.19+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.19.0.7-1.el7_9) (build 11.0.19+7-LTS, mixed mode, sharing)
4.3 启动jenkins
启动 Jenkins 可以通过下面三种方式实现
1、利用 service 文件启动
2、 利用 jar 命令直接启动
3、 利用 tomcat 启动
[root@jenkins ~]# java -jar jenkins.war #运行jenkins
Running from: /root/jenkins.war
webroot: $user.home/.jenkins
2023-07-01 14:15:09.298+0000 [id=1] INFO winstone.Logger#logInternal: Beginning extraction from war file
2023-07-01 14:15:09.979+0000 [id=1] WARNING o.e.j.s.handler.ContextHandler#setContextPath: Empty contextPath
2023-07-01 14:15:10.026+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: jetty-10.0.12; built: 2022-09-14T01:54:40.076Z; git: 408d0139887e27a57b54ed52e2d92a36731a7e88; jvm 11.0.19+7-LTS
2023-07-01 14:15:10.247+0000 [id=1] INFO o.e.j.w.StandardDescriptorProcessor#visitServlet: NO JSP Support for /, did not find org.eclipse.jetty.jsp.JettyJspServlet
2023-07-01 14:15:10.297+0000 [id=1] INFO o.e.j.s.s.DefaultSessionIdManager#doStart: Session workerName=node0
2023-07-01 14:15:10.619+0000 [id=1] INFO hudson.WebAppMain#contextInitialized: Jenkins home directory: /root/.jenkins found at: $user.home/.jenkins
2023-07-01 14:15:10.817+0000 [id=1] INFO o.e.j.s.handler.ContextHandler#doStart: Started w.@3e7545e8{Jenkins v2.375.1,/,file:///root/.jenkins/war/,AVAILABLE}{/root/.jenkins/war}
2023-07-01 14:15:10.834+0000 [id=1] INFO o.e.j.server.AbstractConnector#doStart: Started ServerConnector@13d4992d{HTTP/1.1, (http/1.1)}{0.0.0.0:8080}
2023-07-01 14:15:10.855+0000 [id=1] INFO org.eclipse.jetty.server.Server#doStart: Started Server@7d9e8ef7{STARTING}[10.0.12,sto=0] @1933ms
2023-07-01 14:15:10.857+0000 [id=25] INFO winstone.Logger#logInternal: Winstone Servlet Engine running: controlPort=disabled
2023-07-01 14:15:11.030+0000 [id=32] INFO jenkins.InitReactorRunner$1#onAttained: Started initialization
2023-07-01 14:15:11.044+0000 [id=43] INFO jenkins.InitReactorRunner$1#onAttained: Listed all plugins
2023-07-01 14:15:11.589+0000 [id=44] INFO jenkins.InitReactorRunner$1#onAttained: Prepared all plugins
2023-07-01 14:15:11.594+0000 [id=44] INFO jenkins.InitReactorRunner$1#onAttained: Started all plugins
2023-07-01 14:15:11.604+0000 [id=38] INFO jenkins.InitReactorRunner$1#onAttained: Augmented all extensions
2023-07-01 14:15:11.772+0000 [id=32] INFO jenkins.InitReactorRunner$1#onAttained: System config loaded
2023-07-01 14:15:11.772+0000 [id=42] INFO jenkins.InitReactorRunner$1#onAttained: System config adapted
2023-07-01 14:15:11.772+0000 [id=35] INFO jenkins.InitReactorRunner$1#onAttained: Loaded all jobs
2023-07-01 14:15:11.774+0000 [id=35] INFO jenkins.InitReactorRunner$1#onAttained: Configuration for all jobs updated
2023-07-01 14:15:11.800+0000 [id=58] INFO hudson.util.Retrier#start: Attempt #1 to do the action check updates server
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.codehaus.groovy.vmplugin.v7.Java7$1 (file:/root/.jenkins/war/WEB-INF/lib/groovy-all-2.4.21.jar) to constructor java.lang.invoke.MethodHandles$Lookup(java.lang.Class,int)
WARNING: Please consider reporting this to the maintainers of org.codehaus.groovy.vmplugin.v7.Java7$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
2023-07-01 14:15:12.155+0000 [id=34] INFO jenkins.install.SetupWizard#init:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
e944271f335e45bf8e601db10d644876 <===============这里存放是登录的密码
This may also be found at: /root/.jenkins/secrets/initialAdminPassword <===============登录密码的保存文件
*************************************************************
*************************************************************
*************************************************************
#############################################帮助信息#####################################################
[root@centos7 ~]#java -jar jenkins.war --help
Running from: /root/jenkins.war
webroot: /root/.jenkins/war
Jenkins Automation Server Engine 2.401.1
Usage: java -jar jenkins.war [--option=value] [--option=value]
Options:
--webroot = folder where the WAR file is expanded into. Default is ${JENKINS_HOME}/war
--pluginroot = folder where the plugin archives are expanded into. Default is ${JENKINS_HOME}/plugins
(NOTE: this option does not change the directory where the plugin archives are stored)
--extractedFilesFolder = folder where extracted files are to be located. Default is the temp folder
--enable-future-java = allows running with Java versions which are not fully supported
--paramsFromStdIn = Read parameters from standard input (stdin)
--version = Print version to standard output (stdout) and exit
--javaHome = Override the JAVA_HOME variable
--config = load configuration properties from here. Default is ./winstone.properties
--prefix = add this prefix to all URLs (eg http://localhost:8080/prefix/resource). Default is none
--commonLibFolder = folder for additional jar files. Default is ./lib
--extraLibFolder = folder for additional jar files to add to Jetty classloader
--logfile = redirect log messages to this file
--logThrowingLineNo = show the line no that logged the message (slow). Default is false
--logThrowingThread = show the thread that logged the message. Default is false
--debug = set the level of Winstone debug msgs (1-9). Default is 5 (INFO level)
--httpPort = set the http listening port. -1 to disable, Default is 8080
--httpListenAddress = set the http listening address. Default is all interfaces
--httpKeepAliveTimeout = how long idle HTTP keep-alive connections are kept around (in ms; default 30000)?
--httpsPort = set the https listening port. -1 to disable, Default is disabled
--httpsListenAddress = set the https listening address. Default is all interfaces
--httpsKeepAliveTimeout = how long idle HTTPS keep-alive connections are kept around (in ms; default 30000)?
--httpsKeyStore = the location of the SSL KeyStore file. Default is ./winstone.ks
--httpsKeyStorePassword = the password for the SSL KeyStore file. Default is null
--httpsKeyManagerType = the SSL KeyManagerFactory type (eg SunX509, IbmX509). Default is SunX509
--httpsRedirectHttp = redirect http requests to https (requires both --httpPort and --httpsPort)
--http2Port = set the http2 listening port. -1 to disable, Default is disabled
--httpsSniHostCheck = if the SNI Host name must match when there is an SNI certificate. Check disabled per default
--httpsSniRequired = if a SNI certificate is required. Disabled per default
--http2ListenAddress = set the http2 listening address. Default is all interfaces
--excludeProtocols = set protocol versions to exclude. (comma separated list, use blank quote " " to exclude none)
(default is "SSL", "SSLv2", "SSLv2Hello", "SSLv3")
--excludeCipherSuites = set the ciphers to exclude (comma separated, use blank quote " " to exclude none) (default is
// Exclude weak / insecure ciphers
"^.*_(MD5|SHA|SHA1)$",
// Exclude ciphers that don't support forward secrecy
"^TLS_RSA_.*$",
// The following exclusions are present to cleanup known bad cipher
// suites that may be accidentally included via include patterns.
// The default enabled cipher list in Java will not include these
// (but they are available in the supported list).
"^SSL_.*$",
"^.*_NULL_.*$",
"^.*_anon_.*$"
--controlPort = set the shutdown/control port. -1 to disable, Default disabled
--sessionTimeout = set the http session timeout value in minutes. Default to what webapp specifies, and then to 60 minutes
--sessionEviction = set the session eviction timeout for idle sessions in seconds. Default value is 180. -1 never evict, 0 evict on exit
--mimeTypes=ARG = define additional MIME type mappings. ARG would be EXT=MIMETYPE:EXT=MIMETYPE:...
(e.g., xls=application/vnd.ms-excel:wmf=application/x-msmetafile)
--requestHeaderSize=N = set the maximum size in bytes of the request header. Default is 8192.
--responseHeaderSize=N = set the maximum size in bytes of the response header. Default is 8192.
--maxParamCount=N = set the max number of parameters allowed in a form submission to protect
against hash DoS attack (oCERT #2011-003). Default is 10000.
--useJmx = Enable Jetty Jmx
--qtpMaxThreadsCount = max threads number when using Jetty Queued Thread Pool
--jettyAcceptorsCount = Jetty Acceptors number
--jettySelectorsCount = Jetty Selectors number
--usage / --help = show this message
Security options:
--realmClassName = Set the realm class to use for user authentication. Defaults to ArgumentsRealm class
--argumentsRealm.passwd.<user> = Password for user <user>. Only valid for the ArgumentsRealm realm class
--argumentsRealm.roles.<user> = Roles for user <user> (comma separated). Only valid for the ArgumentsRealm realm class
--fileRealm.configFile = File containing users/passwds/roles. Only valid for the FileRealm realm class
Access logging:
--accessLoggerClassName = Set the access logger class to use for user authentication. Defaults to disabled
--simpleAccessLogger.format = The log format to use. Supports combined/common/resin/custom (SimpleAccessLogger only)
--simpleAccessLogger.file = The location pattern for the log file(SimpleAccessLogger only)
注意:这里也可以采用tomcat的方式来部署或者采用yum安装以及docker容器化的方式运行。
4.4 登录jenkins
浏览器输入:http://ip:8080,登录需要密码验证,密码如下路径中
复制这段密码输入即可登录
4.5 安装插件
4.5.1 安装插件
插件安装过程中,如果因为某种原因导致有安装失败的插件,可以后期再单独安装
安装过程比较耗时,需要等待。
4.6 基础设置
4.6.1 密码设置
默认密码的存放位置在 /root/.jenkins/secrets/initialAdminPassword
下,不容易记忆,我们可以设一下登录密码
刷新页面后,使用新的密码登录。
4.6.1.1 admin密码更改忘记情况
删除Jenkins目录下config.xml文件中下面代码,并保存文件。
[root@jenkins .jenkins]# cp config.xml config.xml.bak
[root@jenkins .jenkins]# vim config.xml
<useSecurity>true</useSecurity>
<authorizationStrategy class="hudson.security.FullControlOnceLoggedInAuthorizationStrategy">
<denyAnonymousReadAccess>true</denyAnonymousReadAccess>
</authorizationStrategy>
<securityRealm class="hudson.security.HudsonPrivateSecurityRealm">
<disableSignup>true</disableSignup>
<enableCaptcha>false</enableCaptcha>
</securityRealm>
重启jenkins服务,再次登录后就不再需要输入密码进行验证了。
如果需要密码验证,进入首页>“系统管理”>“Configure Global Security”;(全局安全配置)---》点选“Jenkins专有用户数据库”,并点击“保存”;
重新点击首页>“系统管理”,发现此时出现“管理用户”
点击进入展示“用户列表”;
点击左侧进入修改密码页面,修改后即可重新登录
4.6.2 安装中文插件(默认启用)
插件管理--搜索 chinese -- 选中 Location: Chinese (simplified) 进行安装
4.7 插件下载失败解决方案
解决方案如下:
1)修改/root/.jenkins/hudson.model.UpdateCenter.xml文件,将https方式修改成http方式,并重启jenkins下载
[root@jenkins .jenkins]# vim hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://updates.jenkins.io/update-center.json</url>
</site>
</sites>
- 如果此方法不行,可以将别人下载好的插件,打包过来,上传到/root/.jenkins/plugins这个路径下解压,并重启jenkins,在web界面上才能看到插件
- 自行在jenkins的网站下载对应的插件,通过web界面上传,再重新启动jenkins后,在web界面上也可以看到
https://plugins.jenkins.io
http://updates.jenkins-ci.org/download/plugins/
国内镜像站点插件下载地址:
http://updates.jenkins-ci.org/download/plugins/
https://updates.jenkins.io/download/plugins/
https://mirrors.aliyun.com/jenkins/plugins/
https://mirrors.tuna.tsinghua.edu.cn/jenkins/plugins/
重启jenkins服务
站点升级备用源:
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
4.8 全局工具配置
4.8.1 maven配置
4.8.2 jdk配置
此处我使用的yum安装的jdk环境,如果不清楚jdk环境,参考如下办法:
[root@jenkins ~]# which java
/usr/bin/java
[root@jenkins ~]# ll /usr/bin/java
lrwxrwxrwx. 1 root root 22 Jul 1 22:11 /usr/bin/java -> /etc/alternatives/java
[root@jenkins ~]# ll /etc/alternatives/java
lrwxrwxrwx. 1 root root 64 Jul 1 22:11 /etc/alternatives/java -> /usr/lib/jvm/java-11-openjdk-11.0.19.0.7-1.el7_9.x86_64/bin/java
4.8.3 git配置
4.8.4 maven安装
4.9 账号权限设置
jenkins默认登录的账号属于admin的账号,属于管理员账号,该账号的权限很大,存在一些安全隐患,所以,应该对账号的权限进行划分
4.9.1 安装用户管理插件
jenkins的用户管理的插件基于2个
- Role-based Authorization Strategy
- Authorize Project
安装插件:系统管理---->插件管理--->可选插件--->搜索该插件
4.9.2 开启插件功能
系统管理---->全局安全设置----->授权策略----->旋转该插件-->保存
4.9.3 测试
4.9.3.1 新建测试用户
先将策略改回,以便于我们可以正常注册测试用户
可以看到test用户几乎可以做任何的事情,这跟我们定义的策略一致。
4.9.3.2 修改授权策略
使用管理员账号登录(admin)登录jenkins,修改授权策略为“Role-based Strategy”。完成后点击保存。
4.9.3.3 使用test账号登录测试
可以看到没有任何的权限了。
4.9.4 权限划分
安装完如上的插件后,在jenkins中系统管理中多了一个“Manage and Assign Roles”的功能,点击打开就可以进行权限的划分,jenkins的权限划分,是将权限赋予角色,然后在将角色和用户进行绑定。
4.9.4.1 角色管理
角色管理分为3种:
- 全局角色:对全局生效
- 项目角色:针对某一个特定的项目生效
- 代理角色(节点角色):只对某个节点生效。
接下创建一个新的角色:
默认新的角色没有任何的权限,我们自定义一些角色权限,完成后,点击保存;
4.9.4.2 分配角色
将角色的权限应用到test用户,完成被保存
4.9.4.3 测试
使用test账号再次登录,查看用户权限分配问题。
现在看到test用户有了一些基本的权限了。
五、实战1:基于gitlab和jenkins的自动化部署h5实例
5.1 实验环境
IP地址 | 系统版本 | 角色 |
---|---|---|
192.168.1.100 | CentOS7.9 | gitlab-server |
192.168.1.101 | CentOS7.9 | jenkins-server |
192.168.1.102 | CentOS7.9 | nginx-server |
192.168.1.103 | CentOS7.9 | dev |
5.2 安装gitlab
前期安装步骤参考第1天安装过程
5.3 创建项目
这里我是从码云(https://gitee.com/)上下载的小项目
https://gitee.com/lovexzq/XingYunDaZhuanPan.git
说明:项目导入成功。
5.4 将开发者的公钥添加到gitlab
5.4.1 复制开发者的公钥信息
[root@dev ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCji7bj2nVbqLaMIV0xfeNrnK7owyH54HPYzp3mntBe+Wm1pxku+VQzOpW4CGSAgpXAXfqOSyom2zWDZn6OlMZAGGjEpSo+mbg3ZN+pOnC1NS99UE+eCVLvOfhJrD8hGJlVZ439sXKBNTJGIyRXypuRc0Muyx5rUkhuH/k91d9dV9uK2p4KLtz5c1sBgenhnfKQTiox7hsgLSdTon0p6suO3Yn1G2DUTzyzn4N8KYdPJ9LSq0onnqXl8msQj6PebI/06jl3tLfHYk+OHbDmZLCudmgnV9wmB52ARYgeBqUOU6Sx8ljKqtR+VoYVVvgYiFGvrHDQisAPvlhNe1UckSFR root@dev
5.4.2 将公钥添加到gitlab上
5.4.3 测试clone gitlab上的项目
[root@dev ~]# git clone git@192.168.1.100:root/dazhuanpan.git
Cloning into 'dazhuanpan'...
The authenticity of host '192.168.1.100 (192.168.1.100)' can't be established.
ECDSA key fingerprint is SHA256:WhNOenKWGD3FA2obGLKFOUNc4p7vKdlcoveb9Vrt4ys.
ECDSA key fingerprint is MD5:19:e4:b9:4c:b6:46:66:bf:c3:f5:59:c6:83:aa:fd:84.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.100' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 19 (delta 2), reused 19 (delta 2), pack-reused 0
Receiving objects: 100% (19/19), 104.36 KiB | 0 bytes/s, done.
Resolving deltas: 100% (2/2), done.
5.4.4 测试push代码功能
[root@dev dazhuanpan]# vim lottery.html
[root@dev dazhuanpan]# git add lottery.html
[root@dev dazhuanpan]# git commit -m "第一次提交 lottery.html" #提交
[master affe55c] 第一次提交 lottery.html
1 file changed, 2 insertions(+), 2 deletions(-)
[root@dev dazhuanpan]# git push -u origin master #推送到远程仓库
Counting objects: 5, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 308 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To git@192.168.1.100:root/dazhuanpan.git
3935eb7..affe55c master -> master
Branch master set up to track remote branch master from origin.
代码推送功能没有问题。
5.5 配置jenkins
5.5.1 安装插件
安装gitlab和gitlab hook(Generic Webhook Trigger),通过这2个插件实现自动触发
5.6 将jenkins的公钥导入gitlab上
jenkins需要登录gitlab上拉去代码,因此需要将公钥导入到gitlab
5.6.1 复制jenkins的公钥
[root@jenkins ~]# cat .ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJwoSvc+AuL/zE3aHK/J20Fy17bCfTjHCtx9ej1FPdUQVcUk7oxhnP+kgncuqqYyfK0/HWLWCSwWeGR2aOT0ifq3xcrS8zJ45Sqq6JshrcsqSI/TBXT4+KFpGFQFJ51Phwqk8DkVKHj0Jx6w9VcqEeHVcqMFANFZASrhR7GMwWSEXai/zs3idxt9m+MR9knHziI4QZetsixbfSA+Yko7nwMVxS0smCY1L5EZtAgB4pmB/nuTM3zlvrWZa44luLBjnwrsFcVFEvwstj1jCsQ0G6ZjdP3BLwZJZ/nk4xkIUL7nr2rhnzOgcrdolLhvyV4WZHRLOB0lYLoKkRGb8ywGav root@jenkins
5.6.2 添加到gitlab
5.6.3 在jenkins上测试连通性
[root@jenkins ~]# git clone git@192.168.1.100:root/jenkins.git
Cloning into 'jenkins'...
Warning: Permanently added '192.168.1.100' (ECDSA) to the list of known hosts.
remote: Enumerating objects: 6, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (6/6), done.
测试能clone下来代码说明连通性没有问题。
5.7 jenkins创建自动构建任务
5.7.1 新建自由风格构建任务
-
新建任务
输入任务名
选择自由风格的软件项目
描述该任务的作用
-
设置丢弃旧的构建
丢弃旧的构建:构建后的产物,保留多久 条件1:保持构建的天数:当前项目构建的产物最多保留多少天 条件2:保持构建的最大个数:当前项目最多保留多少构建产物,多出的自动删除
-
源码管理
从gitlab等仓库下载源码
-
构建触发器
定义自动构建的触发器
-
构建
构建项目的具体过程,比如: 编译,打包,部署等
-
构建后操作
构建完成后可以执行的操作,比如,通知或执行其它任务
5.7.2 通用设置
5.7.3 源码设置
注意:你的jenkins密钥对如果重新生成了,则使用新的凭证
5.7.4 构建触发器
注意:将webhook地址和token地址记录下来保存。
5.8 添加构建步骤
脚本内容如下:
#!/bin/bash
#定义web服务器的地址
web_ip=192.168.1.102
#定义jenkins的工作任务目录
SOURCE_DIR=/root/.jenkins/workspace/$JOB_NAME/
#定义目录目录为nginx的网站根目录
DEST_DIR=/usr/share/nginx/html
#使用rsync将源同步到nginx的网站目录下
/usr/bin/rsync -av --delete $SOURCE_DIR root@$web_ip:$DEST_DIR
5.9 将jenkins的公钥传给Nginx,实现免密登录
[root@jenkins auto_build_nginx_web]# ssh-copy-id 192.168.1.102
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.1.102 (192.168.1.102)' can't be established.
ECDSA key fingerprint is SHA256:29Hc2ezJCjBZVzmieSkg3XJTSpp1P5XlVuuteyQJnlE.
ECDSA key fingerprint is MD5:c3:45:25:c5:ed:b6:63:e8:1a:68:1d:ed:1a:02:34:c9.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.1.102's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh '192.168.1.102'"
and check to make sure that only the key(s) you wanted were added.
5.10 配置自动构建
5.10.1 配置webhook
将我们的项目的地址和secret token的地址复制保存,将令牌信息添加到gitlab上
注意:如果这里保存异常,无法添加,请使用如下方式修改:
5.11 开发测试上传代码
5.11.1 上传新代码
[root@dev dazhuanpan]# vim lottery.html
[root@dev dazhuanpan]# git add lottery.html
[root@dev dazhuanpan]# git commit -m "第三次提交 lottery.html" #提交
[master c205f89] 第三次提交 lottery.html
1 file changed, 1 insertion(+), 1 deletion(-)
[root@dev dazhuanpan]# git push -u origin master #推送至远程仓库
Counting objects: 5, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 306 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To git@192.168.1.100:root/dazhuanpan.git
cf46401..c205f89 master -> master
Branch master set up to track remote branch master from origin.
5.11.2 查看jenkins是否有自动构建
可以看到jenkins自动构建成功。
5.11.3 访问nginx
可以看到,第三次提交的代码已经自动推送到了nginx服务器上了。
5.12 利用 Git Parameter 插件实现拉取指定版本
5.12.1 在gitlab上创建多个标签,并设置不同的标签中不同的代码
5.12.2 jenkins安装插件
5.12.3 开始构建
5.12.3.1 v1.0构建的版本
5.12.3.2 v2.0构建的版本
5.12.4 根据标签构建保存版本
5.12.4.1 修改jenkins的配置
5.12.4.2 修改构建步骤中的脚本
#!/bin/bash
#定义web服务器的地址
web_ip=192.168.10.103
#定义jenkins的工作任务目录
SOURCE_DIR=/root/.jenkins/workspace/$JOB_NAME/xydzp_$TAG #加上子目录
#定义目录目录为nginx的网站根目录
DEST_DIR=/usr/share/nginx/html/
#使用rsync将源同步到nginx的网站目录下
/usr/bin/scp -r $SOURCE_DIR/ root@$web_ip:$DEST_DIR
5.12.4.3 立即构建
5.12.4.4 构建完成后查看是否存在不同的版本
5.12.4.5 测试访问
5.13 利用 Git Parameter 插件实现拉取指定 Commit_ID
5.13.1 创建构建项目
5.13.2 添加执行脚本
cd /root/.jenkins/workspace/$JOB_NAME
ssh 192.168.10.103 systemctl stop nginx
scp -r * 192.168.10.103:/usr/share/nginx/html/
ssh 192.168.10.103 systemctl start nginx
5.13.3 立即构建
5.13.4 测试访问
5.14 Blue Ocean 插件实现可视化
Blue Ocean 插件可以实现更加漂亮的可视化界面,并且可以对指定的步骤进行重启等操作
5.14.1 安装 Blue Ocean 插件
5.14.2 使用 blue ocean
5.15 定时和 SCM 构建
周期性构建这是—-种cron类型的构建机制.按照预定义的时间周期性启动作务
对于期望能够基于代码变更进行触的CI场景来说,周期性构建并非其最佳选项,但对于有些类型的住务,它却也能够通过精心编排的周期性构建来避免资源冲突;
周期性构建分为定时构建和轮询构建
- 定时构建: 按时间周期性的触发构建。
- 轮询SCM(Source Code Management): 指的是定期到代码仓库检查代码是否有变更,存在代码变更时就运行pipeline;为了能够从CI中得到更多的收益,轮询操作越频繁越好;显然,这会给SCM带去无谓的压力,所以构建的触发由SCM负责通知Jenkins最为理想;但在外部的SCM无法通知到局域网中的Jenkins时,可以采轮询SCM方式倒也不失为一种选择。
Jenkins cron 语法遵循 Unix cron 语法的定义,但在细节上略有差别
一项cron的定义包含由空白字符或Tab分隔的5个字段,用于定义周期性的时间点
H 符号可用于任何字段,且它能够在一个时间范围内对项目名称进行散列值计算出一个唯一的偏移量,以避免所有配置相同cron值的项目在同一时间启动;比如:triggers { cron(H(0,30)) }
This field follows the syntax of cron (with minor differences). Specifically, each line consists of 5 fields separated by TAB or whitespace:
MINUTE HOUR DOM MONTH DOW
MINUTE Minutes within the hour (0–59)
HOUR The hour of the day (0–23)
DOM The day of the month (1–31)
MONTH The month (1–12)
DOW The day of the week (0–7) where 0 and 7 are Sunday.
To specify multiple values for one field, the following operators are available. In the order of precedence,
* specifies all valid values
M-N specifies a range of values
M-N/X or */X steps by intervals of X through the specified range or whole valid range A,B,...,Z enumerates multiple values
To allow periodically scheduled tasks to produce even load on the system, the symbol H (for “hash”) should be used wherever possible. For example, using 0 0 * * * for a dozen daily jobs will cause a large spike at midnight. In contrast, using H H * * * would still execute each job once a day, but not all at the same time, better using limited resources.
The H symbol can be used with a range. For example, H H(0-7) * * * means some time between 12:00 AM (midnight) to 7:59 AM. You can also use step intervals with H, with or without ranges.
The H symbol can be thought of as a random value over a range, but it actually is a hash of the job name, not a random function, so that the value remains stable for any given project.
Beware that for the day of month field, short cycles such as */3 or H/3 will not work consistently near the end of most months, due to variable month lengths. For example, */3 will run on the 1st, 4th, …31st days of a long month, then again the next day of the next month. Hashes are always chosen in the 1-28 range, so H/3 will produce a gap between runs of between 3 and 6 days at the end of a month. (Longer cycles will also have inconsistent lengths but the effect may be relatively less noticeable.)
Empty lines and lines that start with # will be ignored as comments.
In addition, @yearly, @annually, @monthly, @weekly, @daily, @midnight, and @hourly are supported as convenient aliases. These use the hash system for automatic balancing. For example, @hourly is the same as H * * * * and could mean at any time during the hour. @midnight actually means some time between 12:00 AM and 2:59 AM.
Examples:
# Every fifteen minutes (perhaps at :07, :22, :37, :52):
H/15 * * * *
# Every ten minutes in the first half of every hour (three times, perhaps at :04,
:14, :24):
H(0-29)/10 * * * *
# Once every two hours at 45 minutes past the hour starting at 9:45 AM and
finishing at 3:45 PM every weekday:
45 9-16/2 * * 1-5
# Once in every two hour slot between 8 AM and 4 PM every weekday (perhaps at
9:38 AM, 11:38 AM, 1:38 PM, 3:38 PM):
H H(8-15)/2 * * 1-5
# Once a day on the 1st and 15th of every month except December:
H H 1,15 1-11 *
Time zone specification
Periodic tasks are normally executed at the scheduled time in the time zone of the Jenkins master JVM (currently Asia/Shanghai). This behavior can optionally be changed by specifying an alternative time zone in the first line of the field. Time zone specification starts with TZ=, followed by the ID of a time zone.
Complete example of a schedule with a time zone specification:
TZ=Europe/London
# This job needs to be run in the morning, London time
H 8 * * *
# Butlers do not have a five o'clock, so we run the job again
H(0-30) 17 * * *
范例: 每小时构建
例如:每3分钟构建一次, 如: 在2:55,2:58,3:01,3:04 时间点进行构建
范例: SCM 构建
六、实战2:基于gitlab和jenkins的自动化部署java实例
这里java实例我们采用的是jpress源码作为测试项目
6.1 实验环境
IP地址 | 系统版本 | 角色 |
---|---|---|
192.168.1.100 | CentOS7.9 | gitlab-server |
192.168.1.101 | CentOS7.9 | jenkins-server |
192.168.1.102 | CentOS7.9 | tomcat8 |
192.168.1.103 | CentOS7.9 | dev |
6.2 新建项目仓库
从URL导入项目,项目地址:
https://gitee.com/JPressProjects/jpress.git
项目导入成功了。
6.3 测试拉取项目
[root@dev ~]# git clone http://192.168.1.100/root/jpress.git
Cloning into 'jpress'...
remote: Enumerating objects: 111504, done.
remote: Counting objects: 100% (111504/111504), done.
remote: Compressing objects: 100% (34060/34060), done.
remote: Total 111504 (delta 45727), reused 111504 (delta 45727), pack-reused 0
Receiving objects: 100% (111504/111504), 200.97 MiB | 55.80 MiB/s, done.
Resolving deltas: 100% (45727/45727), done.
可以到项目拉取没有问题。
6.4 jenkins配置
6.4.1 安装Git插件和Git工具
为了让Jenkins支持从Gitlab拉取源码,需要安装Git插件以及在CentOS7上安装Git工具。
我这里是提前安装好了,所以在已安装这里可以查看到。
在jenkins上安装git,这里我已经提前安装好了
[root@jenkins ~]# git --version
git version 1.8.3.1
6.4.2 创建凭证
6.4.3 测试凭证是否正常
新建一个测试项目,使用凭证正常拉取项目测试。
可以看到构建没有问题。
6.5 Maven安装和配置
这里已经提前在centos7中安装好了,安装部署可以参考前面部分内容。
系统管理--->全局工具配置
6.5.1 maven配置
6.5.2 JDK安装
6.5.3 git配置
6.5.4 maven安装
6.5.5 修改Maven的settings.xml
[root@jenkins ~]# mkdir -p /home/jenkins/repo 创建本地仓库目录
[root@jenkins ~]# chown -R jenkins:jenkins /home/jenkins 修改目录权限为 jenkins:jenkins
[root@jenkins ~]# vim /usr/local/maven/conf/settings.xml
修改两个地方,参数如下:
1) 添加阿里云私服地址:
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2)本地仓库改为: /home/jenkins/repo
6.5.6 测试Maven
使用之前的gitlab密码测试项目,修改配置
Build Steps ->增加构建步骤->Execute Shell
输入:
mvn clean package
再次构建,如果可以把项目打成war包,代表maven环境配置成功啦!
打包好的war包放置位置
[root@jenkins target]# pwd
/root/.jenkins/workspace/test1/starter-tomcat/target
[root@jenkins target]# ls
classes maven-archiver starter-tomcat-5.0 starter-tomcat-5.0-classes.jar starter-tomcat-5.0.war
6.6 安装tomcat
这里我们采用的是tomcat8版本
6.6.1 安装jdk
[root@web ~]# tar zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local/
[root@web ~]# vim /etc/profile
添加如下内容:
JAVA_HOME=/usr/local/jdk1.8.0_341
JAVA_BIN=$JAVA_HOME/bin
JRE_HOME=$JAVA_HOME/jre
JRE_BIN=$JRE_HOME/bin
PATH=$JAVA_BIN:$JRE_BIN:$PATH
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export JAVA_HOME JRE_HOME PATH CLASSPATH
[root@web ~]# source /etc/profile #生效配置
[root@web ~]# java -version #查看
java version "1.8.0_341"
Java(TM) SE Runtime Environment (build 1.8.0_341-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.341-b10, mixed mode)
6.6.2 安装tomcat
[root@web ~]# tar zxvf apache-tomcat-8.5.72.tar.gz -C /usr/local/
[root@web local]# ln -s apache-tomcat-8.5.72 tomcat
6.6.3 启动tomcat
6.6.4 配置Tomcat用户角色权限
默认情况下Tomcat是没有配置用户角色权限的
但是,后续Jenkins部署项目到Tomcat服务器,需要用到Tomcat的用户,所以修改tomcat以下配置,添加用户及权限
[root@web local]# vim /usr/local/tomcat/conf/tomcat-users.xml
添加如下内容:
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-status"/>
<role rolename="tomcat"/>
<role rolename="role1"/>
<user username="tomcat" password="tomcat" roles="admin-gui,manager-gui,manager-script,manager-status,tomcat,role1"/>
用户和密码都是:tomcat
注意:为了能够刚才配置的用户登录到Tomcat,还需要修改以下配置
[root@web local]# vim /usr/local/tomcat/webapps/host-manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="strict" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192.168.1.*" /> #将这里修改成你本地的IP地址网段。
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
[root@web local]# vim /usr/local/tomcat/webapps/manager/META-INF/context.xml
<Context antiResourceLocking="false" privileged="true" >
<CookieProcessor className="org.apache.tomcat.util.http.Rfc6265CookieProcessor"
sameSiteCookies="strict" />
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="192.168.1.*" /> #将这里修改成你本地的IP地址网段。
<Manager sessionAttributeValueClassNameFilter="java\.lang\.(?:Boolean|Integer|Long|Number|String)|org\.apache\.catalina\.filters\.CsrfPreventionFilter\$LruCache(?:\$1)?|java\.util\.(?:Linked)?HashMap"/>
</Context>
注意:Tomcat8以后的版本这里默认设置仅主机能访问tomcat,设置成客户端访问IP或者网段即可。
重启Tomcat,访问测试
6.7 jenkins构建Maven项目
下面演示创建一个自由风格项目来完成项目的集成过程:拉取代码->编译->打包->部署
6.7.1 拉取代码
6.7.1.1 创建项目
6.7.1.2 配置源码管理,从gitlab拉取代码
6.7.2 编译打包
构建->添加构建步骤->Executor Shell
echo “开始编译和打包”
mvn clean package
echo “编译和打包结束”
6.7.3 部署
把项目部署到远程的Tomcat里面
1)安装 Deploy to container插件
Jenkins本身无法实现远程部署到Tomcat的功能,需要安装Deploy to container插件实现,我这里提前安装好了。
2)创建连接tomcat的凭证
3)添加构建后操作
继续编辑刚才的项目,增加新的配置
6.7.4 开始构建
可以看到已经构建成功。
6.7.5 测试访问
可以看到手动构建已经完成了,并可以通过浏览器正常访问。
6.8 部署自动构建
前一步已经完成了代码的构建部分,但是还未实现自动构建,自动构建是指当开发将代码推送至gitlab后,系统自动进行构建,不需要在人为的手动构建。
6.8.1 构建触发器
添加webhook并生成token
6.8.2 添加webhook和token
在gitlab上添加webhook和token
6.8.3 测试在gitlab推送一个事务
可以看到,已经在jenkins上自动实现了构建任务。
6.8.4 测试自动构建
模拟开发提交新的代码,测试自动构建是否触发。
[root@dev jpress]# touch test.html
[root@dev jpress]# echo 1111 > test.html
[root@dev jpress]# git add test.html
[root@dev jpress]# git commit -m "增加新功能后第一次提交"
[master 9de1f13] 增加新功能后第一次添加
1 file changed, 1 insertion(+)
create mode 100644 test.html
[root@dev jpress]# git push -u origin master
Username for 'http://192.168.1.100': root
Password for 'http://root@192.168.1.100':
Counting objects: 4, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 305 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
To http://192.168.1.100/root/jpress.git
6883a43..9de1f13 master -> master
Branch master set up to track remote branch master from origin.
可以看到自动构建完成。
6.9 Jenkins 流水线部署
Pipeline,简而言之,就是一套运行于Jenkins上的工作流框架,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排与可视化;
Pipeline 是Jenkins 2.X 的最核心的特性,帮助Jenkins 实现从CI 到 CD 与 DevOps的转变。 Pipeline 是一组插件,让jenkins 可以实现持续交付管道的落地和实施。持续交付管道是将软件从版本控制阶段到交付给用户/客户的完整过程的自动化表现。
Pipeline定义有两种方式:
一种是Pipeline Script ,是直接把脚本内容写到脚本对话框中;
一种是 Pipeline script from SCM (Source Control Management–源代码控制管理,即从gitlab/github/git上获得pipeline脚本–JenkisFile)
6.9.1 Pipeline示例
pipeline最简结构 jenkins的必须部分有以下五个,少一个都不行都会报错。
pipeline
代表整条流水线,包含整条流水线的逻辑。
stage
阶段,代表流水线的阶段。每个阶段都必须有名称。
stages
流水线中多个stage的容器。stages部分至少包含一个stage。
steps
代表阶段中的一个或多个具体步骤(step)的容器。steps部分至少包含一个步骤
agent部分
指定流水线的执行位置(Jenkins agent)
pipeline {
agent any #必要参数,表示执行的主机,any表示任意主机
stages { #必要参数,表示执行的步骤
stage('Hello') { #必要参数,表示具体执行的步骤的说明信息
steps { #必要参数,表示具体执行的动作
echo 'Hello World' #执行的内容
}
}
}
}
6.9.2 对java项目进行流水线部署
将每一个步骤使用流水线的方式实现
6.9.2.1 拉取代码
将生成的内容附加到上述的模板内容中,即可,其他的步骤可以调用执行脚本的方式来执行
6.9.2.2 打包构建
6.9.2.3 推送代码至 tomcat
ssh 192.168.10.103 /usr/local/tomcat8/bin/shutdown.sh
scp /root/.jenkins/workspace/auto_build_jpress_java_pipleline/starter-tomcat/target 192.168.10.103://usr/local/tomcat8/webapps
ssh 192.168.10.103 /usr/local/tomcat8/bin/startup.sh
最后pipelline脚本文件如下
pipeline {
agent any
environment {
DEST_IP='192.168.10.103'
DEST_PATH='/usr/local/tomcat8'
SRC_PATH='/root/.jenkins/workspace/auto_build_jpress_java_pipleline/starter-tomcat/target'
}
stages {
stage('拉取代码') {
steps {
checkout scmGit(branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.10.101/root/jpress.git']])
}
}
stage('开始构建打包') {
steps {
sh '''echo "开始构建打包"
mvn clean package
echo "建构打包结束"'''
}
}
stage('推送war至tomcat') {
steps {
sh '''ssh ${DEST_IP} ${DEST_PATH}/bin/shutdown.sh
scp ${SRC_PATH}/*.war ${DEST_IP}:${DEST_PATH}/webapps
ssh ${DEST_IP} ${DEST_PATH}/bin/startup.sh'''
}
}
}
}
6.9.2.4 开始构建
问题:在构建的时候出现JDK的找不到,在业务服务器的/root/.bashrc下新增jdk环境解决
同时也可以将pipelline脚本文件内容写入Jenkinsfile文件中,将Jenkinsfile文件传至代码仓库中托管
再次构建
6.10 Jenkins部署Master-Slave架构
Jenkins部署Master-Slave架构的特点在于可以利用slave节点充分减轻master节点的并发构建的压力
6.10.1 添加节点
系统管理——————》节点管理
注意:启动代理会在slave01节点上运行java的代理服务,需要提前在192.168.10.88这台机器上安装JDK环境以及MAVEN环境
6.10.2 调用此节点构建项目
- 感谢你赐予我前进的力量