前言

上篇文章简单介绍了如何安装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 ''

这里写图片描述
然后将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系统配置中配置 :
配置SSH Server

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 文件夹的内容
这里写图片描述

  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收到通知,开始自动构建:
这里写图片描述
这里写图片描述

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

查看私有仓库

最后一点差点忘记...
脚本最后是依据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

这里写图片描述
然后run 起来:

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

访问应用验证….

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

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