docker 在AWS CodePipeline中访问AWS CodeBuild变量

nkcskrwz  于 2023-02-07  发布在  Docker
关注(0)|答案(1)|浏览(147)

我正在尝试使用AWS CodeBuild ID作为我的Docker映像的标记。此Docker映像是在CodeBuild的构建阶段构建的。我希望获取此AWS CodeBuild ID,它是我在AWS CodePipeline阶段的Docker标记。如何在AWS CodePipeline中访问这些AWS CodeBuild环境变量?
代码构建阶段:

CodeBuildProject:
    Type: AWS::CodeBuild::Project
    Properties:
      Artifacts:
        Location: !Ref ArtifactBucket
        Type: "S3"
      Source:
        Location: !Sub ${ArtifactBucket}/source.zip
        Type: "S3"
        BuildSpec: |
          version: 0.1
          phases:
            pre_build:
              commands:
                - $(aws ecr get-login --region $AWS_DEFAULT_REGION)
                - sudo apt-get update
                - echo Pulling maven image...
                - docker pull maven:3.3-jdk-8
                - echo done with the pre build phase
            build:
              commands:
                - echo Build started on `date`
                - printf "%s" $REPOSITORY_URI
                - docker run -i --rm -w /opt/maven -v $PWD:/opt/maven -v $HOME/.m2:/root/.m2 maven:3.3-jdk-8 mvn clean install
                - docker build --file Dockerfile --tag $REPOSITORY_URI:$CODEBUILD_BUILD_ID .
            post_build:
              commands:
                - echo post build
                - docker push $REPOSITORY_URI:$CODEBUILD_BUILD_ID
            discard-paths: yes
      Environment:
        ComputeType: "BUILD_GENERAL1_LARGE" 
        Image: "aws/codebuild/docker:1.12.1"
        Type: "LINUX_CONTAINER"
        EnvironmentVariables:
          - Name: AWS_DEFAULT_REGION
            Value: !Ref AWS::Region
          - Name: REPOSITORY_URI
            Value: !Sub ${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${Repository}
          - Name: PipelineName
            Value: !Ref PipelineName
      Name: !Ref AWS::StackName
      ServiceRole: !Ref CodeBuildServiceRole

这里我的docker图像现在是我的仓库URL和我的代码构建ID的组合。我想在aws代码管道的部署阶段使用这个代码构建ID,如何获得它?

Pipeline:
    Type: AWS::CodePipeline::Pipeline
    Properties:
      Name: !Ref PipelineName
      RoleArn: !GetAtt CodePipelineServiceRole.Arn
      ArtifactStore:
        Type: S3
        Location: !Ref ArtifactBucket
      Stages:
        - Name: Source
          Actions:
            - Name: GitHubRepoSource
              ActionTypeId:
                Category: Source
                Owner: ThirdParty
                Provider: GitHub
                Version: 1
              Configuration:
                Owner: !Ref GitHubUser
                Repo: !Ref GitHubRepo
                Branch: !Ref GitHubBranch
                OAuthToken: !Ref GitHubToken
              OutputArtifacts:
                - Name: GitHubRepoSource
              RunOrder: 1
        - Name: Build
          Actions:
            - Name: Build
              ActionTypeId:
                Category: Build
                Owner: AWS
                Version: 1
                Provider: CodeBuild
              Configuration:
                ProjectName: !Ref CodeBuildProject
              InputArtifacts:
                - Name: GitHubRepoSource
              OutputArtifacts:
                - Name: BuildOutput
              RunOrder: 1
        - Name: Deploy
          Actions:
            - Name: Deploy
              ActionTypeId:
                Category: Deploy
                Owner: AWS
                Version: 1
                Provider: CloudFormation
              Configuration:
                ChangeSetName: Deploy
                ActionMode: CREATE_UPDATE
                StackName: !Sub "${AWS::StackName}-Service"
                Capabilities: CAPABILITY_NAMED_IAM
                TemplatePath: https://s3.amazonaws.com/cicdoveraws-visa/service.yaml
                RoleArn: !GetAtt CloudFormationExecutionRole.Arn
                ParameterOverrides: !Sub |
                  {
                    "Tag" : "${}",
                    "DesiredCount": "2",
                    "Cluster": "${ECSCluster}",
                    "TargetGroup": "${ECSTG}",
                    "ImageName": "${AWS::AccountId}.dkr.ecr.${AWS::Region}.amazonaws.com/${Repository}:<Tag Name>,
                    "ContainerName": "${ContainerName}",
                    "Cpu": "${Cpu}",
                    "Memory": "${Memory}",
                    "ContainerPort": "${ContainerPort}" 
                  }
              InputArtifacts:
                - Name: BuildOutput
              RunOrder: 1
lb3vh1jj

lb3vh1jj1#

您可以在AWS CodeBuild的post_build阶段编写包含标记信息的build.json文件,如下所示:

post_build:
          commands:
            - echo post build
            - docker push $REPOSITORY_URI:$CODEBUILD_BUILD_ID
            - printf '{"Tag":"%s"}' "$REPOSITORY_URI:$CODEBUILD_BUILD_ID" > /tmp/build.json
    artifacts:
        files: /tmp/build.json
        discard-paths: yes

在您的管道中,现在可以简单地读取标记,如下所示:

ParameterOverrides: !Sub |
     {
       "Tag" : { "Fn::GetParam" : [ "BuildOutput", "build.json", "Tag" ] },
     }

相关问题