Этап утверждения / проверки кода aws не создает последнюю фиксацию, а создает каждую отдельную фиксацию

У меня есть угловой сайт, который я создаю с помощью ng build. Мой конвейер выглядит так: source code -> Build -> Staging -> Approval -> Prod

У меня проблема, когда в репо помещены 2 коммита, скажем, фиксация 1 (c1) и фиксация 2 (c2), этап утверждения будет вести себя следующим образом: он утвердит c1, который перейдет на этап Prod, где мы другая сборка, подобная этой ng build --prod (для минимизации файлов js), а затем этап утверждения автоматически запускает вторую сборку для C2.

Expected behavior: Я ожидал утверждения только для получения последнего коммита в этом случае, допустим, C2 был последним, и только сборкой C2, поскольку C1 был заменен C2.

Вот как выглядит мой этап утверждения в шаблоне:

    Stages:
    - Name: Source
      Actions:
        - Name: Source
          ActionTypeId:
            Category: Source
            Owner: AWS
            Version: 1
            Provider: CodeCommit
          Configuration:
            RepositoryName: !Ref ProjectName
            BranchName: master
          OutputArtifacts:
            - Name: checkout
          RunOrder: 1
          RoleArn:someRole
    - Name: Dev
      Actions:
      -
        Name: staging
        ActionTypeId:
          Category: Build
          Owner: AWS
          Version: 1
          Provider: CodeBuild
        Configuration:
          ProjectName: !Ref CodeBuildProject
        RunOrder: 1
        InputArtifacts:
          - Name: checkout
        OutputArtifacts:
          - Name: buildOutput

    - Name: Approval
      Actions:
      - 
        InputArtifacts: []
        Name: pushToProd
        ActionTypeId:
          Category: Approval
          Owner: AWS
          Version: '1'
          Provider: Manual
        OutputArtifacts: []
        Configuration:
          NotificationArn: arn:aws:sns:us-east-1:########:myApprovalTopic
          ExternalEntityLink: http://myWebsite.s3-website-us-east-1.amazonaws.com/index.html
          CustomData: Approving changes to Prod
        RunOrder: 1

    - Name: Prod
      Actions:
      -
        Name: Prod
        ActionTypeId:
          Category: Build
          Owner: AWS
          Version: 1
          Provider: CodeBuild
        Configuration:
          ProjectName: !Ref CodeBuildProd
        RunOrder: 1
        InputArtifacts:
          - Name: checkout
        OutputArtifacts:
          - Name: OutputArtifactsProd

