使用jenkins实现java的springboot项目的自动部署

202 阅读4分钟

jenkins自动化部署

2021年 01月 02日 星期六 15:11:03

正式学习自动化 部署

初次探索,先实现java的springboot项目的自动部署

前言:本人使用的系统是deepinv20系统

1.由于是java项目,所以先安装java环境

从官网下载jdk-8u271-linux-x64.tar.gz至本地

解压

tar -zxvf jdk-8u271-linux-x64.tar.gz

把解压好的文件夹移动到当前用户的文件目录中

mv jdk1.8.0_271 /home/shizc/

配置java环境变量

sudo vi /etc/bash.bashrc

打开配置文件后在文件末尾输入以下配置信息

JAVA_HOME=/home/shizc/jdk1.8.0_271

CLASSPATH=.:$JAVA_HOME/bin.tools.jar

PATH=JAVAHOME/bin:JAVA_HOME/bin:PATH

export JAVA_HOME CLASSPATH PATH

保存退出后输入以下命令,是配置生效

source /etc/bash.bashrc

2.设置java项目的打包工具maven的环境变量

可以去maven官网下载最新的maven包到本地,然后解压使用,我这里使用了idea插件库里带的maven3

sudo vi /etc/bash.bashrc

添加内容:

export PATH="/home/shizc/idea-IU-183.6156.11/plugins/maven/lib/maven3/bin:$PATH"

保存并退出后

source /etc/bash.bashrc

是修改生效

输入

mvn --help

验证是否配置成功

3.使用Spring Initializr 初始化一个测试项目

国内可以使用阿里云的镜像,以加快构建速度

地址:start.aliyun.com/

只需要选择Spring Web,使我们可以写接口进行测试,就可以了

下面,我们写一个接口并进行访问

启动后进行访问

4.安装Git环境

本例子使用开源的Gitee码云作为代码仓库,所以需要使用Git环境进行代码的上传和下载

sudo apt-get install git

安装完成使用命令

git --help

进行验证

然后我们把刚才的项目上传到Gitee代码仓库

首先需要安装idea的Gitee插件

重启idea

配置码云的账户

进行代码上传

提示成功后去Gitee查看

5.安装docker,对springboot项目使用容器化部署

不了解docker的可以百度一下

docker的阿里云二进制包下载地址:mirrors.aliyun.com/docker-ce/l…

直接下载自己喜欢的版本,比如最新版19.03.12

下载好了,解压

tar xzvf docker-19.03.12-ce.tgz

复制解压好的程序文件到/usr/bin目录下

