基于 Amazon EC2 Container Service 的持续集成 / 持续交付解决方案

阅读数:218 2019 年 11 月 13 日 08:00

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

互联网软件的开发和发布,已经形成了一套标准流程,最重要的组成部分就是持续集成(Continuous integration,简称 CI)和持续交付(Continuous delivery,简称 CD)。

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

通过 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 的流程图:

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

  1. 开发者 commit/push 新版本的软件工程到 GitHub 仓库
  2. GitHub 的 webhook 触发 Jenkins 预先定义好的构建 Pipeline
  3. Jenkins 下载 GitHub,并基于下载的 DockerFile 构建新的 docker 镜像并上传 ECR 仓库
  4. Jenkins 调用 aws cli 更新 ECS 的 task definition 引用新的 docker 镜像并更新相关的 service
  5. ECS 基于新的 service 配置更新集群中的 container

可以看到,整个代码的发布过程,开发人员只需要在本地开发新版本的软件并提交到 GitHub,之后的一系列代码构建、部署等过程可以完全实现自动化,无需人为干预,大大提高了软件迭代的速度,为敏捷开发、微服务化提供支持,同时,可以根据需要添加测试步骤、代码审查、人工审批等步骤,构建一条更为强大灵活的代码交付流程。

  1. 准备工作启动一台 EC2 用于安装 jenkins,本例使用 Amazon Linux AMI,建议分配 EIP(52.34.X.X),并且赋予合适 role 使其能够操作 ECR 和 ECS

  2. 安装 java jdk 1.8

  3. 安装并运行 docker daemon,

    col 1

    yum install docker –y

    chkconfig docker on

    service docker start

  4. 安装并运行 jenkins

    col 1

    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

  5. 将 jenkins 用户加入 docker 用户组,使其拥有 docker cli 执行权限

    col 1

    usermod -a -G docker jenkins

  6. 安装 git,jq

    col 1

    yum install git jq –y

第一步 配置 GitHub 与 Jenkins 联动

生成 GitHub token,用于 jenkins 访问 GitHub

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

记录下生成的 token 字符串

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

为需要做 CI/CD 的 GitHub 创建 hook,实现代码更新自动通知 Jenkins,Payload URL 设置 Jenkins Server 的地址,默认 Jenkins 监听 8080 端口

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

第二步 配置 Jenkins 的构建步骤

在浏览器中输入 jenkins server 的地址 (52.34.X.X:8080),开始配置 jenkins

初始化登入

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

安装推荐的插件

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

安装 CloudBees Docker Build and Publish plugin,用于构建 docker 镜像并上传到 ECR 仓库

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

配置 github 插件,使得 jenkins 能够连接到 github

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

点击 Add GitHub Server 增加 GitHub 服务器,并添加 Credentials

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

在 Secret 中输入之前记录的 GitHub Personal Access Token

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

点击 Test connection 测试连通性

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

创建 jenkins 项目

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

设置 GitHub 项目路径

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

源代码管理选择 Git

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

勾选 GitHub hook trigger for GITScm polling,使得 github 项目的更改自动触发构建行为

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

添加三个构建步骤

第一个步骤为通过 aws cli 登入 ECR 仓库

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

第二个步骤为通过 CloudBees Docker Build and Publish plugin 构建 docker 镜像并上传到 ECR 中

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

第三个步骤为通过脚本注册新的 ECS task definition 并更新 service,实现服务部署,详细代码可以从如下链接获取

https://s3.cn-north-1.amazonaws.com.cn/junyublog/buildstep3.sh

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

第三步 测试

https://github.com/iwasnobody/ecs-cicd-jenkins

本例使用的 GitHub 工程对外提供一个 apache PHP 的静态页面

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

在本地 PC 上 clone 下工程兵修改工程下的 src/index.php 文件

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

commit 并 push 到 GitHub 上

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

Jenkins 界面可以看到自动触发了一次新的构建

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

查看新的镜像已经被上传到 ECR

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

查看 jenkins 创建了新版本的 task definition

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

查看 service 已经引用了新版本的 task definition

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

访问应用,确认已经更新到最新版

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

作者介绍

基于Amazon EC2 Container Service的持续集成/持续交付解决方案

余骏,AWS 解决方案架构师,负责基于 AWS 的云计算方案架构的咨询和设计,同时致力于 AWS 云服务在国内的应用和推广。在加入 AWS 之前,他在思科中国担任系统工程师,负责方案咨询和架构设计,在企业私有云和基础网络方面有丰富经验。

本文转载自 AWS 技术博客。

原文链接:
https://amazonaws-china.com/cn/blogs/china/continuous-integrationcontinuous-delivery-solution-based-on-aws-ecs/

欲了解 AWS 的更多信息,请访问【AWS 技术专区】

评论

发布