Кто-нибудь знает, почему моя стадия утверждения НЕ принимает последнюю фиксацию и строит PROD только ОДИН РАЗ после нажатия этой кнопки утверждения / обзора? Вместо этого он ставит коммиты в очередь, и после того, как вы нажимаете кнопку утверждения, он строит все поставленные в очередь коммиты в этом случае C1 и C2 вместо ТОЛЬКО СОЗДАНИЕ ПОСЛЕДНИЙ КОММЕТАЦИИ :(


person pelican    schedule 24.10.2018    source источник


Ответы (2)


Ровно одно активное выполнение конвейера может занимать этап. Когда выполнение конвейера, соответствующее C1, переходит в стадию Approval, этот этап блокируется до тех пор, пока вы не отклоните или не утвердите выполнение конвейера, а C2 будет ждать стадии Approval (выполнение конвейера, соответствующее C1, завершится ошибкой или завершится). Если вы хотите, чтобы последующие сборки наверстали упущенное, отклоните более раннюю сборку, ожидающую утверждения.

Вы должны поместить действие постановки и действия утверждения на одном этапе. Это позволяет вам утверждать именно то, что вы тестировали. В противном случае каждый этап может занимать разное выполнение конвейера, и вы не обязательно одобряете то, что тестировали.

Вот пример (на основе вашего примера), который объединяет стадии Dev и Approval:

    Stages:
    - Name: Source
      Actions:
        - Name: Source
          ActionTypeId:
            Category: Source
            Owner: AWS
            Version: 1
            Provider: CodeCommit
          Configuration:
            RepositoryName: !Ref ProjectName
            BranchName: master
          OutputArtifacts:
            - Name: checkout
          RunOrder: 1
          RoleArn:someRole
    - Name: Dev
      Actions:
      -
        Name: staging
        ActionTypeId:
          Category: Build
          Owner: AWS
          Version: 1
          Provider: CodeBuild
        Configuration:
          ProjectName: !Ref CodeBuildProject
        RunOrder: 1
        InputArtifacts:
          - Name: checkout
        OutputArtifacts:
          - Name: buildOutput
      - 
        InputArtifacts: []
        Name: pushToProd
        ActionTypeId:
          Category: Approval
          Owner: AWS
          Version: '1'
          Provider: Manual
        OutputArtifacts: []
        Configuration:
          NotificationArn: arn:aws:sns:us-east-1:########:myApprovalTopic
          ExternalEntityLink: http://myWebsite.s3-website-us-east-1.amazonaws.com/index.html
          CustomData: Approving changes to Prod
        RunOrder: 2

    - Name: Prod
      Actions:
      -
        Name: Prod
        ActionTypeId:
          Category: Build
          Owner: AWS
          Version: 1
          Provider: CodeBuild
        Configuration:
          ProjectName: !Ref CodeBuildProd
        RunOrder: 1
        InputArtifacts:
          - Name: checkout
        OutputArtifacts:
          - Name: OutputArtifactsProd
person Aaron    schedule 25.10.2018
comment
Спасибо, когда вы говорите You should place the staging action and approval action in the same stage, что вы имеете в виду? Пожалуйста, я новичок в aws и учусь как можно больше. Разве мой конвейер выше НЕ помещает и постановку, и утверждение на одну и ту же стадию? Возможно, у вас есть пример или ссылка на github для справки? - person pelican; 26.10.2018
comment
YAML в вашем вопросе объявляет одно действие на этап. Я предлагаю вам объявить два действия на одном этапе. Например: вы можете удалить этап Approval и вместо этого добавить действие pushToProd к этапу Dev. - person Aaron; 26.10.2018
comment
Когда вы говорите You should place the staging action and approval action in the same stage, не могли бы вы отрегулировать мой конвейер и показать мне, как он будет выглядеть с предложенными вами изменениями? Я немного новичок в AWS и изучаю столько, сколько могу, но изо всех сил пытаюсь собрать все это воедино - person pelican; 28.10.2018
comment
Я обновил свой ответ, включив в него ваш пример конвейера с двумя изменениями (объедините действия staging и pushToProd в один этап Dev и задайте для действия pushToProd порядок выполнения 2, то есть после действия staging ). - person Aaron; 29.10.2018
comment
Спасибо, попробуете; когда вы говорите: «Если вы хотите, чтобы последующие сборки наверстали упущенное, отклоните более раннюю сборку, ожидающую утверждения», поэтому, если в очереди было 10 коммитов, мне пришлось бы нажать эту кнопку отклонения, как 9 раз, чтобы пройти только через самый последний коммит, о котором мы заботимся? Я надеялся, что все коммиты будут проходить через staging / Dev и в конечном итоге ждать утверждения ToProd; и когда я нажимаю "Утвердить", он получает только последние коммиты, так как это последний код? Почему меня волнуют все предыдущие коммиты из 10? когда я мог просто утвердить 10-е? - person pelican; 29.10.2018
comment
И в реальной ситуации, если мы поставили в очередь 100 коммитов перед тем, как нажать на prod, тогда я скажу людям, чтобы они нажимали «одобрить» 100 раз или отклонять 99 раз, а затем одобрять 1 раз, если в очереди стояли 100 коммитов? Кажется, что будет флаг / функция codepipeline, чтобы установить и сказать, развертывать последнюю фиксацию только после того, как я нажму «одобрить», что вы думаете? - person pelican; 29.10.2018
comment
CodePipeline будет пакетировать изменения между этапами (более позднее выполнение конвейера заменяет более раннее выполнение конвейера), поэтому у вас будет первое выполнение конвейера, которое нужно отклонить (разблокировать этап), и последнее выполнение конвейера, которое нужно утвердить. Почему CodePipeline не заменяет стадию? Невозможно узнать, начали ли вы вручную тестировать то, что собираетесь утвердить и развернуть заранее / отдельно от других изменений. - person Aaron; 29.10.2018

Я бы переместил действие «pushToProd» на первое действие в стадии «Prod» и отключил бы переходы на стадию Prod. Таким образом, даже если у вас было 100 коммитов перед нажатием на prod, вам нужно будет включить переход между этапами только для 100-го коммита, и только последняя ревизия будет проходить через стадию prod и утвердить действие только для ревизии, которая будет запущена в производство.

person mockora    schedule 31.10.2018