写点什么

微服务项目部署实践:使用 GitLab Runner 实现微服务项目的持续集成,持续交付和持续部署

发布于: 2021 年 05 月 19 日
微服务项目部署实践:使用GitLab Runner实现微服务项目的持续集成,持续交付和持续部署

概念

  • 服务治理遇到的问题

  • 在微服务项目中每个服务都是独立运行的项目

  • 不可能对每个项目进行手动部署,涉及到自动化运维的问题

持续集成

  • 持续集成(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/environment

daemon.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/bin
WORKDIR /--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
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_hhy63pNJtqM  Please 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_PUnx Please enter the executor: docker, shell, ssh, docker-ssh+machine, docker+machine, kubernetes, docker-windows, docker-ssh, parallels, virtualbox: shell Runner 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 Token Please enter the gitlab-ci token for this runner: kTx_PUnx_hhy63pNJtqM
# 输入Runner的说明 Please enter the gitlab-ci description for this runner: 可以不填为空
# 设置Tag,用于指定在构建规定的tag时触发ci,如果不设置,默认每次都会触发ci Please enter the gitlab-ci tags for this runner (comma separate): deploy
# 这里选择true,用于代码上传后直接执行 Whether to run utagged builds [true/false]: true
# 这里选择false,可以直接回车,默认false Whether to lock Runner to current project [true/false]: false
# 选择runner执行器,这里选择shell Please 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_production
cache: 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-jre
MAINTAINER Chova
# 环境变量ENV APP_VERSION 1.0.0-SNAPSHOT# Docker插件,用来检测依赖项,只有依赖项启动才会启动ENV DOCKERIZE_VERSION v0.6.1
RUN 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 /app
COPY 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不会自动地删除一个volume
3.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
复制代码


发布于: 2021 年 05 月 19 日阅读数: 45
用户头像

一位攻城狮的自我修养 2021.04.06 加入

分享技术干货,面试题和攻城狮故事。 你的关注支持是我持续进步的最大动力! https://github.com/ChovaVea

评论

发布
暂无评论
微服务项目部署实践:使用GitLab Runner实现微服务项目的持续集成,持续交付和持续部署