持续集成、持续交付、持续部署

持续集成

持续集成好处

持续集成指的是, 频繁的将代码集成到主干。
好处:
	1. 快速发现错误 。每完成一点更新,就集成到主干,可以快速发现错误,定位错误也比较容易。
	2. 防止分支大幅偏离主干。如果不是经常集成,主干又在不断更新,会导致以后集成的难度变大,甚至难以集成。
持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。

持续集成流程

代码从提交到生产,有以下步骤
1. 提交
	持续集成的第一步是开发者向代码仓库提交代码。
2. 测试
	代码仓库对 commit 操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
	测试分为:
		1. 单元测试:针对函数或模块的测试
		2. 集成测试:针对整体产品的某个功能的测试,又称功能测试
		3. 端对端测试:从用户界面直达数据库的全链路测试
	第一轮至少跑完单元测试
3. 构建
	通过第一轮测试后,代码可以合并主干,就算可以交付了。
	交付后,先构建(build),再开始第二轮测试。我们使用jenkins来构建。它会将构建和测试,在一次运行中执行完成。
4. 测试(第二轮)
	如果第一轮已经涵盖了所有测试内容,第二轮可以省略,但构建步骤要移到第一轮前面。
	第二轮是全面测试,单元测试和集成测试都会跑,有条件的话,也要做端对端测试。
	新版本的每一个更新点都必须测试到。如果测试的覆盖率不高,进入后面的部署阶段后,很可能会出现严重的问题。
5. 部署
	通过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包(tar)存档,发到生产服务器。
6. 回滚
	一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指向上一个版本的目录。

使用 GitLab 持续集成

Gitlab CI
1. 从 GitLab 8.0 开始,GitLab CI 就已经集成在 GitLab 中,我们只要在项目中添加一个 .gitlab-ci.yml 文件,然后添加一个 Runner,
	即可进行持续集成。 而且随着 GitLab 的升级,GitLab CI 变得越来越强大。
2. 概念分为:Pipeline(管道),Stages(阶段),Jobs(工作)
	1. 一次 Pipeline 其实相当于一次构建任务,里面可以包含多个流程(Stages),如安装依赖、运行测试、编译、部署测试服务器、
		部署生产服务器等流程。任何提交或者 Merge Request 的合并都可以触发 Pipeline。
	2. Stages 表示构建阶段,我们可以在一次 Pipeline 中定义多个 Stages。
		所有 Stages 会按照顺序运行,即当一个 Stage 完成后,下一个 Stage 才会开始
		只有当所有 Stages 完成后,该构建任务 (Pipeline) 才会成功。
		如果任何一个 Stage 失败,那么后面的 Stages 不会执行,该构建任务 (Pipeline) 失败。
	3. Jobs 表示构建工作,我们可以在 Stages 里面定义多个 Jobs。
		相同 Stage 中的 Jobs 会并行执行。
		相同 Stage 中的 Jobs 都执行成功时,该 Stage 才会成功。
		如果任何一个 Job 失败,那么该 Stage 失败,即该构建任务 (Pipeline) 失败。
Gitlab Runner
概念:构建任务都会占用很多的系统资源 (譬如编译代码),而 GitLab CI 又是 GitLab 的一部分,如果由 GitLab CI 来运行构建任务的话,
	在执行构建任务的时候,GitLab 的性能会大幅下降。GitLab CI 最大的作用是管理各个项目的构建状态,因此,运行构建任务使用
	GitLab Runner。GitLab Runner可以安装到不同的机器上,所以在构建任务运行期间并不会影响到 GitLab 的性能。
Gitlab、Gitlab CI和Gitlab Runner的关系
  1. gitlab: 代码托管平台
  2. Gitlab CI: 最大作用是监控项目的构建状态
  3. Gitlab Runner: 运行构建任务
