利用jenkins和docker实现持续交付

一.什么是持续交付

  让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定、持续的保持在随时可以发布的状况。它的目标在于让软件的构建、测试与发布变得更快以及更频繁。这种方式可以减少软件开发的成本与时间,减少风险。

二.对比持续交付和传统交付

  传统交付的发布周期可以表示为下图:

    

  

传统交付的缺点:

慢交付:在这里,客户在指定需求之后很长时间才收到产品。这导致了不满意的上市时间和客户反馈的延迟。

  反馈周期长:反馈周期不仅与客户有关,还与开发人员有关。假设您意外地创建了一个bug,并在UAT阶段了解了它。修理你两个月前修过的东西需要多长时间?即使是很小的错误也会耗费数周的时间。

  危险的热修复程序:热修复程序通常不能等待完整的UAT阶段,因此它们的测试方式往往不同(UAT阶段缩短了),或者根本没有测试。

  压力:对运营团队来说,无法预测的发布是有压力的。更重要的是,发布周期通常被安排得很紧,这给开发人员和测试人员带来了额外的压力。

  为了能够持续地交付产品,而不是将大笔资金花在全天候工作的运营团队上,我们需要自动化。这就是为什么,连续交付就是将传统交付过程的每个阶段都更改为一系列脚本,称为自动部署管道或连续交付管道。

    然后,如果不需要手动步骤,我们可以在每次代码更改之后运行该流程,从而不断地将产品交付给用户。

持续交付的优点:

         快速交付:开发完成后,客户就可以使用产品,大大缩短了产品上市的时间。请记住,软件只有在用户手中才会带来收入。

快速反馈周期:假设您在代码中创建了一个bug,该bug在同一天投入生产。要花多少时间才能修好你当天工作的东西?可能没有那么多。这与快速回滚策略一起,是保持生产稳定的最佳方法。

低风险的发布:如果您每天都发布,那么这个过程就会变得可重复,因此更加安全。

灵活的发布选项:如果您需要立即发布,那么一切都已经准备好了,因此没有与发布决策相关的额外时间/成本。

   不用说,我们可以通过消除所有交付阶段并直接在生产上进行开发来实现所有的好处。然而,这将导致质量下降。实际上,引入连续交付的全部困难在于担心质量会随着取消手工步骤而降低。我们将展示如何以一种安全的方式处理它,交付的产品不断地有更少的bug,并更好地适应客户的需求。

三.怎么实现持续交付

  

  自动化部署管道,它包括如下图所示的三个阶段:

  每一步都对应着传统交付过程中的一个阶段,具体如下:

      持续集成:检查以确保不同开发人员编写的代码集成在一起    

    自动化验收测试:这将取代手工QA阶段,并检查开发人员实现的特性是否满足客户的需   求

    配置管理:这将取代手工操作阶段——配置环境和部署软件

  1.持续集成

    持续集成阶段向开发人员提供第一个反馈。它从存储库(git,svn)中检出代码,编译代码,运行单元测试,并验证代码质量。如果任何步骤失败,则停止管道执行,开发人员应该做的第一件事是修复持续集成构建。

  2.自动化验收测试

    自动化验收测试阶段是和QAs一起编写的一组测试,这些测试应该替代手动UAT阶段。它作为一个质量检验关来决定一个产品是否准备好发布。如果任何验收测试失败,则停止管道执行,不再运行进一步的步骤。它阻止移动到配置管理阶段,从而阻止发布。

  3.配置管理

    配置管理阶段负责跟踪和控制软件及其环境中的更改。它涉及准备和安装必要的工具、扩展服务实例的数量及其分布、基础设施清单以及与应用程序部署相关的所有任务。

    配置管理是针对在生产环境中手动部署和配置应用程序所带来的问题的解决方案。配置管理工具(如Ansible、Chef或Puppet)支持在版本控制系统中存储配置文件,并跟踪在生产服务器上所做的每个更改。

    替代操作(运维)团队手工任务的另一项工作是负责应用程序监视。这通常是通过将运行系统的日志和指标流到一个公共仪表板来完成的,该仪表板由开发人员(或DevOps团队,如下一节所述)监视。

