Jenkins持续集成
文章目录
一、Jenkins简介
Jenkins是一个开源CI&CD软件、提供友好操作界面的持续集成(CI)工具。
起源于Hudson(Hudson是商用的),主要用于持续、自动化的构建(包括编译,发布,测试)软件项目、监控外部任务的运行;Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行;通常与版本管理工具(SCM)、构建工具结合使用。
常用的版本控制工具:SVN、GIT
构建工具有:Maven、Ant、Gradle
二、Jenkins特性
1)开源的java语言开发持续集成工具,支持CI,CD
2) 易于安装部署配置:可通过yum安装,或下载war包以及通过docker容器等快速实现安装部署,可方便web界面配置管理
3)消息通知及测试报告:集成RSS/E-mail通过RSS发布构建结果或当构建完成时通过e-mail通知,生成JUnit/TestNG测试报告
4)分布式构建:支持Jenkins能够让多台计算机一起构建/测试
5)文件指纹信息:Jenkins能够跟踪哪次构建生成哪些jar,哪次构建使用哪个版本的jar等
6)丰富的插件支持:支持扩展插件,你可以开发适合自己团队使用的工具,如git,svn,maven,docker等
7)变更支持:Jenkins 能从代码仓库(SVN/Git)中获取并产生代码更新列表,并输出到编译输出信息中
8)支持永久链接:用户是通过 Web 来访问 Jenkins 的,而这些 Web 页面的链接地址都是永久链接地址,可以在各种文档中直接使用该链接
三、Jenkins用处
1. 定时拉取代码并编译
2. 静态代码分析
3. 定时打包发布测试版
4. 自定义操作,如跑单元测试等
5. 出错提醒
四、Jenkins工作原理
1.开发者检入代码到源代码仓库。
2.CI系统会为每一个项目创建了一个单独的工作区。当预设或请求一次新的构建时,它将把源代码仓库的源码存放到对应的工作区。
3.CI系统会在对应的工作区内执行构建过程。
4.(配置如果存在)构建完成后,CI系统会在一个新的构件中执行定义的一套测试。完成后触发通知(Email,RSS等等)给相关的当事人。
5.(配置如果存在)如果构建成功,这个构件会被打包并转移到一个部署目标(如应用服务器)或存储为软件仓库中的一个新版本。软件仓库可以是CI系统的一部分,也可以是一个外部的仓库,诸如一个文件服务器或者像 SourceForge、Java.net之类的网站。
6.CI系统通常会根据请求发起相应的操作,诸如即时构建、生成报告,或者检索一些构建好的构件。
五、CI/CD介绍
CI(Continuous integration|持续集成)
是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。借用网络图片对CI加以理解。
CD(Continuous Delivery|持续交付)
是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境) 中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。下图反应的是CI/CD 的大概工作模式。
CD持续部署(Continuous Deployment|持续部署)
是 CI持续集成 ,CD持续交付的延伸。自动将交付的应用部署到生产环境。能及时收到用户反馈,降低部署的风险。持续部署是持续交付的下一步,在持续交付的基础上,由开发人员或运维人员自助式的定期向生产环境部署稳定的构建版本,持续部署的目标是代码在任何时刻都是可部署的,并可自动进入到生产环境。
总结
- 持续集成:指程序员在代码的开发工程中,可以频繁的将代码部署到主干上,并进行自动化测试
- 持续交互:指在持续集成的基础之上,将代码部署到线上测试环境
- 持续部署:指在持续交互的基础之上,将要部署的代码实现自动部署,包括持续交互、持续部署
下面是一张完整流程图
六、Maven介绍
- Maven 就是构建 java 里面的一个 war 包的;
- Maven 项目对象模型(POM)是可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具;
- Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于Maven的缺省构建规则有较高的可重用性,所以常常用两三行Maven构建脚本就可以构建简单的项目;
- 由于Maven的面向项目的方法,许多Apache Jakarta 项目发文时使用Maven,而且公司项目采用Maven的比例在持续增长。
六、Jenkins部署
使用tomcat容器安装jenkins
注意!要用9版本的tomcat进行部署,目前10版本的有bug。
#安装jdk
[root@localhost ~]# dnf -y install java-17-openjdk
#安装tomcat
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat9.0.67.tar.gz
[root@localhost src]# tar -xf apache-tomcat-9.0.67.tar.gz -C /usr/local/
[root@localhost local]# mv apache-tomcat-9.0.67/ tomcat
#安装jenkins
[root@localhost local]# cd tomcat/webapps/
[root@localhost webapps]# ls
docs examples host-manager manager ROOT
#下载到此目录,tomcat运行时会自动解压
[root@localhost webapps]# wget http://mirrors.jenkins.io/war-stable/2.346.3/jenkins.war
#启动tomcat服务
[root@localhost webapps]# ../bin/catalina.sh start
七、Jenkins的Web界面管理
初始化设置
在浏览器的地址栏输入IP:8080/Jenkins
访问到此页面后会提示你初始密码文件的位置,用cat查看该文件内容,然后copy过来即可登录
[root@localhost ~]# cat /root/.jenkins/secrets/initialAdminPassword
6ec3f80da8234a10af076d753babee86
身为运维人员当然要选自定义安装来熟悉Jenkins的Web界面啦!
点击【无】进行安装,后面需要什么插件就手动去安装
为了方便记忆,我的用户名与密码都设为【admin】。你请随意,只要别忘了就行。
设置访问Jenkins的URL的根路径,我这里保持默认。
上述步骤相续完成后就可以看见Jenkins的首页【Welcome to Jenkins!】了。
替换国内源,安装中文插件
替换源步骤:点击 Advanced —> 更新为国内源 —> Submit
原国外插件源地址:https://updates.jenkins.io/update-center.json
国内插件源地址:https://mirror.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
进到【Advanced】界面后往下划,要设置的地方在最底下
我把原有的源替换成了国内源,这能极大的加快我们的访问速度!
别忘了点击底下的【Submit】噢
下面进行安装中文语言界面
在安装界面可以勾选我所标记的。因安装插件需要重启才能生效,当然!我们也可以手动进行重启,下面就来演示一番
演示手动重启Jenkins
请仔细看这张图的URL栏与上张有何区别。我把Jenkins根路径后面删掉了,然后输入了restart,然后敲回车键即可。
输入初次登陆时设置的用户名与密码
安装中文插件并重启生效后可以发现是不是不一样了。虽说是中文插件,可也并非完全汉化了,或许有些名词术语用英文表述更加准确吧
安装Git、Github、Gitlab、Gitee插件,安装后重启Jenkins生效。跟安装中文语言插件的步骤相同就不一一示范了,请你举一反四~
任务管理
输入一个任务名,选择该任务的类型
此时返回首页就能看到刚刚新建的任务
全局工具配置
节点管理
系统配置
八、Jenkins流水线项目发布流程
环境说明:
主机名 | IP地址 | 应用服务 | 工具包 | 操作系统 |
---|---|---|---|---|
node1 | 192.168.92.132 | Jenkins、tomcat | git、maven、sshpass | Centos8 |
node2 | 192.168.92.130 | tomcat | wget | Centos8 |
1.关闭防火墙与SELinux
systemctl disable --now firewalld.service
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
2.在node1主机部署
#安装jdk
[root@node1 ~]# dnf -y install java-17-openjdk
#安装tomcat9.0.67版本
[root@node1 ~]# cd /usr/local/src/
[root@node1 src]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz
[root@node1 src]# tar -xf apache-tomcat-9.0.67.tar.gz -C /usr/local/
[root@node1 local]# mv apache-tomcat-9.0.67/ tomcat
#安装jenkins
[root@node1 local]# cd tomcat/webapps/
[root@node1 webapps]# ls
docs examples host-manager manager ROOT
#下载到此目录,tomcat运行时会自动解压
[root@node1 webapps]# wget http://mirrors.jenkins.io/war-stable/2.346.3/jenkins.war
#启动jenkins
[root@node1 webapps]# /usr/local/tomcat/bin/catalina.sh start
#下载git(拉代码)、maven(打包)
[root@node1 ~]# dnf -y install git maven wget
#解决centos8无sshpass问题
[root@node1 ~]# rpm -ivh http://mirror.centos.org/centos/8-stream/AppStream/x86_64/os/Packages/sshpass-1.09-4.el8.x86_64.rpm
#将GitHub的IP映射到本地/etc/hosts文件,查询IP网站 https://ip.tool.chinaz.com/
[root@node1 ~]# echo "20.205.243.166" >> /etc/hosts
#配置免密登录
[root@node1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:7dZb9rhhNzocmHEwOiSaZoq8s/IQQlJ6HbrQK83dZ7U root@node1
The key's randomart image is:
+---[RSA 3072]----+
| . . |
| + o . . . o |
|+.+ . o o o o |
|o= + * = o . |
|= * = . S E = |
|.= . o . + . |
|. . o o *..|
|.+ . B.=.|
|.o+ ..+..|
+----[SHA256]-----+
#将公钥传至node2主机
[root@node1 ~]# ssh-copy-id root@192.168.92.130
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/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.92.130's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@192.168.92.130'"
and check to make sure that only the key(s) you wanted were added.
#测试免密登录
[root@node1 ~]# ssh root@192.168.92.130
Last login: Thu Sep 29 22:46:13 2022 from 192.168.92.1
[root@node2 ~]# exit
注意:完成上述配置就可以访问Web界面了,web的一些初始化设置前面已经提过,在此就不浪费版面了,只给出需要注意的配置页面。
这次选择安装推荐的插件,这样可以节省我们后续一个个的找插件安装的时间
耐心等待安装插件的过程,
新建任务
给任务命名,选择任务类型
添加文本参数
添加GitHub仓库
添加客户端的IP地址
添加ssh密码
添加打包工具
定义tomcat路径
流水线脚本
编写流水线脚本。该脚本会自动帮你把客户端的tomcat部署好
脚本内容如下,方便他人copy
pipeline {
agent any
stages {
stage('pull code') {
steps {
git '${git_url}'
}
}
stage('package') {
steps {
sh """
mvn clean
mvn package
"""
}
}
stage('deploy') {
steps {
sh """
sshpass -p "${ssh_pass}" ssh root@${client_ip} 'yum -y install java-11-openjdk > /dev/null'
sshpass -p "${ssh_pass}" ssh root@${client_ip} 'wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.67/bin/apache-tomcat-9.0.67.tar.gz -P /tmp'
sshpass -p "${ssh_pass}" ssh root@${client_ip} 'tar xf /tmp/apache-tomcat-9.0.67.tar.gz -C /usr/local'
sshpass -p "${ssh_pass}" ssh root@${client_ip} 'ln -s /usr/local/apache-tomcat-9.0.67 ${tomcat_path}'
sshpass -p "${ssh_pass}" ssh root@${client_ip} '${tomcat_path}/bin/catalina.sh start'
sshpass -p "${ssh_pass}" scp target/${maven_packages}.war root@${client_ip}:${tomcat_path}/webapps/
sshpass -p "${ssh_pass}" ssh root@${client_ip} '${tomcat_path}/bin/catalina.sh stop && ${tomcat_path}/bin/catalina.sh start'
"""
}
}
}
}
先点击【Build with Parameters】后点击【开始构建】
报错便签:/etc/hosts文件添加github的IP。脚本的变量少打了个s。要按照sshpass和wget工具。已在前面文档添加这些操作
蓝色为构建中。绿色为构建成功。红色为构建失败。除第一次构建外,之后的集成操作都相当耗时。
如构建失败可把鼠标移至该红框里会出现【logs】的按钮,点击可查看报错在哪一步,然后对应解决就可以了
构建成功后,在浏览器URL栏输入客户端IP:8080/ly-simple-tomcat-0.0.1-SNAPSHOT
九、Jenkins脚本语法(拓展)
#简单结构语法:
stages{
stage(''){
steps{
commands
}
}
}
#常规命令的写法:
sh "mvn -Dmaven.test.failure.ignore=true clean package"
sh "mv target/ly-simple-tomcat-0.0.1-SNAPSHOT.war target/app.war"
#命令3点写法:
sh '''
mvn -Dmaven.test.failure.ignore=true clean package
mv target/ly-simple-tomcat-0.0.1-SNAPSHOT.war target/app.war
'''
#环境变量的使用
environment{
DISABLE_AUTH = 'true'
DB_ENGINE = 'sqlite'
}
stages{
stage('hello'){
steps{
echo DISABLE_AUTH
echo DB_ENGINE
}
}
}
#清理和通知
#post部分会在pipeline结束的时候运行,所以可以添加通知去完成步骤清理
#deleteDir是固定写法,可以清理workspace目录下的文件
post{
always{
deleteDir()
}
success{
echo '清理成功'
}
failure{
echo '清理失败'
}
}
#电子邮箱
post{
failure{
mail to: '主题',
subject: "Failed Pipeline: ${currentBuild.fullDisplayName}",
body: "XXX ${env.BUILD_URL}"
}
}
#部署(重点)
#持续交付肯定会有3个阶段,构建,测试,部署,稳定的构建和测试阶段是任何部署的前提
pipeline{
agent any
stages{
stage('Build'){
steps{
echo '命令1'
}
}
stage('Test'){
steps{
echo '命令2'
}
}
stage('Deploy') {
steps{
echo '命令3'
}
}
}
}
#input命令会等待你的确认命令