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
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