Concourse简介
Concourse是为执行敏捷开发并需要处理复杂交付排列的团队重新设计的CI工具,由Pivotal公司赞助开源,目前在市场上已经普遍使用。Concourse以pipeline机制运行集成任务。pipeline将Task、Resource、Job三者有机地结合起来,pipeline采用YAML文件配置,该配置可通过版本控制,方便移植和恢复。其Build构建在容器中运行,隔离各个环境,避免不同环境之间相互污染情况发生。
相对于现在广泛应用的CI/CD工具Jenkins,Concourse的主要优点在于:
- 为pipeline提供第一级的支持
- 在容器中运行相互隔离的构建工作、可避免使用雪花型构建服务器
- 能够方便地访问构建日志
Concourse | Jenkins |
|
|
Concourse的基本概念如下:
实验说明
本实验将使用Concourse实现端到端的蓝绿部署:
- 从Github检索应用程序的源代码,一旦有代码更新/提交事件,就会自动触发pipeline,并将源代码clone到本地
- 通过Mocha+Chai框架对更新的Node.js应用程序代码进行单元测试
- pipeline自动确定应用程序在生产中的当前实例(蓝色或绿色),并利用Cloud Foundry的CLI将代码部署到Pivotal Web Service上的Cloud Foundry环境的其他实例名称(如果绿色当前正在生产,则部署成蓝色,否则相反)。此时该应用实例还未添加外部route,不能被外部用户访问
- 使用Artillery对新部署的应用实例执行压力测试
- 使用Cloud Foundry的CLI将该新版本应用实例提升为生产版本(为该版本应用实例添加外部route),同时回收旧版本(将旧版本应用实例的外部route收回),对外部用户而言没有停机时间
每个pipeline步骤被配置为只有在成功执行前一个步骤时才自动运行,从而实现应用不停的自动蓝绿部署。流程架构如下图所示:
本实验将Concourse部署在Docker中,通过pull Mocha+Chai,Cloud Foundry CLI等docker镜像,实现pipeline中的单元测试,压力测试,Cloud Foundry配置部署等功能。
环境要求
需要的账号(均可以免费注册)
实验步骤
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通过的话,会进入到deploy-app任务
deploy-app任务从Docker hub上pulling pivotalservices/docker-concourse-cf-tools镜像,利用该工具把代码push到Pivotal Web Service上的Cloud Foundry环境中进行部署。注意:部署成功后该应用并没有得到外部route,还不能被外部访问
load-tests任务利用Artillery来进行压力测试
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
https://github.com/pivotalservices/concourse-pipeline-samples/tree/master/blue-green-app-deployment
https://docs.docker.com/toolbox/toolbox_install_windows/
版权声明:本文为博主原创文章,转载请标明作者和出处。