Docker下利用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 8080:8080 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:这决定是否应该根据给定的条件执行阶段

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

总结

以上所述是小编给大家介绍的Docker下利用jenkins和docker实现持续交付,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

(0)

相关推荐

  • Centos7+Docker+Jenkins+ASP.NET Core 2.0自动化发布与部署的实现

    前言 Docker一直很火热,一直想把原本的Jenkins自动部署工具搬到Docker上面,无奈今年一直忙于各种事情,迟迟未实施这个事情,正好迎来了dotnet core 2.0 的正式发布,升级项目的同时,顺便直接将Jenkins搬到Docker上.为什么要写这篇文章呢?因为找过相关的资料,大多数文章都是基于Ubuntu 安装.net core 又或者 GitLab 进行持续集成 自动部署等等等,并未有人尝试过Centos7.3 上部署 Jenkins 并且 构建 ASP.NET CORE 2

  • .Net Core自动化部署之利用docker版jenkins部署dotnetcore应用的方法

    前言 本文主要介绍了关于.Net Core自动化部署用docker版jenkins部署dotnetcore应用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的实现步骤吧. 安装docker版jenkins 因为jenkins的docker版本本身没有 dotnetcore的环境,所以我们需要先自己动手制作下包含dotnet环境的jenkins Docker Container Dockerfile FROM jenkins/jenkins # Switch to root t

  • ASP.NET Core+Docker+Jenkins实现持续集成的完整实例

    前言 在前后端分离开发的项目当中为了避免重复构建发布,我们需要部署一个持续发布环境,而目前的开发环境服务器都是基于 CentOS 的,因此每次在本地发布之后还需要打包,上传,部署,十分繁琐.故这里采用了比较成熟的Jenkins 作为持续部署环境. 方法如下: 1.新建一个ASP.NET Core MVC应用程序: 需要勾选Docker支持 2.将其上传到git: 3.建立Jenkins任务 (1)选择"新建任务",输入任务名称,选择"自由风格项目",然后点击确定:

  • 详解Docker下搭建Jenkins构建环境

    首先需要搭建好docker环境的linux系统,这个教程多如牛毛,在此不再赘述. 然后编写一个dockerfile来生成一个镜像,dockerfile其实就是一系列命令的集合,有点像windows的批处理文件, 搭建Jenkins构建环境需要安装jdk.maven.tomcat.jenkins,另外还安装了GIT,用来构建GIT来源的代码,内容如下: FROM centos:7 # author info MAINTAINER xulijian 514045152@qq.com # instal

  • jenkins构建Docker 镜像实例详解

     jenkins构建Docker 镜像实例详解 前言:jenkins有Docker镜像,而之前我们说过使用jenkins打包Docker镜像,那么可否用jenkins的Docker镜像打包Docker镜像呢? 环境: CentOS 7     Docker 1.10.3 1.本机安装docker环境,并配置TCP访问接口 # vi /usr/lib/systemd/system/docker.service 修改ExecStart为: ExecStart=/usr/bin/docker daem

  • Docker下利用jenkins和docker实现持续交付

    一.什么是持续交付 让软件产品的产出过程在一个短周期内完成,以保证软件可以稳定.持续的保持在随时可以发布的状况.它的目标在于让软件的构建.测试与发布变得更快以及更频繁.这种方式可以减少软件开发的成本与时间,减少风险. 二.对比持续交付和传统交付 传统交付的发布周期可以表示为下图: 传统交付的缺点: 慢交付:在这里,客户在指定需求之后很长时间才收到产品.这导致了不满意的上市时间和客户反馈的延迟. 反馈周期长:反馈周期不仅与客户有关,还与开发人员有关.假设您意外地创建了一个bug,并在UAT阶段了解

  • jenkins插件pipeline集成持续交付管道全面介绍

    目录 前言 Jenkinspipeline是什么? 为什么使用pipeline? enkinsfile支持脚本式ScriptedPipeline和声明式DeclarativePipeline ScriptedPipeline 声明式DeclarativePipeline 使用Jenkinsfile的好处: 关于BlueOcean 前言 前篇博文我们实践了jenkins pipeline的脚本模式,体验到了pipeline的流式构建流程,以及通过bule  ocean更清晰的展示了构建的全过程,下

  • docker环境下安装jenkins容器的详细教程

    推荐docker学习资料:https://www.runoob.com/docker/docker-tutorial.html 一.Centos7环境 docker安装 先到官网下载镜像,docker镜像官方:https://hub.docker.com/ 1.最新版安装 yum install -y yum-utils device-mapper-persistent-data lvm2 2.加入docker源 yum-config-manager --add-repo https://mir

  • 如何利用Jenkins + TFS为.Net Core实现持续集成/部署详解

    前言 在前后端分离开发的项目当中为了避免重复构建发布,我们需要部署一个持续发布环境,而目前的开发环境服务器都是基于 CentOS 的,因此每次在本地发布之后还需要打包,上传,部署,十分繁琐.故这里采用了比较成熟的Jenkins 作为持续部署环境. 为了方便安装,我们这里使用了 Docker 来进行安装,至于 Docker 安装的步骤这里不在赘述,详情可以参考这一篇博文. 上面安装的是一个较老的版本,这里推荐参考Docker 官方文档来进行安装. 安装好 Docker 之后,拉取 Jenkins

  • linux下利用Docker安装mysql的步骤

    作为一个测试人员,在学习的过程中,可能经常需要去在linux下安装一些软件,有的软件通过搜索别人的博客教程进行安装的话,随着一些软件的升级,以及虚拟机/服务器镜像版本不一致等外部因素,都有可能导致安装软件出现各种不可预知的问题,到时候还得去搜索资料逐一解决问题,挺耽误时间的. 而且,像linux下这些软件的安装,一般都是运维的事情,测试作为学习使用的话,安装好一个mysql数据库用于学习使用就行,新手不建议在linux下下载源码去安装软件,容易出问题. 接下来为大家演示一下,如何通过docker

  • centos下GitLab+Jenkins持续集成环境搭建(安装jenkins)

    centos下搭建GitLab+Jenkins持续集成环境,供大家参考,具体内容如下 1.安装JDK yum install -y java 2.安装jenkins 添加Jenkins库到yum库,Jenkins将从这里下载安装. wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo rpm --import https://jenkins-ci.org/redhat/jenkins

  • Centos7下安装与卸载docker应用容器引擎的方法

    Docker 是一个开源的应用容器引擎,基于Go 语言并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低. Docker的应用场景 Web 应用的自动化打包和发布. 自动化测试和持续集成.发布. 在服务型环境中部署和调整数据库或其他的后台应用. 从头编译或者扩展现

  • Linux Centos下使用脚本安装Docker的方法

    Docker的主要作用是什么? 目前来看bai,Docker至少有以下应用场景: 1)测试:Docker 很适du合用于测试发布,将 Docker 封装后可zhi以直接提dao供给测试人员进行运行,不再需要测试人员与运维.开发进行配合,进行环境搭建与部署. 2)测试数据分离:在测试中,经常由于测试场景变换,需要修改依赖的数据库数据或者清空变动 memcache.Redis 中的缓存数据.Docker 相较于传统的虚拟机,更轻量与方便.可以很容易的将这些数据分离到不同的镜像中,根据不同需要随时进行

  • 基于Docker的可持续交付问题

    在测试的立场上,希望开发编写的代码都是经过开发的单元测试的,但是事实上,这中间总是存在理想和现实的差距,既然如此,我们何不来开发部署环境后,对服务进行自动化测试验证了.整体的设计思路就是开发编写的代码,使用Dockerfile构建成镜像文件,然后使用docker-compose自动化启动镜像文件,下一步其实就很简单了,我们测试这边进行智能化的自动验证,其实在前面的文章体系中,介绍中智能化测试完成后,在测试结束的时候出具体的测试报告以及如果存在问题,触发整体报警的机制.本文章系列中主要结合CI持续

随机推荐