sudo cp docker/* /usr/bin/

复制完成后,docker就算已经安装了

此时输入命令

docker version

就会出现相关信息

然后我们给docker配置自动启动

vi /usr/lib/systemd/system/docker.service

输入内容

[Unit] Description=Docker Application Container Engine Documentation=docs.docker.com After=network-online.target firewalld.service Wants=network-online.target

[Service] Type=notify ExecStart=/usr/bin/dockerd ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart=on-failure StartLimitBurst=3 StartLimitInterval=60s

[Install] WantedBy=multi-user.target

写完配置文件,进行服务启动

systemctl daemon-reload # 重载环境变量 systemctl start docker.service # 启动docker服务 systemctl enable docker #设置docker服务开机启动

6.安装Jenkins

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动的构建/测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)。Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工具结合使用。常用的版本控制工具有SVN、GIT,构建工具有Maven、Ant、Gradle。

拉取jdk的docker镜像到本地

sudo docker pull openjdk:8-alpine

这个镜像只有105M,已经很小了

理论上,只要功能符合要求,镜像应尽量的体积小,这个是我见过的体积最小的了

下载jenkins

官网地址:www.jenkins.io/zh/download…

下载war包,比较方便

启动命令:

nohup java -jar /home/shizc/Documents/jenkins.war>/home/shizc/Documents/jenkins.out&

这个后台启动模式,启动完成后,默认的端口号为:8080

在地址栏输入:ip:8080

按页面上的提示找到密码,输入命令:

cat /home/shizc/.jenkins/secrets/initialAdminPassword

输入密码,点击继续,然后等待

出现上述页面后,先不要急着进行下一步,默认的镜像源都是国外的,会很慢,换成国内镜像源,安装的就快很多。

需要先关闭刚才启动的Jenkins程序,

使用jps命令,查看当前运行的java程序,jps是jdk带的

使用命令

kill -9 8719

关闭jenkins程序

再次使用jps命令,确认是否已经关闭

根据上面获取密码的命令推断出jenkins的目录:/home/shizc/.jenkins/

我们进入其中的updates目录,进行文件修改

cd /home/shizc/.jenkins/updates

sed -i 's#updates.jenkins.io/download#ht…' default.json

sed -i 's#www.google.com#www.baidu.com#g' default.json

然后使用命令:

nohup java -jar /home/shizc/Documents/jenkins.war>/home/shizc/Documents/jenkins.out&

再次启动jenkins

然后就是点击安装推荐的插件、下一步是设置自己的用户和密码

接下来要设置全局的工具配置,jdk,git,maven

点击图中的设置项

点击保存

点击确定,创建出一个任务,会跳转到下一个页面

输入一下描述

输入需要自动部署的代码仓库地址,需要外网可访问。(单纯的内网环境,本文章不适用哦)

然后就到了核心部分

把编写的构建脚本内容,贴到里面。下面是脚本内容:

#!/bin/bash
#maven打包
mvn clean package
echo 'package ok!'
echo 'build start!'
cd ./
service_name="demo1"
service_port=10086
#查看镜像id 注意 asd 是 sudo时要用到的密码,如果你的服务器sudo是无需输入密码,则删除
IID=$(echo "asd" | sudo docker images | grep "$service_name" | awk '{print $3}')
echo "IID $IID"
if [ -n "$IID" ]
then
    echo "exist "$service_name" image,IID=$IID"
    #删除镜像
    echo "asd" | sudo docker rmi -f $service_name
    echo "delete $service_name"
    #构建
    echo "asd" | sudo docker build -t $service_name .
    echo "build $service_name"
else 
    echo "not exist "$service_name" image,build docker"
    #构建
    echo "asd" | sudo docker build -t $service_name .
    echo "build $service_name"
fi
#查看容器id
CID=$(echo "asd" | sudo docker ps | grep "$service_name" | awk '{print $1}')
echo "CID $CID"
if [ -n "$CID" ]
then
    echo "exist "$service_name" container,CID=$CID"
    #停止
    echo "asd" | sudo docker stop $service_name
    #删除容器
    echo "asd" | sudo docker rm $service_name
else
    echo "not exist "$service_name" container"
fi
#启动
echo "asd" | sudo docker run -d --name $service_name --net=host -p $service_port:$service_port $service_name

脚本的主要流程是: 打包->构建docker镜像->启动docker容器

当然为了节省磁盘空间,在脚本中加入判断用来删除旧的镜像和容器。当然要做版本控制的话,可以修改脚本。

以镜像的版本做项目的版本控制。例如: 可以存 demo:v1 - demo:v5 5个版本的镜像,超出的删除,依据具体情况使用不同版本的镜像启动容器即可。

然后点击保存按钮。进入到下一个页面。

点击 Build Now 按钮即可开始自动部署流程

下面我们修改一下代码,并把代码提交到仓库,然后点击构建,查看能否实现一键部署

提交代码,然后点击构建。

然后下方 会出现任务信息,点击那个时间,可以进入到详情页面。

进入到详情页面,点击控制台输出,可以看到,部署的整个过程,如果构建失败,也能看到失败的原因。根据原因修改配置或者脚本,然后再次点击构建。

看到成功标志,然后我们去浏览器,输入地址,查看返回内容是否是预期的内容.

嘿嘿,成功了。

这样,我们就可以为我们的每一个微服务创建一个任务,在代码更新后,手动点击构建,这样比较灵活。

除此之外,既然说的是自动部署,当然是可以实现代码提交后无需认为干预,程序自动好=构建部署。

这个时候就要使用到这个触发器了。可以设置轮训,不断检测代码有没有更新。但是我觉得一般情况下不使用全自动部署。这样会浪费资源。可以设置成定时部署的形式。到某一个时间点自动发布最新的代码。

本人也是初次使用jenkins自动部署,故做一下记录,忘了就可以翻翻看看。

更加规范高级的自动化部署应用就需要进一步学习探索了。如果你接触过大厂的自动化部署,流水线等,你就会发现是这我们说的这个是类似的,甚至是根据这个改造的。