AWS CodePipeline:如何将输出从 CloudFormation 操作传递到 CodeBuild 操作
AWS CodePipeline: How to pass output from CloudFormation action to a CodeBuild action
我在 CloudFormation 模板中定义了一个 AWS CodePipeline。
管道的其中一个步骤是为我的应用程序构建测试环境的 CloudFormation 操作。应用的 Elastic Load Balancer 的 URL 是此模板中定义的输出之一。
如何访问此输出,以便我可以在下一步中使用它,这是一个 CodeBuild 操作,将 运行 api 针对测试环境进行测试?
我可以在 CloudFormation 部署步骤中指定一个 OutputFileName
,但是 CodeBuild 步骤需要 2 个输入工件,测试代码和 CloudFormation 输出文件,并且最多有 1 个输入工件。
我想我可以有一个将 CloudFormation 输出文件推送到 S3 的步骤,这样 api 测试步骤就可以访问它(或者只是将它作为 CloudFormation::Init 代码),但我希望我可以在 CodePipeline 步骤中配置更简单的东西(类似于 CloudFormation 中的 !ImportValue)。
我还认为我可以分配一个 'test url' 例如http://test.myapp.com,在 CloudFormation 步骤中,这样 api 测试总是 运行 针对特定的 url,这将是一个很好的选择,除了我正在加速测试在测试之前动态环境(因为我不希望它总是 运行ning 的成本),我不确定 DNS 是否会在 api 测试开始时传播 运行宁.
提前致谢
启动测试环境的 CodePipeline CloudFormation 操作的定义
...
Name: DeployApplicationInfra
ActionTypeId:
Category: Deploy
Owner: AWS
Version: 1
Provider: CloudFormation
Configuration:
ActionMode: CREATE_UPDATE
Capabilities: CAPABILITY_IAM
OutputFileName: test-application-infra-stack.outputs.json
StackName: test-application-infra-stack
RoleArn: !Ref CloudFormationServiceRoleArn
TemplateConfiguration: AppInfraCfnTemplate::test-application-infra.config.json
TemplatePath: AppInfraCfnTemplate::application-infra.yml
InputArtifacts:
- Name: AppInfraCfnTemplate
OutputArtifacts:
- Name: TestApplicationInfraStackOutputs
CodePipeline CodeBuild 操作的定义 运行 api 测试
...
Name: RunApiTests
ActionTypeId:
Category: Test
Owner: AWS
Version: 1
Provider: CodeBuild
Configuration:
ProjectName: !Ref ApiTestsBuildProject
InputArtifacts:
- Name: AppSource
...
ApiTestsBuildProject:
Type: AWS::CodeBuild::Project
Properties:
Name: companyinsight-api-tests-build
Artifacts:
Type: CODEPIPELINE
Environment:
ComputeType: BUILD_GENERAL1_SMALL
Image: aws/codebuild/nodejs:8.11.0
Type: LINUX_CONTAINER
ServiceRole: !Ref CIServerBuildRoleArn
Source:
Type: CODEPIPELINE
BuildSpec: !Sub |
version: 0.2
env:
variables:
BASE_URL: <Want to inject test app url here!!!>
phases:
install:
commands:
- npm install
build:
commands:
- npm run api-test
遗憾的是,当前没有允许 CodePipeline 中的 CodeBuild 的 2 个输入工件的解决方法。
我现在推荐的替代方法是在构建过程中从 CLI 调用 aws cloudformation describe-stacks 并从堆栈输出中提取 ELB 主机名。
从 AWS 检查此更新 https://aws.amazon.com/about-aws/whats-new/2018/08/aws-codebuild-adds-ability-to-create-build-projects-with-multiple-input-sources-and-output-artifacts/
看来你现在可以了。
我在 CloudFormation 模板中定义了一个 AWS CodePipeline。
管道的其中一个步骤是为我的应用程序构建测试环境的 CloudFormation 操作。应用的 Elastic Load Balancer 的 URL 是此模板中定义的输出之一。
如何访问此输出,以便我可以在下一步中使用它,这是一个 CodeBuild 操作,将 运行 api 针对测试环境进行测试?
我可以在 CloudFormation 部署步骤中指定一个 OutputFileName
,但是 CodeBuild 步骤需要 2 个输入工件,测试代码和 CloudFormation 输出文件,并且最多有 1 个输入工件。
我想我可以有一个将 CloudFormation 输出文件推送到 S3 的步骤,这样 api 测试步骤就可以访问它(或者只是将它作为 CloudFormation::Init 代码),但我希望我可以在 CodePipeline 步骤中配置更简单的东西(类似于 CloudFormation 中的 !ImportValue)。
我还认为我可以分配一个 'test url' 例如http://test.myapp.com,在 CloudFormation 步骤中,这样 api 测试总是 运行 针对特定的 url,这将是一个很好的选择,除了我正在加速测试在测试之前动态环境(因为我不希望它总是 运行ning 的成本),我不确定 DNS 是否会在 api 测试开始时传播 运行宁.
提前致谢
启动测试环境的 CodePipeline CloudFormation 操作的定义
...
Name: DeployApplicationInfra
ActionTypeId:
Category: Deploy
Owner: AWS
Version: 1
Provider: CloudFormation
Configuration:
ActionMode: CREATE_UPDATE
Capabilities: CAPABILITY_IAM
OutputFileName: test-application-infra-stack.outputs.json
StackName: test-application-infra-stack
RoleArn: !Ref CloudFormationServiceRoleArn
TemplateConfiguration: AppInfraCfnTemplate::test-application-infra.config.json
TemplatePath: AppInfraCfnTemplate::application-infra.yml
InputArtifacts:
- Name: AppInfraCfnTemplate
OutputArtifacts:
- Name: TestApplicationInfraStackOutputs
CodePipeline CodeBuild 操作的定义 运行 api 测试
...
Name: RunApiTests
ActionTypeId:
Category: Test
Owner: AWS
Version: 1
Provider: CodeBuild
Configuration:
ProjectName: !Ref ApiTestsBuildProject
InputArtifacts:
- Name: AppSource
...
ApiTestsBuildProject:
Type: AWS::CodeBuild::Project
Properties:
Name: companyinsight-api-tests-build
Artifacts:
Type: CODEPIPELINE
Environment:
ComputeType: BUILD_GENERAL1_SMALL
Image: aws/codebuild/nodejs:8.11.0
Type: LINUX_CONTAINER
ServiceRole: !Ref CIServerBuildRoleArn
Source:
Type: CODEPIPELINE
BuildSpec: !Sub |
version: 0.2
env:
variables:
BASE_URL: <Want to inject test app url here!!!>
phases:
install:
commands:
- npm install
build:
commands:
- npm run api-test
遗憾的是,当前没有允许 CodePipeline 中的 CodeBuild 的 2 个输入工件的解决方法。
我现在推荐的替代方法是在构建过程中从 CLI 调用 aws cloudformation describe-stacks 并从堆栈输出中提取 ELB 主机名。
从 AWS 检查此更新 https://aws.amazon.com/about-aws/whats-new/2018/08/aws-codebuild-adds-ability-to-create-build-projects-with-multiple-input-sources-and-output-artifacts/ 看来你现在可以了。