概述
最近在写一个基于SpringBoot的小项目,由于每次部署到服务器都需要经历几个繁琐的过程,随在自己的服务器上安装了Jenkins和Docker实现自动化部署。至此,将整个过程记录如下。
安装与配置
Jenkins
-
安装JDK和Maven 此处呢内容自行安装,不做描述 -
访问官网 下载即可(若下载速度太慢,从华为云镜像站下载即可)
-
个人倾向于使用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
# 文件路径
WORKDIR /mnt
# 复制文件
COPY target/adminlte-web-0.0.1-SNAPSHOT.jar .
# 启动命令
ENTRYPOINT ["java","-Xmx500m", "-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) -
配置构建脚本 脚本内容为
WORKSPACE=${WORKSPACE}
cd $WORKSPACE
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查看启动日志即可
参考资料
- Dockerfile reference
- Best practices for writing Dockerfiles
- Build your Java image
阅读原文
|