Среды с многоступенчатым конвейером в AWS

#amazon-web-services #yaml #aws-codepipeline

Вопрос:

Когда мы создавали проект, он был развернут на промежуточной разработке (см. ниже используемый шаблон yaml). Теперь всякий раз, когда мы совершаем это, мы делаем это. Теперь наша проблема в том, что нам нужна среда разработки и производства с ручным этапом утверждения от стадии разработки до выпуска. Мы добавили два этапа, как показано на рисунке ниже (утверждение и предложение). введите описание изображения здесь

Может ли кто-нибудь помочь сказать, как я могу изменить свой приведенный ниже код YAML, чтобы сказать :

если $CODEBUILD_BUILD_STAGE == ‘prod’ target_bucket = $S3_BUCKET_PROD, ТО ЕЩЕ target_bucket = $S3_BUCKET_DEV

Это мой код без этапов утверждения и продвижения :

 version: 0.2
env:
  variables:
    S3_BUCKET: "s3-frontend"
phases:
  install:
    runtime-versions:
      nodejs: 10
  pre_build:
    commands:
      - echo Installing source NPM dependencies
      - cd project
      # Install node dependancies.
      - npm install
      - npm install -g @angular/cli@"~9.1.1"
  build:
    commands:
      - echo Build started on `date`
      - export NODE_OPTIONS=--max_old_space_size=16384
      #building 
      - ng build --aot --configuration=production --build-optimizer --stats-json --output-path=dist/en
  post_build:
    commands:
      #only run frontend update when the build is success
      - bash -c "if [ /"$CODEBUILD_BUILD_SUCCEEDING/" == /"0/" ]; then exit 1; fi"
      - aws s3 rm s3://$S3_BUCKET --recursive
      #generating root language
      - aws s3 cp dist/en s3://$S3_BUCKET --recursive 
artifacts:
  files:
    - '**/*'
cache:
  paths:
    - '/root/.m2/**/*'
    - '/root/.npm/**/*'
    - 'build/**/*'
    - 'node_modules/**/*'
 

Ответ №1:

Я считаю, что с CodeBuild соглашение заключается в том, чтобы установить var при вызове проекта, поскольку я думаю, что каждая строка представляет собой отдельную оболочку. Так, например, с ведрами в качестве параметров «S3_BUCKET_DEV» и «S3_BUCKET_PROD» в шаблоне cloudformation:

           - Name: Dev
            ActionTypeId:
              Category: Build
              Owner: AWS
              Provider: CodeBuild
              Version: "1"
            Configuration:
              ProjectName: !Ref DeployProj
              EnvironmentVariables: !Sub |
                [
                  {"name":"S3_BUCKET","value":"${S3_BUCKET_DEV}","type":"PLAINTEXT"}
                ]

            InputArtifacts:
              - Name: Whatever
            RunOrder: 2


          - Name: Prod
            ActionTypeId:
              Category: Build
              Owner: AWS
              Provider: CodeBuild
              Version: "1"
            Configuration:
              ProjectName: !Ref DeployProj
              EnvironmentVariables: !Sub |
                [
                  {"name":"S3_BUCKET","value":"$S3_BUCKET_PROD","type":"PLAINTEXT"}
                ]

            InputArtifacts:
              - Name: Whatever
            RunOrder: 2
 

Комментарии:

1. Здравствуйте, извините, что я не ознакомлен с такого рода структурой, которую вы предоставили. Я больше работаю над кодом YAML. Если я правильно понял ваш код, вы запустите сборку кода дважды, в то время как требование состоит в том, чтобы запустить ее один раз. Затем проверьте : если MANUAL_APPROVAL исходит от пользователя, перейдите в PROD

2. Чтобы попытаться уточнить, вы не устанавливаете переменную в buildspec, а передаете переменную в codebuild при выполнении проекта в своем конвейере. Переменная принадлежит Этапу/Действию в определении конвейера кода. Мой пример показывает, как это сделать в Cloudformation. Если вы не используете Cloudformation, вы можете отредактировать определение конвейера в консоли и задать там переменную.