文章目录
aws(学习笔记第四十六课) codepipeline-build-deploy
- 使用
codebuild
- 尝试
codedeploy
学习内容:
- 定义
codebuild
- 使用
codedeploy
1. 代码链接及整体架构
1.1 代码链接
代码连接(codepipeline-build-deploy)
1.2 整体架构
整体架构分为三个部分:
- 初始化阶段,创建
codecommit repo
以及codebuild project
- 创建
vpc
,public alb
,alb listener
以及fargate service
等 - 创建
source
,build
以及deploy
等stage
以及deplyment group
,将部署和alb listener
进行关联
1.2.1 初始化阶段的codecommit repo
以及codebuild project
设定
这里,trigger code build
分为两个阶段:
- 初期阶段,通过
custom resource
创建 ==>trigger lambda
执行 ==>trigger code build project
- 平时运用阶段,通过
code commit
的push
==>trigger code build project
1.2.2 创建vpc
,public alb
,alb listener
以及fargate service
等
这些组件都是真正运行服务的部分。
- 首先生成一个
Application Loader Balancer
- 对这个
Application Loader Balancer
设定listener
- 之后生成
Target Group Green
和Target Group Blue
这里实现蓝绿部署 - 对
Application Loader Balancer Listener
设定default
的target group
,这里设定为Target Group Green
1.2.3 创建source
,build
以及deploy
等stage
以及deplyment group
,将部署和alb listener
进行关联
- 创建
source stage
,input
为code repo
source stage
将整个code repo
生成source artifact
- 创建
build stage
,input
为source artifact
build stage
对整个source artifact
进行build
,主要是使用buildspec.yaml
build stage
进行完docker build
之后,将生成的docker image
上传到ecr
build stage
进行完docker build
之后,生成出deploy stage
需要的appspec.yaml && cat taskdef.json
deploy stage
使用appspec.yaml && cat taskdef.json
对整个deployment group
进行部署
2. 代码详细分析
2.1 初始化阶段代码,创建codecommit repo
以及codebuild project
2.1.1 创建codecommit repo
# Creates an AWS CodeCommit repository
code_repo = codecommit.Repository(
self, "CodeRepo",
repository_name="simple-app-code-repo",
# Copies files from app directory to the repo as the initial commit
code=codecommit.Code.from_directory("app", "main")
)
2.1.2 创建Elastic Container Registry (ECR) image repository
# Creates an Elastic Container Registry (ECR) image repository
image_repo = ecr.Repository(self, "ImageRepo")
2.1.3 创建fargate task definition
# Creates a Task Definition for the ECS Fargate service
fargate_task_def = ecs.FargateTaskDefinition(self, "FargateTaskDef")
fargate_task_def.add_container(
"Container",
container_name="web",
image=ecs.ContainerImage.from_ecr_repository(image_repo),
port_mappings=[{
"containerPort": 80}]
)
这里,创建一个container(docker)
,并将端口映射出80
。
2.1.4 创建code build project
# CodeBuild project that builds the Docker image
build_image = codebuild.Project(
self, "BuildImage",
build_spec=codebuild.BuildSpec.from_source_filename(
"buildspec.yaml"),
source=codebuild.Source.code_commit(
repository=code_repo,
branch_or_ref="main"
),
environment=codebuild.BuildEnvironment(
privileged=True
),
environment_variables={
"AWS_ACCOUNT_ID": codebuild.BuildEnvironmentVariable(value=os.getenv('CDK_DEFAULT_ACCOUNT') or ""),
"REGION": codebuild.BuildEnvironmentVariable(value=os.getenv('CDK_DEFAULT_REGION') or ""),
"IMAGE_TAG": codebuild.BuildEnvironmentVariable(value="latest"),
"IMAGE_REPO_NAME": codebuild.BuildEnvironmentVariable(value=image_repo.repository_name),
"REPOSITORY_URI": codebuild.BuildEnvironmentVariable(value=image_repo.repository_uri),
"TASK_DEFINITION_ARN": codebuild.BuildEnvironmentVariable(value=fargate_task_def.task_definition_arn),
"TASK_ROLE_ARN": codebuild.BuildEnvironmentVariable(value=fargate_task_def.