Jenkins自动化构建部署代码
1.背景
“唉,每天提交完代码都得自己打包再部署到测试环境和开发环境,好麻烦啊!都快变成运维了”
“啊?哦!确实,每天打包部署确实都成为了工具人了”
这不禁让我想起在澳门项目兼顾充当发包工具人的时光,在实际开发中,我们经常要一边开发一边测试,当然这里说的测试并不是程序员对自己代码的单元测试,而是同组程序员将代码提交后,由测试人员测试;或者前后端分离后,经常会修改接口,然后重新部署;这些情况都会涉及到频繁的打包部署;
手动打包常规步骤:
1.提交代码
2.问一下同组小伙伴有没有要提交的代码
3.拉取代码并打包(war包,或者jar包)
4.上传到Linux服务器
5.查看当前程序是否在运行
6.关闭当前程序
7.启动新的jar包
8.观察日志看是否启动成功
9.如果有同事说,自己还有代码没有提交…再次重复1到8的步骤!!!!!(一上午没了)
那么,有一种工具能够实现,将代码提交到git后就自动打包部署勒,答案是肯定的:Jenkins
当然除了Jenkins以外,也还有其他的工具可以实现自动化部署,如Hudson等
只是Jenkins相对来说,使用得更广泛。
2.Jenkins自动化部署实现原理
3.基于docker安装Jenkins环境
前置条件:阿里云服务器+安装好docker环境
当然也可以不使用docker而是自己一步步搭建Jenkins环境(贼辛苦,一堆坑,后面有时间再出教程)
使用docker pull一个镜像可以节省很多时间,也避免了很多奇奇怪怪的坑.
1.使用docker安装jenkins
docker run -p 8080:8080 -p 50000:50000 -v jenkins_data:/var/jenkins_home jenkinsci/blueocean
2.访问jenkins地址 ip:8080
注意:第一次启动的时候正在加载jenkins大概会等待3-10分钟。
3.解锁jenkins
Jenkins启动后,默认的日志会输出到/var/log/jenkins/jenkins.log文件中,启动后默认会创建一个管理员账号admin,以及为此账号产生一个密码,
密码会写入到文件/var/jenkins_home/secrets/initialAdminPassword中,可通过vim或vi查看日志文件和密码文件
大概需要等待3-10分钟
Jenkins默认使用8080端口,要修改此端口,编辑/etc/default/jenkins配置文件,找到对应的端口进行修改成其他端口.这里我还是使用默认端口8080.
3.1 Jenkins全局工具配置
进入到jenkins容器中 echo $JAVA_HOME 获取java环境安装地址
JDK环境安装![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e15a8993a2eb5650dea6c130f882bcc0.png)
Maven环境安装 --这里采用自动安装的方式
3.2安装Jenkins对应Maven插件
找到 “系统管理“ - “安装插件” ,点击 “可选插件”,找到如下maven插件的版本
插件名称 Maven Integration
4.Jenkins实现Springboot项目自动部署
1. 新建一个发布任务
2.配置任务git账号密码(打个码哈哈哈)
3.项目打包
4.点击立即构建
第一次构建可能耗时比较长,因为需要下载一些相关依赖jar包
点击Console Output可以查看控制台打印
5.Jenkins启动成功之后执行的shell脚本
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=/var/jenkins_home/jobs/test_springboot/workspace/mldncloud-dept-service-swagger/target/mldncloud.jar
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh 执行脚本.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup java -jar $APP_NAME > vi /tmp/jenkins/app/admin.log 2&>1 &
echo "App is runing success!"
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
#特别说明:这里其实是根据传的参数去执行对应的方法.在这里我是直接写死直接调restart方法
case "restart" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
对以上脚本做个简单说明,这里的脚本文件需要使用时,是需要传参调用脚本执行对应传参的方法的.为了方便,在这里case “restart” in 我直接写死调用restart方法,而restart方法其实就是先stop杀死进程再启动进程,而启动进程主要看这个: nohup java -jar $APP_NAME > vi /tmp/jenkins/app/admin.log 2&>1 &
这里的文件要你手动先创建,不然jenkins是没有创建文件的权限的.当然你也可以把jenkins的用户改为"root"以此来获得root权限.
6.容器映射8081端口
重启容器
systemctl restart docker
清空未运行的容器
docker rm $(sudo docker ps -a -q)
docker run -p 8080:8080 -p 8081:8081 -p 50000:50000 -v jenkins_data:/var/jenkins_home jenkinsci/blueocean |
---|
5.docker端口映射
5.1项目启动后发现访问不了
测试ping一下ip,能通;
这个时候就要ping一下你的项目(jar包)的端口看看能不能通了.
tcping下载地址:https://download.elifulkerson.com//files/tcping/0.39/tcping.exe
放入目录C:\Windows\System32,之后再cmd窗口运行即可
(这里一开始是不通的,因为jenkins是部署在docker里面的,docker需要对端口做一下外部映射)
5.2【docker】追加docker容器端口映射的方法(不懂的可以看这个)
6.最终效果
以后每次部署只需要把修改后的代码提交到远程仓库,然后点击jenkins的立即构建.之后jenkins会自动去你配置的git仓库拉取最新代码,并且执行maven的构建.
是不是很香?!香得一批!以后谁再手动打包发包到服务器,统统打死!
“唉,每天提交完代码都得自己打包再部署到测试环境和开发环境,好麻烦啊!都快变成运维了”
“啊?哦!不慌,我配Jenkins随便改!”