亚马逊AWS官方博客
基于Amazon EC2 Container Service的持续集成/持续交付解决方案
基本概念
持续集成/持续交付
互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称CI)和持续交付(Continuous delivery,简称CD)。
通过CI/CD构建自动化的代码交付管道,可以实现:
(1) 快速交付。通过CI/CD自动化软件发布的过程,可以更快速地发布新的功能,快速迭代反馈并让新功能更快提供给客户。
(2) 提高质量。自动化构建、测试和发布过程致使可以轻松测试每次代码更改并捕捉易于修复的小型漏洞,通过标准化发布过程运行每一项更改,从而保证应用程序或基础设施代码的质量。
(3) 可配置工作流。通过图形用户界面模拟软件发布过程的各个阶段。
容器
本文涉及到的另外一个概念是容器,相信大家都已经不再陌生,并且很多朋友已经在自己的环境中有实际的运行、部署基于容器的应用,这边简单的回顾下容器的几个重要优势:
一是因为容器可以跨平台,从而让程序猿可以享受到研发生产环境一致性的便利,也就是DevOps。在没有容器之前,常常一个应用做好了在笔记本上可以运转起来,在数据中心就运转不起来,因为操作系统版本不同、库版本不对;或者有的时候生产环境里出现了问题,在笔记本的开发环境中复制不出来。有了容器之后,这些问题就大大减少了。
其二,容器在虚拟机里面可以大幅度提升资源利用率。因为一旦把应用容器化,虚拟机资源就可以通过部署多个容器而得到充分利用,而不是每一个应用去申请一个虚拟机,造成资源的浪费。
Amazon ECS/ECR
Amazon EC2 Container Service (ECS)是一个托管的容器集群管理和调度服务, 可使您在 Amazon EC2 实例集群中轻松运行和管理支持 Docker 的应用程序。
使用 Amazon ECS 后,您不再需要安装、操作、扩展您自己的集群管理基础设施,可以根据资源需求和可用性要求在集群中安排支持 Docker 的应用程序。借助 Amazon ECS,您可以从一个容器扩展到覆盖数百个实例的数千个容器,而运行应用程序的方式并不会因此而变得复杂。您可以运行包括应用程序、批量作业和微服务在内的任何东西。Amazon ECS 将基础设施的一切复杂因素全部消除,让您能够集中精力设计、开发、运行容器化应用程序。
Amazon EC2 Container Registry (ECR) 是完全托管的 Docker 镜像仓库,可以让开发人员轻松存储、管理和部署 Docker 容器映像。Amazon ECR 集成在 Amazon EC2 Container Service (ECS) 中,从而简化产品工作流的开发。
本文主要介绍如何在AWS云上,使用Jenkins快速构建针对容器应用的持续集成/持续交付管道。
下图是整个CI/CD的流程图:
- 开发者commit/push新版本的软件工程到GitHub仓库
- GitHub的webhook触发Jenkins预先定义好的构建Pipeline
- Jenkins下载GitHub,并基于下载的DockerFile构建新的docker镜像并上传ECR仓库
- Jenkins调用aws cli更新ECS的task definition引用新的docker镜像并更新相关的service
- ECS基于新的service配置更新集群中的container
可以看到,整个代码的发布过程,开发人员只需要在本地开发新版本的软件并提交到GitHub,之后的一系列代码构建、部署等过程可以完全实现自动化,无需人为干预,大大提高了软件迭代的速度,为敏捷开发、微服务化提供支持,同时,可以根据需要添加测试步骤、代码审查、人工审批等步骤,构建一条更为强大灵活的代码交付流程。
- 准备工作启动一台EC2用于安装jenkins,本例使用Amazon Linux AMI,建议分配EIP(52.34.X.X),并且赋予合适role使其能够操作ECR和ECS
- 安装java jdk 1.8
- 安装并运行docker daemon,
yum install docker –y
chkconfig docker on
service docker start
- 安装并运行jenkins
wget -O /etc/yum.repos.d/jenkins.repo http://jenkins-ci.org/redhat/jenkins.reporpm –import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.keyyum install jenkins
chkconfig jenkins on
service jenkins start
- 将jenkins用户加入docker用户组,使其拥有docker cli执行权限
usermod -a -G docker jenkins - 安装git,jq
yum install git jq –y
第一步 配置GitHub与Jenkins联动
生成GitHub token,用于jenkins访问GitHub
记录下生成的token字符串
为需要做CI/CD的GitHub创建hook,实现代码更新自动通知Jenkins,Payload URL设置Jenkins Server的地址,默认Jenkins监听8080端口
第二步 配置Jenkins的构建步骤
在浏览器中输入jenkins server的地址(52.34.X.X:8080),开始配置jenkins
初始化登入
安装推荐的插件
安装CloudBees Docker Build and Publish plugin,用于构建docker镜像并上传到ECR仓库
配置github插件,使得jenkins能够连接到github
点击Add GitHub Server增加GitHub服务器,并添加Credentials
在Secret中输入之前记录的GitHub Personal Access Token
点击Test connection测试连通性
创建jenkins项目
设置GitHub项目路径
源代码管理选择Git
勾选GitHub hook trigger for GITScm polling,使得github项目的更改自动触发构建行为
添加三个构建步骤
第一个步骤为通过aws cli登入ECR仓库
第二个步骤为通过CloudBees Docker Build and Publish plugin构建docker镜像并上传到ECR中
第三个步骤为通过脚本注册新的ECS task definition并更新service,实现服务部署,详细代码可以从如下链接获取
https://s3---cn-north-1.amazonaws.com.rproxy.goskope.com.cn/junyublog/buildstep3.sh
第三步 测试
https://github.com/iwasnobody/ecs-cicd-jenkins
本例使用的GitHub工程对外提供一个apache PHP的静态页面
在本地PC上clone下工程兵修改工程下的src/index.php文件
commit并push到GitHub上
Jenkins界面可以看到自动触发了一次新的构建
查看新的镜像已经被上传到ECR
查看jenkins创建了新版本的task definition
查看service已经引用了新版本的task definition
访问应用,确认已经更新到最新版
作者介绍
余骏,AWS解决方案架构师,负责基于AWS的云计算方案架构的咨询和设计,同时致力于AWS云服务在国内的应用和推广。在加入AWS之前,他在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。