四.工具

  1.docker生态链

    

      Docker作为集装箱化的领导者,近年来在软件行业占据了主导地位。它允许在与环境无关的映像中打包应用程序,因此将服务器视为一个资源场,而不是必须为每个应用程序配置的机器。

      Docker是一个明确选择,因为它非常适合(微)服务世界和持续交付过程。

  

 2.jenkins

      Jenkins是目前市场上最流行的自动化服务器。它有助于创建连续集成和连续交付管道,通常还有助于创建任何其他自动化的脚本。高度面向插件,它有一个伟大的社区,不断扩展它的新功能。

      更重要的是,它允许将管道编写为代码并支持分布式构建环境。

  3. Ansible

    Ansible是一个自动化工具,可以帮助进行软件配置、配置管理和应用程序部署。它采用无代理的体系结构,并与Docker进行了良好的集成。

  4.gitHub

    GitHub绝对是所有托管版本控制系统中排名第一的。它提供了一个非常稳定的系统,一个基于web的UI,以及一个公共存储库的免费服务。

    尽管如此,任何源代码控制管理服务或工具都可以使用连续交付,无论它是在云中还是自托管的,也无论它是基于Git、SVN、Mercurial或任何其他工具。

          

五.docker实战

  1.docker概述

    

    Docker是一个开源项目,旨在帮助使用软件容器进行应用程序部署。以下引用自Docker官方页面:

    Docker容器将一段软件封装在一个完整的文件系统中,该文件系统包含运行所需的一切:代码、运行时、系统工具、系统库——任何可以安装在服务器上的东西。这保证了软件将始终运行相同的,不管它的环境如何。

    因此,Docker以类似于虚拟化的方式,允许将应用程序打包成可以在任何地方运行的映像。

  2.虚拟化和容器化

    没有Docker,使用硬件虚拟化(通常称为虚拟机)可以实现隔离和其他好处。最流行的解决方案是VirtualBox、VMware和Parallels。

    虚拟机模拟计算机体系结构并提供物理计算机的功能。如果每个应用程序都作为单独的虚拟机映像交付并运行,我们就可以实现应用程序的完全隔离。下图展示了虚拟化的概念:

    

    每个应用程序都作为独立的映像启动,其中包含所有依赖项和客户操作系统。映像由虚拟机监控程序运行,虚拟机监控程序模拟物理计算机体系结构。

    许多工具(如Vagrant)都广泛支持这种部署方法,并致力于开发和测试环境。然而,虚拟化有三个显著的缺点:

      低性能:虚拟机模拟整个计算机体系结构来运行客户操作系统,因此每个操作都有很大的开销。

      高资源消耗:模拟需要大量的资源,并且必须为每个应用程序分别执行。这就是为什么在标准的台式机上,只有几个应用程序可以同时运行。

      大型映像:每个应用程序都使用完整的操作系统交付,因此在服务器上的部署意味着发送和存储大量数据。

    下面的图是docker带来的不同:

      

  3.docker的安装  

      Docker的安装过程快速简单。目前,大多数Linux操作系统都支持它,其中很多都提供了专用的二进制文件。Mac和Windows也得到了本地应用程序的良好支持。

      但是,重要的是要理解Docker内部是基于Linux内核及其细节的,这就是为什么在Mac和Windows中,它使用虚拟机(Mac使用xhyve, Windows使用hyv)来运行Docker引擎环境。

      这里只说在linux上的Ubuntu 16.04操作(官方的命令):

      

$ sudo apt-get update
$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
$ sudo apt-add-repository 'deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial main stable'
$ sudo apt-get update
$ sudo apt-get install -y docker-ce

      

      如果提示报错:

      ,可以再次执行下面的命令:

