Java运维-jenkins
概念理解
- 什么是jenkins:是一个开源的自动化服务器,由java语言开发,主要用于实现软件开发中的持续集成(CI)和持续交付(CD)。
- 作用:它通过自动化构建、测试和部署流程,帮助开发团队更高效地协作,减少人工操作错误,提升软件交付速度和质量。
- 持续集成(CI):当开发者将代码提交到版本控制系统(如 Git)后,Jenkins 会自动触发构建(编译代码)和测试流程,快速反馈代码是否引入错误。
- 持续交付(CD):在代码通过测试后,Jenkins 可将应用自动部署到测试环境、预生产环境或生产环境,支持一键发布或全自动化交付。
- 其他特点:
- 插件生态系统:提供超过 1500 个插件,支持与各种工具集成(如 Docker、GitHub、Maven、Kubernetes 等),灵活扩展功能。
- 易于安装部署配置:可通过 yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理。
- 分布式构建:支持在多台机器上并行执行任务,加速大型项目的构建和测试。
- 任务流水线(Pipeline):通过编写代码(Jenkinsfile)定义复杂的自动化流程,实现多阶段任务(如构建→测试→部署→通知)。
- 典型应用场景
- 自动编译代码:每次提交代码后,自动编译并检查编译错误。
- 运行自动化测试:执行单元测试、接口测试等,确保代码变更不会破坏现有功能。
- 部署到服务器:将通过测试的应用自动发布到云服务器或容器环境(如 Kubernetes)。
- 定时任务:定期执行清理旧数据、生成测试报告等操作。
- 举例:
- 开发人员每天进行代码提交,提交到Git仓库
- Jenkins作为持续集成工具,使用Git工具到Git仓库拉取代码到集成服务器,再配合JDK,Maven等软件完成代码编译,代码测试与审查,测试,打包等工作,在这个过程中每一步出错,都重新再执行一次整个流程。
- Jenkins把生成的jar或war包分发到测试服务器或者生产服务器,测试人员或用户就可以访问应用。
安装部署Jenkins服务器
安装jdk 1.8,并配置环境变量
- jdk 可以到官网去下载
tar -xf jdk-8u231-linux-x64.tar.gz && mv jdk1.8.0_231 /usr/local/jdk/
vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export PATH=$PATH:$JAVA_HOME/bin
source /etc/profile
查看版本信息
java -version
安装tomcat9的版本
-
安装
wget http://mirrors.hust.edu.cn/apache/tomcat/tomcat-9/v9.0.34/bin/apache-tomcat-9.0.34.tar.gz tar -xf apache-tomcat-9.0.34.tar.gz && mv apache-tomcat-9.0.34 /usr/local/tomcat chmod +710 /usr/local/tomcat/bin/*.sh
-
可以对 tomcat 进行端口修改和localhostx修改(可以不做修改默认即可
修改端口: vim /usr/local/tomcat/conf/server.xml ...... <Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> ...... 把localhost改为你设置的域名: <Engine name="Catalina" defaultHost="localhost"> ...... <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
-
启动 tomcat ,通过本地地址或域名访问即可:http://localhost:8080
启动tomcat sh /usr/local/tomcat/bin/startup.sh
安装jenkins
war包安装方式
cd /usr/local/tomcat/webapps
wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war
需要停止tomcat,重启tomcat
访问 jenkins,安装插件
http://localhost:8080/jenkins
安装好的jenkins目录在/root/.jenkins/
安装过程默认安装插件就好。需要稍等片刻即可
容器安装方式
- 建议使用的Docker映像是jenkinsci/blueocean image(来自 the Docker Hub repository)。 该镜像包含当前的长期支持 (LTS) 的Jenkins版本 (可以投入使用) ,捆绑了所有Blue Ocean插件和功能。这意味着你不需要单独安装Blue Ocean插件。
- 安装步骤
-
打开终端窗口下载
jenkinsci/blueocean
镜像#可以指定版本1.25.3,也可以使用 lts,代表最稳定的版本。 docker pull jenkinsci/blueocean:1.25.3
-
使用以下docker run 命令将其作为Docker中的容器运行
docker run \ -u root \ -d \ -p 8080:8080 \ -p 50000:50000 \ -v jenkins-data:/var/jenkins_home \ -v /usr/local/maven-3.6.3:/usr/local/maven-3.6.3 \ -v /var/run/docker.sock:/var/run/docker.sock \ #允许容器内使用宿主机的 Docker 守护进程(可选,用于在流水线中运行 Docker 命令) -e MAVEN_HOME=/usr/local/maven-3.6.3 \ jenkinsci/blueocean
- -d 后台方式启动
- -p 映射端口,宿主机端口:容器内端口
- v 挂载卷,将容器 Jenkins 工作目录 /var/jenkins_home 挂载到宿主机目录jenkins-data
- -name 给容器起个别名
-
运行成功后会输出一长串容器 id 字符串, 接下来执行查看日志命令查看 Jenkins 初始化日志
docker logs -f <container_id> # 容器id写上前四五位即可
-
安装成功后访问首页 http://ip:8080/
-
登录密码
- 进入页面后, 首先会进入解锁页面,进入容器,查看 /var/jenkins_home/secrets/initialAdminPassword 文件获取密码,输入密码登录成功
# 进入容器
docker exec -it 容器ID /bin/bash
# 查看密码
cat /var/jenkins_home/secrets/initialAdminPassword
安装maven
wget https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
mv apache-maven-3.6.3 /usr/local/maven
在前面已经配置了jdk的环境变量,可使用下面的环境变量配置替代即可
vim /etc/profile
export JAVA_HOME=/usr/local/jdk
export MAVEN_HOME=/usr/local/maven/
export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin
source /etc/profile
mvn -v查看版本
安装完成修改maven的镜像地址,略。
全局工具配置关联JDK和Maven
- Manage Jenkins - Global Tool Configuration - 分别新增 JDK 和 Maven - 保存
添加 Jenkins全局变量
- 需要添加三个变量:JAVA_HOME、M2_HOME、PATH+EXTRA
- Manage Jenkins - Configure System - 全局属性
更换jenkins插件下载源
-
Jenkins 默认是从外网的插件仓库下载插件的,速度在国内来说就慢了很多,我们可以通过将插件地址修改为国内镜像仓库,即可提升插件的下载速度
jenkins插件默认下载地址为:https://updates.jenkins.io/update-center.json 国内阿里源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
-
登录jenkins ->Dashboard->Manage Jenkins -> Manage Plugins->点击Available 等加载出插件后,再在终端执行(登录jenkins-master节点执行如下操作):
#进入 jenkins_home 修改已加载的所有插件下载地址,所有插件数据所在文件 jenkins_home/updates/default.json # 将该文件中所有插件的地址修改为国内的地址 cd jenkins_home/updates sed -i 's/http:\/\/updates.jenkins-ci.org\/download/https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins/g' default.json && sed -i 's/http:\/\/www.google.com/https:\/\/www.baidu.com/g' default.json
- Dashboard->Manage Jenkins -> Manage Plugins->点击Advanced 替换件Update Site URL为
https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
- 提交后,在浏览器输入:
http://jenkins_server_ip:8080/restart
重启 jenkins
凭证管理
- 在 Jenkins 中经常会涉及到需要访问其他服务的操作,例如 git 仓库、ssh 访问服务等,这些服务通常都是需要进行认证的,因此 Jenkins 为我们提供了凭证管理插件Credentials Binding来统一管理所有凭证信息
- 安装步骤:
- Manage Jenkins - Manage Plugins搜索Credentials Binding,并安装
- 安装完成以后,Jenkins 首页右侧多了凭据的菜单栏
- Jenkins首页->凭据->系统->全局凭据(unrestricted)
# 凭证类型 username with password # 用户名密码凭证 ssh username with private key # 使用SSH用户和密钥 secret file # 密钥文件凭证 secret text # 密钥文本凭证 certificate # 证书凭证
- 凭证的使用:首先需要安装git插件,用于下载 git 仓库的源代码,然后在 Jenkins 首页创建一个自由风格的项目,分别测试使用用户名密码和 ssh 私钥凭证来拉取远程仓库项目代码
- 用户名密码凭证
- 首先进入凭证管理页面,选择全局凭证,再找到左侧添加凭证按钮,进入添加页面以后就可以选择不同类型的凭证了。选择用户名密码凭证,并输入用户名与密码既可以创建成功一个用户名密码凭证
- 进入 Jenkins 首页,并点击左侧的新建任务,创建一个自由风格的项目,进入项目配置页面以后,选择源码管理栏目并选择 git 仓库,接下来就完成 git 仓库相关配置信息,并且在后面的凭证位置选择刚刚创建的用户名密码凭证即可
- 返回项目详情页,点击立即构建,查看该仓库的代码是否能够被下载到 Jenkins 中
- SSH 密钥类型
- 操作基本上与添加用户名密码凭证类似,不过需要先使用
ssh-keygen -t rsa
提前生成公钥私钥,并将公钥文件配置到 git 仓库平台的用户 ssh 或仓库 deploy ssh 处 - 配置完成后同样创建一个普通项目,并配置源码管理等信息,检测 ssh 秘钥配置是否成功
- 操作基本上与添加用户名密码凭证类似,不过需要先使用
构建项目
在 Jenkins有许多的构建项目类型,主要用到以下三种:
- 自由风格项目(FreeStyle Project):可以构建各种类型的项目
- Maven项目(Maven Project):专门针对 Java 的 Maven 项目
- 流水线项目(Pipeline Project):灵活度高,可调整空间大,代码控制CICD流程,可以构建较为复杂的项目。(公司中更常用流水线类型,因为灵活度更高,且CICD流程较为清晰)
前置工作
- 服务端安装完Tomcat,默认情况下 Tomcat 是关闭了远程部署功能的,我们需要修改一些 Tomcat 的配置信息来支持远程部署(服务端的Tmocat)
- 首先访问 Tomcat 的 webapps/manager 目录(检查默认没有开启)
-
查看 /META-INF/context.xml 文件并将以下配置注释即可
<!-- <Valve className="org.apache.catalina.valves.RemoteAddrValve" allow="127\.\d+\.\d+|::1|0:0:0:0:0:0:0:1"> -->
-
还需要再进入 tomcat/conf 目录开启远程部署权限,以及配置用户信息。先找到 tomcat-users.xml 配置如下:
<tomcat-users> <role rolename="tomcat"/> <role rolename="role1"/> <role rolename="manager-script"/> <role rolename="manager-gui"/> <role rolename="manager-status"/> <role rolename="admin-gui"/> <role rolename="admin-script"/> <user username="tomcat" password="123" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/> </tomcat-users>
- 重启 tomcat 即可进行远程访问
自由风格项目
项目构建流程:拉取代码 > 编译 > 打包 > 部署
- 新建任务:在 Jenkins 首页,点击新建任务,输入一个任务名称:tomcat-demo,选择“构建一个自由风格的软件项目”,点击确定
- 拉取源码:点击 “源码管理” ,选择git,完成 git 仓库相关配置
-
编译打包配置:点击:构建 -> 添加构建步骤 -> Execute Shell
echo "开始进行编译构建" mvn clean package -Dmaven.skip.test=true echo "编译构建结束"
- 远程部署
jekins安装 deploy to container 插件,用于将一个war包部署到容器
- 点击:构建后操作->选择 deploy war/ear to a container ```
- 设置war包的路径 WAR/EAR files:target/*.war
- 配置上下文路径 context path:/
- 设置容器类型,添加一个容器,选择tomcat 版本 containers: Tomcat 9.x Romote 3.1. 添加 tomcat 用户名密码凭证:Tomcat 远程部署处添加的用户名密码 credentials: 点击右边的添加,选择jenkins 类型:username with password ,范围:全局,用户名:tomcat ,密码:123,ID:tomcat-auth(随便设置) 3.2 配置远程 tomcat 地址:提示地址修改为对应的 tomcat 所在地址即可 Tomcat URL: http://119.45.219.192:8088/ ```
- 点击应用、保存。
- 点击部署即可进行构建。
- 再次访问tomcat地址:http://119.45.219.192:8088/,可以进入项目首页。
- 点击:构建后操作->选择 deploy war/ear to a container ```
Maven项目
- Jenkins 下载
maven integration
的插件安装。 - 新建任务:在 Jenkins 首页,点击新建任务,输入一个任务名称:maven-demo,选择“构建一个maven项目”,点击确定
- 拉取源码:点击 “源码管理” ,选择git,完成 git 仓库相关配置
-
编译打包配置:点击 “构建(build)” 栏目中配置以下两个参数
root pom:pom.xml goals and options:clean package -Dmaven.skip.test=true
- 远程部署:同“自由风格项目”。
流水线项目
- 基本概念:pipeline 是基于Groovy 语言实现的,是一套运行在 Jenkins 上的工作流框架,将原来独立运行于单个或多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
- Pipeline 的好处
- 代码: 以代码的形式实现,通常被检入源代码控制,使团队能够编辑,审查和迭代其传送流程。
- 持久: 无论是计划内还是计划外的服务器重启,Pipeline都是可恢复的
- 可停止: Pipeline可接收交互式输入,以确定是否继续执行Pipeline
- 多功能: Pipeline支持现实世界中复杂的持续交付要求,他支持fork/join,循环执行,并执行任务的功能。
- 可拓展: Pipeline插件支持其DSL的自定义拓展,以及与其他插件集成的多个选项
- 安装 Pipeline 插件:进入插件管理中安装 Pipeline 插件
- 如何创建 Pipeline
- Pipeline 支持两种语法: Declarative(声明式)、Scripted Pipeline(脚本式)语法
- Pipeline 也有两种创建方法:
- Pipeline script:可以直接在 Jenkins 的 Web UI 界面中输入脚本
- Pipeline script from SCM:也可以通过创建一个Jenkinsfile 脚本文件放入项目源码库中(一般我们推荐在Jenkins中直接从源代码控制(SCM)中直接载入 Jenkinsfile Pipeline 这种方法)
- 步骤
- 新建任务:在 Jenkins 首页,点击新建任务,输入一个任务名称:pipeline-demo,选择“流水线”,点击确定
- 进入配置页面:General、构建触发器、高级项目选项、流水线,点击“流水线”
Pipeline script创建方式
-
定义:选择“Pipeline script”,即配置 Pipeline 脚本来自哪里;脚本:选择Hellod World,配置初始化脚本,如下:
# Hello World 声明式语法演示 pipeline { agent any stages { stage('pull code') { steps { echo '拉取代码' } } stage('build project') { steps { echo '编译构建' } } stage('publish project') { steps { echo '项目部署' } } } } stages :代表整个流水线的所有执行阶段。通常stages只有1个,里面包含多个stage stage :代表流水线中的某个阶段,可能出现n个。一般分为拉取代码,编译构建,部署等阶段。 steps:代表一个阶段内需要执行的逻辑。steps里面是shell脚本,git拉取代码,ssh远程发布等任意内容。
- 拉取代码脚本编写:
- 在 “流水线” 配置栏的输入框下面点击“流水线语法”,进入片段生成器页面
- 在右边 “示例步骤” 的下拉框处选择 git:Git(checkout:Check out from version control)
- 填写仓库地址、分支名以及访问仓库的凭证
- 点击下方的生成流水线脚本按钮即可生成对应的脚本内容
pipeline { agent any stages { stage('拉取代码') { steps { checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitlab-ssh-auth', url: 'git@gitee.com:wolfcodeliug/shop-cloud43.git']]]) } } stage('编译构建') { steps { sh label: '', script: 'mvn clean package' } } } }
- 构建:
- 在 “示例步骤” 下拉框中选择:sh:Shell Script
- 部署项目
- 在 “示例步骤” 下拉框中选择 deploy: Deploy war/ear to a container,完成 tomcat 相关配置信息后,点击生成流水线脚本按钮即可
stage('部署项目') { steps { deploy adapters: [tomcat9(credentialsId: 'tomcat-auth', path: '', url: 'http://tomcat.my-company.com:8080')], contextPath: '/', war: 'target/*.war' } }
Pipeline script from SCM创建方式
- 定义:选择“Pipeline script from SCM”,并在 SCM 处选择 git,且配置好 git 仓库的相关信息即可
- 在项目根目录创建一个 Jenkinsfile 文件,并且将上面的 pipeline 脚本拷贝到该文件中
- 文件放到项目的:src 目录下,命名 Jenkinsfile
- 注意路径:流水线配置页面脚本路径设置为: src/Jenkinsfile
构建触发器
以上都是手动执行“立即构建”才会进行构建并远程部署,如何让jenkins自动触发构建呢?
- 构建触发器就是可以配置一些规则,当这些规则被触发时则自动的进行项目的构建操作,Jenkins 中默认有以下4种构建触发器:
- 触发远程构建
- 其他工程构建后触发(Build after other projects are build)
- 定时构建(Build periodically)
- 轮询SCM(Poll SCM)
触发远程构建
- 实际上就是通过 url + token 的方式来进行远程触发构建,你可以在构建触发器处选择 “触发远程构建”,并且设置对应的 token 即完成配置了,然后通过提示的 url 地址再加上刚刚配置的 token 请求一次,即触发一次构建
其他工程构建后触发
- 这个也很好理解了,有些项目之间可能存在着一些依赖关系,需要先启动依赖项目再启动自身,那么此时就可以在项目中配置其他项目构建后触发,当依赖项目构建完成后会立即构建该项目
定时构建
- 通过配置定时任务,可以指定项目在指定的时间周期性的进行部署,定时表达式案例如下
在构建触发器中选择定时构建,并在日程表中配置定时规则:分 时 日 月 周
表达式例子:
每30分钟构建一次:H代表形参
H/30 * * * *
每2小时构建一次:
H H/2 * * *
每天的8点,12点,22点各构建一次
0 8,12,22 * * *
每天中午12点定时构建一次
H 12 * * *
每天下午18点定时构建一次
H 18 * * *
每个小时的前半个小时内的每10分钟各构建一次
H(0-29)/10 * * * *
每两小时一次,每个工作日上午9点到下午5点(也许是上午10:38,下午12:38,下午4:38)
H H(9-16)/2 * * 1-5
轮询 SCM
- 定时的检查代码仓库是否有新的提交,如果有就立刻进行构建。直接在构建触发器中选择 “轮询 SCM” 并在日程表中设置定时规则,定时任务表达式与定时构建表达式语法一致
Git hook 自动触发构建
- 这是我们平常在开发环境中比较常用的一种方式,利用代码管理平台(Github、Gitee、Gitlab)的 webhook 实现代码 push 到仓库,项目自动触发构建
GitLab托管
-
由于 Jenkins 在内网环境,因此我们采用内网的 Gitlab 来完成该功能,操作前需要先下载
Gitlab Hook
和GitLab
两个插件配置步骤: Gitlab 平台配置: 一、开启 WebHook 功能,需要用到管理员用户 1. 使用 root 用户登录 Gitlab,进入 Admin Area 配置中,选择 Settings 2. 点击左侧的 Network 菜单栏,展开 Outbound requests 栏目 3. 勾选 Allow requests to the local network from web hooks and services 开启 webhook 二、代码仓库配置 WebHook 1. 进入仓库配置的 Integrations 中 2. 将 Jenkins GitLab 构建触发器的 URL 粘贴到 Integrations 的 URL 中 3. 在 Trigger 中仅勾选 Push events 即可 4. 点击下方已经添加的 Webhook 测试 PS: 如果此时会出现请求被禁用的问题,需要去 Jenkins 开启允许外部请求 项目构建配置: 1. 进入项目工程配置,勾选构建触发器新出现的 GitLab 变更推送配置 2. 复制提示的构建 url 并在高级设置中生成 token Jenkins 配置: 1. 在 Jenkins 主页的系统管理中,选择系统配置 2. 找到下方的 Gitlab 选项,并将 Enable authentication for '/project' end-point 取消勾选
码云(Gitee)
- 登录码云官网->帮助中心->社区版->第三方服务集成->jekins插件。https://help.gitee.com/devops/connect/Jenkins-Plugin
SonarQube 代码审查
- 在持续集成的流程中,除了基于 Maven 的基础 JUnit 测试外,还需要验证代码是否有明显的 bug 或编码质量底下等问题,因此我们可以借助 SonarQube 服务来对代码进行自动化的审查,检测一些常见的 bug 以及低质量代码
环境准备
- 首先需要安装
SonarQube Scanner
插件,并在 Jenkins 中完成 SonarQube 的相关配置
SonarQube Scanner 配置
1. 找到 Jenkins 配置下的全局工具配置,并在其中找到 SonarQube Scanner 配置栏
2. 配置 SonarQube Scanner 名称,后续使用时会用上
3. 勾选自动安装的方式,并且在 Install from Maven Centeral 处选择 SonarQube scanner 最新版本即可
SonarQube 环境配置
1. 进入 Jenkins 的系统配置页面,并找到 SonarQube Servers 配置项
2. 填写 SonarQube 服务名称,后续扫描实会用到
3. 配置 SonarQube Server URL,Jenkins 会将扫描报告发送至 SonarQube Server 并获得分析结果
4. 在凭证管理器中添加密钥文本类型的凭证,并使用 root 用户登录 SonarQube Server 拿到认证 token 信息填写到 Jenkins 的认证凭证当中
5. 在 Server authentication token 处选择刚刚添加的 token 凭证即可
项目配置
为需要进行代码审查的项目添加如下的扫描模板,通常会在项目中创建一个 sonar-project.properties
文件
# 扫描模板
# 项目的唯一标识,每一个 SonarQube 扫描的实例都必须是不一样的
sonar.projectKey=ci-demo
# 项目的名称和版本号,会显示在 SonarQube Server 中
sonar.projectName=ci-demo
sonar.projectVersion=1.0.0
# 以下路径是相对于 sonar-project.properties 文件的. 在 Windows 下使用 "\" 替代 "/"
# 如果 sonar.modules 设置了的话,这些属性是可选的
sonar.sources=.
sonar.exclusions=**/test/**,**/target/**
sonar.java.source=1.8
sonar.java.target=1.8
# 源码的编码格式,默认使用系统编码
sonar.sourceEncoding=UTF-8
非流水线项目
非流水线项目中需要在项目构建配置的 “构建” 栏目中添加一个 Execute SonarQube Scanner
配置项,并配置以下相关参数信息
配置如下:
# 任务运行的指令
Task to run: scan
# 在全局工具配置中配置的jdk
JDK: jdk1.8
# 项目中的 sonar-project.properties 路径,该路径是相对于项目根目录的
Path to project properties: sonar-project.properties
# 分析项目的属性配置,其实就是 sonar-project.properties 中配置的那些内容,该配置与 Path to project properties 二者配置一个就可以了
Analysis properties:
# 附加参数配置,可选配置
Additional arguments:
# JVM 配置项,可选配置
JVM Options:
流水线项目
流水线类型的项目只需要修改 Jenkinsfile 配置文件,在构建流程中加入代码审查步骤即可,具体配置方式如下
stage('code checking') {
steps {
script {
// 引入扫描工具,此处配置的名称需要与 "全局工具配置 > SonarQube Scanner" 中配置的名称一致
scannerHome = tool 'sonarqube-scanner'
}
// 引入sonarqube服务器环境,此配置名称需要与 "系统配置 > SonarQube Server" 中配置的名称一致
withSonarQubeEnv('sonarqube-server') {
sh "${scannerHome}/bin/sonar-scanner"
}
}
}