jenkins
参考: https://www.cnblogs.com/stulzq/p/10115589.html
知识点 :
gitlab runner跟jenkins作用相同,都是持续集成、部署
jenkins存放数据不依靠数据库,所以在移植时只需要拷贝整个程序主目录即可
CI/CD
标准的开发流程(构建过程):编码 → 构建 → 集成 → 测试 → 交付 → 部署
1.CI(持续集成)
持续集成指的是,频繁地(一天多次)将代码集成到主干。将软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。
它的好处主要有两个:
1. 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易;
2. 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续集成并不能消除Bug,而是让它们非常容易发现和改正。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
2.CD(持续部署)
持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
自动化部署原理
简单说就是代码写好并build之后,把代码提交到github上,jenkins检测到代码变化就会自动构建项目,把代码拉到服务器,从而实现自动部署
一.jenkins
1.特性
除jenkins外,还有gitlab、Bamboo等其他CI/CD平台。jenkins只是一个平台,几乎所有的功能都依赖于插件。
Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。
2.触发器原理
#jenkins构建触发的方式有多种,主要有手动触发、定时触发和webhook触发
webhook触发原理:一般跟gitlab配合使用,gitlab上配置jenkins相关的webhook,一旦有push操作就发送请求让jenkins拉取代码,jenkins通过配置gitlab的仓库地址来拉取代码
3.代码发布流程
拉取代码
scp到测试服务器
单元测试、等其他测试
发送邮件
3.常用插件
#jenkins如果不安装相关插件,界面上是不会有相关选项的
git Plugin:用来拉取git仓库代码,此外在jenkins服务所在机器上要安装git,用来拉取代码
Publish Over SSH Plugin:通过ssh向其他服务器发送拉下来的代码
Job Configuration History Plugin:提供diff对比、回滚功能(如果修改了某配置现在想该回去可用这个)
Pipeline插件
Http Request Plugin:用来访问网站是否超时是否能正常打开,不能用来判断是否正常
Email相关插件
3.安装jenkins
参考: https://blog.csdn.net/miss1181248983/article/details/82840006
yum install -y java-1.8.0-openjdk #安装openjdk,jenkins基于java开发
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo #wget -O 下载文件并以指定的文件名保存
cat /etc/yum.repos.d/jenkins.repo
#[jenkins]
#name=Jenkins
#baseurl=http://pkg.jenkins.io/redhat
#gpgcheck=1 #为1时会检测key
rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key #安装jenkins key
yum install -y jenkins
systemctl start jenkins
3.构建任务
1.前提条件
- 创建任务之前先生成密钥
ssh-keygen -f ~/.ssh/jenkins
- 系统管理-插件管理中安装git Plugin和publish over ssh两个插件
- 系统管理-系统设置中找到publish over ssh,添加私钥,配置如下两图
新增ssh servers,这是代码要发布的目标机器,到目标服务器添加公钥 vim authorized_keys
,将jenkins.pub 添加进去,然后点击下图test confixx是否能连接成功!
2.手动构建
-
源码管理中填写git相关,此步骤一配置之后,就可以拉取git仓库的代码了,拉取到jenkins本地工作目录
) -
build teps配置,此处shell默认在下载的项目代码根目录完成
2.自动构建
如果要自动构建(自己push到gitlab上之后jenkins自动将代码同步到代码服务器),需要用到gitlab中的webhook(网络钩子,当gitlab有新的commit,会触发webhook中的url,一般这个url是jenkins中的job的url),按照如下操作
-
自己生成公私钥
ssh-keygen -t rsa -C '1151048226@qq.com'
,将公钥粘贴到如图 -
jenkins上安装gitlab hook plugin插件(安装成功后会出现下图)
-
将上图url和点击“高级”中的 Secret token 复制到gitlab(settings-integrations)中,点击Test查看是否成功。然后我们重新push新的内容到gitlab上,代码服务器会相应改变。如下两图,其他默认即可
-
构建中执行脚本进行测试,构建-高级-执行shell,这样构建时会自动在目标服务器执行命令
-
构建步骤中配置
ssh server选择在系统配置中已经配置过的publish over ssh目标主机名称
transfer set source files:
**/*
表示项目下所有文件remote diectory:项目远程目录,如果在系统配置的publish over ssh中已经配置remote Directory,此时项目远程目录为/gyktxt
参数化构建-general中选择“参数化构建”,填入参数名称,在shell中使用用“$参数名”
不止有默认的一些参数,可下载 Git Parameter,提供了一些可选的参数,如分支,tag,用户一旦向某个分支commit数据,我们在build with parameters中可选新分支进行构建,如下图参考: http://events.jianshu.io/p/927a1599f7a0
5.例几种项目构建
常用的构建项目有三种: 自由风格软件项目(FreeStyle Project)、 Maven项目(Pipeline Project)、pipline项目
参考:https://blog.csdn.net/m0_53157173/article/details/126578748
4.jenkinsfile
Jenkinsfile 是 Jenkins 2.x 核心特性 Pipeline 的脚本,由Groovy语言实现。Jenkinsfile一般是放在项目根目录,随项目一起受源代码管理软件控制,无需像创建“自由风格"(Jenkins FreeStyle)项目一样,每次可能需要拷贝很多设置到新项目,提供了一些直接的好处
Jenkinsfile需要在项目根目录下写,在jenkins平台上配置pipeline项目会自动拉取代码并执行根目录下的Jenkinsfile文件
jenkins中流水线生成器有哪几种:
1.checkout生成器:下载gitlab代码
2.sh生成器:生成shell脚本
1.语法
pipeline {
agent any #jenkins服务可以分布式搭建,规定在哪个节点运行
environment { #设置环境变量
HARBOR_ADDRESS = "192.168.117.160"
IMAGE_NAME = "gift"
NAMESPACE = "gift"
}
stages { #代表流水线的所有执行阶段
stage('拉取代码') { #单个执行阶段,自行命名
steps { #steps是shell脚本
echo '拉取代码'
}
}
stage('编译构建') {
steps {
echo '编译构建'
}
}
stage('项目部署') {
steps {
echo '项目部署'
echo "HARBOR_ADDRESS"
}
}
}
}
2.例子
编写jenkinsfile添加构建后并发送邮箱
pipeline {
agent any
stages {
stage('拉取代码') {
steps {
checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'bacbbbb1-2df9-470d-adf8-5cb6dc496807', url: 'git@192.168.209.100:develop_group/springboot2.git']]])
}
}
stage('编译构建') {
steps {
sh '''echo "开始构建"
mvn clean install -Dmaven.test.skip=true
echo "构建结束"'''
}
}
stage('项目部署') {
steps {
sshPublisher(publishers: [sshPublisherDesc(configName: '192.168.209.102', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '''#!/bin/bash
echo "stop SpringBoot BAppApiServerApplication"
pid=`ps -ef | grep java | grep -v grep | awk \'{print $2}\'`
echo “旧应用进程id:$pid”
if [ -n "$pid" ]
then
kill -9 $pid
rm -rf springboot2-1.0.jar
fi
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-11.0.9.11-2.el7_9.x86_64
echo ${JAVA_HOME}
echo "授权当前用户"
chmod 777 /usr/local/springboot2-1.0.jar
echo "执行...."
cd /usr/local/
nohup ${JAVA_HOME}/bin/java -jar springboot2-1.0.jar > /dev/null &
echo "启动成功"
''', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/*.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
}
}
}
post {
always {
emailext (
subject: '构建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!',
body: '${FILE,path="email.html"}',
to: 'xxx@qq.com'
)
}
}
}
4.注意点
-
在配置pipeline时,可选pipeline script和pipe script from SCM
pipeline script:在jenkins平台上自定义pipeline内容
pipe script from SCM:引用pipeline文件,一般为git仓库项目根目录下的Jenkinsfile文件
-
点击流水线语法,选择具体生成器,可生成对应语法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律