jenkins+maven+docker+github全自动化部署SpringBoot

      • 前言
      • 安装 Dokcer
        • 搭建Docker 私有仓库
      • 配置免密登录
      • 配置jenkins
        • 配置Publish Over SSH
        • jenkins job 配置
      • Dockerfile
        • dockersh
      • 查看私有仓库

前言

上篇文章简单介绍了如何安装jenkins和使用maven+github webhooks实现自动编译和发布项目,这篇文章将分享一下:jenkins调用远程脚本配合docker完成CI/CD.

jenkins安装参考

安装 Dokcer

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的容器。在Dcoker上编译通过测试的应用可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台

安装环境:Ubuntu 14.04.2
为了方便后面的操作,建议安装docker时使用root身份…

  sudo apt-get update

这里使用了国内源,方便下载,为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。

curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

然后,我们需要向 source.list 中添加 Docker 软件源

$ sudo add-apt-repository \
    "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
    $(lsb_release -cs) \
    stable"

更新 apt 软件包缓存,并安装 docker-ce:

 sudo apt-get update
 sudo apt-get install docker-ce

运行

   docker -v
   #打印如下:
   Docker version 17.09.0-ce, build afdb6d4

配置国内加速源

Ubuntu 14.04、Debian 7 Wheezy
DOCKER_OPTS 中添加获得的加速器配置:

vim /etc/default/docker 
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"

重新启动服务。

 service docker restart
 #使用docker info 查看
 docker info

显示Registry Mirrors:
https://registry.docker-cn.com/

即配置成功!

参考资料:Docker安装【转载】

搭建Docker 私有仓库

我这里使用了2台主机做测试,其中A 主机安装了 Jenkins 和Docker私有仓库(ps: docker 私有仓库是一个docker image 所以两台主机都要安装docker)

docker官方仓库地址
https://hub.docker.com/explore/

搜索 registry 复制 docker pull registry 然后点击 Tags 选择一个tag,案例中使用的2.5

docker pull registry:2.5

开始下载registry images
这里写图片描述

docker run -itd -p 5000:5000 -v /usr/local/registry:/var/lib/registry --name registry registry:2.5

启动容器,并指定5000做为端口,把registry 仓库挂载到/usr/local/registry(地址可改),容器的名字为:registry,运行:

docker ps

这里写图片描述
启动成功
ps:后面可能有一个坑,这里提前说一下:

docker registry push错误“server gave HTTP response to HTTPS client”
后面的push 的时候会有一个这样的错误,可以通过下面的方法解决:
在 /etc/docker 添加一个 daemon.json ,内容为:{ "insecure-registries":["主机ip:5000"] } 然后 service docker restart(ps: 注意引号是英文格式)
参考资料:docker registry push错误“server gave HTTP response to HTTPS client”转载

配置免密登录

方便jenkins配置和操作,对两台主机进行免密登录配置:
分别在两台主机运行如下命令:

ssh-keygen -t dsa -P ''

jenkins+maven+docker+github全自动化部署SpringBoot_第1张图片
然后将A 主机中的id_dsa.pub 添加到B 主机的id_dsa ,然后把B主机的放到A主机里面即可(ps: 把id_dsa.pub 追加到authorized_keys 里面不是覆盖…双向免密登录,如果只想一方登录 只需要在一方配置即可…)
然后在 A 主机上 ssh 10.3.3.2 把ip 换成B主机即可登录到 B主机,使用 exit 可以退回到 A主机,下面开始正文…

配置jenkins

配置Publish Over SSH

前面 jenkins安装 文章里面已经提到需要安装 Publish Over SSH插件,安装过后即可在jenkins系统配置中配置 :
jenkins+maven+docker+github全自动化部署SpringBoot_第2张图片

Passphrase 是私钥,案例中生成的时候没有配置,所以可以不填
Path to key id_rsa的路径
Name 配置的主机自定义名称,可以随便写,我这里和ip一致
HostName 就是ip了(B主机IP ,就是jenkins 要登录的其他主机)
Remote Directory 登录后的路径

jenkins job 配置

还是以上篇文章为例,前面配置一样,在 Post Steps 模块不在使用过多的shell 脚本,而是调用 B主机上的 shell 脚本,如下图
jenkins+maven+docker+github全自动化部署SpringBoot_第3张图片

1.SSH Server Name 就是前面配置的Publish Over SSH 的名称

2.Source files 是指源文件位置,这个位置是在jenkins的工作目录下的job文件在内 (root/.jenkins/workspace/testJenkinsSSH 默认路径 testJenkinsSSH是我的job名称, maven 编译后会在此文件内创建 target 目录)

3.Remove prefix 删除前缀 target

4.Remote directory 远程目录,结合前面Publish Over SSH配置就是 /root/test 目录,这些配置完毕以后, jenkins 在编译成功后,就会自动把 文件 copy 到 B主机下的/root/test

