持续集成 订阅
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。 展开全文
持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。
信息
外文名
Continuous integration
属    于
软件开发实践
过    程
敏捷开发
中文名
持续集成
学    科
电子工程
持续集成定义
大师Martin Fowler对持续集成是这样定义的:持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误。许多团队发现这个过程可以大大减少集成的问题,让团队能够更快的开发内聚的软件。持续集成的宗旨是避免集成问题,如同在极限编程(XP)方法学中描述的集成地狱。持续集成并非普遍接受是用来改善集成频率的方法,因此重要的是区分两者所带来的效益。在极限编程方法学,持续集成需要达到最佳成果,必须依靠着自动化集成单元测试并通过测试驱动开发。首先必须设想在上线运作之前,已在开发环境完成并通过所有的单元测试。这将帮助避免一个开发者的作业流程,导致其他开发者作业的中断。如果有需要,可以在完整上线运作之前进用部分已完成的功能,例如使用功能切换。接着进行CI服务器建置概念的阐述、自动化运行单元测试的周期与每次测试需要提交给开发者的报告。建置CI服务器的用途(不一定要运行单元测试) 已经开始在极限编程(XP)社群之外的团队练习。如今,许多企业组织已经开始采用持续性集成,而非采用完整的极限编程(XP)。除了自动化单元测试,组织在运用持续性集成(CI)一般会建置CI服务器来维护持续性套用质量控制的程序-小部分的影响,并且经常性使用。除了运行单元与集成测试之外,还有额外的静态与动态测试,量测与描述性能,从程序来源码摘录与文件格式与促成手动质量保证(QA)程序。持续性质量控制应用程序用意在提升软件质量以及减少交付的时间,在完成所有开发后,取代传统软件上线质量控制机制。此非常相似进行频繁集成的最初概念让集成得以在QA程序上更容易地达成。同样的道理,持续性交付的最佳实践进一步扩展了持续性集成(CI),以确保软件检核在主要程序上并且能够布署到用户以确保实际的布署流程可以非常快速。 [1] 
收起全文
精华内容
下载资源
问答
  • 持续集成

    2019-06-25 16:00:15
    持续集成一,CI/CD是什么 一,CI/CD是什么 CI(Continuous integration,中文意思是持续集成)是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新...

    一,CI/CD是什么

    CI(Continuous integration,中文意思是持续集成)是一种软件开发时间。持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起。借用网络图片对CI加以理解。

    在这里插入图片描述

    CD(Continuous Delivery, 中文意思持续交付)是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。比如,我们完成单元测试后,可以把代码部署到连接数据库的Staging环境中更多的测试。如果代码没有问题,可以继续手动部署到生产环境。下图反应的是CI/CD 的大概工作模式。

    在这里插入图片描述

    展开全文
  • CICD-持续集成与持续交付持续集成与持续交付是软件开发和交付中的实践。我们项目中一直在践行持续集成(CI:Continuous Integration);持续交付(CD:Continuous Delivery)未能达到理想状态,只能实践一部分。这篇文章...

    CICD-持续集成与持续交付

    持续集成与持续交付是软件开发和交付中的实践。我们项目中一直在践行持续集成(CI:Continuous Integration);持续交付(CD:Continuous Delivery)未能达到理想状态,只能实践一部分。这篇文章用于总结CI/CD的实践。

    持续集成

    8f03dc4c96f25e38e0b576e188eeca58.png

    什么是持续集成?

    软件开发中,集成是一个很可能发生未知错误的过程。持续集成是一种软件开发实践,希望团队中的成员频繁提交代码到代码仓库,且每次提交都能通过自动化测试进行验证,从而使问题尽早暴露和解决。

    持续集成的好处是什么?

    持续集成可以使问题尽早暴露,从而也降低了解决问题的难度,正如老马所说,持续集成无法消除bug,但却能大大降低修复的难度和时间。

    如何做到持续集成?

    首先,持续集成需要:

    1. 单一的代码仓库,团队成员都像该仓库提交代码;

    2. 自动化构建且构建过程需要包含自动化测试;

    3. 有单独的集成机器用于构建;

    4. 保证构建速度不要太慢(曾经有一个项目构建需要20分钟,就会很痛苦);

    5. 在类产品环境进行测试;

    6. 能够方便获取最新的可执行程序;

    7. 可视化,大家都能看到构建过程及结果;

    8. 自动化部署。

    其次,我们通过以下步骤进行持续集成:

    1. 程序员将代码下载到本地,并在完成修改后提交代码;

    2. CI服务器监测代码库,并在有提交时自动触发;

    3. CI服务器对代码进行构建,运行单元测试和集成测试;

    4. CI服务器发布可部署的artefact用于后续测试,并加上本次构建版本的标签。

    5. CI服务器通知团队构建成功或者失败;失败发生时团队需要尽快修复,以免耽搁后续的持续集成过程,因为失败时处于持续集成的暂停阶段。

    最后,需要就团队责任达成共识:

    1. 频繁提交;

    2. 提交之前确保测试通过;

    3. 不在持续集成失败时提交代码;

    4. 提交代码后保证持续集成成功,不然不准回家

    CI工具

    Jenkins + K8s + docker

    持续交付

    什么是持续交付?

    持续交付是持续集成的扩展,指的是将通过自动化测试的软件部署到产品环境。持续交付的本质是把每个构建成功的应用更新交付给用户使用。在持续交付的世界里,我们对完成的定义不是测试完成,而是交付到客户手中。这里需要注意的是,CD代表持续交付(Continuous Delivery)而不是持续部署(Continuous Deploy),因为部署也包括部署到测试环境,而持续交付代表的是功能的上线,交付给用户使用。

    持续交付的好处是什么?

    持续交付的好处在于快速获取用户反馈;适应市场变化和商业策略的变化。开发团队保证每次提交的修改都是可上线的修改,那么决定何时上线,上线哪部分功能则完全由产品业务团队决定。

    虽然持续交付有显著的优点,但也有不成立的时候,比如对于嵌入式系统的开发,往往需要软硬件的配合。

    如何做到持续交付?

    1. 保证每次提交的修改都是可上线的修改。

    2. 完善的测试(包括单元测试,组件测试,验收测试)来测试新功能和进行回归测试;

    3. 持续交付的前提条件是自动化的集成和部署;需要开发/测试/运维人员一起完成。

    蓝绿部署

    5ffd756b24543318497fbfdd63cd5360.png

    蓝绿发布需要注意⚠️(转载自小程故事多的博客https://www.jianshu.com/p/022685baba7d)

    当你切换到蓝色环境时,需要妥当处理未完成的业务和新的业务。如果你的数据库后端无法处理,会是一个比较麻烦的问题;

    可能会出现需要同时处理"微服务架构应用"和"传统架构应用"的情况,如果在蓝绿部署中协调不好这两者,还是有可能会导致服务停止。

    需要提前考虑数据库与应用部署同步迁移 /回滚的问题。

    蓝绿部署需要有基础设施支持。

    在非隔离基础架构( VM 、 Docker 等)上执行蓝绿部署,蓝色环境和绿色环境有被摧毁的风险。

    展开全文
  • 持续集成、持续交付、持续部署

    千次阅读 2019-08-19 17:19:23
    持续集成持续集成持续集成好处持续集成流程使用 GitLab 持续集成Gitlab Runner持续交付持续交付概念持续部署持续部署 持续集成 持续集成好处 持续集成指的是, 频繁的将代码集成到主干。 好处: 1. 快速发现错误 。...

    持续集成

    持续集成好处

    持续集成指的是, 频繁的将代码集成到主干。
    好处:
    	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)指的是,频繁地将软件的新版本,交付给质量团队或者用户,以供评审。如果评审通过,代码就进入生产阶段。
    持续交付强调的是,不管怎么更新,软件是随时随地可以交付的。
    

    持续部署

    持续部署

    持续部署指的是代码通过评审以后,自动部署到生产环境。
    持续部署的目标是,代码在任何时刻都是可部署的,可以进入生产阶段。
    持续部署的前提是能自动化完成测试、构建、部署等步骤。
    
    展开全文
  • 持续集成 乔梁老师

    2014-01-22 11:37:47
    持续集成\乔梁-持续交付最佳实践.pdf 持续集成\挑战互联网团队从LeanStartup看持续交付 - 熊子川 2012.pdf 持续集成\16_持续交付的魅力——百度持续集成实践经验分享.pdf 持续集成\16_与大象共舞——持续交付高...
  • 理解持续集成

    2019-05-10 10:19:44
    理解持续集成什么是持续集成持续集成的特点持续集成作用 什么是持续集成 持续集成 Continuous integration ,简称CI ​ 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经...

    什么是持续集成

    持续集成 Continuous integration ,简称CI
    ​ 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题。
    尤其是近些年来,敏捷(Agile)在软件工程领域越来越红火,如何能再不断变化的需求中快速适应和保证软件的质量也显得尤其的重要。
    持续集成正是针对这一类问题的一种软件开发实践。它倡导团队开发成员必须经常集成他们的工作,甚至每天都可能发生多次集成。而每次的集成都是通过自动化的构建来验证,包括自动编译、发布和测试,从而尽快地发现集成错误,让团队能够更快的开发内聚的软件。

    持续集成的特点

    1)它是一个自动化的周期性的集成测试过程,从检出代码、编译构建、运行测试、结果记录、测试统计等都是自动完成的,无需人工干预;
    2)需要有专门的集成服务器来执行集成构建;
    3)需要有代码托管工具支持,可以用Git以及可视化界面Gogs的使用;

    持续集成作用

    1)保证团队开发人员提交代码的质量,减轻了软件发布时的压力;
    2)持续集成中的任何一个环节都是自动完成的,无需太多的人工干预,有利于减少重复
    过程以节省时间、费用和工作量;

    展开全文
  • 持续集成和持续交付

    2019-03-21 14:53:24
    持续集成和持续交付 摘要 今天看到群友羊宏飞说了下关于持续集成的概念,之前一直听说,但不知道是啥意思,现在就记录下。 0x01 持续集成 开发和测试 达成高效协作 叫做 持续集成。 devops 这个集成的功能在机器上...
  • GitLab持续集成持续部署(CI&CD)

    万次阅读 多人点赞 2018-06-02 22:57:21
    GitLab CI是 GitLab 提供的持续集成服务,只要在你的仓库根目录 创建一个.gitlab-ci.yml 文件, 并为该项目指派一个Runner,当有合并请求或者 push的时候就会触发build。 这个.gitlab-ci.yml 文件定义GitLab runner...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,895
精华内容 11,558
关键字:

持续集成