$ cd /etc/apt/sources.list.d
$ sudo vi docker.list
deb https://download.docker.com/linux/ubuntu zesty edge
$sudo apt update
$sudo apt install docker-ce 
      这一次没有报错,但是发现太慢了,因为下载docker-ce比较大,并且是国外网站,这里可以改成国内源,指令如下:
sudo apt-get update
sudo apt-get install \ apt-transport-https \ ca-certificates \ curl \ software-properties-common
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
    测试是否安装完成:docker -v或者docker info可以看到docker一些基本信息表示安装成功了:
    

  4.运行docker

    docker的环境已经安装完成,我们可以先运行一个非常经典的例子:hello world:

    

$ docker run hello-world

    当你看到如下信息表示你运行正确了:

    

      让我们一步一步来看看引擎盖下面发生了什么:

        1.使用run命令运行Docker客户机。

        2.Docker客户机联系Docker守护进程,要求从名为hello-world的映像创建一个容器。

        3.Docker守护进程检查它是否在本地包含hello-world映像,因为它没有,所以从远程Docker Hub注册中心请求hello-world映像。

        4.Docker Hub注册表包含hello-world映像,因此将其拖放到Docker守护进程中。

        5.Docker守护进程从hello-world映像创建了一个新容器,该映像启动了生成输出的可执行文件。

        6.Docker守护进程将此输出流到Docker客户机。

        7.Docker客户机将其发送到您的终端。

        

  5.构建镜像

    

    构建镜像有2种方式:

Docker commit命令和Dockerfile自动构建。我们来探讨下docker怎么构建镜像的。

  我再这只说Dockerfile方式:

      使用commit命令手动创建每个Docker映像可能很费力,特别是在构建自动化和连续交 付过程的情况下。幸运的是,有一种内置语言可以指定构建Docker映像所需执行的所有指令。

      1.创建DockerFile文件,并输入以下内容:

      

FROM ubuntu:16.04
RUN apt-get update && \
apt-get install -y python
      2.执行构建镜像命令:
docker build -t ubuntu_with_python .

      

      3. 我们可以通过命令:

  docker images看到我们创建了的镜像:

      

   6.docker容器

    

    我们可以通过命令:docker ps查看正在运行的容器,docker ps -a查看所有容器。容器是有状态的。

  通过镜像来启动容器,并且查看容器的状态:

    

    停止docker容器是命令:docker stop 容器id

    

   7.运行tomcat,使用外部访问

    1.运行tomcat镜像:

      

docker run -d tomcat

    

    但是我们外部浏览器是访问不到tomcat 8080端口的,中间有虚拟机阻断了网络连接。
       所以我们启动容器的时候,就要用-p指令来连接虚拟主机和docker容器的网络端口映射
    2.-p启动
    
docker run -d -p : tomcat

    在网页输入虚拟机ip+端口访问如下:

  

六.jenkins实战

  1.介绍jenkins

    

      Jenkins是一个用Java编写的开源自动化服务器。由于非常活跃的基于社区的支持和大量的插件,它是实现持续集成和持续交付过程的最流行的工具。

Jenkins优于其他持续集成工具,是同类软件中使用最广泛的。由于它的特性和功能,这一切都是可能的。

  2.安装jenkins

      

Jenkins的安装过程快速而简单。有许多不同的方法可以做到这一点,但是由于我们已经熟悉Docker工具及其带来的好处,我们将从基于Docker的解决方案开始。这也是最简单、最可预测和最聪明的方法。

jenkins的安装有一些环境要求:

  • Java 8
  • 256MB free memory
  • 1 GB+ free disk space

然而,必须理解需求严格依赖于您计划使用Jenkins做什么。如果Jenkins用作整个团队的持续集成服务器,那么即使是小团队,也建议使用1gb +空闲内存和50gb +空闲磁盘空间。不用说,Jenkins还执行一些计算并在网络上传输大量数据,因此CPU和带宽是至关重要的。

安装jenkins有两种方式:

1.使用docker镜像

2.不使用docker镜像

1.使用docker镜像安装jenkins

