实战:用Concourse实现端到端的蓝绿部署

Concourse是为需要处理复杂交付排列的团队重新设计的CI工具。Concourse的pipeline机制将Task、Resource、Job三者有机地结合起来,其Build在容器中运行,隔离各个环境,避免不同环境之间相互污染情况发生。

0
325

本文作者:林小引

文章转自:用Concourse实现端到端的蓝绿部署

Concourse简介

Concourse是为执行敏捷开发并需要处理复杂交付排列的团队重新设计的CI工具,由Pivotal公司赞助开源,目前在市场上已经普遍使用。Concourse以pipeline机制运行集成任务。pipeline将Task、Resource、Job三者有机地结合起来,pipeline采用YAML文件配置,该配置可通过版本控制,方便移植和恢复。其Build构建在容器中运行,隔离各个环境,避免不同环境之间相互污染情况发生。

相对于现在广泛应用的CI/CD工具Jenkins,Concourse的主要优点在于:

  1. 为pipeline提供第一级的支持
  2. 在容器中运行相互隔离的构建工作、可避免使用雪花型构建服务器
  3. 能够方便地访问构建日志

Concourse的基本概念如下:

 

实验说明

本实验将使用Concourse实现端到端的蓝绿部署:

  1. 从Github检索应用程序的源代码,一旦有代码更新/提交事件,就会自动触发pipeline,并将源代码clone到本地
  2. 通过Mocha+Chai框架对更新的Node.js应用程序代码进行单元测试
  3. pipeline自动确定应用程序在生产中的当前实例(蓝色或绿色),并利用Cloud Foundry的CLI将代码部署到Pivotal Web Service上的Cloud Foundry环境的其他实例名称(如果绿色当前正在生产,则部署成蓝色,否则相反)。此时该应用实例还未添加外部route,不能被外部用户访问
  4. 使用Artillery对新部署的应用实例执行压力测试
  5. 使用Cloud Foundry的CLI将该新版本应用实例提升为生产版本(为该版本应用实例添加外部route),同时回收旧版本(将旧版本应用实例的外部route收回),对外部用户而言没有停机时间

每个pipeline步骤被配置为只有在成功执行前一个步骤时才自动运行,从而实现应用不停的自动蓝绿部署。流程架构如下图所示:

 

本实验将Concourse部署在Docker中,通过pull Mocha+Chai,Cloud Foundry CLI等docker镜像,实现pipeline中的单元测试,压力测试,Cloud Foundry配置部署等功能。

环境要求

  • OS:Windows 10
  • Docker Toolbox on Windows
  • VirtualBox:5.2.8 for Windows

需要的账号(均可以免费注册)

  • Github
  • Pivotal Web Service

实验步骤

1.下载并安装Docker Toolbox on Windows

 

如果还没有安装VirtualBox,可以在这里勾选上。否则请确保VirtualBox已安装。

 

2.启动Docker Toolbox on Windows

在桌面双击Docker Quickstart Terminal图标。启动成功后,它会在Virtual Box中创建一个名为default的VM。

跑个hello world测试一下:

$ docker run hello-world

测试一下concourse的docker镜像:

$ docker run concourse/concourse --help

3.使用docker-compose构建Concourse环境

创建一个工作目录

$ mkdir c:/works/lxyprj/concourse-docker
$ cd c:/works/lxyprj/concourse-docker

下载Concourse的docker-composer.yml

$ curl -o docker-compose.yml https://concourse-ci.org/docker-compose.yml

构建Concourse容器环境

$ docker-compose up -d

在Virtual Box中为default VM添加端口转发规则,将127.0.0.1的8080端口转发给default VM的8080端口

用浏览器打开网址: http://127.0.0.1:8080/

点击中间的Windows图标下载Concourse的CLI工具 fly , 并将 fly.exe 拷贝至工作目录

c:/works/lxyprj/concourse-docker

4.准备pipeline

用你自己的账号登录Github,并前往网址: https://github.com/lxyoutlook/concourse-pipeline-samples

点击右上角的Fork按钮,将该代码fork到你自己的Github账号下。

在Docker Toolbox下将自己Github repo下的该代码clone到本地:

$ git clone https://github.com/lxyoutlook/concourse-pipeline-samples

生成pipeline所需的credentials.yml文件

$ cd concourse-pipeline-samples/blue-green-app-deployment
$ cp ci/credentials.yml.sample ci/credentials.yml

修改credentials.yml文件,填入你在Pivotal Web Service账号的相关信息

$ vi ci/credentials.yml
deploy-username: 你自己的账号
deploy-password: 你自己的密码
pws-organization: 你自己的organization,我这里填的是lxyOrg
pws-space: 你自己的space,我这里填的是development
pws-api: https://api.run.pivotal.io
pws-app-suffix: 你自己的app前缀,我这里填的是app-lxyoutlook
pws-app-domain: cfapps.io

修改pipeline.yml文件,把对Github的检索地址改为你自己的Github账号下的repo地址:

这里我用的是:https://github.com/lxyoutlook/concourse-pipeline-samples

$ vi ci/pipeline.yml

这样,当下次在Github该repo下修改并提交代码时,就会自动触发pipeline进行新一轮蓝绿部署。

5.pipeline解析

$ view ci/pipeline.yml

pipeline中定义了4个job:

  - unit-tests
  - deploy-app
  - load-tests
  - promote-new-version

