Jenkins介绍
1.什么是持续集成
随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。 持续集成正是针对这一类问题的一种软件开发实践,对于提高软件开发效率并保障软件开发质量提供了理论基础。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。
核心价值
- a、持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复过程以节省时间、费用和工作量;
- b、持续集成保障了每个时间点上团队成员提交的代码是能成功集成的。换言之,任何时间点都能第一时间发现软件的集成问题,使任意时间发布可部署的软件成为了可能;
- c、持续集成还能利于软件本身的发展趋势,这点在需求不明确或是频繁性变更的情景中尤其重要,持续集成的质量能帮助团队进行有效决策,同时建立团队对开发产品的信心。
业界普遍认同的持续集成的原则
- 1)需要版本控制软件保障团队成员提交的代码不会导致集成失败。常用的版本控制软件有 IBM Rational ClearCase、CVS、Subversion 等;
- 2)开发人员必须及时向版本控制库中提交代码,也必须经常性地从版本控制库中更新代码到本地;
- 3)需要有专门的集成服务器来执行集成构建。根据项目的具体实际,集成构建可以被软件的修改来直接触发,也可以定时启动,如每半个小时构建一次;
- 4)必须保证构建的成功。如果构建失败,修复构建过程中的错误是优先级最高的工作。一旦修复,需要手动启动一次构建。
2.持续集成系统的组成
由此可见,一个完整的构建系统必须包括:
- A、一个自动构建过程,包括自动编译、分发、部署和测试等。
- B、 一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库。
- C、一个持续集成服务器。本文中介绍的 Jenkins/Jenkins 就是一个配置简单和使用方便的持续集成服务器。
3.Jenkins介绍
Jenkins是一个开源软件项目,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括:
- 1、持续的软件版本发布/测试项目。
- 2、监控外部调用执行的工作
使用Jenkins人员需要对持续集成的概念有所了解,更多的要求对代码的编译过程很了解,Jenkins对于maven/gradle工程完整的编译和发布流程如下:
- 1、Jenkins从Git上拉取代码到指定的编译机器上。
- 2、在编译机器上触发编译命令或脚本。
- 3、编译得到的结果文件。
- 4、把结果文件传到指定的服务器上。
Jenkins安装与配置
1.本次测试环境介绍
部署系统 CentOS7
JDK环境 Jdk1.8
Gradle 5.6.2
管理工具 Git
(这里假设读者对环境搭建已经了解,这里不再概述Jdk及Maven/Gradle环境安装)
2.安装部署Jenkins
Jenkins Jenkins.war(2.190.3)
jenkins下载传送门,或者使用我的对象存储连接网速比较快
wget https://blog-1300588375.cos.ap-chengdu.myqcloud.com/jenkins.war
建议将jenkins.war包放到Tomcat中webapps下,并更改名称为ROOT.war,启动Tomcat,成功启动之后访问ip和端口;
这里需要输入密码,可以使用
cat /root/.jenkins/secrets/initialAdminPassword
查询并输入即可
这里是建议默认安装即可,之后就是漫长的等待...
插件安装完成以后将会创建管理员账户,这里跳过直接进入配置
3.Jenkins部署及配置
JDK和Git配置
输入安装的地址即可,这里注意下git位置,这是可执行文件的地址,不是我们前面安装git的地址,是git/bin下的可执行文件 git的目录,如果不知道可以执行命令 whereis git ,找到路径带bin的git地址就是上面要填的。
Gradle或者Maven配置
Maven配置同理,配置应用保存即可。
新建一个项目
这里建议使用自定义项目,我们选择第一个即可
配置git仓库,这里输入项目的git地址即可,然后设置登录选项
这里点击凭证配置私钥
这里需要配置git的ssh私钥和登录用户名,因为jenkins使用的是jenkins账户拉取,所以需要再设置一次私钥信息;git的私钥可以使用
cat ~/.ssh/id_rsa
查看,输入在我选中的位置,点击add保存应用即可。
这里我们可以先测试下git拉取代码是否成功,回到主页面后点击build now即可。
可以在workspack中点击console output 查看拉取日志
如果代码拉取成功,可以在服务器 ~/.jenkins/workspace/项目名称/中看到你的项目代码。
部署Springboot到服务
上述操作如果正在执行后,我们只需要在项目上点击configure,在gradle 的task中输入clean build即可。
返回到控制台点击重新构建就会发现
在执行完拉取代码后jenkins已经帮我们完成了打包操作,我们进入服务器中,在项目目录下会发现多了一个build目录,并且在build/libs目录可以看到我们的jar包。
编写脚本自动完成启动
执行这里操作需要安装pipline插件,这里如果是开始安装时插件选择默认安装是有该插件的,如果没有在Manage Jenkins > Manage Jenkins的available搜索安装即可。
在我们的项目中configure的build中增加一步
输入以下脚本(以下脚本仅仅适合部署springboot项目,其他请勿copy)
# 将应用停止
echo "Stopping SpringBoot Blog"
pid=`ps -ef | grep halo | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
kill -9 $pid
fi
rm -rf /usr/local/data/halo/halo.jar
mv -f /root/.jenkins/workspace/meetkiki-blog/build/libs/halo.jar /usr/local/data/halo/halo.jar
chmod 777 /usr/local/data/halo/halo.jar
#bash /usr/local/data/halo/start.sh
sudo sh /usr/local/data/halo/start.sh start
这里需要配合start.sh启动脚本,我将它放在/usr/local/data/halo/项目目录下,这里放在下面
##此处是打包的jar包名称,不带.jar后缀
API_NAME=halo
JAR_NAME=$API_NAME\.jar
JAVE_HOME=/usr/java/jdk1.8.0_231-amd64/bin
BLOG_PATH=/usr/local/data/halo
#PID 代表是PID文件
PID=$API_NAME\.pid
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $JAR_NAME|grep -v grep`
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> ${JAR_NAME} is already running PID=${pid} <<<"
else
nohup ${JAVE_HOME}/java -Xms1024m -Xmx1024m -jar ${BLOG_PATH}/$JAR_NAME > ${BLOG_PATH}/server.log 2>&1 &
echo $! > $PID
echo ">>> start $JAR_NAME successed PID=$! <<<"
fi
}
#停止方法
stop(){
#is_exist
pidf=$(cat $PID)
#echo "$pidf"
echo ">>> api PID = $pidf begin kill $pidf <<<"
kill $pidf
rm -rf $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo ">>> api 2 PID = $pid begin kill -9 $pid <<<"
kill -9 $pid
sleep 2
echo ">>> $JAR_NAME process stopped <<<"
else
echo ">>> ${JAR_NAME} is not running <<<"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo ">>> ${JAR_NAME} is running PID is ${pid} <<<"
else
echo ">>> ${JAR_NAME} is not running <<<"
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0
这里建议将脚本设置权限
chmod 777 start.sh
之后保存重新build now即可。如果输入以下便是执行成功
输入域名可以成功访问。
至此,在linux中使用Jenkins集成git、Gradle持续构建Springboot项目完成。