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)

Пример на картинке: три фиксации были выполнены, все выполняются до dev (включительно), только commit 2 прошла через qa, и этап теперь ожидает следующей фиксации (commit 3). Этап prod еще не был запущен и все еще ожидает утверждения самого первого коммита (commit 1).

Чтобы утвердить последний этап (prod) программно, я должен утвердить все коммиты до последнего успешного коммита с предыдущего этапа (qa).

Вызывая codepipeline.getPipelineState из AWS JavaScript SDK, я получаю только текущие состояния:

{   "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 для последнего успешного выполнения или хотя бы список всех выполнений для определенного этапа?


person ttulka    schedule 11.02.2019    source источник
comment
Вы можете объяснить, как вы утверждаете коммиты? В CodePipeline есть действие по утверждению вручную, но похоже, что вы его не используете.   -  person Aaron    schedule 12.02.2019
comment
На самом деле, у aws sdk есть способ сделать это программно.   -  person ttulka    schedule 12.02.2019
comment
Вы видели функции listPipelineExecutions и getPipelineState? docs.aws.amazon.com/AWSJavaScriptSDK/latest/ AWS / и docs.aws.amazon .com / AWSJavaScriptSDK / latest / AWS / Разве вам не поможет проверка возвращаемых ими объектов?   -  person Milan Cermak    schedule 12.02.2019
comment
@Milan Да, я знал. Но ни один из них не предоставляет информации о казнях за этап. listPipelineExecutions возвращает выполнение только для самого конвейера, а getPipelineState только текущий статус - фактически уже упоминается в вопросе.   -  person ttulka    schedule 12.02.2019
comment
Извините. Я сам не пробовал, но в документации getPipelineState упоминается массив stageStates в возвращаемом объекте, который представляет собой список выходной информации этапа конвейера, включая имя этапа, состояние, самые последние сведения о запуске, отключен ли этап, и другие данные. поэтому я подумал, что это все.   -  person Milan Cermak    schedule 12.02.2019
comment
@Milan Нет проблем, все равно спасибо. Кажется, AWS не предоставляет необходимую информацию из коробки.   -  person ttulka    schedule 12.02.2019


Ответы (1)


(Этот ответ был обновлен, чтобы отразить расширенное обсуждение)

CodePipeline - это продукт с непрерывной доставкой, поэтому он похож на конвейер с потоком изменений, а действие ручного утверждения действует как фильтр. На самом деле вы не можете выбрать, какой коммит развернуть в prod, кроме как путем управления вводом в Steam (коммиты) и фильтрами (действия по тестированию и утверждению) на этом пути.

Вы должны разместить действия deploy-qa и approve-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)

Это позволяет QA точно утверждать, что было развернуто и протестировано. Почему? Потому что CodePipeline предписывает, что только одно выполнение конвейера может находиться на стадии конвейера в любой момент времени. Фиксация 3 не сможет перейти на этап контроля качества до тех пор, пока фиксация 1 не будет одобрена или отклонена.

ПРИМЕЧАНИЕ. Я также удалил действие approve-to-deploy-to-qa, потому что подозреваю, что вы использовали его, чтобы предотвратить изменение среды контроля качества новым коммитом во время его тестирования.

person Aaron    schedule 12.02.2019
comment
Возможно, вы имеете в виду выполнение конвейера между этапами - именно так. - person ttulka; 12.02.2019
comment
Вы не можете утвердить выполнение конвейера между этапами. Вы пытаетесь отклонить более раннюю фиксацию, потому что ожидается более новая? В противном случае это звучит так, как будто вы должны просто одобрять / отклонять каждую фиксацию, когда вы сталкиваетесь с ними на этапе. Нет гарантии, что выполнение конвейера между этапами будет тем, которое в конечном итоге перейдет в этап (если более новое выполнение конвейера достигнет той же точки, CodePipeline заменит более старый и позволит более новому перейти на следующий этап). - person Aaron; 12.02.2019
comment
Сделаны 1, 2, 3 коммиты. Выполнение конвейера - 3. Qa имеет 2 как успешных, 3 как выполняемых. Я хочу утвердить последнее успешное выполнение (2) предыдущего этапа (qa) в этап prod (на самом деле выполняется 1). Как определить фиксацию 2 как последнюю успешную с предыдущего этапа ..? Конечно, команда prod должна отклонить фиксацию 1. - person ttulka; 12.02.2019
comment
Почему бы не поместить действие утверждения вручную на этапе развертывания и тестирования, чтобы вы могли быть уверены, что одобряемый вами коммит - это тот, который вы тестировали? См. stackoverflow.com/a/48157636/31304 для более подробного объяснения. - person Aaron; 12.02.2019
comment
Потому что у меня есть лямбда-функция триггера, утверждающая целую кучу конвейеров, запланированных cron. Одна центральная точка управления выпуском. - person ttulka; 12.02.2019
comment
Может быть, вам нужно более одного утверждения вручную для разделения проблем? Утверждение вручную для QA для подписания на выполнение определенного конвейера и другое ручное утверждение на стадии разработки для координации выпусков? FWIW, вы можете отключить входящий переход на стадию prod вместо добавления ручного утверждения, чтобы вы всегда выпускали последнее выполнение конвейера (вместо первого, которое войдет в стадию prod, удерживая блокировку, ожидая ручного утверждения, чтобы быть одобрен / отклонен). - person Aaron; 12.02.2019
comment
Я выделил для этого отдельную функцию. Допустим, функция release-last-qa-tested-commit-into-production запускает действие ручного утверждения для всех конвейеров. По-прежнему у меня нет информации, какая фиксация (выполнение) была последней успешной на этапе qa. - person ttulka; 12.02.2019
comment
Давайте продолжим это обсуждение в чате. - person Aaron; 12.02.2019