如何从 AWS Codepipeline 中的 json 文件中读取值?

How to read a value from a json file in AWS Codepipeline?

我的问题: Codepipeline 如何读取 SourceCodeArtifact 中的 json 文件中的字段值?

我的 Gthub 存储库包含一个文件 imageManifest.json,如下所示:

{
  "image_id": "docker.pkg.github.com/my-org/my-repo/my-app",
  "image_version": "1.0.1"
}

我希望我的 AWS Codepipeline Source 阶段能够从 imageManifest.json 中读取 image_version 的值,并将其作为参数传递给管道后续阶段中的 CloudFormation 操作。

供参考,这是我的源阶段。

        Stages:
        - Name: GitHubSource
          Actions:
          - Name: SourceAction
            ActionTypeId:
              Category: Source
              Owner: ThirdParty
              Version: '1'
              Provider: GitHub
            OutputArtifacts:
              - Name: SourceCodeArtifact
            Configuration:
              Owner: !Ref GitHubOwner
              Repo: !Ref GitHubRepo
              OAuthToken: !Ref GitHubAuthToken

这是我的部署阶段:

        - Name: DevQA
          Actions:
          - Name: DeployInfrastructure
            InputArtifacts:
              - Name: SourceCodeArtifact
            ActionTypeId:
              Category: Deploy
              Owner: AWS
              Provider: CloudFormation
              Version: '1'
            Configuration:
              StackName: !Ref AppName
              Capabilities: CAPABILITY_NAMED_IAM
              RoleArn: !GetAtt [CloudFormationRole, Arn]
              ParameterOverrides: !Sub '{"ImageId": "${image_version??}"}'

请注意,上面最后一行中的 image_version 只是我理想的占位符,用于说明我希望如何使用 image_version json 值。

Codepipeline 如何读取 SourceCodeArtifact 中的 json 文件中的字段值? 步骤函数?拉姆达? CodeBuild?

您可以在源代码和部署阶段之间使用 CodeBuild 步骤。

在 CodeBuild 步骤中,从 SourceArtifact(源阶段生成的工件)读取 image_version 并写入工件 'Template configuration' 文件 1,这是一个配置 属性 CloudFormation 操作。此文件可以保存您的 CloudFormation 堆栈的参数值。使用此文件代替您当前使用的 ParameterOverrides

Fn::GetParam就是你想要的。它可以 returns 来自 JSON 格式文件中键值对的值。 JSON 文件必须包含在工件中。

这是文档,它为您提供了一些示例:https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/continuous-delivery-codepipeline-parameter-override-functions.html#w2ab1c13c20b9

应该是这样的:

ParameterOverrides: |
    {
        "ImageId" : { "Fn::GetParam" : ["SourceCodeArtifact", "imageManifest.json", "image_id"]}
    }