Gitlab Runner安装
  1. gitlab-runner版本要与gitlab对应(去gitlab管理区域查看版本)
  2. gitlab-runner本身不只为java持续集成,对java持续集成需要安装jdk、maven,制作镜像和上传需要安装docker和配置docker仓库,因此我们基于原生镜像制作含有以上配置的镜像
    在/usr/local/docker/runner目录下创建
    1. docker-compose.yml (构建同级目录Dockerfile镜像并运行)
    2. Dockerfile ( 制作镜像命令文件)
    3. daemon.json (用于配置加速器和仓库地址)
    4. jdk (wget下载或官网下载上传 )
    5. maven (Dockerfile里直接下载了,jdk也可以这种方式 两种方式都演示了,下载报错的话要修改版本)
  3. docker-compose.yml(privileged: true 以管理员身份操作容器)
version: '3.1'
services:
  gitlab-runner:
    build: ./
    restart: always
    container_name: gitlab-runner
    privileged: true
    volumes:
      - /usr/local/docker/runner/config:/etc/gitlab-runner
      - /var/run/docker.sock:/var/run/docker.sock
  1. Dockerfile
FROM gitlab/gitlab-runner:v11.0.2

# 修改软件源
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-8u171-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 /

3.daemon.json (insecure-registries 填写自己的docker仓库地址)


{
  "registry-mirrors": [
    "https://registry.docker-cn.com"
  ],
  "insecure-registries": [
    "192.168.79.131:5000"
  ]
}

docker-compose up -d  构建并启动gitlab-runner
Gitlab Runner注册
  1. docker exec -it gitlab-runner gitlab-runner register
  2. 先后输入URL和注册令牌(进入gitlab中需要持续集成的项目 设置 CI/CD中->Runner,复制图中内容)
    在这里插入图片描述
  3. description和tags可以直接跳过,最后选择shell
  4. runner下生成如下图
    在这里插入图片描述
.gitlab-ci.yml流程
1. 注册好的项目,提交代码后,gitlab-runner会拉取代码到容器内部。
2. 按照编写的gitlab-ci.yml执行流程(打包+制作镜像->上传镜像->(关闭)运行镜像->清理虚悬镜像)
build模块要打包和构建在一个流程,下个流程会删掉之前的操作(上传 制作镜像等保存操作不会删除)
stages:
  stages:
  - build
  - push
  - run
  - clean
##### .gitlab-ci.yml
build:
  stage: build
  script:
    - /usr/local/maven/apache-maven-3.5.3/bin/mvn clean package
    - cp target/itoken-config-1.0.0-SNAPSHOT.jar docker
    - cd docker
    - docker build -t 192.168.79.131:5000/itoken-config .
push:
  stage: push
  script:
    - docker push 192.168.79.131:5000/itoken-config
run:
  stage: run
  script:
    - cd docker
    - docker-compose down
    - docker-compose up -d
clean:
  stage: clean
  script:
    - docker rmi $(docker images -q -f dangling=true)

Dockerfile
FROM openjdk:8-jre
ENV APP_VERSION 1.0.0-SNAPSHOT
RUN mkdir /app
COPY itoken-config-$APP_VERSION.jar /app/app.jar
# CMD和ENTRYPOINT两种方式  ENTRYPOINT支持顺序和多项目启动
# CMD java -jar /app/app.jar --spring.profiles.active=prod
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=prod"]
EXPOSE 8888
docker-compose.yml
version: '3.1'
services:
  itoken-config:
    restart: always
    image: 192.168.79.131:5000/itoken-config
    container_name: itoken-config
    ports:
      - 8888:8888
    networks:
      - config_network
networks:
  config_network:
Dockerfile(+DOCKERIZE)
微服务有启动先后顺序,可以用DOCKERIZE来设置
FROM openjdk:8-jre
RUN mkdir /app
ENV DOCKERIZE_VERSION v0.6.1
RUN wget https://github.com/jwilder/dockerize/releases/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
COPY itoken-eureka-1.0.0-SNAPSHOT.jar /app/app.jar
ENTRYPOINT ["dockerize", "-timeout", "5m", "-wait", "http://192.168.79.135:8888/respo/eureka", "java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "/app/app.jar", "--spring.profiles.active=prod"]
EXPOSE 8761

持续交付

持续交付概念

持续交付(Continuous delivery)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
持续交付强调的是,不管怎么更新,软件是随时随地可以交付的。

持续部署

持续部署

持续部署指的是代码通过评审以后,自动部署到生产环境。
持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
持续部署的前提是能自动化完成测试、构建、部署等步骤。
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值