基于Docker、Jenkins实现自动化部署

概述

最近在写一个基于SpringBoot的小项目,由于每次部署到服务器都需要经历几个繁琐的过程,随在自己的服务器上安装了Jenkins和Docker实现自动化部署。至此,将整个过程记录如下。

安装与配置

Jenkins

  1. 安装JDK和Maven

    此处呢内容自行安装,不做描述

  2. 访问官网 下载即可(若下载速度太慢,从华为云镜像站下载即可)

在这里插入图片描述

  1. 个人倾向于使用war包部署,放在Tomcat-webapp目录下启动即可

    注意:将war包放在webapp目录下启动是会提示ClassNotFound等异常,经过一番寻找是项目本地缺少了Jackson依赖包,从Maven中央仓库下载后放置在${path}/tomcat/webapps/jenkins/WEB-INF/lib目录下即可

  2. 启动后从${path}/tomcat/logs/catalina.out获取admin密码,配置JDK和Maven即可

  3. 若代码库在码云平台,在Jekins插件中心安装对应插件即可

在这里插入图片描述

  1. 参照官方文档在Jenkins平台配置即可

在这里插入图片描述

Docker

  1. 安装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

执行

  1. 新建一个任务

    在这里插入图片描述

  2. 添加自己的代码库(Gitee或GitHub)

    在这里插入图片描述

  3. 配置构建脚本

    在这里插入图片描述

    脚本内容为

    # 获取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
    
  4. 保存即可

执行流程

  1. 用户提交代码到代码托管平台

  2. Jenkins从代码托管平台拉取最新的代码到服务器(宿主机)

  3. 在服务器(宿主机)执行maven命令,完成打包

  4. 执行run.sh,删除老进程并启动新镜像

  5. 通过docker logs -f ${容器ID}portainer查看启动日志即可

    在这里插入图片描述

补充

Jenkins 参数化构建

参考资料

  1. Dockerfile reference
  2. Best practices for writing Dockerfiles
  3. Build your Java image

阅读原文

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值