概述
最近在写一个基于SpringBoot的小项目,由于每次部署到服务器都需要经历几个繁琐的过程,随在自己的服务器上安装了Jenkins和Docker实现自动化部署。至此,将整个过程记录如下。
安装与配置
Jenkins
-
个人倾向于使用
war
包部署,放在Tomcat-webapp目录下启动即可注意:将war包放在webapp目录下启动是会提示
ClassNotFound
等异常,经过一番寻找是项目本地缺少了Jackson依赖包,从Maven中央仓库下载后放置在${path}/tomcat/webapps/jenkins/WEB-INF/lib
目录下即可 -
启动后从
${path}/tomcat/logs/catalina.out
获取admin密码,配置JDK和Maven即可 -
若代码库在码云平台,在Jekins插件中心安装对应插件即可
- 参照官方文档在Jenkins平台配置即可
Docker
- 安装Docker-CE并设置阿里云加速镜像
至此,自动化部署所需的基础组件已安装完毕。
配置文件编写
此次自动化部署主要依赖两个文件
- Dockerfile:将我们的项目作为镜像导入Docker中
- 启动脚本:在重新部署项目时,完成Docker内进程的删除、镜像删除和项目启动
项目结构
三者应处于同级目录
编写Dockerfile
# 使用基础镜像
FROM java:8
# 环境变量
ENV TIME_ZONE Asia/Shanghai
# 维护者
MAINTAINER lhc <582895699@qq.com>
# 复制jar包
COPY target/adminlte-web-0.0.1-SNAPSHOT.jar /mnt
# 时区同步
RUN echo "${TIME_ZONE}" > /etc/timezone && \
ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime
# 启动
ENTRYPOINT ["java", "-Xmx500m","-XX:+UseG1GC", "-jar","/mnt/adminlte-web-0.0.1-SNAPSHOT.jar","-Dspring.profiles.active=test", "&"]
# 暴露端口
EXPOSE 8080 8090
配置容器内的工作路径为/mnt
,启动命令和端口接口
编写启动脚本
#!/usr/bin/env bash
APP_NAME_PREFIX="adminlte"
TAG_NAME=$(date -d today +"%H%M")
IMAGE_NAME=$APP_NAME_PREFIX:"$TAG_NAME"
# 删除镜像进程
delProcess() {
DOCKER_PS=$(docker ps -a | grep $APP_NAME_PREFIX | awk '{print $1}')
for i in $DOCKER_PS; do
if [ -n "$i" ]; then
docker stop "$i"
docker rm "$i"
fi
done
}
# 删除镜像
delImages() {
OLD_IMAG_IDS=$(docker images | grep $APP_NAME_PREFIX | awk '{print $1,$2}' | sed 's/[[:space:]]/:/')
for i in $OLD_IMAG_IDS; do
if [ -n "$i" ]; then
docker rmi "$i"
fi
done
}
# 构建新镜像
buildImage() {
docker build -t "$IMAGE_NAME" .
}
# 启动新镜像(部署两个实例)
dockerRun() {
for i in {8090..8091}; do
docker run -d --name "$APP_NAME_PREFIX"_$i -p $i:8080 "$IMAGE_NAME"
done
}
run() {
echo "脚本开始执行"
delProcess
delImages
buildImage
dockerRun
sleep 1
echo "执行结束"
}
run
执行
-
新建一个任务
-
添加自己的代码库(Gitee或GitHub)
-
配置构建脚本
脚本内容为
# 获取Jenkins工作目录为变量 WORKSPACE=${WORKSPACE} # 进入工作目录 cd $WORKSPACE # 执行maven instll命令 mvn clean install -DskipTests -e echo "install 成功" # 进入主目录 cd adminlte-web # 执行打包命令 mvn clean package -DskipTests -e # 启动部署脚本 sh run.sh
-
保存即可
执行流程
-
用户提交代码到代码托管平台
-
Jenkins从代码托管平台拉取最新的代码到服务器(宿主机)
-
在服务器(宿主机)执行maven命令,完成打包
-
执行
run.sh
,删除老进程并启动新镜像 -
通过
docker logs -f ${容器ID}
或portainer查看启动日志即可