CodeBuild无法解析CodePipeline的PipelineExecutionId环境变量问题排查
已配置名为test-pipeline-flow的AWS CodePipeline,源阶段采用名为test-repo的AWS CodeCommit,构建阶段使用名为test-build-repo的AWS CodeBuild,其buildspec.yml内容如下:
version: 0.2 phases: build: commands: - echo $FOO - echo $BAR
在该CodeBuild的「Environment > Additional configuration」中设置了环境变量,其中BAR的值配置为#{codepipeline.PipelineExecutionId}。但触发流水线后,CloudWatch日志显示$FOO正常输出whatever,而$BAR仍显示#{codepipeline.PipelineExecutionId},未解析为实际的流水线执行ID,请问缺少哪些必要配置?
这问题的核心原因是:直接在CodeBuild项目里配置的环境变量没法解析CodePipeline的内置变量,必须通过CodePipeline的构建阶段来传递这些变量,具体要做这两步:
在CodePipeline的构建阶段里配置变量传递
打开你的test-pipeline-flow流水线,找到对应的CodeBuild构建阶段并编辑:- 要么勾选「Override project build specification」(如果不需要用CodeBuild项目自带的buildspec),要么直接在构建阶段的「Environment variables」区域添加变量;
- 添加变量
BAR,值填#{codepipeline.PipelineExecutionId}。
重点:这个变量是配置在CodePipeline的构建阶段里,不是CodeBuild项目自己的环境变量设置里。
清理CodeBuild项目里的冲突变量
如果之前已经在CodeBuild项目的「Environment > Additional configuration」里设了BAR变量,要么把它删掉,要么把变量类型改成「Parameter store」(直接删除更省事)。因为CodeBuild项目自身的环境变量优先级比流水线传过来的高,会把流水线的变量覆盖掉,导致解析失败。
额外说明:CodePipeline的内置变量只能在流水线的上下文里解析,CodeBuild本身没权限也没上下文去识别#{codepipeline.PipelineExecutionId}这种写法,所以必须通过流水线把变量传递给CodeBuild才行。
内容的提问来源于stack exchange,提问作者Prometheus

