jenkins+docker+portainer搭建持续集成环境
该demo基于centos7环境
说明:
- 准备2台以上服务器,该demo准备了master和node两台服务器192.168.10.17(master) 192.168.10.16(node)
- 所有服务器均安装docke
- jenkins portainer安装在master节点上
- eureka和zuul网关部署在master节点上
- springboot-service-a/springboot-service-b/springboot-service-c部署在node节点上
- spring-eureka-server 注册中心,端口7001
- springboot-service-a 服务a,端口7005
- spring-cloud-zuul 网关,端口7000
- springboot-service-b 服务b,端口7006,部署shell和springboot-service-a一样
- springboot-service-c 服务c,端口7007,部署shell和springboot-service-a一样
- 原理
- 所有springboot jar包构建通过安装在master节点的jenkins来完成
- jenkins所在节点(master节点)上docker部署直接通过jenkins执行shell来完成docker镜像构建和运行命令
- 通过jenkins Publish over SSH插件将构建好的jar包和Dockerfile发送到node节点上执行镜像构建和运行命令
一、安装docker
#安装依赖(docker依赖于系统的一些必要的工具,可以提前安装) yum install -y yum-utils device-mapper-persistent-data lvm2 #添加软件源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装docke-ce yum list docker-ce --showduplicates | sort -r #查看所有docker-ce版本 yum install -ysyst docker-ce-18.06.3.ce #启动服务 systemctl start/stop docker systemctl enable/disable docker #开机启动 #配置docker加速镜像 /etc/docker/daemon.json { "registry-mirrors": ["http://hub-mirror.c.163.com"] } #使配置生效 systemctl daemon-reload systemctl restart docker
二、安装java环境
#如果系统中已经安装了jdk,需要先卸载
rpm -qa grep | java #查找
rpm -e --nodeps java-1.6.0xxxxxx #卸载
java -version
1.在线安装 yum install -y java #安装jre yum install -y java-devel #原生安装,包含JDK 2.本地安装 1.下载linux jdk版本 "最新版本下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html" "历史版本下载地址: http://www.oracle.com/technetwork/java/javase/archive-139210.html" 2.上传解压 mkdir -p /user/local/java tar zxvf jdk-8u161-linux-x64.tar.gz -C /user/local/java 3.安装jdk依赖环境glibc,不安装后期容易出问题
安装命令 yum install glibc.i686 "报错cannot file file /usr/local/jdk1.7.0_79/lib/java......" "注:出现error 一个.so文件not found (未找到)那可能你的Linux版本 glibc版本还未达到2.4" "原因分析:linux 上安装jdk 1.7版本必须要配合 glibc 核心源码版本在2.4或以上" 4.配置环境 vim /etc/profile #最后加入 export JAVA_HOME=/usr/local/java/jdk1.8.0_161 export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar export PATH=$PATH:$JAVA_HOME/bin #加载配置 source /etc/profile 5.如果识别不到java建立软连接 ln -s /usr/local/jdk1.8.0_121/jdk/bin/java /usr/bin/java
三、安装jenkins
1.添加Jenkins库到yum库,Jenkins将从这里下载安装。 wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key yum install -y jenkins 2.如果不能安装就到官网下载jenkis的rmp包,官网地址(http://pkg.jenkins-ci.org/redhat-stable/) wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.7.3-1.1.noarch.rpm rpm -ivh jenkins-2.7.3-1.1.noarch.rpm #配置jenkis的端口 vi /etc/sysconfig/jenkins #启动jenkins service jenkins start/stop/restart
#将jenkins用户加入root组合docker组,以免以后执行时权限不足
gpasswd -a jenkins root
gpasswd -a jenkins docker
systemctl restart jenkins
#安装成功后Jenkins将作为一个守护进程随系统启动 #系统会创建一个“jenkins”用户来允许这个服务,如果改变服务所有者,同时需要修改/var/log/jenkins, #/var/lib/jenkins, 和/var/cache/jenkins的所有者 #启动的时候将从/etc/sysconfig/jenkins获取配置参数 #默认情况下,Jenkins运行在8080端口,在浏览器中直接访问该端进行服务配置 #Jenkins的RPM仓库配置被加到/etc/yum.repos.d/jenkins.repo #初始密码在:/var/lib/jenkins/secrets/initialAdminPassword #安装maven插件 Maven Integration "常见问题1" #如果缺少对应权限将jenkins用户加入对应用户组,否者构建时会报权限不足无法执行 gpasswd -a jenkins root #将用户jenkins加入到root组 gpasswd -a jenkins dockr #将用户jenkins加入到root组 "常见问题2" #构建maven项目时报找不到java环境,但在终端上java环境是可见的,解决办法 #1.简历软连接 ln -s /usr/local/jdk1.8.0_121/jdk/bin/java /usr/bin/java #2.在jenkins服务中配置java环境变量 vim /etc/init.d/jenkins #将正确的java路径填写到下面,重启服务 candidates=" /etc/alternatives/java /usr/lib/jvm/java-1.8.0/bin/java /usr/lib/jvm/jre-1.8.0/bin/java /usr/lib/jvm/java-1.7.0/bin/java /usr/lib/jvm/jre-1.7.0/bin/java /usr/lib/jvm/java-11.0/bin/java /usr/lib/jvm/jre-11.0/bin/java /usr/lib/jvm/java-11-openjdk-amd64 /usr/bin/java " systemctl restart jenkins
#安装插件
#手动安装插件下载地址http://updates.jenkins-ci.org/download/plugins/
#如果在线找找不到插件,从上面的下载地址 ctrl+f查找的插件下载后通过插件管理中心高级上传安装
1.jenkins安装maven插件
系统管理->插件管理->可选插件->Maven Integration plugin
2.jenkins安装Publish over SSH
系统管理->插件管理->可选插件->Publish over SSH
四、安装maven
wget http://mirrors.hust.edu.cn/apache/maven/maven-3/3.1.1/binaries/apache-maven-3.1.1-bin.tar.gz tar -zxvf apache-maven-3.1.1-bin.tar.gz 设置环境变量 vi /etc/profile #maven 安装的路径 export M2_HOME=/maven/maven export PATH=$PATH:$JAVA_HOME/bin:$M2_HOME/bin #使环境变量生效 source /etc/profile mvn -version
五、创建springCloud项目部署
master节点jenkins工程配置
注册中心spring-eureka-server配置
1.源码管理 Subversion(SVN) svn://gitee.com/zhangsike/springboot-learn/spring-eureka-server
2.构建触发器:选择轮询 SCM 配置 * * * * * 每分钟查询构建
3.构建环境:选择 Add timestamps to the Console Output
4. Pre Steps:POM:pom.xml,参数:clean package -Dmaven.test.skip=true
5.Post Steps
命令内容如下:
prjName=spring-cloud-zuul
if docker ps -a | grep -i $prjName; then
docker stop $prjName
docker rm -v -f $prjName
fi
if docker images | grep -i $prjName; then
docker rmi -f $prjName
fi
\cp 'target/'$prjName-'0.0.1-SNAPSHOT.jar' $prjName'-0.0.1-SNAPSHOT.jar'
docker build -t $prjName .
docker run -d --expose=7000 -p 7000:7000 --name $prjName $prjName':latest' --server.port=7001
如果docker中不存在对应容器,这段shell会执行失败(docker stop会error,后面就无法构建镜像和创建容器了),所以第一次构建前先手动创建好容器后续执行就正常了,
也可以用shell判断下容器如果存在再停止删除,但暂时不会写这样的shell,正在学习中。
该shell逻辑如下 停止容器-》删除容器-》删除镜像-》将jar包和Dockerfile复制到同一个目录中-》在jar包目录中构建镜像-》创建容器
jenkins项目创建完成,正常执行完毕后就可以看见容器中已经有运行的实例了
[root@slave2 spring-cloud-zuul]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2b43514c10bc spring-cloud-zuul:latest "java -jar /app.jar" 4 hours ago Up 4 hours 0.0.0.0:7000->7000/tcp spring-cloud-zuul bffb0834de15 spring-eureka-server:latest "java -jar /app.jar" 6 hours ago Up 5 hours 0.0.0.0:7001->7001/tcp spring-eureka-server 08326db2cbd7 springboot-demo:latest "java -jar /app.jar" 3 days ago Up 3 days 0.0.0.0:8081->8080/tcp springboot-demo b56abd94c813 portainer/portainer "/portainer" 6 days ago Up 3 days 0.0.0.0:9000->9000/tcp prtainer-test
spring-cloud-zuul项目创建jenkins工程和spring-eureka-server一致,只需修改源码和构建shell
shell改成下面即可
prjName=spring-cloud-zuul
if docker ps -a | grep -i $prjName; then
docker stop $prjName
docker rm -v -f $prjName
fi
if docker images | grep -i $prjName; then
docker rmi -f $prjName
fi
\cp 'target/'$prjName-'0.0.1-SNAPSHOT.jar' $prjName'-0.0.1-SNAPSHOT.jar'
docker build -t $prjName .
docker run -d --expose=7000 -p 7000:7000 --name $prjName $prjName':latest' --server.port=7000
node节点jenkins工程配置
除了Post steps不一致之外,其余配置均一致
执行逻辑:通过Publish over SSH插件 将构建好的springboot jar包和Dockerfile发送到远程主机构建镜像并启动
注意:由于运行在docker中的项目ip是容器ip,外网无法访问,所以在配置eureka客户端时要以主机ip注册,否则注册中心无法提供识别
yml文件如下
eureka: client: registerWithEureka: true fetchRegistry: true serviceUrl: defaultZone: http://admin:admin@192.168.10.17:7001/eureka/ instance: prefer-ip-address: true ip-address: 192.168.10.16 instance-id: 192.168.10.16:${server.port}
最终注册中心效果