Exec command 这个是要执行的脚本,我这里的操作是吧 B 主机 /root/test 的文件 复制到 我自己的 /usr/local/project/docker-test下 然后进入到此目录,执行我的 docker.sh 脚本 脚本需要2个参数 一个是 BUILD_NUMBER 这个是 jenkins build 的次数 GIT_COMMIT是git commit id 主要用于做日志和简单版本控制。

下面是我的docke-test 文件夹的内容
这里写图片描述

  1. build_version.log 是记录build 的日志,记录了build 的 id 和git commit id 以及时间,根据这些我们可以做记录版本升级或者排查问题的资料
  2. Dockerfile 构建docker image
  3. docker.sh 实现动态构造images 管理docker 镜像和容器 以及启动容器和 push 镜像到私有仓库。
  4. jdk-8u151-linux-x64.tar.gz jdk 安装包,用于制作image 的jdk环境
  5. 编译的springboot jar 需要装到容器里面

Dockerfile

FROM ubuntu:16.04
MAINTAINER modian(1050215723@qq.com)
ADD jdk-8u151-linux-x64.tar.gz /usr/local/jdk8
ENV JAVA_HOME /usr/local/jdk8/jdk1.8.0_151  
ENV JRE_HOME $JAVA_HOME/jre  
ENV CLASSPATH :$JAVA_HOME/lib:$JRE_HOME/lib  
ENV PATH $PATH:$JAVA_HOME/bin  
ARG app
ADD $app app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

docker.sh

这里面的脚本只是搞定方案可行,未考虑实际项目情况,仅供参考…

 #!/bin/bash
cd /usr/local/project/docker-test
rm -rf /root/test/*
#jenkins job Id
BUILD_ID=$1
# git commit id 
COMMIT_ID=$2
#container name use the project name
CONTAINER_NAME=springboot01
#image name 
IMAGES_NAME=ubuntu/$CONTAINER_NAME
# write log for build
echo "build_id:"$1" commit_id:"$2"  buildtime:"`date "+%Y-%m-%d %H:%M:%S"`>>build_version.log
# get file path and file name
FILENAME=$(find -name SpringBoot01**.jar)
JARNAME=${FILENAME##*/}
chmod  777 $JARNAME
if [ -z "$JARNAME" ]
then
    echo "not find :"$JARNAME
    exit
else
    echo "find app:"$JARNAME
fi
#stop and rm container and images 
docker stop $CONTAINER_NAME
docker rm $CONTAINER_NAME
# delete image
IMAGE_ID=$(docker images | grep "$IMAGES_NAME" | awk '{print $3}')
echo "iam:"$IMAGE_ID
if [ -z "$IMAGE_ID" ]
then
    echo no images need del
else
    echo "rm images:" $IMAGE_ID
    docker rmi -f $IMAGE_ID
fi
#编译docker file 并动态传入参数
docker build --build-arg app=$JARNAME .  -t  $IMAGES_NAME:$BUILD_ID
rm $JARNAME
# docker run  expose port 8181 
docker run -itd -p 8383:8181 --name $CONTAINER_NAME  $IMAGES_NAME:$BUILD_ID
# docker tag and push registry
docker tag $IMAGES_NAME:$BUILD_ID 10.32.20.31:5000/$IMAGES_NAME:$BUILD_ID
docker push 10.32.20.31:5000/$IMAGES_NAME:$BUILD_ID

里面的ip(10.32.20.31) 需要换成自己Docker 私有仓库的ip

提交git hub push ,jenkins收到通知,开始自动构建:
jenkins+maven+docker+github全自动化部署SpringBoot_第4张图片
jenkins+maven+docker+github全自动化部署SpringBoot_第5张图片

然后访问自己的应用(我这里没做什么页面,访问的是阿里的连接池管理页面):
jenkins+maven+docker+github全自动化部署SpringBoot_第6张图片

查看私有仓库

最后一点差点忘记...
脚本最后是依据Dockerfile 构建的镜像push到了私有仓库,我们可以通过
http://yourip:5000/v2/_catalog 

这里写图片描述
可以查看到私有仓库的镜像,查看具体一个镜像的不同tags,通过下面的连接

#v2 后面是镜像的名称
http://yourip:5000/v2/ubuntu/springboot01/tags/list

这里写图片描述
验证镜像是否可用:

在另外一台主机或者C主机(安装Docker),pull 之前push 的镜像:

#格式 docker pull  私服ip:端口/images_name:tag
docker pull yourip:5000/ubuntu/springboot01:15

jenkins+maven+docker+github全自动化部署SpringBoot_第7张图片
然后run 起来:

# docker run 可以时候 镜像名称:tag 也可以使用镜像id ,推荐使用前者
docker run -itd -p 8383:8181 --name test 3fda25963585

访问应用验证….

ps: 有不足之处还请多多指教,如有交流可留言或QQ联系: 1050215723

你可能感兴趣的:(Jenkins,docker,springboot,maven,ubuntu)