Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Continuous integration AWS代码管道不更新我的ECS群集_Continuous Integration_Amazon Cloudformation_Devops_Continuous Delivery_Aws Codepipeline - Fatal编程技术网

Continuous integration AWS代码管道不更新我的ECS群集

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群集服务通

我使用CloudFormation创建了两个堆栈。 第一个堆栈创建一个包含所需资源的集群:

  • 负载平衡器
  • 自动缩放组
  • 目标群体
  • 听众
  • EC2实例
  • 任务定义和服务
  • 等等
第二个堆栈用于创建CodePipeline堆栈,以便配置连续传递管道

流程应如下所示:

  • 用户将代码推送到Github
  • 触发CodePipeline,执行以下阶段:
    • 源代码阶段:从Github提取代码
    • 构建阶段:构建图像并将其推送到ECR
    • 部署阶段:触发上述第一个CloudFormation堆栈上的堆栈更新
  • ECS群集服务通过CloudFormation堆栈更新进行更新
一切正常,但我有个问题。我正在更新代码,应用程序似乎正在使用旧代码运行,我的意思是,管道以绿色运行,但每当我访问负载平衡器URL时,代码都不会更新。我想这是因为CloudFormation脚本没有改变,但我的代码确实改变了


为了强制更新CloudFormation堆栈,需要做些什么吗?或者我应该在部署阶段部署到ECS集群而不是CloudFormation

据我所知,您缺少部署应用程序阶段。您似乎只是在更新基础架构,而不是在部署阶段部署应用程序代码

我是如何设置它的:

  • 代码管道和基础结构模板与代码一起放置
  • 代码推送触发代码管道
  • 第一阶段:从codecommit(或您的github)检出代码
  • (可选)codepipeline更新自身以处理对codepipeline模板的更改
  • 构建阶段:构建形象并推送到ECR
  • 部署基础设施阶段:触发基础设施堆栈的cloudformation堆栈更新
  • 部署app阶段:将应用程序代码部署到基础架构(您似乎缺少的内容)
在您的cloudformation模板中为ECS部署应用程序阶段如下所示:

...
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必须是构建阶段的输出人工制品和部署应用程序阶段的输入人工制品

更多信息:


看来我的配置与您的类似

我的配置中的部署步骤部署了cloudformation嵌套堆栈

有关部署步骤的一些详细信息:

- 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}
然后,我使用此信息创建ImageURI并更新imageDetail.json 配置文件

  • printf'{“ImageURI”:“%s:%s”}'$REPOSITORY\u URI$IMAGE\u TAG>imageDetail.json
这意味着每个新构建都应该更改此信息, 依次传递给嵌套堆栈, 由于图像定义已更改,因此应更新

在我的案例中,问题与我使用最新版本有关 代替实际标记,如下所示(值不正确,用实际标记替换最新标记)

  • printf'{“ImageURI”:“%s:%s”}'$REPOSITORY\u URI latest>imageDetail.json
一旦我在buildspec.yml中修复了这一行,服务就被更新了 每次代码管道识别新提交时

简言之:

要更新嵌套堆栈,应该对其配置进行一些更改,
在我的例子中,id与Elastic Container Registry中的图像标记相关

我得到了部署基础设施。这是有道理的。但是,我将如何将应用程序部署到该基础设施?我需要做什么?这是什么阶段类型?我在回答中添加了更多关于部署应用程序阶段的信息