概念

  • 服务治理遇到的问题

    • 在微服务项目中每个服务都是独立运行的我的项目
    • 不可能对每个我的项目进行手动部署,波及到自动化运维的问题

      继续集成

  • 继续集成(Continues Integration,简称CI)
  • 继续集成指的是,频繁(一天屡次)地将代码集成到骨干,长处有两个:

    • 疾速发现错误: 每实现一点更新, 就集成到骨干,能够疾速发现错误,定位谬误
    • 避免分支大幅偏离主题: 如果不是常常集成,骨干又在不断更新,会导致当前集成难度变大,甚至难以集成
  • 继续集成强调:开发人员提交了新的代码之后,立刻进行构建,(单元)测试,依据测试后果,确定新代码和原有代码是否集成到一起
  • 与集成相干的概念还有继续交付和继续部署

    应用GitLab继续集成
  • GitLab8.0当前,GitLab CI就曾经集成在GitL中,只有在我的项目中增加一个 .gitlab-ci.yml文件,而后增加一个Runner,就能够进行继续集成
  • Pipeline

    • Pipeline: 管道 ,一次Pipeline相当于一次构建工作,能够蕴含多个流程:装置依赖,运行测试,编译,部署测试服务器,部署生产服务器等流程
    • 任何提交或者Merge Request的合并都能够触发Pipeline
  • Stages

    • Stages示意构建阶段,也就是下面的流程,能够在一次Pipeline中构建多个Stages,这些Stages的特点:

      • 所有Stages会依照程序运行: 即当一个Stage实现后,下一个Stage才会开始
      • 只有当所有Stages实现后,该构建工作(Pipeline)才会胜利
      • 如果任何一个Stage失败,那么后续的Stages都不会执行,该构建工作(Pipeline)失败
  • Jobs

    • Jobs示意构建工作,示意某个Stage外面执行的工作,能够在Stages里定义多个Jobs,这些Jobs特点:

      • 雷同Stage中的Jobs会并行执行
      • 雷同Stage中的Jobs都执行胜利时,该Stage才会执行胜利
      • 如果任何一个Job失败,那么该Stage失败,即构建工作(Pipeline)失败

        继续交付

  • 继续交付(Continuous Delivery):

    • 频繁地将软件的新版本,交付给品质团队或用户以供评审
    • 评审通过,代码就进入生产阶段
  • 继续交付是继续集成的下一步,强调的是:不管怎么更新,软件是随时随地能够交付的
  • 继续交付是在继续集成的根底上,将集成后的代码部署到更靠近实在运行环境的类生产环境(production-like environment)中

    继续部署

  • 继续部署(Continuous Deployment)是继续交付的下一步,指的是代码通过评审后,主动部署到生产环境
  • 继续部署的指标: 代码在任何时刻都是可部署的,可进入生产阶段
  • 继续部署的前提: 自动化实现测试,构建,部署等步骤

    GitLab Runner

    GitLab CI

  • 一般来说,构建工作会占用很多的系统资源(编译代码时),因为GitLab CI是GitLab的一部分,由GitLab CI来运行构建工作的化,GitLab的性能会大大降落
  • GitLab CI最大的作用: 是治理各个我的项目的构建状态

    GitLab Runner

  • GitLab Runner能够装置到不同的机器上,在构建工作运行期间不会影响GitL的性能
  • 基于Docker装置GitLab Runner:

    1.创立工作目录: /usr/local/docker/runner2.创立构建目录: /usr/local/docker/runner/environment3.下载jdk-8u152-linux-x64.tar.gz复制到/usr/local/docker/runner/environment4.下载apache-maven-3.5.3-bin.tar.gz复制到/usr/local/docker/runner/environmentdaemon.json1.在/usr/local/docker/runner/environment目录下创立daemon.json,用于配置加速器和仓库地址-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------{  "registry-mirrors":[      "https://registry.docker-cn.com"  ],  "insecure-registries":[      "127.0.0.1:5000"  ]}----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------Dockerfile1.在 /usr/local/docker/runner/environment目录下创立Dockerfile---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------FROM gitlab/gitlab-runnerMAINTAINER Lusifer <topsale@vip.qq.com># 批改软件源RUN echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse' > /etc/apt/sources.list && \  echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse' >> /etc/apt/sources.list && \  echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse' >> /etc/apt/sources.list && \  echo 'deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse' >> /etc/apt/sources.list && \  apt-get update -y && \  apt-get clean# 装置 DockerRUN apt-get -y install apt-transport-https ca-certificates curl software-properties-common && \  curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - && \  add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" && \  apt-get update -y && \  apt-get install -y docker-ceCOPY daemon.json /etc/docker/daemon.json# 装置 Docker ComposeWORKDIR /usr/local/binRUN wget https://raw.githubusercontent.com/topsale/resources/master/docker/docker-composeRUN chmod +x docker-compose# 装置 JavaRUN mkdir -p /usr/local/javaWORKDIR /usr/local/javaCOPY jdk-8u152-linux-x64.tar.gz /usr/local/javaRUN tar -zxvf jdk-8u152-linux-x64.tar.gz && \  rm -fr jdk-8u152-linux-x64.tar.gz# 装置 MavenRUN mkdir -p /usr/local/mavenWORKDIR /usr/local/maven# RUN wget https://raw.githubusercontent.com/topsale/resources/master/maven/apache-maven-3.5.3-bin.tar.gzCOPY apache-maven-3.5.3-bin.tar.gz /usr/local/mavenRUN tar -zxvf apache-maven-3.5.3-bin.tar.gz && \  rm -fr apache-maven-3.5.3-bin.tar.gz# COPY settings.xml /usr/local/maven/apache-maven-3.5.3/conf/settings.xml# 配置环境变量ENV JAVA_HOME /usr/local/java/jdk1.8.0_152ENV MAVEN_HOME /usr/local/maven/apache-maven-3.5.3ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/binWORKDIR /--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------docker-compose.yml在 /usr/local/docker/runner 目录下创立 docker-compose.yml---------------------------------------------------------------------------------------------------------------------------------------------------------------------------# 示意从 environment 目录下寻找 Dockerfile,即在Docker 里装 Dockerversion: '3.1'services:gitlab-runner:  build: environment  restart: always  container_name: gitlab-runner  privileged: true  volumes:    - ./config:/etc/gitlab-runner    - /var/run/docker.sock:/var/run/docker.sock------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  • 构建镜像并启动

    • 在/usr/local/docker/runner目录下执行:

      docker-compose build
  • 注册 Runner

    • 启动容器在/usr/local/docker/runner目录下执行命令启动:

      docker-compose up 
    • 进入容器主动执行注册流程,在/usr/local/docker/runner目录下执行(前面gitlab-runner register时脚本命令):

      docker exec -it gitlab-runner gitlab-runner register
    • 关上 GitLab,进入继续集成设置界面

      • 在交互式终端中填入 Git Lab 提供的 URL 和 token

        Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):http://192.168.1.21/Please enter the gitlab-ci token for this runner:kTx_PUnx_hhy63pNJtqMPlease enter the gitlab-ci description for this runner:[c77b5e39a2a6]: Please enter the gitlab-ci tags for this runner (comma separated):Registering runner... succeeded                     runner=kTx_PUnxPlease enter the executor: docker, shell, ssh, docker-ssh+machine, docker+machine,     kubernetes, docker-windows, docker-ssh, parallels, virtualbox:shellRunner registered successfully. Feel free to start it, but if it's running already the config   should be automatically reloaded! 
        docker exec -it gitlab-runner gitlab-runner register# 交互式配置阐明:# 输出GitLab地址Please enter the gitlab-ci coordinator URL(e.g. https://gitlab.com/)http://192.168.32.255/# 输出GitLab TokenPlease enter the gitlab-ci token for this runner:kTx_PUnx_hhy63pNJtqM# 输出Runner的阐明Please enter the gitlab-ci description for this runner:能够不填为空# 设置Tag,用于指定在构建规定的tag时触发ci,如果不设置,默认每次都会触发ciPlease enter the gitlab-ci tags for this runner (comma separate):deploy# 这里抉择true,用于代码上传后间接执行Whether to run utagged builds [true/false]:true# 这里抉择false,能够间接回车,默认falseWhether to lock Runner to current project [true/false]:false# 抉择runner执行器,这里抉择shellPlease enter the executor: virtualbox,docker+machine,parallels,shell,ssh,docker-ssh+machine,kubernetes,docker,docker-ssh:shell

      应用Runner

  • 在我的项目工程下编写 .gitlab-ci.yml文件:

    stages: - install_deps - test - build - deploy_test - deploy_productioncache: key: ${CI_BUILD_REF_NAME} paths:- node_modules/- dist/# 装置依赖install_deps: stage: install_deps only:- develop- master script:- npm install# 运行测试用例test: stage: test only:- develop- master script:- npm run test# 编译build: stage: build only:- develop- master script:- npm run clean- npm run build:client- npm run build:server# 部署测试服务器deploy_test: stage: deploy_test only:- develop script:- pm2 delete app || true- pm2 start app.js --name app# 部署生产服务器deploy_production: stage: deploy_production only:- master script:- bash scripts/deploy/deploy.sh

    提交我的项目之后,就会执行Runner

  • 在我的项目工程下创立docker文件夹,创立Dockerfile

    FROM openjdk:8-jreMAINTAINER Chova# 环境变量ENV APP_VERSION 1.0.0-SNAPSHOT# Docker插件,用来检测依赖项,只有依赖项启动才会启动ENV DOCKERIZE_VERSION v0.6.1RUN wget https://github.com/jwilder/dockerize/release/download/$DOCKERIZE_VERSION/dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \  && tar -C /usr/local/bin -xzvf dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz \  && rm dockerize-linux-amd64-$DOCKERIZE_VERSION.tar.gz RUN mkdir /appCOPY myshop-service-user-provider-$APP_VERSION.jar /app/app.jarENTRYPOINT ["dockerize", "-timeout", "5m", "-wait", "tcp://192.168.32.255.131:3306", "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar"]EXPOSE 8501
  • Dockerfile:

    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------FROM openjdk:8-jdk-alpineVOLUME /tmpARG JAR_FILECOPY ${JAR_FILE} app.jarENTRYPOINT ["java","-jar","/app.jar"]---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------1.FROM: 这是引入一个父镜像,在此基础上进行增加只读层.镜像能够了解成由一层层只读层组成,      FORM上面的命令,能够了解就是在已有的只读层,增加只读层.FORM能够有多个,但最下面的肯定是FROM命令2.VOLUME: 配置一个具备长久化性能的目录,主机 /var/lib/docker 目录下创立了一个临时文件,并链接到容器的/tmp.该步骤是能够省略的        默认状况下,容器不应用任何 volume,此时,容器的数据被保留在容器之内,它只在容器的生命周期内存在,会随着容器的被删除而被删除        如果不想在容器删除后,容器的数据也被删除,那么就能够指定长久化目录.它被设计用来保留数据,而不论容器的生命周期.因而,当你删除一个容器时,Docker不会主动地删除一个volume3.ARG:设置编译镜像时退出的参数,能够省略4.COPY:只反对将本地文件复制到容器,还有个ADD更弱小但简单点5.ENTRYPOINT:容器启动时执行的命令
  • 删除所有为<none>的镜像

    docker rmi $(docker images -q -f dangling=true)
  • 在docker-compose.yml中配置默认应用曾经存在的网络

    version: '3.1'services:myshop-service-user-provider:  image: 192.168.32.255:5000/myshop-service-user-provider:v1.0.0  container_name: myshop-service-user-provider  ports:    - 8501:8501    - 22222:22222    - 20881:20881  # 配置容器连贯的网络networks:default:  external:    name: dubbo