AWS CodePipeline:如何获得阶段的最后成功执行?

时间:2019-02-11 15:12:03

标签: amazon-web-services aws-codepipeline

我有一个具有多个部署阶段(部署到不同帐户)的管道。我想以编程方式输入批准结果。

当并行执行等待批准的管道执行数量超过一个时,就会出现问题。

source (Succeeded, commit 3) 
      ↓
build (Succeeded, commit 3)
      ↓
deploy-dev (Succeeded, commit 3) 
      ↓
approve-to-deploy-to-qa (InProgress, commit 3)
deploy-qa
      ↓
approve-to-deploy-to-prod (InProgress, commit 1)
deploy-prod (not run yet)

图中的示例:完成了3次提交,所有提交都运行到dev(含)为止,只有commit 2经过qa和阶段现在正在等待下一次提交(commit 3)。阶段prod尚未运行,它仍在等待第一笔提交(commit 1)的批准。

要以编程方式批准最后一个阶段(prod),我必须批准所有提交,直到上一个阶段(qa)上一次成功提交为止。

从AWS JavaScript SDK调用codepipeline.getPipelineState只能得到当前状态:

{   "pipelineName": "...",
    "stageStates": [
        ...
        {   "stageName": "StagingQA",
            "inboundTransitionState": {
                "enabled": true
            },
            "actionStates": [{
                    "actionName": "approval",
                    "latestExecution": {
                        "status": "InProgress",
                        "token": "1d55d6a2-68bb-4e01-83cc-b46101857088"
                    }
                }, {
                    "actionName": "stage-qa",
                    "entityUrl": "..."
                }
            ],
            "latestExecution": {
                "pipelineExecutionId": "d519482d-5a9a-4a6d-b185-3bc3fd5f98e2",
                "status": "InProgress"
            }
        }, {
            "stageName": "StagingProd",
            "actionStates": [{
                    "actionName": "approval",
                    "latestExecution": {
                        "status": "InProgress",
                        "token": "70b5ef16-a912-4b12-a660-be0792a8a70d"
                    }
                }, {
                    "actionName": "stage-prod",
                    "entityUrl": "..."
                }
            ],
            "latestExecution": {
                "pipelineExecutionId": "04b8b2c4-e677-4d1e-a601-f731260ef00a",
                "status": "InProgress"
            }
        }
    ]
}

是否有一种方法可以获取最后一个成功执行的pipelineExecutionId或至少某个特定阶段的所有执行的列表?

1 个答案:

答案 0 :(得分:1)

(此答案已更新为反映extended discussion

CodePipeline是连续交付的产品,因此就像管道中有一系列更改一样,手动批准操作就像过滤器一样。除了通过控制流程中的输入(提交)和过滤器(测试和批准操作)之外,您实际上并没有选择要部署到产品的提交。

您应将deploy-qaapprove-to-deploy-to-prod动作放在同一阶段:

source (Succeeded, commit 3) 
      ↓
build (Succeeded, commit 3)
      ↓
deploy-dev (Succeeded, commit 3) 
      ↓
deploy-qa
approve-to-deploy-to-prod (InProgress, commit 1)
      ↓
deploy-prod (not run yet)

这可以使质量检查人员完全批准已部署和测试的内容。为什么?因为CodePipeline要求在任何给定时间,一个管道执行都可以处于管道阶段。在提交1被批准或被拒绝之前,提交3将无法进入质量检查阶段。

注意:我也删除了approve-to-deploy-to-qa操作,因为我怀疑您正在使用它来防止较新的提交在测试过程中修改QA环境。