您的位置:首页 > 运维架构 > Docker

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

2017-12-01 00:15 1246 查看
前言

安装 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/[/code] 
即配置成功!

参考资料: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 ''




然后将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系统配置
中配置 :



Passphrase 是私钥,案例中生成的时候没有配置,所以可以不填

Path to key id_rsa的路径

Name 配置的主机自定义名称,可以随便写,我这里和ip一致

HostName 就是ip了(B主机IP ,就是jenkins 要登录的其他主机)

Remote Directory 登录后的路径

jenkins job 配置

还是以上篇文章为例,前面配置一样,在
Post Steps
模块不在使用过多的shell 脚本,而是调用 B主机上的 shell 脚本,如下图



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 文件夹的内容



build_version.log 是记录build 的日志,记录了build 的 id 和git commit id 以及时间,根据这些我们可以做记录版本升级或者排查问题的资料

Dockerfile 构建docker image

docker.sh 实现动态构造images 管理docker 镜像和容器 以及启动容器和 push 镜像到私有仓库。

jdk-8u151-linux-x64.tar.gz jdk 安装包,用于制作image 的jdk环境

编译的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收到通知,开始自动构建:





然后访问自己的应用(我这里没做什么页面,访问的是阿里的连接池管理页面):



查看私有仓库

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


http://yourip:5000/v2/_catalog




可以查看到私有仓库的镜像,查看具体一个镜像的不同tags,通过下面的连接

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


验证镜像是否可用:

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

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




然后run 起来:

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


访问应用验证….

ps: 有不足之处还请多多指教,如有交流可留言或QQ联系: 1050215723
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: