Как сделать Codebuild file_path filter на monorepo? - PullRequest
0 голосов
/ 11 июля 2019

AWS codebuild не может выполнить фильтр file_path в групповых фильтрах для monorepo, размещенного на Github, и для каждого коммита создаются все проекты в monorepo.

У нас есть монорепо, которое выглядит так:

erp
  |_ dir1
  |_ dir2
  |_ functions
        |_ proj1
        |_ proj2

Мы создали конвейер, использующий Github Webhook, созданный с помощью облачного формирования.

Следующий код показывает, как мы строим конвейер и сборку кода (для этого примера сборка и развертывание находятся в одном AWS :: CodeBuild :: Project):



  Webhook:
    Type: AWS::CodePipeline::Webhook
    Properties:
      AuthenticationConfiguration:
        SecretToken:
          Ref: GithubToken
      Filters:
      - JsonPath: "$.ref"
        MatchEquals: refs/heads/{Branch}
      Authentication: GITHUB_HMAC
      TargetPipeline:
        Ref: Pipeline
      TargetAction: SourceCodeRepo
      Name:
        Fn::Sub: ${Stage}${AppName}PipelineWebhook
      TargetPipelineVersion:
        Fn::GetAtt: Pipeline.Version
      RegisterWithThirdParty: 'true'

  BuildAndDeploy:
    Type: AWS::CodeBuild::Project
    Properties:
      Name:
        Fn::Sub: "${Stage}-${AppName}"
      Artifacts:
        Type: NO_ARTIFACTS
      Environment:
        Type: LINUX_CONTAINER
        ComputeType: BUILD_GENERAL1_SMALL
        Image: aws/codebuild/standard:2.0
        EnvironmentVariables:
        - Name: BUILD_OUTPUT_BUCKET
          Value:
            Fn::ImportValue:
              Fn::Sub: "${Stage}BuildArtifactsBucket"
        - Name: CURRENT_ENVIRONMENT
          Value:
            Ref: Stage
        - Name: CURRENT_BUILD
          Value:
            Ref: AppName
      Cache:
        Type: S3
        Location:
          Fn::ImportValue:
            Fn::Sub: "${Stage}BuildArtifactsBucket"
      ServiceRole:
        Fn::ImportValue:
          Fn::Sub: ${Stage}CodeBuildServiceRole
      Source:
        Type: GITHUB
        Location: "https://github.com/mountainequipmentcoop/erp-integration"
        BuildSpec:
          Fn::Sub: "${AppPath}/cicd/buildspec.yml"
      Triggers:
        Webhook: true
        FilterGroups:
        - - Type: EVENT
            Pattern: PUSH
          - Type: HEAD_REF
            Pattern: ^refs/heads/.*
          - Type: FILE_PATH
            Pattern:
              Fn::Sub: "${AppPath}/.*"
            ExcludeMatchedPattern: false

  Pipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      ArtifactStore:
        Location:
          Fn::ImportValue:
            Fn::Sub: "${Stage}BuildArtifactsBucket"
        Type: S3
      Name:
        Fn::Sub: "${AppName}-${Stage}"
      RoleArn:
        Fn::ImportValue:
          Fn::Sub: ${Stage}CodePipelineExecutionRole
      RestartExecutionOnUpdate: true
      Stages:
      - Name: github-erp-integration
        Actions:

        - Name: SourceCodeRepo
          ActionTypeId:
            Category: Source
            Owner: ThirdParty
            Version: 1
            Provider: GitHub
          OutputArtifacts:
          - Name: SourceCodeAsZip
          Configuration:
            Owner:
              Ref: GithubUser
            Repo:
              Ref: GithubRepo
            Branch:
              Ref: GithubBranch
            OAuthToken:
              Ref: GithubToken
            PollForSourceChanges: false
          RunOrder: 1

      - Name: build-and-deploy
        Actions:

        - Name: lambda-functions
          ActionTypeId:
            Category: Build
            Owner: AWS
            Provider: CodeBuild
            Version: "1"
          Configuration:
            ProjectName:
              Ref: BuildAndDeploy
          InputArtifacts:
          - Name: SourceCodeAsZip
          OutputArtifacts:
          - Name: BuildArtifactAsZipAzureFileTransferLambdas
          RunOrder: 1

В следующем разделе нам нужно установить триггер для проекта:

      Triggers:
        Webhook: true
        FilterGroups:
        - - Type: EVENT
            Pattern: PUSH
          - Type: HEAD_REF
            Pattern: ^refs/heads/.*
          - Type: FILE_PATH
            Pattern:
              Fn::Sub: "${AppPath}/.*"
            ExcludeMatchedPattern: false

И значения $ {AppPath} могут быть:

  • э.и.м. / функция / proj1
  • э.и.м. / функция / proj2

, который затем переводится (например, для proj1):

          - Type: FILE_PATH
            Pattern:
              Fn::Sub: "erp/functions/proj1/.*"

Я также попробовал следующие варианты в качестве шаблона FILE_PATH:

- erp/functions/proj1/.*
- erp/functions/proj1/*.*
- erp/functions\/proj1\/.*
- erp/functions\/proj1\/*.*
- ^erp/functions/proj1/.*
- ^erp/functions/proj1/*.*
- ^erp/functions\/proj1\/.*
- ^erp/functions\/proj1\/*.*

Однако эти групповые фильтры в проекте AWS Codebuild никогда не работают на PUSH. Что происходит, когда я изменяю что-то в proj1, и proj1, и proj2 собираются Что я делаю не так и как я могу это исправить?

Обновление: я тоже пробовал через веб интерфейс, он не работает. Я все построил вручную.

1 Ответ

0 голосов
/ 11 июля 2019

Похоже, в тот момент, когда проект codebuild становится частью конвейера, который он не может выполнить на групповом фильтре.

Есть какие-либо причины, почему?

...