pipeline中定义了2个resource(注意:type分别是git和cf,一个是CI/CD管道的源头,一个是CI/CD管道的终点):

- name: concourse-pipeline-samples
  type: git
  source:
    branch: master
    uri: https://github.com/lxyoutlook/concourse-pipeline-samples.git
- name: PWS
  type: cf
  source:
    api: {{pws-api}}
    organization: {{pws-organization}}
    username: {{deploy-username}}
    password: {{deploy-password}}
    skip_cert_check: true
    space: {{pws-space}}

pipeline中定义了5个task:

- task: run-unit-tests
- task: get-current-app-color
- task: prepare-app-manifest
- task: run-load-tests
- task: switch-app-routes

其中每个task有一个对应的yml配置文件和一个shell脚本文件执行相应的操作,无需安装插件,就是这么简单

6.在Concourse环境中部署pipeline并测试

使用fly CLI指向(target)Virtual Box中的Concourse环境:

$ /c/works/lxyprj/concourse-docker/fly.exe -t lite login -c http://127.0.0.1:8080

在Concourse环境中设置(set-pipeline)该pipeline:

$ cd /c/works/lxyprj/concourse-docker/concourse-pipeline-samples/blue-green-app-deployment
$ /c/works/lxyprj/concourse-docker/fly.exe -t lite set-pipeline -c ci/pipeline.yml -p blue-green-pipeline -l ci/credentials.yml
$ y

通过set-pipeline命令设置好的pipeline是暂停状态,需要通过命令行启动或在图形界面下点击启动:

$ /c/works/lxyprj/concourse-docker/fly.exe -t lite unpause-pipeline --pipeline blue-green-pipeline

或者用浏览器访问 http://127.0.0.1:8080 。点击右上角的login,点击main,然后点击login

点击左上角的三角形图标启动该流程:

pipeline开始到Github检索代码,需要等待几分钟。检索完成后,开始执行unit-tests:

unit-tests任务会通过Mocha+Chai测试框架来对从Github上检索下来的代码进行单元测试。Mocha+Chai测试框架是pipeline自动从Docker hub上pulling下来的docker镜像:djudorange/node-gulp-mocha。

坏消息是这个pulling过程可能非常长,但好消息是只需pulling一次

unit-tests通过的话,会进入到deploy-app任务

deploy-app任务从Docker hub上pulling pivotalservices/docker-concourse-cf-tools镜像,利用该工具把代码push到Pivotal Web Service上的Cloud Foundry环境中进行部署。注意:部署成功后该应用并没有得到外部route,还不能被外部访问

deploy-app任务通过的话,会进入到load-tests任务

load-tests任务利用Artillery来进行压力测试

load-tests任务通过的话,会进入到promote-new-version任务

promote-new-version使用docker-concourse-cf-tools工具将该版本应用实例提升为生产版本(为该版本应用实例添加外部route),同时回收旧版本(将旧版本应用实例的外部route收回),对外部用户而言没有停机时间

下面是通过Pivotal Web Service的console看到的应用部署情况,黄色框内的就是刚刚通过pipeline自动部署到PWS上的应用实例,你可以通过内部route https://green-app-lxyoutlook.cfapps.io/来访问该实例

也可以通过对外的外部route https://main-app-lxyoutlook.cfapps.io/来访问该实例。因为此时它已经被提升为生产实例了

下面是该版本应用实例在浏览器中的显示,该版本为绿色版本(注意观察火车的颜色以及Application name)

至此,我们通过Concourse CD工具实现了蓝绿部署的自动化,中间还包括自动化的单元测试和压力测试。下面我们通过对Github中的代码进行修改/提交,看看pipeline会不会帮我们自动部署新版本

7.提交代码的新版本并测试pipeline

登录Github,打开https://github.com/lxyoutlook/concourse-pipeline-samples 这个repo,找到 concourse-pipeline-samples/blue-green-app-deployment/bgd-app/index.js 这个文件,点击右上角的“Edit this file”笔形图标

在第34行,将标题修改为“Blue-Green deployments new version”,然后点击“Commit Changes”按钮

回到Concourse的控制台 http://127.0.0.1:8080,你会发现pipeline有一个新的实例自动触发了

很快,流程自动进入到unite-tests任务

接下来,pipeline流程会自动化执行完成,直到新版本被成功部署并提升为生产。等pipeline新实例执行结束,打开Pivotal Web Service的console

此时外部route被绑定到了蓝色版本应用实例上

在浏览器中刷新刚才的外部route  https://main-app-lxyoutlook.cfapps.io/,可以看到新版本的应用。蓝绿版本实现了不停机切换

8.清理工作

1.在Pivotal Web Service中停止所有应用实例(1美分/每小时/实例,免费账户有87美金的credit)

2.从Concourse环境中将pipeline移除

$ /c/works/lxyprj/concourse-docker/fly.exe -t lite destroy-pipeline --pipeline blue-green-pipeline

3.销毁Concourse环境

$ docker-compose stop
$ docker-compose down

4.从Virtual Box中删除“default”VM

参考文献:

  • https://concourse-ci.org/getting-started.html
  • http://concoursetutorial.com/
  • https://github.com/pivotalservices/concourse-pipeline-samples/tree/master/blue-green-app-deployment
  • https://docs.docker.com/toolbox/toolbox_install_windows/

    请关注微信公众号 【devopshub】,获取更多关于DevOps研发运维一体化的信息

- leansoftx.com -