在软件开发中,随着应用或产品的开发和部署,需要根据用户反馈或新增功能不断更新。这个过程应该是自动化的,因为如果没有自动化,就需要为应用的每一次变更重复执行相同的开发和部署步骤/命令。通过持续集成和持续交付管道,可以自动化从构建、测试、打包到部署的整个工作流程,这将在现有应用有任何变更或代码库有新的提交时触发。
频繁发布:CI/CD使能够根据客户反馈或监控输入发布变更。
低风险:由于流程自动化,不会有任何手动干预和配置设置。
提高生产力:通过结构化流程,产品可以独立于其他组件发布,例如在多个微服务的情况下,可以独立发布变更,从而提高开发人员生产力。
首先,将创建一个应用程序负载均衡器,这将使应用可扩展且高可用。在AWS控制台中搜索EC2,然后点击负载均衡器,选择应用程序负载均衡器并点击创建。接下来,通过命名并选择VPC和可用区域来配置它。点击下一步,选择创建一个新的安全组,然后点击下一步。为Target组命名,对于Target类型选择IP,然后点击下一步。一旦创建,记下DNS名称,这是服务的公共地址。
在之前的博客中,学习了如何在ECS中创建任务定义,这是运行Fargate作业所需的。将使用相同的任务定义来创建Fargate服务。请参考之前的博客以理解概念并跟随操作。转到Amazon ECS中的任务定义,勾选对应现有任务定义的单选按钮,点击操作并创建服务。选择Fargate作为启动类型,给它命名,不要更改部署类型(滚动更新),然后点击下一步。选择在负载均衡器中配置的子网。选择应用程序负载均衡器作为负载均衡器类型,然后点击添加到负载均衡器。选择在应用程序负载均衡器中创建的目标组名称,然后点击下一步,审查并点击创建服务。
它是一个类似于Github的版本控制服务,由AWS托管。对于演示,将使用CodeCommit仓库并将应用代码推送到其中(如果愿意,也可以使用Github)。在AWS控制台中搜索CodeCommit,创建一个仓库,并给它命名。一旦仓库创建,需要添加特定权限并创建Git凭据以访问CodeCommit仓库。转到IAM控制台,选择用户并选择要为CodeCommit配置的用户,从策略列表中附加AWSCodeCommitPowerUser策略,然后审查并点击添加权限。现在,为了生成Git凭据,选择添加了CodeCommit权限的用户,并搜索HTTPS Git凭据AWS CodeCommit部分,然后点击生成凭据并下载。现在复制仓库URL并在本地系统上使用git clone克隆它。对于用户名和密码,请使用之前下载的凭据文件。现在可以将应用推送到这个仓库,使用的是之前帖子中的相同应用,可以从Github下载源代码或使用自己的应用。
下一步是在CodeCommit仓库上设置持续集成功能。AWSCodeBuild是管理CI服务,它编译源代码,运行测试,并打包源代码,这些可以用于部署。要使用CodeBuild,需要一个buildspec.yml文件,其中包含用于编译、测试和打包代码的命令。对于目的,在buildspec.yml文件中,将编写命令以使用docker容器化应用并将其推送到ECR。
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- CODEBUILD_RESOLVED_SOURCE_VERSION="${CODEBUILD_RESOLVED_SOURCE_VERSION:-$IMAGE_TAG}"
- IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- echo image_tag $IMAGE_TAG
- REPO="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com"
- IMAGE_URI="$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG"
- echo Repository $REPO
- docker login -u AWS -p $(aws ecr get-login-password --region $AWS_DEFAULT_REGION) $REPO
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $IMAGE_URI .
post_build:
commands:
- bash -c "if [ /"$CODEBUILD_BUILD_SUCCEEDING/" == /"0/" ]; then exit 1; fi"
- echo Build stage successfully completed on `date`
- echo Pushing the Docker image...
- docker push $IMAGE_URI
- printf '[{"name":"sentiment-analysis-container","imageUri":"%s"}]' "$IMAGE_URI" > images.json
artifacts:
files: images.json
不会过多深入细节,因为大多数命令都与docker相关,而且像pre_build、build等语法都是自解释的。如果想深入了解,请参考AWS文档。有一点要强调的是artifacts文件,这里保存了一个‘images.json’文件,其中包含了之前在ECS(任务定义容器名称)中创建的容器名称和将推送到ECR的容器的Image URI。这个artifacts文件将在CodePipeline阶段需要。