使用命令:

             docker run -p <host_port>:8080 -v <host_volume>:/var/jenkins_home jenkins:2.60.1

在网页上输入网址,如图代表安装成功:

      

    输入密码,是在日志中可以看到一个初始密码:

      

    2.不使用docker镜像安装jenkins

安装也非常简单,只需要执行以下命令:

$ wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
$ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
$ sudo apt-get update
$ sudo apt-get install jenkins

    3.jenkins简单应用(hello world)

      

        让我们遵循这条规则,看看创建第一个Jenkins管道的步骤:

单击New Item。

输入hello world作为项目名称,选择Pipeline,然后单击OK。

有很多选择。现在我们将跳过它们,直接进入管道部分。

在脚本文本框中,我们可以输入流水线脚本:

pipeline {
agent any
stages {
stage("Hello") {
steps {
echo 'Hello World'
}
}
}
}

      

      点击保存,并且立即构建,我们可以在输出日志里面看到如下图:

      

七.持续集成管道

   1.介绍管道

      

      管道可以理解为一系列的自动化操作,可以看成是一个简单的脚本链:

操作分组:将操作分组到各个阶段(也称为门或质量门),这些阶段向流程引入一 个结构,并明确定义了规则:如果一个阶段失败,则不再执行其他阶段

可见性:流程的所有方面都是可视化的,这有助于快速进行故障分析并促进团队协作

反馈:团队成员在任何问题发生时都能及时了解,这样他们就能快速做出反应

   2.管道结构

      Jenkins管道由两种元素组成:阶段和步骤。下图显示了如何使用它们:

        

   3.管道的hello world

      

pipeline {
agent any
stages {
stage('First Stage') {
steps {
echo 'Step 1. Hello World'
}
}
stage('Second Stage') {
steps {
echo 'Step 2. Second time Hello'
echo 'Step 3. Third time Hello'
}
}
}
}

    

      立即构建成功后可以看到以下图:

      

   4.管道规则

      

      Agent:它指定执行发生的位置,并可以定义标签来匹配标记相同的代理或docker,以指定动态准备的容器,以便为管道执行提供环境

Triggers:这定义了自动触发管道的方法,并可以使用cron设置基于时间的调度或pollScm来检查存储库中的更改(我们将在触发器和通知部分详细介绍)

Options:这指定了特定管道的选项,例如超时(管道运行的最大时间)或重试(失败后应该重新运行管道的次数)

Environment:这定义了一组关键值,在构建过程中用作环境变量

Parameters:这定义了一个用户输入参数列表

Stage:这允许对步骤进行逻辑分组

When:这决定是否应该根据给定的条件执行阶段

 这个就是最基础的一些知识,后续会发一些高级一点的特性。

