基于gitlab-ci runner的Docker stack实践

##背景

公司现有的技术架构为分布式(粗粒度微服务)服务架构,代码版本管理工具使用的gitlab,部署是是通过Jenkins编译打包并部署的,看到原来的项目部署编写的*.sh很繁琐,故先在现有项目测试环境进行实验。

早就听闻gitlab可以集成CI CD 但一直没有尝试过,第一步当然是尝试将研发push的代码先编译,做个初步的编译异常提醒,参考了各种文章和官网文档,开始了接入runner
跟这篇文章过程一样,这里整理一下( [后端]gitlab之gitlab-ci自动部署 - 简书 https://www.jianshu.com/p/df433633816b)

###步骤

  • 安装GitLab-CI 这个不用安装了,装好GitLab就自带了

  • 安装GitLab-Runner
    在centOS上安装gitlab-ci-multi-runner

$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash
$ yum install gitlab-ci-multi-runner

这样就装好了gitlab-ci-multi-runner,然而我们只是装好了gitlab-runner,当然我们要接着向gitlab-CI注册这个runner,不然gitlab-CI在push事件到来的时候怎么知道要调用谁呢?这里也可以发现和webhook方式的区别,webhook方式是我们主动配置了一个连接给gitlab;gitlab-runner只要注册一下就好了。

  • 那么我们就注册一下
$ gitlab-ci-multi-runner register
#引导会让你输入gitlab的url,输入自己的url,例如http://gitlab.example.com/
#引导会让你输入token,去相应的项目下找到token,例如ase12c235qazd32
#引导会让你输入tag,一个项目可能有多个runner,是根据tag来区别runner的,输入若干个就好了,比如web,hook,deploy
#引导会让你输入executor,这个是要用什么方式来执行脚本,图方便输入shell就好了。

在输入 executor 类型的时候,我尝试过docker的形式 ,会让你选择依赖的镜像,我选择的是maven官方镜像,编译的时候会在一个容器中进行 每次都会启动一个容器,环境非常干净,但后面到我自己需要构建镜像的时候遇到问题,估计不能在容器中构建镜像,就unregister后重新register,然后选择shell的方式

  • 注册成功后gitlab里面可以看到

基于gitlab-ci runner的Docker stack实践_第1张图片

  • 编写.gitlab-ci.yml
    在项目根目录下编写.gitlab-ci.yml这样在push之后,gitlab-ci就会自动识别来解析了。我最初只是想要编译结果 所以是这样写的,关于这个文件的更多介绍,可以参考这篇文章 --》持续集成-通过 .gitlab-ci.yml配置任务 - RUNYUQINGBING的博客 - CSDN博客
    http://blog.csdn.net/RUNYUQINGBING/article/details/78608820
stages:
 - build

makejava:
  stage: build
  script:
    - mvn clean package -P test
    - mvn clean
  tags:
      - dev

到这一步后,我们提交的项目runner会自动帮我们编译,也会给gitlab反馈一个结果,比如

基于gitlab-ci runner的Docker stack实践_第2张图片

我们可以从中清晰的看到谁push的代码有问题,也可以点进去看到具体的错误

基于gitlab-ci runner的Docker stack实践_第3张图片
你可以 根据这个错误给相关的研发提issue或者重试一次
基于gitlab-ci runner的Docker stack实践_第4张图片
贴了这么多图片,差点忘了我们的目标,let’s 走
首先你手里得有几台虚拟机,我们用虚拟机搭建了一个docker集群,并为这个集群安装了可视化操作界面,集群的搭建你可以参考使用Docker Swarm模式搭建Swarm集群 - 简书
https://www.jianshu.com/p/df744c4e375e ,我们安装的web界面为portainer,你可以参考官方文档安装 Portainer | Simple management UI for Docker https://portainer.io/install.html
我们的装逼(操作)思路是将编译打包的结果构建成镜像,然后将镜像推送到阿里云镜像私有仓库,最后在Portainer界面中编写stack,最后的最后就是点击发射按钮,所以接下来天才第一步是

  • 怎么构建镜像呢?(这里有个前提,你需要在runner的机器上安装好JDK、MAVEN、Docker)这里我们需要使用到mvn的一个插件com.spotify的docker-maven-plugin 你可以参考这篇文章 1.7 Docker与微服务-使用Maven插件构建Docker镜像 - http://blog.csdn.net/qq_22841811/article/details/67369530 修改父级pom后是我的这样的
 
                    com.spotify
                    docker-maven-plugin
                    ${docker.plugin.version}
                    
                        
                            package
                            
                                build
                            
                        
                    
                    
                         
                        
                        ${docker.image.prefix}/${project.artifactId}
                        ${project.basedir}/
                        
                            
                                /
                                ${project.build.directory}
                                ${project.build.finalName}.jar
                            
                        
                    
                

因为我们的模块项目中有war包 所以具体的子pom里面可能为(注意一个是.jar 一个是.war)


                com.spotify
                docker-maven-plugin
                
                    
                    
                    ${docker.image.prefix}/${project.artifactId}
                    ${project.basedir}/
                    
                        
                            /
                            ${project.build.directory}
                            ${project.build.finalName}.war
                        
                    
                
            

除此之外还需要在需要的(子)项目根目录增加Dockerfile文件来描述镜像构建过程,我这里贴出两种Dockerfile,一种为Dubbo的生产者jar的,一种是Dubbo的消费者war包的

FROM java:8
VOLUME /tmp
COPY target/*.jar app.jar
COPY target/lib/ /lib/

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN bash -c 'touch /app.jar'

CMD java -Djava.security.egd=file:/dev/./urandom -Dfile.encoding=utf-8 -Duser.timezone=GMT+08 -server -jar /app.jar
FROM tomcat:8.5
VOLUME /tmp
RUN rm -rf /usr/local/tomcat/webapps && mkdir /usr/local/tomcat/webapps
COPY target/*.war /usr/local/tomcat/webapps/ROOT.war

ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

CMD ["catalina.sh", "run"]

部分目录结构贴个图吧
基于gitlab-ci runner的Docker stack实践_第5张图片
因为前面已经将docker镜像的构建个maven的package绑在了一起,所以我们修改了.gitlab-ci.yml 使其完成后面的打包、构建镜像并推送到仓库的过程,

stages:
 - build
 - tagpushimage

variables:
  xxxxxx_order_service: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-order-service:latest
  xxxxxx_product_service: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-product-service:latest
  xxxxxx_user_service: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-user-service:latest
  xxxxxx_webapp_app: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-webapp-app:latest
  xxxxxx_webapp_center: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-webapp-center:latest
makejava:
  stage: build
  script:
    - mvn clean package -P test
    - mvn clean
  tags:
      - dev
tag_push_images:
  stage: tagpushimage
  when: manual
  script:
    - docker tag gpf/xxxxxx-order-service:latest $xxxxxx_order_service
    - docker tag gpf/xxxxxx-product-service:latest $xxxxxx_product_service
    - docker tag gpf/xxxxxx-user-service:latest $xxxxxx_user_service
    - docker tag gpf/xxxxxx-webapp-app:latest $xxxxxx_webapp_app
    - docker tag gpf/xxxxxx-webapp-center:latest $xxxxxx_webapp_center
    - docker login [email protected] -p passwd registry.cn-shanghai.aliyuncs.com
    - docker push  $xxxxxx_order_service
    - docker push  $xxxxxx_product_service
    - docker push  $xxxxxx_user_service
    - docker push  $xxxxxx_webapp_app
    - docker push  $xxxxxx_webapp_center
  tags:
      - dev
 

关于这个文件的编写,你可以参考使用 Docker 构建 | Live Digital http://livedig.com/733

至此,我们到了推送镜像完成的过程

下面我们需要编写stack需要的描述文件,这个和docker-compose.yml的编写感觉很像,这里也有给你参考学习的文章 Compose file version 3 reference | Docker ocumentation
https://docs.docker.com/compose/compose-file/#reference-and-guidelines

version: '3'
services:
  zookeeper:
    image: 'registry.aliyuncs.com/acs-sample/zookeeper:3.4.8'
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    hostname: zookeeper
    networks:
      - xxxxxxnetwork
    ports:
      - "2181:2181"
  xxxxxx-order-service:
    image: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-order-service:latest
    depends_on:
      - zookeeper
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    networks:
      - xxxxxxnetwork
  xxxxxx-user-service:
    image: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-user-service:latest
    depends_on:
      - zookeeper
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    networks:
      - xxxxxxnetwork
  xxxxxx-product-service:
    image: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-product-service:latest
    depends_on:
      - zookeeper
    networks:
      - xxxxxxnetwork
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
  xxxxxx-webapp-center:
    image: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-webapp-center:latest
    depends_on:
      - zookeeper
    networks:
      - xxxxxxnetwork
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    ports:
      - "8080:8080"
  xxxxxx-webapp-app:
    image: registry.cn-shanghai.aliyuncs.com/sssss/xxxxxx-webapp-app:latest
    depends_on:
      - zookeeper
    deploy:
      replicas: 2
      restart_policy:
        condition: on-failure
    networks:
      - xxxxxxnetwork
    ports:
      - "8060:8080"
networks:
  xxxxxxnetwork:

你需要注意的是你的linux防火墙端口是否打开,还有portainer有点问题,查看service是正常的,但是显示容器的状态的时候不正常。转载需要注明出处以及url可点击直达链接(http://blog.csdn.net/zhangruhong168/article/details/78924700),欢迎评论探讨。

转载于 http://blog.c7d8.com/blog/23.html ,原文可能有更新,以原文为准

你可能感兴趣的:(docker,微服务)