jenkins+docker+portainer搭建持续集成环境

该demo基于centos7环境

说明:

  •   准备2台以上服务器,该demo准备了master和node两台服务器192.168.10.17(master) 192.168.10.16(node)
  1.   所有服务器均安装docke
  2.   jenkins portainer安装在master节点上
  3.   eureka和zuul网关部署在master节点上
  4.   springboot-service-a/springboot-service-b/springboot-service-c部署在node节点上
  5.   网关作为同一的访问入口,springboot-service-b通过feign组件调用springboot-service-a的方法
  6.   网关作为同一的访问入口,springboot-service-b通过feign组件调用springboot-service-a的方法
  1.   spring-eureka-server 注册中心,端口7001
  2.   springboot-service-a 服务a,端口7005
  3.   spring-cloud-zuul 网关,端口7000
  4.   springboot-service-b 服务b,端口7006,部署shell和springboot-service-a一样
  5.   springboot-service-c 服务c,端口7007,部署shell和springboot-service-a一样
  •   原理
  1.   所有springboot jar包构建通过安装在master节点的jenkins来完成
  2.   jenkins所在节点(master节点)上docker部署直接通过jenkins执行shell来完成docker镜像构建和运行命令
  3.   通过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}

  最终注册中心效果

posted @ 2019-12-30 16:51  zincredible  阅读(2558)  评论(0编辑  收藏  举报