jenkins+maven+docker+github全自动化部署SpringBoot
2017-12-01 00:15
1246 查看
前言
安装 Dokcer
搭建Docker 私有仓库
配置免密登录
配置jenkins
配置Publish Over SSH
jenkins job 配置
Dockerfile
dockersh
查看私有仓库
jenkins安装参考
安装环境:Ubuntu 14.04.2
为了方便后面的操作,建议安装docker时使用root身份…
这里使用了国内源,方便下载,为了确认所下载软件包的合法性,需要添加软件源的 GPG 密钥。
然后,我们需要向 source.list 中添加 Docker 软件源
更新 apt 软件包缓存,并安装 docker-ce:
运行
配置国内加速源
Ubuntu 14.04、Debian 7 Wheezy
DOCKER_OPTS 中添加获得的加速器配置:
重新启动服务。
显示
安装 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.5docker pull registry:2.5
开始下载registry imagesdocker 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
相关文章推荐
- jenkins自动化部署搭建。jenkins+docker+maven+git+springboot
- SpringBoot + maven + Jenkins + docker 实现docker集群一键自动化部署
- jenkins+maven+docker+github全自动化部署SpringBoot
- 使用jenkins+github+tomcat实现Springboot半自动化部署
- 在搭建基于jenkins+maven+git+docker的全自动化部署时遇到的问题
- Jenkins+github+maven自动构建发布SpringBoot项目
- jenkins + docker + maven + git(阿里云code) 部署spring-cloud-eureka
- jenkins+windows+springboot+.net项目自动化部署图文教程
- 二. Spring Boot使用DockerFile maven插件自动化部署
- jenkins-整合git ssh maven spring-boot实现一键部署启动
- jenkins&docker自动化部署maven项目
- Springboot Gitlab Jenkins Maven Docker 持续集成/持续交付
- 0基础教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)
- Jenkins+docker+git+maven 实现自动化部署
- 使用maven集成docker构建和部署Spring Boot 应用
- Jenkins-Docker-SpringBoot-java-git-gradle-持续集成与自动部署-实现跨服务器部署
- Git+Spring-boot+Docker+ Maven +Registry私有仓库 +jenkins 持续集成测试
- centos+Docker +Jenkins 自动化部署配置
- svn + jenkins + maven 实现java环境的自动化构建和部署