- 外文名
- Continuous integration
- 属 于
- 软件开发实践
- 过 程
- 敏捷开发
- 中文名
- 持续集成
- 学 科
- 电子工程
-
持续集成
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 的大概工作模式。
-
持续集成、持续交付、持续部署
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的关系
- gitlab: 代码托管平台
- Gitlab CI: 最大作用是监控项目的构建状态
- Gitlab Runner: 运行构建任务
Gitlab Runner安装
- gitlab-runner版本要与gitlab对应(去gitlab管理区域查看版本)
- gitlab-runner本身不只为java持续集成,对java持续集成需要安装jdk、maven,制作镜像和上传需要安装docker和配置docker仓库,因此我们基于原生镜像制作含有以上配置的镜像
在/usr/local/docker/runner目录下创建- docker-compose.yml (构建同级目录Dockerfile镜像并运行)
- Dockerfile ( 制作镜像命令文件)
- daemon.json (用于配置加速器和仓库地址)
- jdk (wget下载或官网下载上传 )
- maven (Dockerfile里直接下载了,jdk也可以这种方式 两种方式都演示了,下载报错的话要修改版本)
- 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
- 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注册
- docker exec -it gitlab-runner gitlab-runner register
- 先后输入URL和注册令牌(进入gitlab中需要持续集成的项目 设置 CI/CD中->Runner,复制图中内容)
- description和tags可以直接跳过,最后选择shell
- 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:21GitLab CI是 GitLab 提供的持续集成服务,只要在你的仓库根目录 创建一个.gitlab-ci.yml 文件, 并为该项目指派一个Runner,当有合并请求或者 push的时候就会触发build。 这个.gitlab-ci.yml 文件定义GitLab runner... -
持续集成工具之Concourse
2017-10-27 14:36:46持续集成工具之Concourse视频教程,该培训课程主页围绕Concourse,作为由Pivotal赞助的开源的CI(Continuous Integration,持续集成)工具,在目前市场上已经普遍使用,Concourse以pipeline机制运行集成任务。...
-
机器学习中的归一化
-
AcWing 168.生日蛋糕
-
Java编程思想-一切都是对象
-
手势解锁-canvas-javascript实战
-
超微型全石英光纤Fizeau腔水下激波压力传感器
-
Spring Boot2.X仿朋友圈PC版系统实战_架构1.0
-
Redis数据库入门与使用
-
JavaScrpit入门笔记
-
2021-01-27
-
PHP支付宝微信支付配置教程
-
商业的本质——杰克·韦尔奇著
-
Unity游戏开发之数字华容道
-
微信公众号2021之网页授权一学就会java版
-
A.0.0.1 修改服务器名称
-
高精度位移测量系统的硬件在环仿真
-
基于准比例谐振和比例积分复合控制并网逆变器研究
-
SMT回流焊的温度曲线.pdf
-
Electronic and optical properties of an intrinsic type-I band alignment ZrS2/SnS2 van der Waals heterostructure for optoelectronic devices
-
基于STM32的图像编码与采集系统
-
三维地图GIS大数据可视化