Codepipeline restricting artifact properties in co

2019-07-19 03:41发布

问题:

I had created a codebuild to build my project based on the changes in codecommit. This is the batch-get-projects command details for it

{
    "projects": [
        {
            "name": "MultiRepBuild",
            "arn": "arn:aws:codebuild:us-east-1:100000xxx0x:project/MultiRepBui
ld",
            "source": {
                "type": "CODECOMMIT",
                "location": "https://git-codecommit.us-east-1.amazonaws.com/v1/r
epos/PythonRep",
                "gitCloneDepth": 1,
                "insecureSsl": false
            },
            "secondarySources": [],
            "artifacts": {
                "type": "S3",
                "location": "testxxxthe-codebuild",
                "path": "",
                "namespaceType": "NONE",
                "name": "Lambda",
                "packaging": "ZIP",
                "overrideArtifactName": false,
                "encryptionDisabled": false
            },
            "secondaryArtifacts": [],
            "cache": {
                "type": "NO_CACHE"
            },
            "environment": {
                "type": "LINUX_CONTAINER",
                "image": "aws/codebuild/python:3.6.5",
                "computeType": "BUILD_GENERAL1_SMALL",
                "environmentVariables": [],
                "privilegedMode": false
            },
            "serviceRole": "arn:aws:iam::xxxxxxxx:role/service-role/codebuil
d-MultiRepBuild-service-role",
            "timeoutInMinutes": 60,
            "encryptionKey": "arn:aws:kms:us-east-1:xxxxxx:alias/aws/s3",
            "tags": [],
            "created": 1542607679.567,
            "lastModified": 1542611632.345,
            "badge": {
                "badgeEnabled": false
            }
        }
    ],
    "projectsNotFound": []
}

This codebuild will create a buildartifact with specified name Lambda and keep it in specified bucket in zip format.

But when i integrate same codebuild with the Codepipeline it is overriding the bucketname as per this answer. Even i try to change the bucketname with cloudformation but how can i add the parameters that are defined in the artifacts section(i.e.name) from the above snippet, because i will point this name as an S3KeyName in my cloudformation template.

I tried to change in the name in below file which i got through by running aws codepipeline get-pipeline --name MyFirstPipeline >pipeline.json command

{
    "pipeline": {
        "name": "MultiBuild",
        "roleArn": "arn:aws:iam::xxxxxxxxxxx:role/service-role/AWSCodePipelineServiceRole-us-east-1-MultiBuild",
        "artifactStore": {
            "type": "S3",
            "location": "codepipeline-us-east-1-xxxxx"
        },
        "stages": [
            {
                "name": "Source",
                "actions": [
                    {
                        "name": "Source",
                        "actionTypeId": {
                            "category": "Source",
                            "owner": "AWS",
                            "provider": "CodeCommit",
                            "version": "1"
                        },
                        "runOrder": 1,
                        "configuration": {
                            "BranchName": "master",
                            "PollForSourceChanges": "false",
                            "RepositoryName": "PythonRep"
                        },
                        "outputArtifacts": [
                            {
                                "name": "SourceArtifact"
                            }
                        ],
                        "inputArtifacts": []
                    }
                ]
            },
            {
                "name": "Build",
                "actions": [
                    {
                        "name": "Build",
                        "actionTypeId": {
                            "category": "Build",
                            "owner": "AWS",
                            "provider": "CodeBuild",
                            "version": "1"
                        },
                        "runOrder": 1,
                        "configuration": {
                            "ProjectName": "MultiRepBuild"
                        },
                        "outputArtifacts": [
                            {
                                "name": "Lambda" -->Here
                            }
                        ],
                        "inputArtifacts": [
                            {
                                "name": "SourceArtifact"
                            }
                        ]
                    }
                ]
            }
        ],
        "version": 1
    }
}

This is creating a folder with name Lambda rather than creating a file. The file structure is like this

 ---MultiBuild
      |
      |
      -->Lambda
          |
          |
          abcd.zip
      -->SourceArti
          |
          |
          efgh.zip

回答1:

Sorry! This is an unfortunate consequence of the way CodePipeline manages artifacts. The "name" in the CodePipeline outputArtifacts field is just a logical name. CodePipeline was designed so that future stages can reference artifacts created in past stages with that name. These artifacts are stored in the bucket you specify in your pipeline, but I don't think it's really expected for you to use these objects in your deployment configuration.

If you're building a ZIP file which you want to deploy to a Lambda function, you can create a second stage in your pipeline which deploys to the Lambda function you have: https://docs.aws.amazon.com/lambda/latest/dg/build-pipeline.html

If you just need your ZIP file to be in a predictable place (eg., s3://testxxxthe-codebuild/Lambda.zip) for some other process you've created, we have heard your use case from several customers and are thinking of ways to make this experience better. In the mean time, you might find the following forum post useful: https://forums.aws.amazon.com/thread.jspa?threadID=228984