概念
-
服务治理遇到的问题
- 在微服务项目中每个服务都是独立运行的我的项目
-
不可能对每个我的项目进行手动部署, 波及到自动化运维的问题
继续集成
- 继续集成(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/runner 2. 创立构建目录: /usr/local/docker/runner/environment 3. 下载 jdk-8u152-linux-x64.tar.gz 复制到 /usr/local/docker/runner/environment 4. 下载 apache-maven-3.5.3-bin.tar.gz 复制到 /usr/local/docker/runner/environment daemon.json 1. 在 /usr/local/docker/runner/environment 目录下创立 daemon.json, 用于配置加速器和仓库地址 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- { "registry-mirrors":["https://registry.docker-cn.com"], "insecure-registries":["127.0.0.1:5000"] } ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Dockerfile 1. 在 /usr/local/docker/runner/environment 目录下创立 Dockerfile --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- FROM gitlab/gitlab-runner MAINTAINER 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 # 装置 Docker RUN 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-ce COPY daemon.json /etc/docker/daemon.json # 装置 Docker Compose WORKDIR /usr/local/bin RUN wget https://raw.githubusercontent.com/topsale/resources/master/docker/docker-compose RUN chmod +x docker-compose # 装置 Java RUN mkdir -p /usr/local/java WORKDIR /usr/local/java COPY jdk-8u152-linux-x64.tar.gz /usr/local/java RUN tar -zxvf jdk-8u152-linux-x64.tar.gz && \ rm -fr jdk-8u152-linux-x64.tar.gz # 装置 Maven RUN mkdir -p /usr/local/maven WORKDIR /usr/local/maven # RUN wget https://raw.githubusercontent.com/topsale/resources/master/maven/apache-maven-3.5.3-bin.tar.gz COPY apache-maven-3.5.3-bin.tar.gz /usr/local/maven RUN 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_152 ENV MAVEN_HOME /usr/local/maven/apache-maven-3.5.3 ENV PATH $PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin WORKDIR / -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- docker-compose.yml 在 /usr/local/docker/runner 目录下创立 docker-compose.yml --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- # 示意从 environment 目录下寻找 Dockerfile,即在 Docker 里装 Docker version: '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.jar ENTRYPOINT ["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-alpine VOLUME /tmp ARG JAR_FILE COPY ${JAR_FILE} app.jar ENTRYPOINT ["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