下面的构建规范运行一些命令并在最后导出一个变量:

env:
  exported-variables:
    - PROPERTY_FROM_BUILD

我想在自定义管道阶段中使用此变量,但我不知道如何在此处获取它:

import { Stage, StageProps } from 'aws-cdk-lib';
class MyStage extends Stage {
  constructor(scope: Construct, id: string, props: StageProps) {
    new Stack(this, 'MyStack', {
        PROPERTY_FROM_BUILD: '???'
    });
  }
}

让我发布更多细节,以防万一.我的代码管道如下所示:

const codePipeline = new cdk.pipelines.CodePipeline(this, 'MyPipeline', {...});
codePipeline.addStage(new MyStage(this, 'MyStage', {...})
codePipeline.buildPipeline();

如你所见,我只是创建了一个管道,添加我的stage并构建它.在此之后,我创建了一个代码构建项目和操作来运行我的构建规范:

const project = new cdk.aws_codebuild.PipelineProject(this, 'MyProject', {
  buildSpec: cdk.aws_codebuild.BuildSpec.fromSourceFilename(`buildspec.yml`),
});
const action = new cdk.aws_codepipeline_actions.CodeBuildAction({
  actionName: 'MyAction',
  project: project,
});
codePipeline.pipeline.addStage({
  stageName: 'MyActionStage',
  actions: [action],
  placement: {
    rightBefore: codePipeline.pipeline.stage('MyStage')
  }
});

它是有效的,并生成了一个很好的管道.有没有什么方法可以将PROPERTY_FROM_BUILD从变量传递并在堆栈中使用?

推荐答案

虽然我花了大约一周的时间才弄明白这一点,但我还是设法让它奏效了.让我把解决方案留在这里,以防其他人遇到这个问题:

在开始之前,用一个定制的命名空间来扩展你的CodeBuildAction,比如:

const action = new cdk.aws_codepipeline_actions.CodeBuildAction({
  actionName: 'MyAction',
  project: project,
  variablesNamespace: 'my_action_namespace',
});

首先,您必须确定部署阶段的索引,例如:

const deployIdx = codePipeline.pipeline.stages.indexOf(codePipeline.pipeline.stage('Deploy'));

然后,找到"Changeset Replace"类型的所有操作:

const actionsIdxs = codePipeline.pipeline.stage('Deploy').actions.filter(x => x.actionProperties.category === 'Deploy').map((x,i)=>i);

接下来,使用此Escape Hatches功能编辑生成的模板,并将the pipeline variable作为ParameterOverrides附加到所有部署操作:

const cfnPipeline = codePipeline.pipeline.node.findChild('Resource') as cdk.aws_codepipeline.CfnPipeline;
for(const i of actionsIdxs){
  cfnPipeline.addOverride(
    `Properties.Stages.${deployIdx}.Actions.${i}.Configuration.ParameterOverrides`,
    JSON.stringify({
        // Use lowercase-only here to match the autogenerated name of the CfnParameter.
        propertyfrombuild: "#{my_action_namespace.PROPERTY_FROM_BUILD}"
    }));
}

最后,在我的堆栈中,我可以像这样访问该值:

const PROPERTY_FROM_BUILD = new cdk.CfnParameter(this, 'propertyfrombuild').valueAsString;

确保将变量命名为全小写,不包含特殊字符,并将其放入堆栈(而不是子构造中).

Typescript相关问答推荐

数组文字中对象的从键开始枚举

学习Angular :无法读取未定义的属性(正在读取推送)

是否使用非显式名称隔离在对象属性上声明的接口的内部类型?

打字类型保护递归判断

如何使我的函数专门针对联合标记?

在数据加载后,如何使用NgFor在使用异步管道的可观测对象上生成子组件?

在HighChats列时间序列图中,十字准线未按预期工作

将具有Readonly数组属性的对象接口转换为数组

使用TypeScrip5强制使用方法参数类型的实验方法修饰符

TypeScrip:使用Union ToInterval辅助对象,但保留子表达式

如何解决&Quot;类型不可分配给TypeScrip IF语句中的类型&Quot;?

在单独的组件中定义React Router路由

Angular NG8001错误.组件只能在一个页面上工作,而不是在她的页面上工作

如何扩展RxJS?

从以下内容之一提取属性类型

为什么类型脚本使用接口来声明函数?他的目的是什么.

任何导航器都未处理有效负载为";params";:{";roomId";:";...";}}的导航操作

使用枚举子集避免返回类型void

当还传递了显式类型参数时,从函数参数推断类型

从已知键推断类型