如何在CodeDeploy脚本中识别CodePipeline触发源(人工/CloudWatch调度)
你可以通过以下两种方式在CodeDeploy脚本中识别流水线的触发源:
方法1:通过自定义参数传递触发标识(推荐,无需额外API调用)
这种方法无需调用AWS API,直接通过流水线参数传递触发源信息,更高效:
步骤1:配置CloudWatch触发时添加自定义参数
当设置CloudWatch Event触发CodePipeline时,在事件目标的「Configure input」选项中选择「Constant (JSON text)」,输入自定义JSON:{ "triggerSource": "cloudwatch" }步骤2:在流水线中传递参数给CodeDeploy
编辑CodePipeline的CodeDeploy阶段,在「Additional deployment input」中添加一个部署参数,比如triggerSource,值设为#{triggerSource}(引用CloudWatch传递的参数)。人工触发流水线时,这个参数不会被设置。步骤3:在CodeDeploy脚本中判断
在你的部署脚本(比如appspec.yml定义的钩子脚本)中,读取该参数对应的环境变量:if [ "$DEPLOYMENT_PARAM_TRIGGERSOURCE" == "cloudwatch" ]; then echo "流水线由CloudWatch调度器触发" # 执行对应逻辑 else echo "流水线由人工控制台触发" # 执行对应逻辑 fi
方法2:调用CodePipeline API获取触发信息
如果无法修改CloudWatch触发配置,可以通过API查询流水线执行的触发源:
步骤1:给CodeDeploy角色添加权限
给CodeDeploy使用的IAM服务角色添加codepipeline:GetPipelineExecution权限,示例政策:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codepipeline:GetPipelineExecution", "Resource": "arn:aws:codepipeline:<你的区域>:<你的账号ID>:<你的流水线名称>" } ] }步骤2:传递流水线执行ID和名称到CodeDeploy
在CodePipeline的CodeDeploy阶段,添加两个部署参数:pipelineName,值为#{codepipeline.PipelineName}executionId,值为#{codepipeline.PipelineExecutionId}
步骤3:在脚本中调用API并解析
在部署脚本中使用AWS CLI查询触发信息(需确保实例已安装AWS CLI和jq工具):# 从部署参数中获取流水线信息 PIPELINE_NAME="$DEPLOYMENT_PARAM_PIPELINENAME" EXECUTION_ID="$DEPLOYMENT_PARAM_EXECUTIONID" # 查询触发源 TRIGGER_TYPE=$(aws codepipeline get-pipeline-execution \ --pipeline-name "$PIPELINE_NAME" \ --pipeline-execution-id "$EXECUTION_ID" \ --query 'pipelineExecution.trigger.triggerType' \ --output text) # 判断触发类型 if [ "$TRIGGER_TYPE" == "Manual" ]; then echo "流水线由人工控制台触发" elif [ "$TRIGGER_TYPE" == "CloudWatchEvent" ]; then echo "流水线由CloudWatch调度器触发" else echo "未知触发源: $TRIGGER_TYPE" fi
内容的提问来源于stack exchange,提问作者Jordan

