简介
Jenkins:一款基于Java开发的一种持续集成(CI)工具。
CI:Continuous Integration持续集成。指自动且频繁地将代码更改集成到共享源代码存储库中的做法。
CD:Continuous Delivery持续交付/Continuous Deployment持续部署。二者有时会交叉使用,选择持续交付还是持续部署取决于开发团队和运维团队的风险承受能力及具体需求。
- 持续交付是指自动执行 CI 中的构建、单元测试和集成测试后,自动将经过验证的代码发布到存储库。
- 持续部署是指自动将开发人员的更改从存储库发布到生产环境。
(参考文档:什么是 CI/CD?)
一. Jenkines安装教程
-
(一)前置准备:
1.jdk环境:Jenkines是Java开发的,所以需要jdk环境。注意事项:Jenkines 2.357版本后不再支持java8
2.git:代码仓库。
3.maven:打包工具。
上述中间件安装教程:Java所需中间件
部署远程的话还需要:
4.Linux服务器:上述中间件部署的地方
5.jumpserver:连接Linux服务器
6.FlashFXP:上传文件至Linux服务器 -
(二)Jenkines下载及安装
下载地址:https://mirrors.tuna.tsinghua.edu.cn/
下载路径:/jenkins/war/自选版本/jenkins.war
下载完成后,压缩包解压缩即可
远程部署步骤:
上传jenkins.war压缩包至Linux服务器,解压缩即可。注意上传位置。
解压缩命令:jar -xf jenkins.war -
(三)Jenkines启动
使用jar包启动命令即可:java -jar jenkins.war(文件名) --httpPort=8080(指定端口)
关闭命令:
1.查询进程ID(pid):
(1)端口命令查询: lsof -i | grep 8080 或 netstat -ano| findstr 8080
(2)ps命令查询: ps aux | grep xxx.jar 或 ps -elf
2.杀死进程:kill -9 {pid} -
(四)Jenkines配置
访问页面:http://localhost:8080 或者 http://Linux服务器对外IP:8080
1.按指示解锁即可
2.安装插件。后续新增插件时注意,只有管理员才有权利管理插件,插件安装完成后重启生效
常用插件说明:
(1) Locale 中文插件
(2) Pipeline Stage View 显示 Pipeline 任务的各个阶段的执行情况和状态
(3) Credentials Plugin 默认已经安装,签名证书管理插件
(4) Gitlab Plugin 拉取 gitlab 中的源代码,可实现git提交后自动构建
(5) SSH Plugin 这个插件使用 SSH 协议远程执行 shell 命令
(6) Build With Parameters : Jenkins pipeline 参数化构建
(7) GitHub Authentication GitHub身份验证插件
(8) Safe Restart 安全重启的插件
(9) Maven Integration Maven集成插件
(10) groovy postbuild 查看job的修改记录
(11) Deploy to container 自动化部署工程所需要插件,部署到容器插件
(12) Folders Plugin 支持用户创建“文件夹”(可嵌套)来组织(或分类)任务
二. Jenkines使用教程
(一)创建任务
任务类型 | 任务说明 | 适用场景 |
---|---|---|
Freestyle project | 自定义项目,可以执行任意的构建任务,可以使用自定义的构建步骤和插件。 | 包含所有基础功能(提前安装好插件),只能构建在本机,将构建好的jar包上传至服务器运行 |
Pipeline | 流水线任务,在一个可扩展的脚本中描述了整个构建过程,包括构建、 测试、部署等各个阶段。适用于复杂构建流程的项目,支持声明式和脚本式语法。可以跨节点执行,所以支持并发构建。 | 更贴近真实业务场景,通过脚本控制任务执行流程。所有支持groovy命令控制的插件都可以通过脚本控制 |
多分支流水线 | 根据一个源码仓库(SCM-版本控制系统)检测到的所有分支创建独立的流水线 | 适合开发和测试环境。支持检出某个分支代码,执行该分支的流水线任务 |
Organization Folder | 组织文件夹。扫描源码仓库(SCM-版本控制系统)创建一组多分支 项目子文件夹。当代码仓库中包含 Jenkinsfile 时会自动将该仓库加入流水线队列。 | 期望根据分支分类任务时 |
构建一个多配置项目 | 允许用户并行运行跨多个环境的作业,实现了对不同环境的全面测试和构建。通过定义轴(Axes),您可以指定一系列变量,每个变量的不同值都将产生不同的作业配置。 | 如开发,测试,生产,Windows,Linux等“轴”维度匹配不同的作业配置 |
文件夹 | 用于构建和管理其他job的容器 | 自定义分类 |
着重梳理自定义项目和pipeline任务类型。其他类型可自行查找资料学习。
(二)配置Configure
- (1)General 全局配置
-
- Discard old builds 抛弃旧的构建
-
- Do not allow concurrent builds 不允许并发构建
-
- Do not allow the pipeline to resume if the controller restarts 控制器重启流水线不自动恢复之前的运行状态
-
- Pipeline speed/durability override 流水线速度/持久性设置。需要用户进行取舍,流水线运行时将临时数据写入磁盘,以便处理意外的Jenkins重启或系统崩溃,会导致流水线运行速度过慢。
可选项:
(1)performance_optimized(性能优化,非优雅关闭,可能导致数据丢失)
(2)less durability a bit faster(没那么持久,稍微快一些。每一步都写,但避免了原子写入)
(3)maximum_survivability/durability(最久持久性,原子写入)
该配置可以根据流水线独立配置,故支持组合使用
- Pipeline speed/durability override 流水线速度/持久性设置。需要用户进行取舍,流水线运行时将临时数据写入磁盘,以便处理意外的Jenkins重启或系统崩溃,会导致流水线运行速度过慢。
-
- Preserve stashes from completed builds 保留最近几次历史构建
-
- This project is parameterized 定义用户可输入的参数。如环境:字符串。
-
- Throttle builds 两个build任务之间最小间隔时间和同一时间最大任务数(允许用户触发构建时跳过该比例限制)
-
- (2)触发器
-
- Build after other projects are built 在指定项目之后构建
-
- Build periodically 定期执行
-
- GitHub hook trigger for GITScm polling 基于GitHub的webhook机制。GitHub上有代码更新时,GitHub会发送一个HTTP POST请求到Jenkins服务器上指定的URL,然后Jenkins会根据这个请求去执行构建任务
-
- Poll SCM 定时检查版本控制系统(源码仓库)变更,需配置定时器
-
- 静默期 构建开始之前等待一段时间
-
- 触发远程构建 (例如,使用脚本)
-
以下步骤pipeline流水线任务可脚本配置
-
(3)构建环境
-
- Delete workspace before build starts 构建之前删除工作空间内文件,默认删除所有,也可以设置删除特定文件
-
- Use secret text(s) or file(s) 使用私密文件或文本,全局密码管理
-
- Add timestamps to the Console Output 在控制台输出内容中添加时间戳
-
- Inspect build log for published build scans 检查已发布的构建扫描的构建日志
-
- Terminate a build if it’s stuck 构建阻塞时的超时策略
-
- With Ant 使用Ant脚本(Apache Ant,基于Java的构建工具,也可以构建php。构建模型相对简单,适合较小的项目或者构建过程简单的场景)
-
-
(4)Build Steps 构建步骤
-
- Execute Windows batch command 批量执行Windows命令
-
- Execute shell 执行shell命令
-
- Invoke Ant 调用Ant脚本
-
- Invoke Gradle script 调用Gradle脚本(Gradle,基于Apache Ant和Apache Maven概念的项目自动化构建开源工具,用于Java、Android、Kotlin等项目的构建,支持声明式语法)
-
- Invoke top-level Maven targets 使用 Maven 构建工具时,用户需要执行一些顶层的 Maven 目标(targets),Maven 目标是指构建过程中的一系列任务,比如编译代码(mvn compile)、打包应用(mvn package)、运行测试(mvn test)等。
-
- Run with timeout 构建超时
-
- Set build status to “pending” on GitHub commit 在github提交时将构建状态置为等待中
-
-
(5)构建后操作
-
- Aggregate downstream test results 最后将测试结果合并
-
- Archive the artifacts 归档历史结果(workspace中的文件)
-
- Build other projects 构建另一个构建任务
-
- Publish JUnit test result report 发布单元测试结果报告
-
- Record fingerprints of files to track usage 记录文件唯一印记方便追踪使用情况
-
- Git Publisher 构建成功后,git自动生成tag
-
- E-mail Notification 邮件通知
-
- Editable Email Notification 可编辑的邮件通知
-
- Set GitHub commit status (universal) 设置github提交状态(普遍的)
-
- Set build status on GitHub commit [deprecated] 在github提交时设置构建状态【弃用】
-
- Delete workspace when build is done 构建完成之后删除工作空间
-
以上配置的流水线脚本,即Jenkinsfile书写方法:
工具:
(1)Blue Ocean插件提供了UI来自动生成流水线脚本:说明文档。注意:Blue Ocean生成的其实是多流水线项目脚本,会扫描SCM内每个分支是否有Jenkinsfile文件,为其生成流水线任务。
(2)脚本工具:流水线语法 - 片段生成器、声明式指令生成器
tip:片段生成器中需要选择示例步骤,其中每个选项在 流水线语法-步骤参考 下方有具体说明。
基础示例:
//流水线语法文档:https://www.bookstack.cn/read/jenkins/a80f4d0e840c74f2.md
//脚本由节段, 指令, 步骤, 或赋值语句组成
//一般包含以下几个部分:
//* agent(指定节点。可在stage级别)
//* environment(环境变量。可在stage级别)
//* stages(阶段(构建,测试,部署等)指令集合,包含至少1个阶段指令。
//stage阶段指令内可能包含以下指令:
//(1)steps步骤指令集合
//(2)agent指定节点或environment环境变量)
//(3)when 根据给定的条件决定是否应该执行阶段
//(4)input 提示输入,被批准(点击通过按钮), stage 将会继续。提交参数可用于其他stage
//(5)parallel 并行执行
//(6)script 脚本
//(7)还有一些插件使用指令,需自己探索。参考文档:https://www.bookstack.cn/read/jenkins/62f9cfc0b85e3818.md
//post(根据stage或流水线执行情况而运行,常用级别:always, changed, failure, success等)
//options(特殊选项。如失败重试,超时构建终止等。可在stage级别)
//triggers(自定义触发器,web中指定之后,就无需流水线配置了。)
//tools(定义自动安装。示例见上方文档说明)
pipeline {
//指定节点(Jenkins节点说明:见下方三 jenkines节点)
//any:在任意可用的代理上执行流水线。还有none,label,node,docker,dockerfile等配置项,具体可见上方语法文档。
agent any
//通过env关键字暴露的全局变量,可以在jenkins文件任何位置使用
//所以jenkins文件中内置的环境变量,可以有env关键字也可以没有,但要有${}包围,shell命令中{}都可以不要
//内置环境变量定义方法1:声明
environment {
GIT_BUILD_REF = '分支名称'
GIT_REPO_URL = 'git地址'
//shell 命令执行结果 赋值环境变量
CREDENTIALS_ID = "${sh(script:'ls -lah', returnStdout: true).trim()}"
}
options {
timeout(time: 1, unit: 'HOURS')
retry(3)
}
stages {
stage('环境变量') {
steps {
echo "sh命令打印所有环境变量"
sh "printenv"
}
//内置环境变量方法2:内置函数式
withEnv(["WITH_ENV_VAR=Test Env"]){
echo "withEnv内置环境变量:${WITH_ENV_VAR}"
}
//内置环境变量方法3:脚本式声明
script {
//不能修改environment定义的环境变量,脚本式声明只能修改脚本式环境变量
env.JOB_NAME = "new value"
echo "JOB_NAME修改后的值:${JOB_NAME}"
//shell 命令执行结果 赋值环境变量
env.JOB_NAME = sh(script: 'find -name "fileName.tar.gz"', returnStdout: true).trim()
echo "JOB_NAME修改后的值:${JOB_NAME}"
}
//环境变量只有String,需要Boolean类型的话,调用.toBoolean()方法
if(env.IS_BOOLEAN.toBoolean()){
echo "true"
}
}
stage('代码检出') {
steps {
//从版本控制系统中检出 Check out from version control
checkout([
$class: 'GitSCM',
branches: [[name: ${env.GIT_BUILD_REF}]],
userRemoteConfigs: [[
url: ${GIT_REPO_URL},
credentialsId: ${CREDENTIALS_ID}
]]
])
}
}
stage('代码编译') {
script {
echo '编译开始.....'
sh 'mvn clean package -Dmaven.test.skip=true'
echo '编译完成.....'
}
//Archive the artifacts 保存和管理build artifacts,帮助部署和使用build artifacts。
//参数说明:
//fingerprint(指纹):这里指记录文件的指纹信息(简单的MD5校验和)来追踪使用情况
//onlyIfSuccessful :仅构建成功时执行保存
//artifacts string :构建结果路径,可使用通配符和逗号。
//defaultExcludes boolean 允许排除默认的artifacts
//excludes string 排除指定文件
//allowEmptyArchive:允许空的构建结果
//caseSensitive 实例感知,这里指是否区分大小写,默认区分大小写
archiveArtifacts(fingerprint: false, onlyIfSuccessful: true, artifacts: '**/target/*.tar.gz', defaultExcludes: false, allowEmptyArchive: true)
}
stage('部署脚本') {
script {
//获取上一步骤的构建文件作为环境变量
tarResult = sh(script: 'find -name "' + ${env.FILE_NAME} + '.tar.gz"', returnStdout: true).trim()
sh "sh部署脚本自己补充,需要构建文件可直接使用。${tarResult}"
}
}
stage('结束') {
steps {
echo '结束'
}
}
}
post{
always {
echo '永远执行'
deleteDir() /* clean up our workspace */
}
failure {
echo '失败后执行执行'
mail to: '邮箱',
subject: "主题:Failed Pipeline: ${currentBuild.fullDisplayName}",
body: "邮件内容:Something is wrong with ${env.BUILD_URL}"
}
}
}
三. Jenkines节点
节点是什么?执行构建作业的机器
Jenkins分布式部署解决什么问题?多项目多系统的情况下,仅一台机器效率太低。每个系统单独部署Jenkines的话,资源利用率差,以及管理难度太大。故需要分布式部署,支持并行构建,特定环境构建等构建方式。
Jenkins所在服务器为master节点,master负责分发任务给slave节点(或称为代理节点,主要提供执行构建任务的额外环境)。
如何指定机器构建?使用Labels标签。标签是用来在Jenkins任务中指定哪些节点可以执行该任务的重要标识,因此在配置节点时要考虑到标签的准确性。
代理节点配置关键项:
- 代理节点类型: “Permanent Agent” 固定代理,常用类型; “Durable Agent” 持久化代理,即使构建完成后也会保持节点在线,适合用于多任务场景。
- 并发构建数:建议不要超过CPU核数
- 代理节点的启动方式:
(1)Launch slave via execution of command on the Master 通过主节点的控制台连接代理节点
命令行启动:在目标机器上执行以下命令:
java -jar agent.jar -jnlpUrl http://JENKINS_URL/computer/NODE_NAME/slave-agent.jnlp -secret SECRET -workDir "/path/to/ workspace"
替换 JENKINS_URL, NODE_NAME, 和 SECRET 为实际的Jenkins服务器地址、节点名称和密钥。
(2)Launch agent via Java Web Start 适用于所有支持Java的系统,宕机后主节点无法操作该节点
下载对应的 .jnlp 文件并在支持Java Web Start的操作系统上运行即可。
(3)Launch slave agents on Unix machines via SSH 在Unix机器上通过SSH通道连接节点(Linux)
该启动方式需要配置凭证信息,凭证如果使用SSH Username with private key方式配置,需要将公钥信息配置到代理节点.ssh目录下的authorized_keys文件中
详细配置流程可参考:https://blog.csdn.net/wenxiaoba/article/details/130333680- 重点注意:确保目标代理节点上的防火墙和安全设置允许Jenkins主服务器与代理节点之间的通信。
四. 参考文档汇总
https://cloud.tencent.com/developer/article/2223512
https://www.bookstack.cn/read/jenkins/pipeline.md
https://cloud.tencent.com/developer/article/1772190
https://docs.pingcode.com/ask/ask-ask/86771.html
https://blog.51cto.com/u_16213712/9646796
https://blog.csdn.net/wenxiaoba/article/details/130333680