web-dev-qa-db-fra.com

Comment définir l'option de filtre de branche dans le modèle de cloudformation AWS CodeBuild?

Si vous utilisez un référentiel Github comme source dans un projet CodeBuild, l'option Branch Filter Permet d'exécuter des builds uniquement pour les branches, dont le nom correspond à une certaine expression régulière.

  1. AWS Management Console

Dans AWS Management Console, vous pouvez configurer le filtre de branche lors de la création ou de la modification d'un projet CodeBuild:

AWS console

  1. AWS CLI

Pour awscli existe une option --update-webhook (Documentée ici )

    $ aws codebuild update-webhook --project-name myproject --branch-filter ^master$
  1. CloudFormation

Dans CodeBuild, le modèle de cloudformation existe une option Triggers > Webhook (Documentée ici ), mais cette option est juste un booléen pour activer/désactiver simplement le webhook github.

Resources:
    MyCodeBuildProject:
    Type: AWS::CodeBuild::Project
    Properties:
        Name: myproject
        ...
        Triggers:
            Webhook: true

Ma question est donc de savoir comment définir directement un filtre de branche dans un modèle de cloudformation, sans avoir à exécuter par la suite une commande awscli ou à utiliser l'AWS Management Console?

12
dron22

Voici un exemple minimal utilisant des déclencheurs et des filtres de webhook, le modèle de groupe de filtres peut également être quelque chose comme ^refs/heads/.*:

AWSTemplateFormatVersion: "2010-09-09"
Description: "CodeBuild project and IAM role"
Parameters:
  Image:
    Type: String
    Description: "Name of the docker image."
    Default: "my-image"
Resources:
  CodeBuildRole:
    Type: AWS::IAM::Role
    Properties:
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          Effect: Allow
          Principal:
            Service: codebuild.amazonaws.com
          Action: sts:AssumeRole
      Policies:
        - PolicyName: "CodeBuild-Service-Policy"
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: "Allow"
                Action:
                  - "ecr:BatchCheckLayerAvailability"
                  - "ecr:CompleteLayerUpload"
                  - "ecr:DescribeImages"
                  - "ecr:GetAuthorizationToken"
                  - "ecr:InitiateLayerUpload"
                  - "ecr:ListImages"
                  - "ecr:PutImage"
                  - "ecr:UploadLayerPart"
                  - "logs:*"
                Resource: "*"
  CodeBuildProject:
    Type: AWS::CodeBuild::Project
    Properties:
      Artifacts:
        Type: NO_ARTIFACTS
      Environment:
        ComputeType: "BUILD_GENERAL1_SMALL"
        Image: "aws/codebuild/docker:18.09.0"
        Type: LINUX_CONTAINER
      ServiceRole: !GetAtt CodeBuildRole.Arn
      Source:
        Type: GITHUB
        Location: "https://github.com/ORG/REPO.git"
        BuildSpec: "codebuild/create_docker_image.yml"
      Triggers:
        Webhook: true
        FilterGroups:
          - - Type: EVENT
              Pattern: Push
            - Type: HEAD_REF
              Pattern: master

Voir également: https://docs.amazonaws.cn/en_us/codebuild/latest/userguide/sample-bitbucket-pull-request.html#sample-bitbucket-pull-request-filter-webhook-events-cfn

1
ivansabik

Vous pouvez essayer d'utiliser AWS CodePipeline

        Stages:
            -
                Name: "Source"
                Actions:
                    -
                        Name: "Checkout"
                        ActionTypeId:
                            Category: "Source"
                            Owner: "ThirdParty"
                            Provider: "GitHub"
                            Version: "1"
                        Configuration:
                            Owner: !Ref "UsernameOrOrg"
                            Repo: !Ref "ProjectName"
                            Branch: "master"
                            OAuthToken: !Ref "GitHubOAuthToken"
                        OutputArtifacts:
                            -
                                Name: "checkout"
            -
                Name: "Build"
                Actions:
                    -
                        Name: "Build"
                        ActionTypeId:
                            Category: "Build"
                            Owner: "AWS"
                            Provider: "CodeBuild"
                            Version: "1"
                        Configuration:
                            ProjectName: !Ref "BuildProject"
                        InputArtifacts:
                            -
                                Name: "checkout"

Il vous suffit ensuite de définir votre projet CodeBuild avec l'intégration de CodePipeline:

BuildProject:
    Type: "AWS::CodeBuild::Project"
    Properties:
       ... 
        Artifacts:
            Type: "CODEPIPELINE"
        Source:
            Type: "CODEPIPELINE"
1
Rafał Wrzeszcz