Continuous integration AWS代码管道不更新我的ECS群集
我使用CloudFormation创建了两个堆栈。 第一个堆栈创建一个包含所需资源的集群:Continuous integration AWS代码管道不更新我的ECS群集,continuous-integration,amazon-cloudformation,devops,continuous-delivery,aws-codepipeline,Continuous Integration,Amazon Cloudformation,Devops,Continuous Delivery,Aws Codepipeline,我使用CloudFormation创建了两个堆栈。 第一个堆栈创建一个包含所需资源的集群: 负载平衡器 自动缩放组 目标群体 听众 EC2实例 任务定义和服务 等等 第二个堆栈用于创建CodePipeline堆栈,以便配置连续传递管道 流程应如下所示: 用户将代码推送到Github 触发CodePipeline,执行以下阶段: 源代码阶段:从Github提取代码 构建阶段:构建图像并将其推送到ECR 部署阶段:触发上述第一个CloudFormation堆栈上的堆栈更新 ECS群集服务通
- 负载平衡器
- 自动缩放组
- 目标群体
- 听众
- EC2实例
- 任务定义和服务
- 等等
- 用户将代码推送到Github
- 触发CodePipeline,执行以下阶段:
- 源代码阶段:从Github提取代码
- 构建阶段:构建图像并将其推送到ECR
- 部署阶段:触发上述第一个CloudFormation堆栈上的堆栈更新
- ECS群集服务通过CloudFormation堆栈更新进行更新
为了强制更新CloudFormation堆栈,需要做些什么吗?或者我应该在部署阶段部署到ECS集群而不是CloudFormation 据我所知,您缺少部署应用程序阶段。您似乎只是在更新基础架构,而不是在部署阶段部署应用程序代码 我是如何设置它的:
- 代码管道和基础结构模板与代码一起放置
- 代码推送触发代码管道
- 第一阶段:从codecommit(或您的github)检出代码
- (可选)codepipeline更新自身以处理对codepipeline模板的更改
- 构建阶段:构建形象并推送到ECR
- 部署基础设施阶段:触发基础设施堆栈的cloudformation堆栈更新
- 部署app阶段:将应用程序代码部署到基础架构(您似乎缺少的内容)
...
Stages:
- Name: deploy-app
Actions:
- Name: Deploy
ActionTypeId:
Category: Deploy
Owner: AWS
Provider: ECS
Version: 1
InputArtifacts:
- Name: build-output-artifact
Configuration:
ClusterName: 'my-cluster'
ServiceName: 'my-service'
FileName: 'imagedefinitions.json' (optional)
在构建阶段,将映像推送到ECR后,将ECR url写入ECS imagedefinitions.json。imagedefinitions.json必须是构建阶段的输出人工制品和部署应用程序阶段的输入人工制品
更多信息:
- Name: Deploy
Actions:
- Name: Deploy
ActionTypeId:
Category: Deploy
Owner: AWS
Version: 1
Provider: CloudFormation
Configuration:
ChangeSetName: Deploy
ActionMode: CREATE_UPDATE
StackName: !Sub ${AWS::StackName}-nested
Capabilities: CAPABILITY_NAMED_IAM
TemplatePath: Architecture-Template::service-ec2.yaml
RoleArn: !GetAtt CloudFormationExecutionRole.Arn
ParameterOverrides: !Sub |
{
"ImageURI" : { "Fn::GetParam" : [ "BuildOutput", "imageDetail.json", "ImageURI" ] },
"ApplicationRepoName": "${ApplicationRepoName}",
"VpcId": "${VpcId}",
"Cluster": "${Cluster}",
"ListenerArn": "${ListenerArn}",
"ServiceAssignPublicIP": "${ServiceAssignPublicIP}",
"ServiceDesiredCount": "${ServiceDesiredCount}",
"ServiceLoadBalancerPath": "${ServiceLoadBalancerPath}",
"ServiceSecurityGroups": "${ServiceSecurityGroups}",
"ServiceSubnets": "${ServiceSubnets}",
"TaskHostPort": "${TaskHostPort}",
"TaskContainerPort": "${TaskContainerPort}",
"TaskCpu": "${TaskCpu}",
"TaskMemory": "${TaskMemory}",
"TaskExecutionRoleArn": "${TaskExecutionRoleArn}",
"LoadBalancerPriority": "${LoadBalancerPriority}",
"TargetGroupHealthCheckPath": "${TargetGroupHealthCheckPath}",
"TargetGroupPort": "${TargetGroupPort}",
"TargetGroupHealthCheckPort": "${TargetGroupHealthCheckPort}",
"TagMaintainer": "${TagMaintainer}",
"TagEnvironment": "${TagEnvironment}",
"TagApi": "${TagApi}"
}
InputArtifacts:
- Name: Architecture-Template
- Name: BuildOutput
RunOrder: 1
如您所见,我向嵌套堆栈传递了一组参数,
包括来自
imageDetail.json
文件,在生成步骤中根据
请参阅buildspec.yml配置文件中的说明。
在此文件中,我将图像标记定义为:
- 提交\u哈希=$(echo$CODEBUILD\u RESOLVED\u SOURCE\u VERSION | cut-c1-7)
- echo$COMMIT\u散列
- IMAGE_TAG=${COMMIT_HASH:=latest}
- printf'{“ImageURI”:“%s:%s”}'$REPOSITORY\u URI$IMAGE\u TAG>imageDetail.json
- printf'{“ImageURI”:“%s:%s”}'$REPOSITORY\u URI latest>imageDetail.json
在我的例子中,id与Elastic Container Registry中的图像标记相关我得到了部署基础设施。这是有道理的。但是,我将如何将应用程序部署到该基础设施?我需要做什么?这是什么阶段类型?我在回答中添加了更多关于部署应用程序阶段的信息