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

概述

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

安装与配置

Jenkins

  1. 安装JDK和Maven

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

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

基于Docker、Jenkins实现自动化部署_第1张图片

  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插件中心安装对应插件即可

基于Docker、Jenkins实现自动化部署_第2张图片

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

基于Docker、Jenkins实现自动化部署_第3张图片

Docker

  1. 安装Docker-CE并设置阿里云加速镜像

至此,自动化部署所需的基础组件已安装完毕。

配置文件编写

此次自动化部署主要依赖两个文件

  • Dockerfile:将我们的项目作为镜像导入Docker中
  • 启动脚本:在重新部署项目时,完成Docker内进程的删除、镜像删除和项目启动

项目结构

基于Docker、Jenkins实现自动化部署_第4张图片

三者应处于同级目录

编写Dockerfile

# 使用基础镜像
FROM java:8
# 环境变量
ENV TIME_ZONE Asia/Shanghai
# 维护者
MAINTAINER lhc <[email protected]>
# 复制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. 新建一个任务

    基于Docker、Jenkins实现自动化部署_第5张图片

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

    基于Docker、Jenkins实现自动化部署_第6张图片

  3. 配置构建脚本

    基于Docker、Jenkins实现自动化部署_第7张图片

    脚本内容为

    # 获取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查看启动日志即可

    基于Docker、Jenkins实现自动化部署_第8张图片

补充

Jenkins 参数化构建

参考资料

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

阅读原文

你可能感兴趣的:(工具,jenkins,docker,自动化,shell)