Jenkins
typora-copy-images-to: images
Jenkins
一. 引言
1. 互联网软件开发发布标准流程
编码 ---> 构建 ---> 集成 ---> 测试 ---> 交付 ---> 部署
如上图所见,当今的企业级软件发布越来越强调[持续集成(Continuous Integration)]、[持续交付(Continuous Delivery)]和[持续部署(Continuous Deployment)].
2. 持续集成(CI)
上面整个流程中最重要的组成部分就是持续集成(Continuous integration,简称CI)。
持续集成指的是,频繁地(一天多次)将代码集成到主干。将软件个人研发的部分向软件整体部分交付,频繁进行集成以便更快地发现其中的错误。
它的好处主要有两个:
1. 快速发现错误。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易;
2. 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续集成并不能消除Bug,而是让它们非常容易发现和改正。持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
3. 持续交付
持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境的「类生产环境」(production-like environments)中。持续交付优先于整个产品生命周期的软件部署,建立在高水平自动化持续集成之上。
持续交付可以看作持续集成的下一步。它强调的是,不管怎么更新,软件是随时随地可以交付的。
4. 持续部署(CD)
持续部署(continuous deployment)是持续交付的下一步,指的是代码通过评审以后,自动部署到生产环境。
持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
持续部署的前提是能自动化完成测试、构建、部署等步骤。
5. 总结
总的来说,持续集成、持续交付、持续部署提供了一个优秀的 DevOps 环境。对于整个开发团队来说,能很大地提升开发效率,好处与挑战并行。无论如何,频繁部署、快速交付以及开发测试流程自动化都将成为未来软件工程的重要组成部分。
二. Jenkins介绍
1. Jenkins概念
Jenkins是一个开源的、可扩展的持续集成、交付、部署(软件/代码的编译、打包、部署)的基于web界面的平台。起源于Hudson,允许持续集成和持续交付项目,无论用的是什么平台,可以处理任何类型的构建或持续集成。
通常与版本管理工具(SCM)、构建工具结合使用;常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。
2. Jenkins工作流程
传统项目开发发布流程
Jenkins开发发布流程
3. 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等。
二.Jenkins安装
1. Jenkins安装启动
官网下载地址 : https://jenkins.io/download/ 选择下载war包
-
启动方式 (基于Linux)
- 将war包移至tomcat/webapps下,启动tomcat
tomcat 启动配置 export JAVA_HOME=/usr/local/java export TOMCAT_HOME=/usr/local/tomcat export CATALINA_HOME=/usr/local/tomcat export CLASS_PATH=$JAVA_HOME/bin/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tool.jar export PATH=$PATH:/usr/local/java/bin:/usr/local/tomcat/bin
- 进入你war包存放的位置,输入以下指令后台启动jenkins
nohup java -jar jenkins.war --logfile=server.log --httpPort=8088 > server.log 2>& 1 &
--httpPort的话jenkins使用的是8080端口,在此我指定的端口是8088
- 打开浏览器,访问ip:8080进行安装,ip为linux机器ip
从日志中获取密码,输入密码继续,进行环境初始化
选择安装推荐的插件
等待插件下载成功,若失败请多次重试
选择使用admin账户继续 | 或创建管理员账户
实例配置不更改保存并完成
2. 全局工具配置
- 在Linux系统中安装JDK
jdk环境变量配置 vi /etc/profile
export JAVA_HOME=/usr/local/java/jdk1.8.0_162
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
- 在Linux系统中安装Git并配置SSH免密令牌
git安装
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install -y gcc perl-ExtUtils-MakeMaker
yum remove git
tar -zxvf git-2.9.3.tar.gz
cd git-2.9.3
make prefix=/usr/local/git all
make prefix=/usr/local/git install
git 环境变量
export PATH="/usr/local/git/bin:$PATH"
将git设置为默认路径,不然后面克隆时会报错
ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack
ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack
SSH**生成
git config --global user.name "baizhiRxx"
git config --global user.email "aaa@qq.com"
ssh-****** -t rsa -C "aaa@qq.com"
GitHub SSH配置
在 /root/.ssh/id_rsa.pub 中获取令牌信息 , 输入至GitHub中
- 在Linux系统中安装Maven
maven 环境变量
export M2_HOME=/usr/local/maven3
export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin
- 在Jenkins图形化页面的全局配置中分别配置JDK,Git,Maven路径
3. 第一个Jenkins项目
- 新建项目 — *风格软件项目
- 源码管理 — 输入你需要关联的git仓库地址
源码管理选择Git(如果使用SVN就选择Subversion);Repository URL选择自己公共仓库的地址;Branches to build默认为*/master,意思是发布代码的分支为master分支;
- 查看工作空间 — 显示错误 错误原因 : 未初始化构建
- 点击构建 — Invoke top-level Maven targets
- 选择安装的Maven
- 输入clean install指令
- 多模块项目需要指定pom.xml文件位置
- 点击Build Now 手动构建项目
显示项目构建成功时,托管于GitHub的源码将显示于Jenkins当前项目中的工作区中,实际源码将同步于/root/.jenkins/workspace/目录下
三.Jenkins远程部署
引言 :
Jenkins第一个项目构建成功后,每次构建都将把GitHub仓库中最新的代码同步至Jenkins服务器中,但实际生产环境中需要将项目部署至远端服务器中,那么Jenkins应具有将自己管理的项目部署至远端服务的功能
Jenkins远程部署步骤
- 安装Deploy to container Plugin
- 在构建后操作中选择Deploy war/ear to a container
点击Add Container
可以增加更多台服务器,在生产环境下通常也是多台服务器一起发布代码。
- 输入远端服务器Url
- 远端服务器中 conf/tomcat-users.xml 文件添加如下配置
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="tomcat_user" password="123456" roles="manager-gui,manager-script,manager-jmx,manager-status" />
在 conf/server.xml 文件中做如下修改
<Connector port="8080" protocol="HTTP/1.1" 72 connectionTimeout="20000" 73 redirectPort="8443" URIEncoding="UTF-8"/>
- 在Jenkins中配置**
四.Jenkins自动构建
1. 触发远程构建
在Url中输入http://192.168.75.3:8080/jenkins/job/项目名/build?token=输入的身份验证令牌 即可触发远程构建
2.基于轮询策略自动构建
原理 : 设置Configure->Build Trigger中勾选【Github hook trigger for GITScm polling】和【poll SCM】,并设置定时轮询,当检测到有新的提交时会自动构建当前任务,如果没有新的提交则不会触发
3.基于钩子程序自动构建
- 在GitHub — Setting 中
在Note中输入令牌名称 , 如图示勾选 创建令牌后妥善保存令牌 , 无法再次获取令牌信息
-
Jenkins中Github配置中添加token凭证
系统管理->添加Github server->添加Secret text凭证->连接测试同时,勾选为github指定另外一个hook url(配置Jenkins在Hook URL中监听Github的Post请求,然后进行自动构建)
- Github中项目配置webhook
-
必须输入外网的Url 故之前重写的 http://192.168.75.3:8080/jenkins/github-webhook/ 无法访问
- 将Jenkins服务器部署于外网环境(如 阿里云服务器)中
- 借用外网服务器(如 阿里云服务器)做内网穿透
- 将ngrok | ngrok.cfg 上传至Jenkins服务器
- ./ngrok -config=ngrok.cfg -subdomain baizhi 8080 启动
-
在Jenkins项目管理中选中 触发远程构建 |GitHub hook trigger for GITScm polling
五.SpringBoot项目远程部署
- 插件准备
- Maven Integration plugin
- Publish Over SSH
- 系统设置 — SSH Server管理
- 新建maven项目
- 源码管理设置
- 构建触发器
- Build
- 指定pom.xml文件位置
- 输入需要的maven指令
- 构建后操作 — Send build artifacts Over SSH
- 启动脚本编写 — hello.sh 脚本编写
#!/bin/bash
function killproject()
{
#由于我这边多个项目jar包名一致了,所以并没有用 ps -ef | grep jar包名 来查进程id,而是通过端口号来查的
project_pid=$(ps -ef | grep jenkins-springboot-0.0.1-SNAPSHOT.jar | awk 'NR==1{print $2}')
if [ $project_pid > 0 ];then
echo "项目已经启动了,开始关闭项目,项目pid为: $project_pid "
kill -9 $(ps -ef | grep jenkins-springboot-0.0.1-SNAPSHOT.jar | awk 'NR==1{print $2}')
echo '项目关闭成功,开始重启项目。。。'
else
echo "项目未启动,直接启动"
fi
}
function start_project()
{
source /etc/profile
echo '正在启动项目。。。'
cd /usr/local/jenkins-jar/
nohup java -jar demo-0.0.1-SNAPSHOT.jar >warpper.log &2>1 &
}
function check_project()
{
check_pid=$(ps -ef | grep jenkins-springboot-0.0.1-SNAPSHOT.jar | awk 'NR==1{print $2}')
if [ $check_pid > 0 ];then
echo "project is start and pid = : $check_pid "
else
echo "project are not start"
fi
}
killproject
start_project
sleep 10
check_project
六. Jenkins邮件配置
1. 默认邮件通知
系统管理
–>系统设置
,找到“邮件通知”进行配置,这里我使用的是163邮箱
发邮件的地址必须与管理员地址一致,否则发邮件会报错。同时必须在163邮箱设置授权码,并且在上面设置密码的地方填入该授权码,不然也是发送不了邮件。
点击Test configuration
,如果显示为“Email was successfully sent",说明邮箱配置成功
到163邮箱查看是否收到刚刚测试的邮件
收到了,邮件配置成功。点击保存
,进入到之前的任务中,点击配置
找到构建后操作
,选择E-mail Notification
,Recipients
这里填入接收邮件的邮箱地址
邮件收到,邮箱配置成功。
但这样有一点不好,只有构建失败才会发邮件提示,我想让它不管构建成功还是失败都发邮件提示。
2. 使用插件email-ext配置邮件
想让它不管构建成功还是失败都发邮件来提示,就必须要安装一个插件,该插件名字是Email Extension Plugin。如果你是按照上面步骤来的,那么该插件就已经安装。系统管理
–>插件管理
查看是否安装此插件,没有就安装。
系统管理
–>系统设置
–>Extended E-mail Notification
,填写SMTP server
,勾选Use SMTP Authentication
,再填写User Name
和Password
,Password
这里填邮箱授权码,然后SMTP port
这里填25
往下拉,定位到Default Triggers
,选择always
,表示不管什么情况都会发邮件提示。之后再清空之前设置的邮箱通知,应用、保存即可
打开任务(我这里是lzx_php)–>配置,去掉构建后操作,点击增加构建后操作步骤,选择Editable Email Notification,在Project Recipient List那里添加自己的邮箱,然后点击Advanced Setting,定位到Triggers,可以在Add Trigger处增加发邮件的条件
上一篇: jenkins
下一篇: 单利模式及python实现方式详解