利用jenkins和docker实现持续交付的更多相关文章

  1. Docker学习总结(14)——从代码到上线, 云端Docker化持续交付实践

    2016云栖大会·北京峰会于8月9号在国家会议中心拉开帷幕,在云栖社区开发者技术专场中,来自阿里云技术专家罗晶(瑶靖)为在场的听众带来<从代码到上线,云端Docker化持续交付实践>精彩分 ...

  2. 容器调度 • Docker网络 • 持续交付 • 动态运行应用程序 部署的多元化

    <英雄联盟>在线服务运维之道 - InfoQ https://www.infoq.cn/article/running-online-services-riot/ 第一章 简 介 我是Jo ...

  3. Docker学习总结(8)——利用Docker开启持续交付之路

    持续交付即Continuous Delivery,简称CD,随着DevOps的流行正越来越被传统企业所重视.持续交付讲求以短周期.小细粒度,自动化的方式频繁的交付软件,在这个过 程中要求开发.测试.用 ...

  4. jenkins+webhook+docker做持续集成

    简介:我们现在都流行把项目封装成docker的镜像,不过实际用的时候就会发现很麻烦,我们每次更改代码了以后都要打包成docker容器 ,事实证明项目比较多的时候真的会让人崩溃,我这边用spring c ...

  5. Jenkins+Svn+Docker搭建持续集成环境 自动部署

    一.准备工作: 两台服务器:192.168.206.212,192.168.206.213 自己新建一个maven项目 其中两台机子做下面的软件配置 212机子: 安装expect并配置: 安装jen ...

  6. Asp.Net Core&Jenkins持续交付到Windows Server

    对于Linux平台上的持续集成和持续交付可以使用Docker快捷的完成任务,但是Windows Server下却不好使用,一般来讲,windows Server下最简单的发布方式是直接手动打包发布或是 ...

  7. 利用ansible来做tomcat应用的持续交付

    https://www.jianshu.com/p/fca8f91ae223 在做持续交付这件事,想必大家都是用jenkins这款程序来做基石.当然,我们这次也是用jenkins作为承载工具,jenk ...

  8. 使用 Docker 和 Jenkins 持续交付(新书免费获取!)

    今天没有长篇大论,给大家推荐一本新书,书名:Continuous Delivery with Docker and Jenkins.封面如图所示: 以下内容纯属凑字数 本书结合了 Jenkins 和 ...

  9. [持续交付实践] Jenkins Pipeline 高可用设计方法

    前言 这篇写好一段时间了,一直也没发布上来,今天稍微整理下了交下作业,部分内容偷懒引用了一些别人的内容.使用Jenkins做持续集成/持续交付,当业务达到一定规模的时候,Jenkins本身就很容易成为 ...

随机推荐

  1. Spring -- Bean自己主动装配&amp;Bean之间关系&amp;Bean的作用域

    对于学习spring有帮助的站点:http://jinnianshilongnian.iteye.com/blog/1482071 Bean的自己主动装配 Spring IOC 容器能够自己主动装配 ...

  2. vmware Unable to open kernel device "\\.\Global\vmx86": The system cannot find the file 的解决方法

    https://communities.vmware.com/thread/245800?start=0&tstart=0 I have exactly same issue.  I star ...

  3. 对交换机VLAN及各种端口类型的理解

    每学习一种技术时,我们往往需要去了解why,即这个技术是为解决什么问题而出现的. VLAN全称为Virtual Local Area Network,即虚拟局域网,是逻辑上的一种划分.一般来说,如果交 ...

  4. Codeforces Round #422 (Div. 2) C. Hacker, pack your bags! 排序,贪心

    C. Hacker, pack your bags!     It's well known that the best way to distract from something is to do ...

  5. org.eclipse.swt.SWTError: No more handles的解决办法

    今天装了JBoss Tools 3.1 插件后,eclipse 打开jsp文件老是报错,或者要我关闭: org.eclipse.swt.SWTError: No more handles 网上找了两个 ...

  6. mysql数据库隔离级别及其原理、Spring的7种事物传播行为

    一.事务的基本要素(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  7. 如何用redis做到限制,一个手机号,1分钟内最多发一条,一天内最多10条

    需要两个缓存 key名称 phone-busy,缓存1分钟 key名称 phone-send-count,缓存1天,每成功发送一条+1 发送的时候流程如下: 判断phone-busy是否存在,存在直接 ...

  8. JS中的存储机制

    一.堆和栈的介绍 1.堆和队,是先进先出:栈,是先进后出,就跟水桶差不多: 2.存储速度:堆和队的存储速度较慢,栈的存储速度较快,会自动释放: 二.js中存储的类型 1.堆,一般用于复杂数据类型,存储 ...

  9. hrtimer高精度定时器的简单使用【学习笔记】

    #include <linux/module.h> #include <linux/kernel.h> #include <linux/hrtimer.h> #in ...

  10. [原创]JAVA获取word表格中数据的方案

    上一个项目的开发中需要实现从word中读取表格数据的功能,在JAVA社区搜索了很多资料,终于找到了两个相对最佳的方案,因为也得到了不少网友们的帮助,所以不敢独自享用,在此做一个分享. 两个方案分别是: ...